0
votes

Y a-t-il une alternative plus rapide pour Dlookup pour remplir des champs de texte non liés sur un formulaire?

J'utilise dlookup pour rechercher un champ dans une table. Il fonctionne correctement, mais est lent. Y a-t-il quelque chose que je puisse faire pour accélérer?

Voici mon code existant: P>

Me(k1) = Dlookup("[KLant]", "[Planning_tbl02]", "[Plek#]=" & p & " AND [datum]='" & Me(k4) & "'" & " AND [bezet_ochtend]='" & "bezet" & "'")


3 commentaires

Cela dépend de l'endroit où vous l'utilisez. Vous mettez cette formule dans un contrôle sur une forme ou un rapport ou utilisez-vous-le dans une requête?


Veuillez modifier votre question pour afficher tout code pertinent - Est-ce exécuté dans une boucle? Dans quel événement? - P.S. Salut! :)


Salut @andre! Pourquoi les noms de vos commandes proviennent-ils des variables ( k1 et k4 )?


3 Réponses :


0
votes

Ajouter index dans le tableau des champs que vous filtrez.


0 commentaires

0
votes

Vous pouvez écrire votre propre code de recherche qui ouvre un jeu d'enregistrements et trouve la valeur souhaitée, par exemple:

Private Sub Form_Load()

    Dim p As Integer, k2 As Integer
    Dim k1 As String, k1_prev As String, k4 As String
    Dim r1 As Integer, g As Integer, b As Integer
    Dim strCriteria As String, strQuery As String

    For p = 1 To 30

        If r1 < 49 Then r1 = 255 Else r1 = r1 - 49
        If g > 203 Then g = 100 Else g = g + 52
        If b < 127 Then b = 160 Else b = b - 127

        strQuery = "SELECT [KLant], [datum] FROM [Planning_tbl02] WHERE " & _
            BuildCriteria("[Plek#]", dbLong, p) & " And " & _
            BuildCriteria("[bezet_ochtend]", dbText, """bezet""")

        With CurrentDb.OpenRecordset(strQuery, dbOpenDynaset)
            For k2 = 1 To 26

                k1_prev = k1
                k1 = "pl" & p & "_" & k2

                If k2 Mod 2 = 1 Then
                    k4 = "calday" & (k2 + 1) \ 2
                    .FindFirst BuildCriteria("[datum]", dbDate, Me(k4))
                    If .NoMatch Then Me(k1) = Null Else Me(k1) = ![klant]
                Else
                    Me(k1) = Me(k1_prev)
                End If

                If Not IsNull(Me(k1)) Then
                    If k2 = 1 Then
                        Me(k1).BackColor = RGB(r1, g, b)
                    Else
                        If Me(k1) <> Me(k1_prev) Then 'next color
                            If r1 < 49 Then r1 = 255 Else r1 = r1 - 49
                            If g > 203 Then g = 100 Else g = g + 52
                            If b < 127 Then b = 160 Else b = b - 127
                        End If
                        Me(k1).BackColor = RGB(r1, g, b)
                    End If
                End If

            Next
            .Close
        End With
    Next

End Sub


12 commentaires

Vrai, vous pouvez le faire, mais un dlookup () vs un rebrousse entier pefort de la même manière. Le gros problème est lors de l'utilisation d'un dlookup () de la face d'une requête ou de dire sur une forme continue - c'est comme exécuter une requête d'enregistrement entier +. Donc, ce n'est pas vraiment que dlookup (ou dcount (), etc.) est plus lent alors un processus "entier" ou crée une requête + reprcrdset. Le problème principal est Dlookup () peut être une corde à accrocher à soi-même, car elle peut être facilement maltraitée.


Cher @ALBERT, je ne peux pas croire à vous lire (je veux dire que vous ...) que "dlookup" et "jeu d'enregistrement" représentent la même chose. Bien sûr, en utilisant dlookup dans une requête serait vraiment une douleur et que la joindre la table de recherche serait beaucoup plus efficace, mais dans ce cas, la lecture moi Dans la question initiale, nous devons supposer que c'est le code VBA "derrière un formulaire".


