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

أستعلام لجمع القيمة السابقة


أبو وليد

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

السلام عليكم :rol:

 

بسبب استخدامنا لوحدات نمطية ، ودالة DFirst ، فهذه تأخذ مجهود من البرنامج ، فعليه ، يتأخر عمل الاستعلام!!

 

انا هنا وضعت جميع المشاركات في برنامج واحد ، وجعلت في الجدول 129,600 سجل ، لنعرف الفرق في السرعة بين المشاركات:

256.2.Clipboard01.jpg.39fcf3894bfcb5a193

.

وأحد النتائج:

256.2.Clipboard02.jpg.4b0bf1c42e094b4885

.

جرب وشوف الوقت بجزء من الثانية (نعم اجزاء الثانية تعتبر تأخير بالنسبة لي :rol:)

مع ملاحظة انك لن تحصل على نفس الوقت للإستعلام ، وذلك يعتمد على مدى انشغال الكمبيوتر بأوامر الوندوز والتي يعطيها الكمبيوتر الاولوية:blink:

لذلك ، خذ معدل 3-4 مرات لكل استعلام :rol:

 

وفي النهاية ستعرف ان اختيار الاستعلام له اسباب اخرى ايضا غير :

7 ساعات مضت, أبو وليد said:

الاستعلام المباشر أسهل

ولكن الكود تستطيع التحكم به أكثر وأشمل

.

 

جعفر

 

256.2.Database3.accdb.zip

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

بارك الله فيك

ونفع بك رائع أنت لا تقدم حلوم بل معلومات للأبد

استفدت كثيرا ووضعت لي حلول لأشياء الغيت عملها لعدم وصولي لحلها

 

بما أن تكلمت عن السرعة لدي استفسار

لدي ملف كبير به تقريبا

541906 كل يوم يضاف له 173 سجل

هذه السجلات لعدد 173 شركه

عملت استعلام في عملية sum

لبعض الاعمدة المضافة للاستعلام حسابيا

طبعا عملية sum لمجموعة من تلك السجلات

الاستعلام يستغرق وقت طويل جدا ما ادري هل السبب كثرة السجلات أم ماذا

 

بارك الله فيك

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

وعليكم السلام أبو وليد :rol:

 

هو دائما في طريقة :rol:

 

احدها:

http://www.officena.net/ib/topic/67004-تسريع-عملية-البحث-في-access/?do=findComment&comment=435657

 

ولكن ، لكل برنامج تفاصيله ،

فقد يكون تغيير بسيط في استعلام ، يغير سرعة الاستعلام الآخر الذي يعتمد عليه :rol:

 

جعفر

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

وهذه النسخة لعمل المتوسط تلقائيا على جميع الاختيارات :rol:

 

اختار كم مرة تريد التجربة ، انا اخترت 10 مرات :rol:

256.2.Clipboard03.jpg.4ab2ddb87b99c0341d

.

وهذا الكود الذي يقوم بالعمل:


Function Open_Query_Timing(Q, F)
        
    Me(F).BackColor = RGB(225, 225, 0)    'yellow
    DoEvents
    t = Timer
    DoCmd.OpenQuery Q
    Me(F) = (Nz(Me(F), 0) + Format(Timer - t, "0.000000")) / 2
    DoCmd.Close acQuery, Q, acSaveNo
    
    Me(F).BackColor = RGB(255, 255, 255)    'white
    
End Function

Private Sub cmd_Get_Average_Click()

    For i = 1 To Me.How_Many_Times
        
        Me.Counter = i
        
        RowID = 0
        RowVal = 0

        Call Open_Query_Timing("Query1", "q1")
        Call Open_Query_Timing("Query2", "q2")
        Call Open_Query_Timing("Query3", "q3")
        Call Open_Query_Timing("Query4", "q4")
        Call Open_Query_Timing("Query6", "q6")
        Call Open_Query_Timing("Query7", "q7")

    Next i
    
End Sub

 

جعفر

256.2.Database3.accdb.zip

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

23 ساعات مضت, أبو وليد said:

بما أن تكلمت عن السرعة لدي استفسار

لدي ملف كبير به تقريبا

541906 سجل كل يوم يضاف له 173 سجل ، هذه السجلات لعدد 173 شركه

عملت استعلام في عملية sum ، لبعض الاعمدة المضافة للاستعلام حسابيا ، طبعا عملية sum لمجموعة من تلك السجلات

الاستعلام يستغرق وقت طويل جدا ما ادري هل السبب كثرة السجلات أم ماذا

 

السلام عليكم أخي ابو وليد :rol:

 

في الواقع برنامجك كان تحدي :wallbash:

البارحة لما انزلت البرنامج ، وشغّلت استعلام المجاميع ، بدأت احسب مثل الاطفال ، وعديت العدد 600 (بس جزاك الله خير ، ارجعت الثقة في نفسي اني اقدر احسب لهذا العدد :rol:) ، والاستعلام ما خلص وسيطر على الكمبيوتر ، وما رضى يتسكر ، فاضطررت ان اغلق البرنامج من Windows Task Manager :blink:

 

