2009-05-22 7 views
3

J'ai les éléments suivants: forme principale "client" d'une table "client". sous-formulaire "factures" avec champs "date facture", "montant facture" "ID client" etc. à partir d'une table "factures"Contrôle calculé sur le sous-formulaire basé sur l'enregistrement en cours

chaque fois que l'utilisateur clique ou passe à un enregistrement dans le sous-formulaire "factures". Je voudrais qu'un contrôle «total jusqu'à présent» calcule la somme du «montant des factures» jusqu'à ce que la date de l'enregistrement en cours soit «cliquée» ou sélectionnée.

-à-dire pour le client Microsoft avec factures: 1) 2 mai 09, 150 2 $) 3 mai 09, 200 3 $) 4 mai 09, 500

$ Si l'utilisateur clique sur enregistrement 2), « total donc loin » devrait afficher 350 $ Si l'utilisateur clique sur le disque 1), « jusqu'à maintenant » devrait montrer 150 $ Si l'utilisateur clique sur enregistrement 3), « jusqu'à maintenant » devrait montrer 850

$ Actuellement, je suis en utilisant la fonction DSum sur un événement "OnCurrent" dans le sous-formulaire "factures" pour définir la valeur "total jusqu'à présent". Cette méthode est-elle lente, inefficace?

Toute autre méthode plus simple, plus propre, plus élégante, plus rapide et plus efficace utilisant les fonctions d'accès au ms?

Je souhaite que le sous-formulaire "factures" affiche TOUTES les factures pour ce client, quel que soit l'utilisateur cliqué.

Répondre

1

Si la méthode DSum fonctionne pour vous, utilisez-la.

Si c'est trop lent alors une autre façon est d'utiliser un recordsetclone et de faire défiler les enregistrements. Ceci est plus de code mais c'est plus efficace car il n'a pas à frapper la base de données. Vous avez besoin d'une clé unique.

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 

L'autre façon est de construire une requête SQL avec une somme() mais qui prend encore plus de code et frappe à nouveau la base de données.

+0

Si DSum() est lent, le bouclage de tous les enregistrements sera sûrement plus lent? –

+0

Non - le recordsetclone est une copie en mémoire. DSUM fait une requête sur la base de données. –

+0

Et c'est une copie des enregistrements déjà filtrés et récupérés dans le sous-formulaire, donc il ne va pas y avoir beaucoup d'enregistrements –

0

Vous pouvez mettre un contrôle caché avec un Dsum dans le pied de page du sous-formulaire, puis vous reporter à celui-ci dans le formulaire principal. Le Dsum aurait son troisième argument comme "InvoiceId <= " & InvoiceId

Aucun besoin de VBA/événement dans ce cas.

Questions connexes