Neuigkeiten:

Ist euer Problem gelöst, dann bitte den Knopf "Thema gelöst" drücken!

Mobiles Hauptmenü

Summe in einem Recordset berechnen

Begonnen von SMBR, April 16, 2020, 23:07:20

⏪ vorheriges - nächstes ⏩

SMBR

Einen schönen guten Abend zusammen,
leider muss ich erneut euch um Hilfe bitten. Mein heutiges Problem ist folgendes:
Ich würde gerne in einem Recordset wie oben schon beschrieben die Summe bilden. Diese Werte brauche ich an verschiedenen Stellen in der Datenbank. Deswegen würde ich nur ungern die Sache wie bisher mit Domainfunktionen lösen. Ich würde das gerne in eine Klasse auslagern. Diese sieht wie folgt aus
  Dim m_rcsDaten As Recordset
  Dim m_strName As String
   
Sub OeffneRecordset(strRecordsetname As String)
    m_strName = strRecordsetname
    Set m_rcsDaten = CurrentDb.OpenRecordset(strRecordsetname, dbOpenDynaset)
End Sub

Property Get AnzahlDerDatensaetze() As Long
    If m_rcsDaten Is Nothing Then
        AnzahlDerDatensaetze = -1
    Else
        With m_rcsDaten
            .MoveLast
            AnzahlDerDatensaetze = .RecordCount
            .MoveFirst
        End With
    End If
End Property

Property Get SummeVonMitGold() As Long
       
    Set m_rcsDaten = CurrentDb.OpenRecordset(m_strName, dbOpenDynaset)
    SummeVonMitGold = Sum(m_rcsDaten.Fields("MitGold").Value)
End Property
Property Get Recordsetname() As String
    Recordsetname = m_strName
End Property

Private Sub Class_Terminate()
    Set m_rcsDaten = Nothing
End Sub

In der Ersten Sub öffne ich das recordset mit dem Wert was ich unter strRecordsetname übergeben bekomme.

Und in diesem Geöffneten Recordset möchte ich dann die Summe aus einem Feld des Recordsets berechnen. So wie die Property für die Anzahl der Datensätze, benötige ich nun eine Property die die Summe aus einem bestimmten Feld des Recordsets bildet. (SummeVonMitGold)
Wenn ich dann in einem Formular diese ANgaben benötige, möchte ich die Klasse aufrufen, und den Wert der Summe aus der Klasse auslesen. Aktuell bekomme ich beim Kompiliercheck diese Fehlermeldung:"Sub oder Function nicht definiert" Was mache ich falsch?
Ich hoffe ich konnte mich gut genug ausdrücken und sag schon mal recht herzlichen Dank im Voraus und einen schönen Abend.

MzKlMu

Hallo,
mir scheint das alles eher überflüssig-
Summen lassen sich wunderbar mit einfachen gruppierten Abfragen bilden.
Da braucht es doch kein extra Recordset.

Kannst Du mal ein Beziehungsbild posten und erklären, welche Summe Du bilden willst.
Gruß Klaus

DF6GL

Hallo,

eine VBA-Sum()-Funktion gibt es nicht..   Allenfalls in einem SQL-Statement

ZitatSet m_rcsDaten = CurrentDb.OpenRecordset(m_strName, dbOpenDynaset)
    SummeVonMitGold = Sum(m_rcsDaten.Fields("MitGold").Value)

-->

SummeVonMitGold  = CurrentDb.OpenRecordset ("Select Sum([MitGold]) from [" & m_strName & "]", dbOpenSnapShot)(0)
Viele Grüße vom Bodensee
Franz, DF6GL

Hilfestellung:  http://www.access-o-mania.de/forum/index.php?topic=6969.msg118738#msg118738

Links und Tipps:
1.   http://v.hdm-stuttgart.de/~riekert/lehre/db-kelz/
1a. http://www.tinohempel.de/info/info/datenbank/normalisierung.htm
1b. https://support.office.com/de-de/article/Grundlagen-des-Datenbankentwurfs-eb2159cf-1e30-401a-8084-bd4f9c9ca1f5#bmterms
2.   http://www.donkarl.com
3.   https://web.archive.org/web/20201201233522/http://www.dbwiki.net/
4.   http://www.access-tutorial.de/
5.   http://www.tty1.net/smart-questions_de.htm
6.   http://access.joposol.com/accept

