اذهب الي المحتوي
أوفيسنا

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

قام بنشر

السلام عليكم

في المرفق :

جدول أسماء وأمام كل اسم مربعات اختيار  تمثل ايام الأسبوع   chekVuc1= يوم الأحد  chekVuc2= يوم الاثنين .. وهكذا حتى chekVuc7= يوم السبت

عندما نأشر عليها فنحن نحدد العطلة الاسبوعية لهذا الاسم .. فاحتمال تكون عطلته يوم الاحد فقط  وممكن تكون الاربعاء والخميس أو الجمعة والسبت

أو اكثر من يومين

...................

نريد دالة في الاستعلام المرفق و في حقل day_id  الذي يمثل رقم اليوم في الاسبوع

بناء على اختيار الاسم من النموذج يتم اخفاء يوم أو ايام العطلة في الاستعلام

Database1.rar

  • ابوخليل changed the title to المطلوب دالة كمعيار في الاستعلام تحمل قيمتين أو اكثر لتصفية أيام الأسبوع
قام بنشر
SELECT tblNames.UserId, tblNames.s_name, tblDays.day_id, tblDays.dayNm
FROM tblDays, tblNames
WHERE tblNames.UserId = [Forms]![Form1]![Combo0]
    AND (
        (tblDays.day_id = 1 AND NOT tblNames.chekVuc1) OR
        (tblDays.day_id = 2 AND NOT tblNames.chekVuc2) OR
        (tblDays.day_id = 3 AND NOT tblNames.chekVuc3) OR
        (tblDays.day_id = 4 AND NOT tblNames.chekVuc4) OR
        (tblDays.day_id = 5 AND NOT tblNames.chekVuc5) OR
        (tblDays.day_id = 6 AND NOT tblNames.chekVuc6) OR
        (tblDays.day_id = 7 AND NOT tblNames.chekVuc7)
    );


اعتذر عندى مشكلة بالانترنت
لا استطيع رفع مرفقات

استاذى الجليل ومعلمى القدير و والدى الحبيب :fff:

لا اعرف هل الافكار فى هذا الموضوع مشابهه ام تساعد فى تحقيق اى من اهدافكم الحالية او المستقبلية ام لا ولكن احسست بوجه شبه من بعيد او من قريب بينهم 

 

  • Like 1
  • Thanks 1
قام بنشر

الف شكر لكم احبتي

الحلول كلها تعطي نتيجة صحيحة ،، وحل الأخ موسى الطف وأخف

 

منذ ساعه, ابو جودي said:

لا اعرف هل الافكار فى هذا الموضوع مشابهه ام تساعد فى تحقيق اى من اهدافكم الحالية او المستقبلية ام لا ولكن احسست بوجه شبه من بعيد او من قريب بينهم 

نعم اطلعت عليه الآن  يوجد وجه شبه .. ولكن الحلول هنا افضل في التعامل مع النتيجة

اكرر شكري وامتناني ،،

  • Like 1
  • Thanks 1
قام بنشر

السلام عليكم

1 ساعه مضت, ابوخليل said:

وحل الأخ موسى الطف وأخف

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


احل اخى موسي يبدو الطف فى الشكل الظاهرى ولكن ليس بالضرورة أخف

تعتمد طريقة اخى موسى على انشاء سلسلة نصية و معالجة النص باستخدام (InStr وIIf) مما قد يكون بطئ نسبيا مع مرور الوقت وبالأخص مع وجود بيانات كبيرة

بينما تعتمد طريقتى المتواضعة على استخدام شروط منطقية صريحة (AND - OR - NOT) والتى بدورها سوف تكون اسرع مع محرك الاستعلام  لان التحقق يتم على القيم مباشرة دون تكوين سلاسل أو بحث نصي

 

قاعدة ذهبيه مع الاستعلامات :
دائما الأولوية للمنطق المباشر أفضل من الاعتماد على الحيل النصية 

قام بنشر
18 دقائق مضت, ابو جودي said:

تعتمد طريقة اخى موسى على انشاء سلسلة نصية و معالجة النص باستخدام (InStr وIIf) مما قد يكون بطئ نسبيا مع مرور الوقت وبالأخص مع وجود بيانات كبيرة

 

حبيبنا @ابو جودي اقرأ تعليق الأستاذ جعفر هنا 🙂 : 

في 12‏/7‏/2025 at 11:31, jjafferr said:

ملاحظة هامة:

اذا كان حجم الشاشة يعرض 30 سجل (مثلا) ، واذا كان عندنا استعلام به 100 او 10000 سجل (اي رقم اكبر من حجم العرض 30) ، وبغض النظر عن المحتويات والقيم  والاوامر والمعادلات في الاستعلام ،

فالاكسس يقوم بحساب السجلات المعروضة على الشاشة فقط ، وفي حالتنا فالاكسس يحسب نتائج 30 سجل فقط ،