احد الافكار اللي جائتني ، وهي عمل جدول مؤقت ، نخزن فيها البيانات من الاستعلام العادي ، وثم من هذا الجدول نعمل استعلام المجاميع ، 

وبدأت احسب مثل الاطفال ، وعديت العدد 600 ، والاستعلام ما خلص وسيطر على الكمبيوتر ، وما رضى يتسكر ، فاضطررت ان اغلق البرنامج من Windows Task Manager :blink:

 

دخلت في الاستعلام وفككت الكود ، واتضح لي ان المشكلة هي هذا السطر:

volume: [close]-Nz(DLookUp("close","Saudistock","ID = " & Nz(DMax("ID","Saudistock","tickerr = '" & [tickerr] & "' And ID < " & [ID]),0)))

.

يعني احنا ننادي الاوامر DLookup و DMax بعدد السجلات 541906 مرة (ومثل ما المثل العماني يقول: وابويا انا عليك:wallbash:) ، لأن هذه الاوامر اصلا ثقيلة في الاستعمال ،

وللعلم ، كل امر من هذه الاوامر (DMax , DLookup, Dcount, Dlast, DMin, DFirst) عبارة عن استعلام ولكنه بصيغة امر تسهيلا للمستخدم ،

 

ولاحظت ان المعادلة عبارة عن أمرين مستقلين ، ففككتهم عن بعض ، وفهمت اللي يعملونه ، ولكني كنت محتاج اشوف نتائج كل امر بطريقة مستقلة ، فشغلت الاستعلام ، وهذه النتيجة:

261.1.Clipboard01.jpg.e7d088441ecced5f56

.

وبعد عدت تجارب ، استطعت ان اتخلص من هذا الكود ، بوحدة نمطية:


'
Public old_i As Long
Public old_c As Double
Public old_t As Long
'

Function Get_Previous(i, t, c) As Double

    'i = ID
    't = ticherr
    'c = close
    
    If Val(t) <> Nz(old_t, 0) Then
        old_i = 0
        old_c = 0
    End If
    
        old_t = Val(t)
        
    Get_Previous = Format(c - Nz(old_c, 0), "#.000")
    
'DM = Nz(DMax("ID", "Saudistock", "tickerr = '" & [tickerr] & "' And ID < " & [ID]), 0)
'volume = [Close] - Nz(DLookup("close", "Saudistock", "ID = " & DM

        old_i = i
        old_c = c
        
End Function

.

وعلشان تشغل الاستعلام (ليس استعلام المجاميع) ، لازم تستخدم النموذج علشان يعطي البيانات نتيجة صفر الاولية المطلوبة :rol:

ولاحظت كذلك انك عامل فهرسة لجميع الحقول في الجدول ، وهذا يكبر حجم البرنامج وبدون مردود ، فحذفت فهرست هذه الحقول :rol:

 

النتيجة:

في المرفق برنامجين:

برنامجك بدون بيانات ، وبرنامج للجدول المؤقت ،

استخدم فهرست الحقول كما في البرنامج المرفق ، واربط الجدول اللي في البرنامج المؤقت ، ببرنامجك ،

وعندها عندك طريقتين للعمل (النموذج فيه زرين):

1. سيقوم البرنامج بتفريغ بيانات الجدول المؤقت ، ثم الاستعلام العادي سيُلحق البيانات جديدة بالجدول المؤقت ، وعند الانتهاء ، سيعمل استعلام المجاميع ،

2. وبدون استعمال الجدول المؤقت ، يأخذ استعلام المجاميع بياناته من الاستعلام العادي ،

وانا أفضل استخدام الطريقة الاولى ، وخصوصا ان الجدول المؤقت لن يضر برنامجك :rol:

 

وافضل شئ في هذه العملية هي نتائج السرعة:

1. والذي فيه استعلام الحاق بيانات في الجدول المؤقت ، ثم عمل استعلام المجاميع = 120 ثانية

2. استعلام المجاميع والذي يأخذ بياناته من الاستعلام العادي = 73 ثانية

3. واذا كانت البيانات موجودة في الجدول المؤقت ، واجرينا استعلام المجاميع = 3 ثوان :rol:

 

 

جعفر

 

261.1.SaudiSatck2.zip

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

10 دقائق مضت, أبو وليد said:

بحاول أضيف الجدول المؤقت في القاعدة

عند فتح القاعدة يضيف البيانات وعند الاغلاق بفرغ البيانات

اش رأيك  مو أفضل

 

لا ، لأن حجم برنامجك بيصير مثل الديناصور ، وبتضطر ان تستخدم الضغط والاصلاح دائما ، لإرجاعه الى حجمه الاصلي :rol:

وبعدين اذا ما انتبهت ، حجم البرنامج المؤقت يوصل الى 85MB :blink:

 

جعفر

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

هههههههههههههههههههههههههههههههههههه

 

يعطيك العافية

