2009-05-22 9 views
3

Ich habe folgendes: Hauptformular "Kunde" aus einer "Kunden" -Tabelle. Unterformular "Rechnungen" mit Feldern "Rechnungsdatum", "Rechnungsbetrag" "Kundennummer" usw. aus einer Tabelle "Rechnungen"Berechnet Kontrolle auf Unterformular basierend auf aktuellen Datensatz

, wenn Benutzer auf einen Datensatz im Unterformular "Rechnungen" klickt oder geht. Ich möchte ein Steuerelement "total so weit", um die Summe der "Rechnungsbetrag" bis zum Datum des aktuellen Datensatzes "angeklickt" oder ausgewählt zu berechnen.

dh für den Kunden Microsoft mit Rechnungen: 1) kann 2 09, kann $ 150 2) 3 09, Mai 4 09 $ 200 3), $ 500

Wenn Benutzer klickt auf Rekord 2), „insgesamt so weit“sollte $ 350 zeigen Wenn Benutzer auf Aufzeichnung klickt 1),‚insgesamt so weit‘$ 150 zeigen sollte, wenn Benutzer auf Aufzeichnung klickt 3),‚total bisher‘zeigen sollte 850

$ Zur Zeit bin ich mit DSum-Funktion bei einem Ereignis "OnCurrent" im Unterformular "rechnungen", um den Wert "total so weit" zu setzen. Ist diese Methode langsam, ineffizient?

Jede andere einfachere, sauberere, elegantere, schnellere und effizientere Methode mit ms Zugriffsfunktionen?

Ich möchte, dass das Unterformular "Rechnungen" ALLE Rechnungen für diesen Kunden anzeigt, egal auf welchen Datensatz geklickt wird.

Antwort

1

Wenn die DSum-Methode für Sie funktioniert, verwenden Sie sie.

Wenn es zu langsam ist, besteht ein anderer Weg darin, einen Recordsetclone zu verwenden und die Datensätze durchzulaufen. Dies ist mehr Code, aber es ist effizienter, da es nicht die Datenbank treffen muss. Sie benötigen einen eindeutigen Schlüssel.

Private Sub Form_Current() 

    Dim rst As DAO.Recordset 
    Dim subTotal As Currency 
    Dim rec_id As Long 

    'get clone of current records in subform' 
    Set rst = Me.RecordsetClone 

    'save current record id' 
    rec_id = Me.rec_id 

    rst.MoveFirst 

    'loop and total until current is reached' 
    Do Until rst![rec_id] = rec_id 
    subTotal = subTotal + rst![InvoiceAmt] 
    rst.MoveNext 
    Loop 

    'add last amount on current record' 
    subTotal = subTotal + rst![InvoiceAmt] 

    Set rst = Nothing 

    'set text box with subtotal' 
    Me.Text2 = subTotal 

End Sub 

Der andere Weg ist eine SQL-Abfrage mit einer Summe zu bauen(), aber das braucht noch mehr Code und die Datenbank trifft wieder.

+0

Wenn DSum() langsam ist, wird das Durchlaufen aller Datensätze sicher langsamer sein? –

+0

Nein - der Recordsetclone ist eine In-Memory-Kopie. DSUM führt eine Abfrage für die Datenbank durch. –

+0

Und es ist eine Kopie der bereits gefilterten und abgerufenen Datensätze im Unterformular, so dass es nicht viele Datensätze sein wird –

0

Sie könnten ein verstecktes Steuerelement mit einem Dsum in der Fußzeile des Unterformulars einfügen und sich dann auf dieses aus dem Hauptformular beziehen. Der Dsum hätte sein drittes Argument wie "InvoiceId <= " & InvoiceId

Keine Notwendigkeit für irgendein VBA/Ereignis in diesem Fall.

Verwandte Themen