2009-09-25 10 views
0

Je suis nouveau VBA et Access en général et a couru dans ce problème tout en essayant d'utiliser la mise en œuvre d'une autre alternative proposée question que je lui avais demandé (DLookup in Access not running until textBox clicked on in Form)VBA/accès RecordSet par formulaire problème d'enregistrement

Le code ci-dessous s'exécute, le problème est que Me.Key est différent pour chaque enregistrement affiché dans le formulaire et en cours d'exécution dans le formulaire événement ouvert signifie qu'il saisit uniquement la première valeur attribuée à Me.Key du premier enregistrement. Comment puis-je faire cette exécution de sorte que Me.Key est différent pour chaque enregistrement/ligne affichée?

 
Dim rs As DAO.Recordset 
Dim db As Database 
Dim qdf As QueryDef 
Dim prm As Parameter 

Set db = CurrentDb 
Set qdf = db.QueryDefs("[MF INCOME - STREAM MONTHLY]") 
For Each prm In qdf.Parameters 
    prm.Value = Eval(prm.Name) 
Next prm 

Set rs = qdf.OpenRecordset(dbOpenDynaset) 
rs.FindFirst "[MyMonth]=10 AND [Org_Type]='" & Me.Key & "'" 
Me.Oct = rs!SumVal 
'...other month assignments 
+0

Vous pouvez naviguer dans les enregistrements du formulaire via la navigation dans le jeu d'enregistrements. Mais je suggère que vous pourriez considérer s'il vaut mieux ouvrir le jeu d'enregistrements une fois et naviguer via .FindFirst ou s'il est préférable d'ouvrir vos enregistrements limités aux enregistrements pour chaque ligne. –

Répondre

0

Je suppose que le Me.Key fait référence à un contrôle situé dans la section des détails de votre formulaire. Dans ce cas, et afin de lister toutes les valeurs prises par le contrôle, vous devrez parcourir tous les enregistrements. L'une des façons de le faire peut être:

Dim m_position as Long 
for m_position = 1 to Me.recordset.recordcount 
    me.seltop = m_position 
    debug.print me.key 
next m_position 

Malheureusement, votre verrez votre blincker tout en naviguant sur toutes les lignes. Vous pouvez bien sûr trouver des utilitaires 'screenFreezer' pour VBA sur le net (il y en a un appelé LockWindowUpdate, aussi loin que je me souvienne).

Une autre solution consiste à parcourir le clone du jeu d'enregistrements sous-jacent (l'exploration du jeu d'enregistrements provoquera le même comportement d'écran que précédemment). En supposant que le contrôle Me.Key est lié à la colonne du jeu d'enregistrements, le code pourrait être « clé »:

Dim rsClone as DAO.recordset 
set rsClone = Me.recordsetclone 
if rsClone.EOF and rsClone.BOF then 
Else 
    rsClone.moveFirst 
    Do while not rsClone.EOF 
     debug.print rsCLone.fields("Key") 
     rsClone.moveNext 
    Loop 
Endif 
set rsClone = nothing 

Mon préféré est le premier, avec l'option « geler » ajouté. Votre code peut gérer les valeurs seltop et selheight du formulaire. Cela signifie que vous pouvez parcourir spécifiquement les enregistrements sélectionnés par les utilisateurs et/ou, une fois que tous les enregistrements ont été consultés, revenir à la sélection d'enregistrement d'origine.

EDIT:

Après @ commentaire de Ben, j'ajoute que si votre « myControl » le contrôle est dans la section des détails et est non liée, alors vous ne serez pas en mesure de gérer une valeur par ligne. Le contrôle aura la même valeur pour toutes les lignes lorsque le formulaire est affiché comme "continu". Si votre contrôle "myControl" est lié au champ "myField" d'un jeu d'enregistrements, l'un des codes suivants incrémenteront en même temps la valeur de contrôle "myControl" et la valeur du champ "myField". Vous serez que en mesure d'avoir une valeur différente sur chaque ligne:

Solution 1:

Dim m_position as Long 
for m_position = 1 to Me.recordset.recordcount 
    me.seltop = m_position 
    me.controls("myControl") = m_position 
next m_position 

Solution 2:

Dim rsClone as DAO.recordset, _ 
    i as long 