بس أما مااحتاج اضيف كل السجلات للجدول المؤقت بالكثير 30 سجل لكل شركة

استفسار أخير هل تنصحني بتقسيم القاعدة

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

6 دقائق مضت, أبو وليد said:

استفسار أخير هل تنصحني بتقسيم القاعدة

هذا من الاساسيات اللي لازم تعملها لما برنامجك يبدأ يشتغل ، من اول يوم :rol:

لأن الجداول نادرا يصير لها Corruption ، بينما الطامة تصير في جزء النماذج / التقارير ... ، فلا تضيّع الشغل الكبير (البيانات) بسبب عدم تقسيم برنامجك :rol:

 

جعفر

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

في ‏٢٥‏/‏٠٤‏/‏١٤٣٧ at 14:34, jjafferr said:

شكرا :rol:

 

جرب هذا الكود بدل السابق :



Public RowID As Integer
Public RowVal As Double


Function Add_5(N)
    
    'N = vol

'    If Len(RowID & "") = 0 Or RowID = 0 Then
        RowID = RowID + 1
'    End If
    
    If RowID = 1 Then
        Add_5 = N
        
    Else
        'Add_5 = N + RowVal + 5
        Add_5 = RowVal + 5
        
    End If
    
    RowVal = Add_5
    
End Function

 

 

جعفر

استاذي

الكود رائع ومفيد جدا

ولكن به مشله لا أعلم هل هي من الكود ام ماذا

عند فتح الاستعلام وتحريك عجلة الماوس تتغير النتائج

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

وعليكم السلام :rol:

 

الاكسس لما يفتح الاستعلام ، فانه لا يعطيك بيانات كل السجلات دفعة واحدة ، وانما لتسريع العمل ، فانه يحسب قيم البيانات التي تظهر على الشاشة ، ولما تنزل للاسفل لترى اي سجل ، فيقوم الاكسس بحساب السجلات الجديدة التي على الشاشة مرة اخرى ،

طيب والسجلات اللي شفناها سابقا ، ورجعنا نشوفها مرة ثانية ، فكذلك يقوم الاكسس بحساب قيمها ، لأن الاستعلام لا يملك طريقة لحفظ البيانات المحسوبة ،

ولأن الاستعلام يستخدم وحدة نمطية تتغير فيها القيم ، فالارقام ستتغير كذلك :blink:

بس للعلم ، نحن نواجه هذه المشكلة مع الوحدة النمطية ، وذلك بسبب طبيعة عمل الاستعلام في تغيير البيانات على اساس كل سجل ، وإلا ، فلا مشكلة باستخدام الوحدات النمطية للإستعلام :rol:

 

لهذا السبب عندك طريقتين لحل هذا الموضوع:

1. عمل جدول مؤقت ، وارسال بيانات الاستعلام مباشرة الى الجدول ، ثم قراءة البيانات من الجدول ، وعمل الخطوة التالية ،

2. ارسال البيانات مباشرة الى التقرير ،

 

جعفر

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

فكرة الجدول المؤقت رائعه

سويت عمود أخر في الاستعلام مع تغيير الكود وإضافة في الكود

Option Compare Database

Public Rowclose As Double
Public RowEMA As Double





Function Add_3(T, N)
    
    'T = ticker
    'N = close


   
    
    If T = 0 Then
        
        Add_3 = N

    Else
        Add_3 = N * (2 / (5 + 1)) + (1 - (2 / (5 + 1))) * Rowclose
        
    'Else
      '  Add_3 = Rowclose_1 + Rowclose_2 + Rowclose_3
            
    End If
    
    Rowclose = Add_3
End Function

Function EMA_2(T1, S)
    
    'T = ticker
    'N = close


   
    
    If T1 = 0 Then
        
        EMA_2 = S

    Else
        EMA_2 = S * (2 / (5 + 1)) + (1 - (2 / (5 + 1))) * RowEMA
        
    'Else
      '  Add_3 = Rowclose_1 + Rowclose_2 + Rowclose_3
            
    End If
    
    RowEMA = EMA_2
End Function

المشكله عند عمل الكود الاول فقط يعطي نتيجة 100%

لمن أضيف عمود أخر يعطي نتيجة خطأ في العمود الجديد والعمود السابق

 

تحملني يااستاذي الفاضل

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

آسف أخوي أبو وليد ، بس هذا الكود لا علاقة له بالموضوع هذا :blink:

وانا بعيد عن كمبيوتري الاصل ، فما اعرف وين الكود الاصل علشان اقارن بينهم:blink:

 

اقترح عليك ان تفتح سؤال جديد ، وتعرض الكود الاصل ، ثم تعرض الكود الجديد ، فمنه نستطيع ان نعمل المقارنة ،

كذلك يُحبذ ان ترفق بيانات قليلة في برنامجك ، وترفعه كذلك:smile:

والاهم انك تذكر رابط الموضوع الاصل ، حتى يكون سهل على المتتبع :smile:

 

هذا الموضوع يُغلق :smile:

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

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

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

Important Information