Droite, mais si cette forme ou que ce code est en fait, tirez seulement celui-ci avec dlookup (). Ce seul Dlookup () fonctionnera de la même manière que l'ensemble du code ReocDreet affiché. Vous n'améliorerez pas la vitesse en échangeant ce seul code dlookup () avec un code d'enregistrement VBA tel que publié pour tirer la même valeur unique. Ils courent la même chose en termes de vitesse. Mon point sur Dlookup () dans une requête est bien sûr très mauvais. Ce point n'est pas pertinent pour cet exemple - et le point reste toujours que dlookup () pour obtenir une valeur vs que le code ReocDeet affiche une même vitesse. Alors oui, j'assume VBA sous une forme ici.


J'ai déjà utilisé un certain code de Wolfgang et c'est un peu plus rapide, merci. Mais il est maintenant 6 secondes au lieu de 10 secondes et je veux avoir max 2 secondes si possible.


Bonjour @andre, j'ai ajouté un autre exemple. S'il vous plaît jeter un oeil et leur donner un essai.


Salut @wolfgang, merci pour le code! J'ai essayé, mais je reçois une erreur ce que je ne peux pas résoudre par moi-même.


Hallo @andre, désolé d'entendre ça, mais si vous ne me dites pas plus sur l'erreur, je ne peux pas m'empêcher non plus.


Salut @wolfgang, je reçois une erreur avec la ligne ci-dessous: '.Findfirst buildcriteria ("' [Datum] '", dBtext, moi (k4))' I Obtenir l'erreur: Erreur d'exécution de l'erreur 3070 Le moteur de la base de données Microsoft Access-Base de données peut Ne reconnaissez pas le point de données comme nom de terrain ou expression valide, j'ai modifié le code comme ci-dessus et que cela fonctionne maintenant sans erreur, mais les champs sont vides, alors que j'attends certaines données. Y a-t-il quelque chose avec l'un des 3 critères? Merci beaucoup!


Salut @andre, ok, je vois. Nous avons tous deux commis une erreur. Vous avez utilisé dBText au lieu de dbdate , et j'ai oublié le champ dans ma requête. J'ai corrigé mon code.


Salut @wolfgang, génial! Cela fonctionne correctement maintenant. Merci beaucoup pour vos efforts et votre temps!


@Andre, vous êtes les bienvenus. Puis-je demander si la vitesse a augmenté un peu?


@Wolfgang, oui, la vitesse est augmentée de 9 secondes à 2,5 secondes! J'ai également ajouté des index dans la table ce qui vous aide également.



0
votes

Merci pour vos réponses. C'est une forme avec des champs de texte +/- 780 non liés qui devrait être rempli de données d'une table. Je construis un programme pour un petit camping et ce formulaire est une sorte de planification des lieux disponibles par jour. Ils ont donc 30 places et ils veulent voir 2 semaines, donc beaucoup de champs, car ils ont envie de la journée divisée au matin et à l'après-midi. Je sais que c'est peut-être pas la bonne façon de passer à PROGAM, mais ma connaissance n'est pas plus grande pour le moment: - (

Donc, si quelqu'un a une bonne suggestion, j'apprécierai vraiment ça.

Voir Ci-dessous pour le code complet, c'est une boucle dans une boucle. xxx


4 commentaires

Si k2 est même, il est toujours supérieur à 1. R1 et B ne peut pas devenir supérieur à 255, g < / code> ne peut pas devenir moins de 0.


Ce code est nécessaire pour donner à la zone de texte une couleur backrante. Il doit vérifier si la case est vide ou un client différent. Donc, chaque client a une autre couleur de fond pour l'obtenir plus visible. Mais sans ce code, il est toujours lent


OK, alors il sera probablement plus efficace de réduire le code de longueur un peu, de modifier l'ordre des boucles, d'ouvrir un seul jeu d'enregistrements par Datum et d'utiliser FindFirst pour trouver le fichier Place . Je vais vous donner un exemple plus tard. En outre, créez des index sur datum et PLEK # .


Eh bien, si vous tirez simplement une valeur, Dlookup () est aussi rapide d'un jeu d'enregistrements. Toutefois, si vous avez besoin de 10 colonnes, un recodage pour tirer l'un des enregistrements sera 10 fois plus rapide. Vous n'avez pas précisé que vous étiez ou souhaitez utiliser dlookup () pour tirer plus une valeur. Si vous avez besoin de toutes les colonnes d'un enregistrement, une SQL Pull + A Reprocdét sera «X» fois plus rapide en fonction du nombre de colonnes. NON Où était la suggestion ici est que vous avez besoin de plus qu'une valeur d'une table donnée.