الشرح داخل المثال
فتح النموذج اكثر من مرة
هذا مثال للطريقة الشائعة في تطبيق هذه الفكرة على ملفك الذي أرفقته. واحد من المصادر الكثيرة التي تجد فيها بعض الشرح http://allenbrowne.com/ser-35.html
بارك الله فيك و جعله في ميزان حسناتك
أحمد مبارك الحيقي كتب:هذا مثال للطريقة الشائعة في تطبيق هذه الفكرة على ملفك الذي أرفقته. واحد من المصادر الكثيرة التي تجد فيها بعض الشرح http://allenbrowne.com/ser-35.html
اخي العزيز قمت بتجربة المثال و هو رائع بالفعل
و لكن عندما اقوم بتشغيل بعض الدوال على النموذج الجديد تظهر رسالة خطأ معنا تعذر العثور على النموذج مع العلم ان النموذج مفتوح
كل ما اريده هو معرفة الاسم الجديد للنموذج الذي تم فتحه.
sayed fox كتب:اخي العزيز قمت بتجربة المثال و هو رائع بالفعل
و لكن عندما اقوم بتشغيل بعض الدوال على النموذج الجديد تظهر رسالة خطأ معنا تعذر العثور على النموذج مع العلم ان النموذج مفتوح
كل ما اريده هو معرفة الاسم الجديد للنموذج الذي تم فتحه.
متى تستدعي الدالة ومن أين؟ إذا كان الاستدعاء يتم من خارج النموذج كما يظهر، فعلى أي أساس تريد تحديد النموذج المختار؟ المزيد من التفاصيل (وربما الملف الذي يحوي الخطأ) سيساعد بإذن الله...
لا عليك أخي الكريم، هذا هو الملف بعد التعديل... لاحظ من فضلك استخدام الخاصية OpenArgs عند استدعاء نموذج اختيار الاسم، وعند تحديد نموذج التقرير المطلوب، وذلك من أجل التمييز بين النماذج التي تكون عناصر مجموعة العناصر colCustomerForms...
لا تنس أن النماذج هنا هي عناصر في مجموعة العناصر هذه، لذلك عليك أن تختار واحداً من items مجموعة العناصر بمفتاحه المناسب (Hwnd) عندما تريد التعامل مع أحدها.
في حالة أي استفسار، أرجو ألا تتردد...
والله أعلم.
أثابك الله بدعائك أخي الكريم، وأعتذر عن التأخير...
بالنسبة للاستفسار الأول، فلا داعي لتمرير اسم النموذج إلى التقرير، وإنما يمكن تمرير شرط الاستعلام من كل نموذج عند استدعاء التقرير (كما تجد في الملف المرفق). لاحظ أن مصدر التقرير قد تم تغييره إلى الجدول كاملاً، وتمت تصفية السجلات عند استدعاء كل تقرير من أي نموذج...
ثانياً، لست أعلم حالياً طريقة لعمل نفس النسخ للتقرير مثل النماذج (لأن النماذج لها Classes يمكن أن تأخذ منها Instances، وليس للتقارير المثيل)، هذا يعني أن على المستخدم إغلاق التقرير الأول (بالشرط الأول من نموذج ما) ثم فتح التقرير من نموذج آخر بشرط آخر (يمكنك أن تلاحظ ذلك في الملف المرفق)...
بيد أنه إن كان من الضروري تشغيل أكثر من نسخة من نفس التقرير في نفس الوقت، فإن هناك فكرة أن يتم إنشاء تقرير جديدة (كنسخة من نفس التقرير) مع كل استدعاء من نموذج، ثم حذفها بعد ذلك بطريقة ما...
والله أعلم.
اخي الغالي
اعرف اني قد اثقلت عليك و لكن هذا واجب المسلم تجاه اخيه المسلم
اثابك الله و ثبت خطاك
الذي اريده هو كيفية تمرير اسم النموذج الى الاستعلام
حيث انني اقوم بعمل استعلامات ثم اقوم بتحويلها الى اكواد SQL مثل الاستعلام الاتي
مع العلم اني اقوم بوضع هذه الاكواد في دوال FUNCTION بعيدة عن النماذج و اقوم باستدعائها من النموذج عن طريق CALL
INSERT INTO [ALL] ( Name, Tell1, TARIKH )
SELECT Customer.Name, Customer.Tell1, Customer.TARIKH
FROM Customer
WHERE (((Customer.Name)=[FORMS]![REP]![N]) AND ((Customer.TARIKH) Between [FORMS]![REP]![D1] And [FORMS]![REP]![D2]));
تم تعديل هذه المشاركة بواسطة sayed fox في 8 ديسمبر 2009 في 10:58
أخي العزيز، لا عليك، ولكن أرجو أن يصلح الله نيتي ويتقبل مني، اللهم آمين...
لا تستطيع تمرير اسم النموذج بهذا الشكل، لأن هناك أكثر من نسخة، ولكننا لسنا بحاجة إلى طرق معقدة من أجل المطلوب في ردك الأخير، فهناك العديد من الطرق لتنفيذه...
واحد من الأساليب الممكنة هو تمرير اسم الزبون وتاريخي البداية والنهاية على شكل معاملات parameters للدالة أو الإجراء الذي تستدعيه، كما يلي:
Public Sub AddSomeRecords (strName As String, datFrom As Date, datTo As Date) ... ... strSQL = "INSERT INTO [ALL] ( Name, Tell1, TARIKH ) " & _ "SELECT Customer.Name, Customer.Tell1, Customer.TARIKH " & _ "FROM Customer " & _ "WHERE Customer.Name ='" & strName & "' AND Customer.TARIKH Between #" & datFrom & "# And #" & datTo & "#" ... ... End Sub
لاحظ أنك ستستدعي هذا الإجراء من داخل كل نموذج كالتالي:
Call AddSomeRecords(Me.n, Me.D1, Me.D2)
أرجو أن تكون الفكرة قد وصلت، وفي انتظار أي استفسار...
والله أعلم.
تم تعديل هذه المشاركة بواسطة أحمد مبارك الحيقي في 8 ديسمبر 2009 في 17:57
اخي الغالي
كيف اسوي هذه الدالة بالطريقة السابقة حاولت كثيرا و لكن للاسف كل محاولاتي باءت بالفشل
ملحوظة اريد تطبيقها كدالة و ليس sub و كيف استدعي هذه الدالة
Function Rep_01()
DoCmd.RunSQL "INSERT INTO Rep_DaftrOstaz_02 ( Tarikh, Mokafea_M, Mokafea_D, ACC ) SELECT ACC00_ALL.Tarikh, NZ([Mokafea_M],0) AS M, NZ([Mokafea_D],0) AS D, ACC00_ALL.ACC FROM ACC00_ALL WHERE (((ACC00_ALL.Tarikh) Between [FORMS]![Rep]![D1] And [FORMS]![Rep]![D2]) AND ((ACC00_ALL.ACC)=[Forms]![Rep]![ACC]));"
DoCmd.RunSQL "UPDATE Rep_DaftrOstaz_02 SET Rep_DaftrOstaz_02.Maden = [Mokafea_M]/[sarfPrice] WHERE (((Rep_DaftrOstaz_02.Mokafea_M)>0) AND ((Rep_DaftrOstaz_02.Omla_Name)=[Forms]![Rep]![Omla_Name]));"
DoCmd.RunSQL "UPDATE Rep_DaftrOstaz_02 SET Rep_DaftrOstaz_02.Maden = [Mokafea_M]/[Forms]![Rep]![sarfPrice] WHERE (((Rep_DaftrOstaz_02.Mokafea_M)>0) AND ((Rep_DaftrOstaz_02.Omla_Name)<>[Forms]![Rep]![Omla_Name]));"
End Function
تم تعديل هذه المشاركة بواسطة sayed fox في 9 ديسمبر 2009 في 15:15
لنفترض أخي العزيز أن هذه الدالة في وحدة نمطية module:
Public Function Rep_01(intAcc As Integer, datFrom As Date, datTo As Date, strOmlaName As String) As Boolean DoCmd.RunSQL "INSERT INTO Rep_DaftrOstaz_02 ( Tarikh, Mokafea_M, Mokafea_D, ACC ) SELECT ACC00_ALL.Tarikh, NZ([Mokafea_M],0) AS M, NZ([Mokafea_D],0) AS D, ACC00_ALL.ACC FROM ACC00_ALL WHERE ACC00_ALL.Tarikh Between #" & datFrom & "# And #" & datTo & "# AND ACC00_ALL.ACC=" & intAcc DoCmd.RunSQL "UPDATE Rep_DaftrOstaz_02 SET Rep_DaftrOstaz_02.Maden = [Mokafea_M]/[SarfPrice] WHERE (((Rep_DaftrOstaz_02.Mokafea_M)>0) AND ((Rep_DaftrOstaz_02.Omla_Name)='" & strOmlaName & "'" DoCmd.RunSQL "UPDATE Rep_DaftrOstaz_02 SET Rep_DaftrOstaz_02.Maden = [Mokafea_M]/[Forms]![Rep]![SarfPrice] WHERE (((Rep_DaftrOstaz_02.Mokafea_M)>0) AND ((Rep_DaftrOstaz_02.Omla_Name)<> '" & strOmlaName & "'" Rep_01 = True End Function
عليك بالطبع إضافة جزء لتعقب أيو أخطاء وإعادة False في حالة وجود خطأ...
أما استدعاء هذه الدالة فيكون من النموذج، بدون الحاجة لتحديد أي اسم، لأن الاستدعاء سيمرر قيم الحساب والتاريخين واسم العملة كمعاملات للدالة، باستخدام القيم المحلية في كل نموذج، مثل التالي:
bolFlag= Rep_01(Me.Acc, Me.FromDate, Me, ToDate, Me.OmlaName))
لاحظ أن استدعاء الدالة يقتضي استقبال قيمتها المعادة في أي متغير (افترضت أن الدالة تعيد قيمة خطأ أو صواب)...
إن كان ما يزال هناك غموض، أرجو تحديد الجزئية غير المفهومة من أجل التفصيل...
أحمد مبارك الحيقي كتب:لنفترض أخي العزيز أن هذه الدالة في وحدة نمطية module:
Public Function Rep_01(intAcc As Integer, datFrom As Date, datTo As Date, strOmlaName As String) As Boolean DoCmd.RunSQL "INSERT INTO Rep_DaftrOstaz_02 ( Tarikh, Mokafea_M, Mokafea_D, ACC ) SELECT ACC00_ALL.Tarikh, NZ([Mokafea_M],0) AS M, NZ([Mokafea_D],0) AS D, ACC00_ALL.ACC FROM ACC00_ALL WHERE ACC00_ALL.Tarikh Between #" & datFrom & "# And #" & datTo & "# AND ACC00_ALL.ACC=" & intAcc DoCmd.RunSQL "UPDATE Rep_DaftrOstaz_02 SET Rep_DaftrOstaz_02.Maden = [Mokafea_M]/[SarfPrice] WHERE (((Rep_DaftrOstaz_02.Mokafea_M)>0) AND ((Rep_DaftrOstaz_02.Omla_Name)='" & strOmlaName & "'" DoCmd.RunSQL "UPDATE Rep_DaftrOstaz_02 SET Rep_DaftrOstaz_02.Maden = [Mokafea_M]/[Forms]![Rep]![SarfPrice] WHERE (((Rep_DaftrOstaz_02.Mokafea_M)>0) AND ((Rep_DaftrOstaz_02.Omla_Name)<> '" & strOmlaName & "'" Rep_01 = True End Functionعليك بالطبع إضافة جزء لتعقب أيو أخطاء وإعادة False في حالة وجود خطأ...
أما استدعاء هذه الدالة فيكون من النموذج، بدون الحاجة لتحديد أي اسم، لأن الاستدعاء سيمرر قيم الحساب والتاريخين واسم العملة كمعاملات للدالة، باستخدام القيم المحلية في كل نموذج، مثل التالي:
bolFlag= Rep_01(Me.Acc, Me.FromDate, Me, ToDate, Me.OmlaName))لاحظ أن استدعاء الدالة يقتضي استقبال قيمتها المعادة في أي متغير (افترضت أن الدالة تعيد قيمة خطأ أو صواب)...
إن كان ما يزال هناك غموض، أرجو تحديد الجزئية غير المفهومة من أجل التفصيل...
ا اخي الغالي
اعتذر لك عن تاخري على الرد عليك
ان شاء الله سوف اقوم بتجربة هذه الاكواد