وعليه ، اذا كان هذا الاستعلام هو مصدر بيانات لنموذج او تقرير ، فلن يكون هناك تأخير وبطئ في العرض (طبعا سيكون هناك بطئ بسيط ، ولكن ليس كما هو الاعتقاد السائد بأن البطئ سيلاحظه المستخدم) ،

فالمصطلح المتداول في البطئ ، هو اذا اردت جلب بيانات الاستعلام كاملا دفعة واحدة ، مثل اذا اردت ان تبحث عن قيمة معينة فيه ، او تصدير جميع البيانات دفعة واحدة الى ملف اكسل او pdf ، بينما لا يوجد بطئ عند الطباعة لان الطباعة تتطلب بيانات صفحة واحدة فقط وهي الصفحة التي يتم طباعتها حاليا (بمعنى آخر ، حتى لو اردت طباعة 1000 صفحة ، فانت تطبعها صفحة صفحة) .

مع ملاحظة تفادي استعمال فرز/تصفية للحقول التي بها معادلات والحقول التي تستعمل الامر Dlookup والحقول التي تنادي دوال خارجية ، لأنه هنا الاستعلام يجب ان يقوم بحساب قيم جميع السجلات ، ثم يقوم بعملية الفرز/التصفية.

 

لهذا السبب ، فمناداة دالة خارجية (فيها معادلات فقط) لا تعمل بطئ عند استعمالها ، حسب ملاحظاتي اعلاه 🙂

 

وحسب ما يظهر أن الاستعلام هنا لا يتعدى السبع سجلات ، وهي بعدد أيام الأسبوع. :rol:

  • Thanks 1
قام بنشر

الاكسس يقوم بحساب السجلات المعروضة على الشاشة فقط عندما يكون ذلك داخل نموذج وليس داخل استعلام 

هذا حسب فهمى المتواضع قد اكون مخطئ.

5 دقائق مضت, Moosak said:

وحسب ما يظهر أن الاستعلام هنا لا يتعدى السبع سجلات ، وهي بعدد أيام الأسبوع

ربما هذا الظاهر فقط الان :yes:

 

ولكن انا دائما مع الاستعلامات اعمل وفق هذه القاعدة الذهبية
دائما الأولوية للمنطق المباشر أفضل من الاعتماد على الحيل النصية 

 

 

عند فتح استعلام مباشرة (Query View أو من الكود) Access يقوم بتحميل كل السجلات دفعة واحدة وليس فقط الظاهرة على الشاشة

يعني:

سواء كان عندك 100 أو 1000,000 سجل

وسواء كان حجم الشاشة يعرض 30 فقط او حتى 10

بمجرد فتح الاستعلام مباشرة (من نافذة Access أو من الكود) يقوم Access

  • بتنفيذ الاستعلام بالكامل من البداية إلى النهاية
  • ويحسب ويقوم بمعالجة البيانات فى كل الأعمدة بما فيها الدوال مثل DLookup أو أي دوال خارجية
  • ثم يظهر أول 30 سجل فقط او اول 10 سجلات حسب حجم الشاشة لكن المعالجة تمت لكل السجلات بالفعل
قام بنشر

وتوضيحا فقط وحسب فهمى لقول استاذى الجليل ومعلمى القدير و والدى الحبيب الاستاذ جعفر
 

- الاكسس يعالج فقط السجلات المعروضة على الشاشة (مثلا 30)؟
صحيح فقط في حالة النماذج (Forms)
وغير صحيح في حالة فتح الاستعلام مباشرة أو في التقارير أو التصدير الاكسس ينفذ الاستعلام بالكامل ويحسب النتائج لكل السجلات


- إذا كان الاستعلام مصدرا لنموذج فلن يكون هناك بطء ملحوظ؟
صحيح إذا لم تستخدم دوال خارجية في حقول يتم عليها فرز/تصفية

لو كان هناك:
فرز أو تصفية على حقل فيه دالة DLookup أو دالة VBA خارجية أو تحميل بيانات من جدول كبير بدون فهرسة مناسبة


- الطباعة لا تسبب بطء لأنها تطبع صفحة صفحة؟
غير دقيق: الاكسس يقوم بتجهيز التقرير بالكامل قبل عرض أول صفحة أي دوال خارجية أو معادلات تحسب على كل السجلات قبل العرض والطباعة


- لا يوجد بطء عند استخدام دوال خارجية إذا لم تكن هناك عمليات فرز أو تصفية؟
صحيح تماما في حالة:
استخدام الاستعلام كمصدر نموذج أو عرض النتائج فقط دون فرز/تصفية على الحقول التي تنادي دوال خارجية
لكن عند فتح الاستعلام مباشرة أو فرز/تصفية الحقول المحسوبة الاكسس يجبر على حساب القيم لكل السجلات

 

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

