rey360 قام بنشر أغسطس 16, 2020 قام بنشر أغسطس 16, 2020 السلام عليكم المنتدى الكرام الكل يقول بأن Recordset اسرع من DLookup ولاكن في المثال المرف وجدت العكس فأين الخلل ياترى recordset vs dlookup.rar
تمت الإجابة jjafferr قام بنشر أغسطس 17, 2020 تمت الإجابة قام بنشر أغسطس 17, 2020 وعليكم السلام 🙂 سيدي الفاضل ، سؤالك مهم ، ولكن صيغة الكود غير صحيحة !! لما نقول ان Dlookup بطيء ، فمقارنته تكون مع نتائج استعلام بدون Dlookup ، اما لما نقول لا تستعملوا Dlookup ، فهو في الاستعلام ، مثل: . اما اذا كانت مقارنتك في الكود بين 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 في استعلام ، وهو الخطأ ، فنتيجة الاستعلام التالي ، والوقت الذي اخذته: والوقت الذي اخذته بالثانية وجزء من الثانية 997.8555 جعفر 6 2 1
ابو ياسين المشولي قام بنشر أغسطس 17, 2020 قام بنشر أغسطس 17, 2020 استاذ جعفر jjafferr انت معلمنا ومنكم نستفيد فالف الف شكر
rey360 قام بنشر أغسطس 17, 2020 الكاتب قام بنشر أغسطس 17, 2020 شكرا لك أستاذنا 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.