2010-07-22 9 views
1

quelqu'un pourrait éventuellement me donner quelques indications sur la méthode appropriée à utiliser ici.Essayer d'améliorer les performances en supprimant DLookUp - Access 2007

-Edit

je champs sous une forme qui se rapportent à une Adresse de risque »des utilisateurs, et j'ai une case à cocher qui met à jour les valeurs dans ces champs que si des charges sélectionnées les détails « contact »(de la table tblInsPersDet) dans ces champs. Si la case n'est pas cochée, l'utilisateur peut entrer de nouveaux détails.

Je lance la sous-routine ci-dessous sur la célérité de la case à cocher. Pour obtenir les valeurs de champ j'utilise Dlookup, mais je crois que ce soit inefficace? Comme il interroge la base de données/table chaque fois.

Public Sub sameAsContact(frm As Form) 

frm.riskAddress1 = DLookup("[add1]", "tblInsPersDet", "[ID] =" & frm.insuredId) 
frm.riskAddress2 = DLookup("[add2]", "tblInsPersDet", "[ID] =" & frm.insuredId) 
frm.riskAddress3 = DLookup("[add3]", "tblInsPersDet", "[ID] =" & frm.insuredId) 
frm.riskAddress4 = DLookup("[add4]", "tblInsPersDet", "[ID] =" & frm.insuredId) 
frm.riskAddress5 = DLookup("[add5]", "tblInsPersDet", "[ID] =" & frm.insuredId) 
frm.cmbRiskCountry = DLookup("[country]", "tblInsPersDet", "[ID] =" & frm.insuredId) 
frm.riskDstToProp = DLookup("[distToProp]", "tblInsPersDet", "[ID] =" & frm.insuredId) 
frm.riskInsCompany = DLookup("[insCompany]", "tblInsPersDet", "[ID] =" & frm.insuredId) 
frm.riskPolNo = DLookup("[polNo]", "tblInsPersDet", "[ID] =" & frm.insuredId) 
frm.riskBldSi = DLookup("[bldSi]", "tblInsPersDet", "[ID] =" & frm.insuredId) 
frm.riskContSi = DLookup("[contSi]", "tblInsPersDet", "[ID] =" & frm.insuredId) 
frm.riskExcess = DLookup("[excess]", "tblInsPersDet", "[ID] =" & frm.insuredId) 
frm.riskOgLinkMort = DLookup("[linkMort]", "tblInsPersDet", "[ID] =" & frm.insuredId) 
frm.riskOgAddOn = DLookup("[addOn]", "tblInsPersDet", "[ID] =" & frm.insuredId) 

End Sub 

Existe-t-il un moyen d'interroger la base de données une fois? Quelqu'un pourrait-il me donner un pointeur sur une méthode plus appropriée pour obtenir les données de l'enregistrement requis?

Merci à l'avance pour toute aide Vive Noel

+0

Par curiosité, pourquoi posez-vous toutes vos questions sur wiki communautaire? – Fionnuala

+0

n'êtes-vous pas supposé ?! Cela n'amène-t-il pas à éditer la question? – noelmcg

+0

Ce n'est pas la chose habituelle, et cela signifie que vous ne bénéficiez pas de votes pour une bonne question, mais c'est à vous de décider. – Fionnuala

Répondre

2

Vous devez utiliser un sous-formulaire qui a insuredId comme champ Master Link et ID comme champ enfant Lien.

EDIT re note

Je crois toujours que vous pouvez utiliser un sous-formulaire. Si la case est cochée, soit sélectionner l'enregistrement concerné pour le sous-formulaire:

Me.MySubformControlName.Form.RecordSource="Select * From tblInsPersDet Where ID=" _ 
& Me.txtinsuredId 

Ou remplir une valeur dans un champ caché ou visible appelé, par exemple, txtinsuredId.

Si la case n'est pas cochée, vous pouvez passer à un nouvel enregistrement dans le sous-formulaire.

EDIT re Note n ° 2

Si vous devez utiliser quelque chose de semblable à DLookUp, utilisez un jeu d'enregistrements:

Set rs=CurrentDB.OpenRecordset("Select * From tblInsPersDet Where ID=" _ 
& Me.txtinsuredId) 

For each fld in rs.Fields 
    frm("txt" & fld.name)=fld 
Next 

ou là abouts.

+0

Salut Remou, J'ai édité ma question car je ne crois pas que j'étais complètement clair quant à ce que la case à cocher réalise. Je ne pense pas que je peux utiliser un sous-formulaire dans cette instance? – noelmcg

+0

Je pense toujours qu'un sous-formulaire est la solution dont vous avez besoin. – Fionnuala

+0

Je vois maintenant comment cette solution fonctionnerait.Les contraintes de temps peuvent rendre difficile à mettre en œuvre, car pour autant que je le vois, je devrais restructurer la base de données de la façon dont je l'ai organisé à l'heure actuelle. Mais je vois certainement comment cela serait efficace. – noelmcg