قام بنشر

بالنسبة لي فحتى الآن لم اطبق  على السجلات

لكني من النظرة الاولى شدتني  المعايير وكثرتها في استعلام ابي جودي 

وكل له وجهة نظره التي يراها .. والتطبيق على ارض الواقع هو الفيصل

سوف يتعامل الاستعلام عندي  ما بين 1000 الى 1500 سجل في ابعد الأحوال

وسوف يتضح التنفيذ من النقرة الأولى  .. ويمكن ان احذوا حذو ما يفعله الاستاذ جعفر .. بأن اطبق على سجلات كثيرة جدا  بحيث يكون الفرق واضح

والبضاعة عندي :yes: يمكنني حينها اختار المناسب .. وكلنا اصحاب .. خلاص .. كل واحد يسلم على الثاني:gift2: 

  • Haha 1
قام بنشر

انا فقط اوضح وجهات نظرى حتى يصحح لى اساتذتى اى اخطاء فى الفهم او آلية التطبيق

فى البداية والنهاية انا مجرد طويلب علم وحتى لا يفهم مقصدى خطأ أكدت على انه مجرد طرح لوجهة نظر تحتمل الخطأ والصواب لا اكثر ولا اقل 

وفى النهاية الكل اساتذتى العظماء ادين لهم بكل الخير الفضل فانا اتعلم من الجميع سواء كان بشكل مباشر او بشكل غير مباشر اما لخطوات وتطبيقات او افكار

ولكن لن اتعلم ان لم اوضح ما يدور بخاطرى وبخلدى :biggrin:

قام بنشر

السلام عليكم

 

 

5 ساعات مضت, Moosak said:

اقرأ تعليق الأستاذ جعفر هنا 🙂 :

انا فخور أن مشاركاتي الطويلة يتم قراءتها ويُستفاد منها 🙂

 

 

 

11 ساعات مضت, ابوخليل said:

نريد دالة في الاستعلام المرفق و في حقل day_id  الذي يمثل رقم اليوم في الاسبوع

انا دائما انظر لعملي ، انه بعد 3 اشهر او اكثر ، يرجع لي المستخدم بطلب تعديل ، وانا اكون نسيت تفاصيل برنامجي.

لهذا السبب ، فلا آخذ بطريق اخوي موسى ولا ابو جودي (معلش ، محدش يزعل :biggrin:) ،

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

اما لتعديل اي شيء في معادلات اخوي ابو جودي وموسى ، فأنا مضطر احك راسي الى ان افهم شو اللي كنت عامله سابقا ، ثم افكر في مكان التعديل.

ولما تستخدم دالة خارجية ، استخدم ElseIf او Case قدر الامكان ، ومع انه قد يكون عندك 100 سطر كود (مثلا) ، إلا انك في الواقع تستعمل بضع اسطر فقط ، وتكون الدالة سريعة.

 

 الدليل خير برهان 🙂
 

اخوي موسى فهم كلامي بالطريقة الصحيحة 🙂

ارفق مثال بسيط لأثبت قولي:

 

عندنا جدولين

image.png.2a7ace08d5621bc2cf2273c26505f0c3.png

.

واستعلام فيه الامر Dlookup ، وانادي الدالة Add_One

image.png.9e27e5c2d5bae1bba56304c9dbc48402.png

.

الدالة Add_One

Function Add_One(ID As Long, N As Long) As Double

    Add_One = N + 1.5
    
    If ID = 55 Then
        Add_One = 55
    End If
    
End Function

.

 

الان نريد ان نثبت ان الاستعلام 

5 ساعات مضت, Moosak said:

فالاكسس يقوم بحساب السجلات المعروضة على الشاشة فقط

.

سأقوم بتوقيف الاستعلام عندما يعرض على الشاشة السجل Auto_ID=55 ،

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

 

image.png.bb0e983227e1a82d86478d5c110d7f40.png

.

وهنا قمت بتشغيل الاستعلام ، واظهرت 27 سجل فقط ، ثم 27 سجل آخر 27+27=54 ،

ثم طلبت عرض السجل Auto_ID=55 ، فلم يعطني الاكسس الجواب ، لأنه كان بحاجة الى تمرير البيانات الى الدالة للحصول على نتيجة الدالة ، وهنا توقف الكود.

image.thumb.gif.30b2d1e135f351b00fde2189bd40d230.gif

.

 

 

1637.Query_Records.accdb

  • Thanks 1
قام بنشر
20 دقائق مضت, jjafferr said:

وهنا قمت بتشغيل الاستعلام ، واظهرت 27 سجل فقط ، ثم 27

بعد اذن استاذى الجليل و معلمى القدير 
تجربة عملية:
أضف Debug.Print ID داخل دالة Add_One

افتح الاستعلام ولا تعرض سجلات اخرى