Last but not least:   < F1 > für Hilfe
;) Learning by doing not by spoon-feed ;)

Tipp: Find and Replace for Access

SMBR

#3
Hallo und erst mal schönen Dank für die Antwort. Das Beziehungsfenster ist in den Anhängen zu sehen. Dieses ist meine richtige Datenbank. In diesem Fall geht es um eine Private DB. Da ich auf mehrere Medikamente angewiesen bin, und einige davon auch BTM´s sind, muss ich halbwegs genau über die Eingänge und Einnahmen Buch führen. Hierfür habe ich zwei Hauppttabellen angelegt in dem in der einen die Eingänge und in der zweiten Haupttabelle die Einnahmen aufgelistet. Ausserdem gibt es eine Tabelle in der die ganzen Medikamente aufgelistet sind. Dieses ist die Referenztabelle für die Eingänge und Einnahmen. Und von den beiden Haupttabellen benötige ich die Gesamtstückzahl der einzelnen Medikamente um den Bestand errechnen zu können. Bis vor kurzem habe ich das ganze wie gesagt mit Domainfunktionen gelöst, was die DB aber unnötig langsamer macht. Da ich die Werte auch noch an verschiedenen Stellen benötige, erschien mir die Möglichkeit zweier Klassen in dem die Berechnungen stattfinden, doch deutlich einfacher als jedes Mal entweder die Dom-Funktion zu bemühen oder jedes Mal einen RS aufzumachen und das SQL-Statement neu zu schreiben. Vielleicht gibt es ja noch ne einfachere Lösung?
LG aus der Hauptstadt!

SMBR

Zitat von: DF6GL am April 17, 2020, 11:28:59
Hallo,

eine VBA-Sum()-Funktion gibt es nicht..   Allenfalls in einem SQL-Statement

ZitatSet m_rcsDaten = CurrentDb.OpenRecordset(m_strName, dbOpenDynaset)
    SummeVonMitGold = Sum(m_rcsDaten.Fields("MitGold").Value)

-->

SummeVonMitGold  = CurrentDb.OpenRecordset ("Select Sum([MitGold]) from [" & m_strName & "]", dbOpenSnapShot)(0)

Hallo
danke für die Schnelle und unbürokratische Hilfe. Das war genau das was ich gesucht habe. Ich war zwar schon am richtigen Weg, war aber leider unfähig das SQL-Statment zu formulieren. LG zum Bodensee

MzKlMu

#5
Hallo,
wie ich vermutet habe, bei richtigem Aufbau der DB ist das alles ersatzlos überflüssig.
Die beiden jetztigen Haupttabellen sind in einer Tabelle zusammenzulegen.
Ob Eingang oder Einnahme lässt sich über eine Vorgangsart unterscheiden, die gleichzeitig das Vorzeichen der Menge bestimmt.
Einnahmen werden negativ dargestellt und Zugänge positiv.
Der Bestand ist dann einfach der Saldo der Mengen (gruppiert über das Medikament), wie bei Deinem Bankkonto Einnahmen und Ausgaben.
Da braucht es weder Domänenfunktionen, Recordsets, Klassen noch sonst einen Buchstaben VBA Code.
Schnell, komfortabel und einfach.

Im Anhang findest Du ein einfaches beispiel. Die Artikel wären dann die Medikamente. Die Tabelle "tblBewegungsdaten" ist dann die Haupttabelle die dann mit weiteren Feldern zu ergänzen ist.
Die Namen der beiden Abfragen sind selbsterklärend.
In der ganzen DB gibt es nur wenige Buchstaben VBA Code, der mit der eigentlichen Bestandsrechnung aber nichts zu tun hat.
Gruß Klaus

SMBR

hallo Klaus,
ich muss gestehen, klingt gut, schaut gut aus, funktioniert gut!! ;) :D :D Danke für den guten Tip. Wer das die Tage mal umbauen.  :). Ich wünsche noch einen schönen Tag und ne gute Woche. Grüße aus der Hauptstadt!

Stefan