set rsClone = Me.recordsetclone 
if rsClone.EOF and rsClone.BOF then 
Else 
    rsClone.moveFirst 
    i = 1 
    Do while not rsClone.EOF 
     rsClone.fields("myField") = i 
     rsClone.update 
     rsClone.moveNext 
     i = i+1 
    Loop 
Endif 
set rsClone = nothing 
+0

désolé pour le retard dans la réponse, d'autres projets ont gêné. Cela ressemble à cela pourrait bien aider ... le clignotement n'est pas un problème pour mes utilisateurs (petite charité je fais du bénévolat à temps), le système remplace des centaines de post-its, feuilles de calcul et emails;) en utilisant le La première solution que vous avez publiée, je peux itérer sur les différentes clés et voir les valeurs correctes étant calculées par clé, mais chaque fois que Me.Oct = est réglé chaque champ 'Oct' des enregistrements obtient la même valeur. Je n'ai jamais vu SetTop auparavant ... est-il possible d'utiliser cette valeur pour définir 'Oct' pour l'enregistrement en cours? –

+0

seltop, pas settop ... S'il vous plaît voir mon edit –

+0

merci pour l'écriture, je pense que dans mon cas particulier cela ne fonctionnera pas mais comme une réponse générale à la question d'origine, il est excellent. à votre santé. –

0

Vous pouvez essayer l'événement actuel de la forme, comme suggéré précédemment :)

+0

il fonctionne bien et les nombres sont affichés en utilisant l'un ou l'autre événement ... le problème est que Me.Key est toujours la même valeur s'il est exécuté comme ceci alors que dans le formulaire lui-même c'est différent par rangée. une erreur de débutant que je fais je me sens! –

+0

Vous parlez de lignes, cela suggère que vous utilisez un formulaire continu ou une feuille de données, si c'est le cas, vous aurez besoin de regarder une approche différente, comme la mise en place d'une requête, ou de changer en un seul formulaire. – Fionnuala

+0

en utilisant un formulaire continu, donc je devrais faire quelque chose de différent, je ne peux pas utiliser l'approche de formulaire unique car ce formulaire est construit comme une sorte de navigateur pour les utilisateurs - chaque ligne affiche des informations financières globales qui peuvent être expliquées en plusieurs fois pour voir (éventuellement) les revenus individuels avec leurs dates que l'organisme de bienfaisance a reçu par projet/donateur/flux de revenus. Existe-t-il un moyen standard d'accès pour remplir les données par ligne du formulaire à partir de la base de données en fonction des valeurs de cette ligne? –

0

Il est pas du tout clair ce que vous avez besoin des paramètres pour dans cette requête. Je suggère que vous construisiez simplement une requête sans AUCUN paramètre qui inclut toutes les colonnes dont vous avez besoin. Ensuite, construisez un petit formulaire en fonction de cette requête.

Vous pouvez ensuite déposer ce petit formulaire dans votre formulaire existant et afficher les différents champs de données en fonction du paramètre de valeur de clé. (Assurez-vous simplement que vous avez configuré le maître du lien et les paramètres enfants pour le sous-formulaire).Voici ce que une forme ressemble:

alt text http://www.members.shaw.ca/AlbertKallal/Articles/invoice2.gif

Ainsi, dans ce qui précède le projet de loi affiche les informations du client basée sur ID client et est une table liée à la facture. En d'autres termes, pour afficher plusieurs champs de données en fonction d'une valeur de clé d'un autre tableau, vous n'avez pas besoin d'écrire une ligne de code. Donc, tout ce processus et votre but peuvent être fait par glisser-déposer avec la souris. J'ai souvent quelque chose comme une facture, ou un bon de commande et je n'ai que le numéro de client. En utilisant un sous-formulaire, je peux afficher l'adresse complète et plusieurs champs de données sans écrire de code. Lorsque vous passez d'un enregistrement à l'autre, cet ensemble de champs est mis à jour et affiche toujours les données correctes.

+0

merci pour la réponse - je pense que cela fonctionnerait je n'étais pas pour le fait que j'affiche plusieurs 'clés' ou plusieurs 'clients' dans votre exemple et je ne pense pas que je peux faire une forme continue avoir un sous-formulaire. –

Questions connexes