اذهب الي المحتوي
أوفيسنا
بحث مخصص من جوجل فى أوفيسنا
Custom Search

من أسرع DLookup أم Recordset


rey360
إذهب إلى أفضل إجابة Solved by jjafferr,

الردود الموصى بها

  • أفضل إجابة

وعليكم السلام 🙂

 

سيدي الفاضل ، سؤالك مهم ، ولكن صيغة الكود غير صحيحة !!

 

لما نقول ان Dlookup بطيء ، فمقارنته تكون مع نتائج استعلام بدون Dlookup ،

اما لما نقول لا تستعملوا Dlookup ، فهو في الاستعلام ، مثل:

image.png.f716b6daad99240c0082ccfca64dc8e7.png

.

اما اذا كانت مقارنتك في الكود بين Dlookup و Recordset :

1. لإستخراج قيمة واحدة فقط ، فطبيعي Recordset تكون ابطأ ، لأنها تعمل نسخة من البيانات وتحتفظه في الذاكرة المؤقته RAM في الكمبيوتر ، فهذه العملية تأخذ وقت ،

2. إستخراج اكثر من قيمة/سجل ، فيكون Recordset اسرع ، لأنه بعد حفظ القيمة في ذاكرة الكمبيوتر ، يكون الحصول على البيانات منها اسرع ، ولكن بشرط ان تعمل الكود بالطريقة الصحيحة (انظر الكود) ،

 

انا عملت نسخة من الجدول test واسميته test2 ، وعملت حقل tst مفهرس، لأنك تستخدمه كمعيار للحصول على النتائج التي تريدها ، ثم ضغط واصلاح للبرنامج حتى يستفيد البرنامج من فهرست الحقل،

وعليه ، اصبح جلب النتائج من الجدول الثاني اسرع بكثير !!

اليك بعض التجارب التي عملتها للجدولين : 

Option Compare Database

Private Sub Commande0_Click()

    Dim t, t11, t12, t13, t14, t21, t22, t23, t24 As Single
    Dim r As Long
    
'table test

    '1 Dlookup
        t = Timer
        r = Nz(DLookup("id", "test", "tst='mohamed'"), 0)
        t11 = Timer - t
        t11 = Format(t11, "#0.0####")
    
    '2 qry_test
        t = Timer
        r = DCount("*", "qry_test")
        t12 = Timer - t
        t12 = Format(t12, "#0.0####")
    
    '3 Recordset_1
        t = Timer
        r = fff_1("test", "mohamed")
        t13 = Timer - t
        t13 = Format(t13, "#0.0####")
        
    '4 Recordset_2
        t = Timer
        r = fff_2("test", "mohamed")
        t14 = Timer - t
        t14 = Format(t14, "#0.0####")
    
'table test2

    '1 Dlookup
        t = Timer
        r = Nz(DLookup("id", "test2", "tst='mohamed'"), 0)
        t21 = Timer - t
        t21 = Format(t21, "#0.0####")
    
    '2 qry_test
        t = Timer
        r = DCount("*", "qry_test2")
        t22 = Timer - t
        t22 = Format(t22, "#0.0####")
    
    '3 Recordset_1
        t = Timer
        r = fff_1("test2", "mohamed")
        t23 = Timer - t
        t23 = Format(t23, "#0.0####")
    
    '4 Recordset_2
        t = Timer
        r = fff_2("test2", "mohamed")
        t24 = Timer - t
        t24 = Format(t24, "#0.0####")
        
    Debug.Print "Dlookup:" & vbCrLf & _
                "table test: " & t11 & vbTab & " test2: " & t21 & vbCrLf
                    
    Debug.Print "qry_test, test2:" & vbCrLf & _
                "table test: " & t12 & vbTab & " test2: " & t22 & vbCrLf
                    
    Debug.Print "Recordset_1:" & vbCrLf & _
                "table test: " & t13 & vbTab & " test2: " & t23 & vbCrLf
                    
    Debug.Print "Recordset_2:" & vbCrLf & _
                "table test: " & t14 & vbTab & " test2: " & t24

    
    MsgBox "Done"
    
End Sub

Public Function fff_1(tbl_Name As String, tt2 As String) As Long

    Dim db As DAO.Database
    Dim rs As DAO.Recordset
    Dim rr As Long
    
    Set db = CurrentDb
    Set rs = db.OpenRecordset("Select id, tst From " & tbl_Name)
     
    rs.FindFirst "[tst]='" & tt2 & "'"
        If rs.NoMatch Then
            fff_1 = 0
        Else
            fff_1 = rs!id
        End If
    
    rs.Close: Set rs = Nothing
    
End Function

Public Function fff_2(tbl_Name As String, tt2 As String) As Long

    Dim db As DAO.Database
    Dim rs As DAO.Recordset
    Dim rr As Long
    
    Set db = CurrentDb
    Set rs = db.OpenRecordset("Select id, tst From " & tbl_Name & " WHERE tst='" & tt2 & "'")
    rs.MoveLast: rs.MoveFirst
    
        fff_2 = rs.RecordCount
    
    rs.Close: Set rs = Nothing
    
End Function

 

والنتائج من "كمبيوتري القديم" بالثواني واجزاء من الثانية :

Dlookup:
table test: 0.1875   test2: 0.0

qry_test, test2:
table test: 0.375    test2: 0.00391

Recordset_1:
table test: 1.19531  test2: 0.17578

Recordset_2:
table test: 0.38281  test2: 0.00391

 

 

اما اذا وضعنا الدالة Dlookup في استعلام ، وهو الخطأ ، فنتيجة الاستعلام التالي ، والوقت الذي اخذته:

image.png.7a69c25ba3ec43b5a6ec9067167e9b5c.png

 



 والوقت الذي اخذته بالثانية وجزء من الثانية 
997.8555

 

 

جعفر

  • Like 6
  • Thanks 2
  • Sad 1
رابط هذا التعليق
شارك

شكرا لك أستاذنا jjafferr فقد كنت جربت rs.findfirst و كانت أسرع من صيغة التى قمت بعملها في الاول الا أن DLookup بقية اسرع ولم اكن اعلم ان عمل فهرسة يزيد من سرعة البحث كما اريد مثلا ان أمكن على تغلب recordset على dlookup وشكرا جزيلا لك على الشرح الوافي.

رابط هذا التعليق
شارك

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

زائر
اضف رد علي هذا الموضوع....

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

  • تصفح هذا الموضوع مؤخراً   0 اعضاء متواجدين الان

    • لايوجد اعضاء مسجلون يتصفحون هذه الصفحه
×
×
  • اضف...

Important Information