افتح محرر الاكواد وانظر الى النتيجة تجد انه تم معالجة كل البيانات دفعة واحده

تجربة عملية رقم (2)

اعتذر عندى مشكلة لا استطيع اضافة اى مرفقات

 

من فضلك قك بانشاء جدولا من خلال الاستعلام التالى 
 

CREATE TABLE tblFunctionCalls (
    ID AUTOINCREMENT PRIMARY KEY,
    FunctionName TEXT(50),
    CallTime DATETIME,
    Param1 DOUBLE,
    Param2 DOUBLE,
    ResultValue DOUBLE,
    ContextInfo TEXT(100)
);



انظر الى الكود التالى بتعديل بسيط 
 

Public Function Add_One(lngID As Long, dblN As Double) As Double
    Dim dblResult As Double
    dblResult = dblN + 1.5
    
    If lngID = 55 Then
        dblResult = 55
    End If
    
    ' تسجيل الاستدعاء في الجدول
    On Error Resume Next
    CurrentDb.Execute "INSERT INTO tblFunctionCalls (FunctionName, CallTime, Param1, Param2, ResultValue, ContextInfo) " & _
                      "VALUES ('Add_One', Now(), " & lngID & ", " & dblN & ", " & dblResult & ", '" & Nz(Application.CurrentObjectName, "Unknown") & "')"
    On Error GoTo 0
    
    Add_One = dblResult
End Function

 الان قم بفتح الاستعلام ولا تحرك الشاشة ولا تعرض اى سجلات

اغلق الاستعلام

انظر الى الجدول 

قام بنشر
7 دقائق مضت, ابو جودي said:

أضف Debug.Print ID داخل دالة Add_One

تفضل يا سيدي

يعرض نتائج السجلات على الشاشة فقط

image.thumb.gif.d1ac001fd15c18fee96199582659d357.gif

قام بنشر

مع التجربة
عندما افتح الاستعلام واغلقه سريعا 
فقط يكون العدد 37 سجل فى الجدول الجديد
ولو فتحت الاستعلام وانتظرت ثوان اكثر من ذى قبل يكون 64 تقريبا

هذا يعني أن الاكسس كان يعالج باقي السجلات تدريجيا فقط في الخلفية رغم أنه تم فتح الاستعلام فقط ولم احاول استعراض اى عدد من السجلات

قام بنشر
8 دقائق مضت, ابو جودي said:

مع التجربة
عندما افتح الاستعلام واغلقه سريعا 
فقط يكون العدد 37 سجل فى الجدول الجديد
ولو فتحت الاستعلام وانتظرت ثوان اكثر من ذى قبل يكون 64 تقريبا

هذا يعني أن الاكسس كان يعالج باقي السجلات تدريجيا فقط في الخلفية رغم أنه تم فتح الاستعلام فقط ولم احاول استعراض اى عدد من السجلات

 

انت تأكد كلامي ولكن بعدد سجلات مختلف (قد يعتمد على العدد الذي تم عرضه) ،

فلو ان الاكسس "كان يعالج باقي السجلات تدريجيا فقط في الخلفية" ، لحصلت على العدد 100 ، وهو عدد سجلات الكامل في الجدول.

  • Like 1
قام بنشر

اذا السؤال الان
هل لو الاستعلام معقد ويعالج العديد من البيانات
اذا تتم المعالجة مع كل دفعة 

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

 

قام بنشر
2 دقائق مضت, ابو جودي said:

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

بالعكس ، فانت تقوم بجعل البرنامج بطئ بدون سبب !!

بما ان الاكسس يقوم بما عليه وبكل اريحية ، فلماذا تغير الوضع ؟

 

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

dim rst as dao.recordset
  
  set rst=currentdb.openrecordset("Select * From Query1")
  rst.movelast 
  rst.movefirst

 

او في النموذج المستمر ، عند تحميل النموذج:

docmd.gotorecord,,aclast
docmd.gotorecord,,acfirst

 

  • Haha 1
قام بنشر
1 ساعه مضت, jjafferr said:

تحميل بيانات الاستعلام التي تم معالجتها دفعة واحدة ، ولكنك ستدفع ثمن التأخير

يبدو اننى لم استطع صياغة السؤال بشكل مفهوم

انا اقصد انه تتم عملية حسابية معقدة
تستغرق مثلا من دقيقتين الى ثلاث دقائق

معنى هذا انه سوف يتم استغراق نفس الوقت لعدد السجلات التى سوف يتم عرضها

يعنى مثلا كل 27 او 30 سجل تحدث هذه العمليات اتستغرق ذلك الوقت ؟

ام انه من الافضل التطبيق للعمليات جميعها على كافة السجلات
ليتم بعد ذلك التنقل والاستعراض دون اعادة اجراء العمليات على كل دفعة سجلات ؟؟

 

 

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