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

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


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

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

السلام عليكم ورحمة الله وبركاتة 

يوجد بالمرفق 

مثال يحتوي على ثلاثة نماذج 

frm1   و frm2  نقوم من خلالهما فتح النموذج frm 

وعند فتح النموذج وضعت في الحدث عند النقر 

        Me.Visible = False

وعند اغلاق النموذج frm 

حدث 

Forms![frm1].Visible = True

 

بما ان النموذج frm يمكن استدعائه من اكثر من نموذج 

المطلوب :

عند اغلاق النموذج frm 

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

Forms![].Visible = True

أتمنى يكون المطلوب واضح 

visbelform.accdb

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

تفضل أخي السهران 🙂 

تم تعريف متغير عام في موديول يحفظ اسم النموذج الأخير ، ومن ثم يستدعيه مجددا عند إغلاق النموذج frm

visbelform.accdb

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

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

 

مثل ما يقول المثل: اش لك في البحر واهواله ، و رزق الله على السيف 🙂

فيه طريقة اسهل من طريقة اخوي موسى السهلة 🙂

 

في امر فتح النموذج ، في آخر متغير في هذا الامر ، هناك متغير اسمه OpenArgs ، 

استعمله في ارسال اسم النموذج الذي تريد تفتحه ، هكذا (لا تغير في السطر شيء ، إلا اذا اردت ان تضيف امر تصفية ، او ارسال معلومات اخرى في المتغير OpenArgs) :

DoCmd.OpenForm "frm", , , , , , me.name

.

وعند اغلاق النموذج frm1 او frm2 ، اكتب :

Forms(me.openargs).Visible = True

 

جعفر

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

39 دقائق مضت, jjafferr said:

في امر فتح النموذج ، في آخر متغير في هذا الامر ، هناك متغير اسمه OpenArgs ، 

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

الان نأتي للشق الاهم في هذه الكود 

38 دقائق مضت, jjafferr said:

إلا اذا اردت ان تضيف امر تصفية ، او ارسال معلومات اخرى في المتغير OpenArgs) :

كيف اضيف عامل التصفية حسب السجل الذي يقع عليه التركيز في مربع القائمة 

    DoCmd.OpenForm "frm_QualityEvaluation", , , , , acDialog, LisetViewData

 

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

36 دقائق مضت, alsihran said:
DoCmd.OpenForm "frm_QualityEvaluation", , , , , acDialog, LisetViewData

 

اولا:

اذا كان LisetViewData اسم النموذج الذي انت عليه الآن ، فتقدر تكتب السطر كالتالي (حيث me.name معناه اسم النموذج الذي انت فيه الآن) :

DoCmd.OpenForm "frm_QualityEvaluation", , , , , acDialog, me.name

 

ثانيا:

منذ ساعه, alsihran said:

كيف اضيف عامل التصفية حسب السجل الذي يقع عليه التركيز في مربع القائمة

بالنسبة للتصفية ، فاثناء كتابتك للامر ، سترى ان الاكسس يخبرك المتغير الذ يجب ان تكتبه ، ومنها Filter و Where ، ولاحظ آخر امر هو OpenArgs الذي تكلمت عنه

image.png.07dac34a652d003eb3a163fbdd7d3855.png

.

فإذا اردت تصفت النموذج frm بحقل الرقم ID مثلا واسم مربع القائمة lst_1 ، فيصبح الامر 

docmd.OpenForm "frm",,,"[ID]=" & me.lst_1,,acDialog, me.name
  
  واذا كان الحقل نص
  
docmd.OpenForm "frm",,,"[ID]='" & me.lst_1 & "'",,acDialog, me.name  

.

جعفر

منذ ساعه, Moosak said:

معلومة جديدة 😄👌🏼

سترى معلومات اكثر عن هذا المتغير هنا

.

 

جعفر

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

منذ ساعه, Moosak said:

معلومة جديدة 😄👌🏼

:wallbash:

متأكد استاذ موسى 😄 بالامس تحدثنا عن ذلك

وطالما تمكنا من تمرير قيمة حقل ممكن تمرير اسم النموذج او تسميته الخ

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

مثلا اذا كان الرقم المحمل 1 يكون النموذج خاص بجدول التدريب 2 يكون النموذج لجدول المؤهلات 3 يعرض اسماء المدن الخ

مع امكانية التحكم بالحقول والتسميات والتنسيق كل ذلك بناء على الرقم المحمل

 

عذرا اخ @jjafferrكتب الرد اوف لاين ولم اشاهد ردك

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

6 دقائق مضت, مبرمج سابق said:

متأكد استاذ موسى 😄 بالامس تحدثنا عن ذلك

لا تلومني العتب على النظر 😂

6 دقائق مضت, مبرمج سابق said:

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

مثلا اذا كان الرقم المحمل 1 يكون النموذج خاص بجدول التدريب 2 يكون النموذج لجدول المؤهلات 3 يعرض اسماء المدن الخ

مع امكانية التحكم بالحقول والتسميات والتنسيق كل ذلك بناء على الرقم المحمل

لا هذي يبغالها شرح عملي 😏

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

11 ساعات مضت, jjafferr said:

فإذا اردت تصفت النموذج frm بحقل الرقم ID مثلا واسم مربع القائمة lst_1 ، فيصبح الامر 

الله يعطيك العافية استاذ 

هذا عامل تحديد السجل في النموذج الذي نستدعية 

يجلب البيانات من SqlServer

وهو يعمل بشكل سليم 

rs.Open "SELECT * FROM tbl_QualityEvaluation WHERE id_Ccallg = '" & OpenArgs & "' And Deletrecord =1  ORDER BY tbl_QualityEvaluation.id_Ccallg DESC;", sqldb

 

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

يظهر خطأ حيث ان المتغير OpenArgs  يقرأ النموذج  ولا يقرأ حقل التصفيه 

كما هو موضح بالصورة 

image.png.3e1f5a7c03503359ab826f8d22d8e076.png

 

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

20 دقائق مضت, alsihran said:

حيث ان المتغير OpenArgs  يقرأ النموذج  ولا يقرأ حقل التصفيه 

 

الله يطول عمرك ، انت خلطت الحابل بالنابل !!

احنا استعملنا المتغير OpenArgs لإرسال اسم النموذج ، وهو يعمل بطريقة صحيحة حسب الصورة اعلاه ،

ولكنك هنا تحتاج الى:

12 ساعات مضت, jjafferr said:

فإذا اردت تصفت النموذج frm بحقل الرقم ID مثلا واسم مربع القائمة lst_1 ، فيصبح الامر

فإذن استعمل الحقل ID هنا (ID هو عبارة عن حقل فيه قيمة فريدة تميز السجلات) 🙂

 

جعفر

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

30 دقائق مضت, jjafferr said:

فإذن استعمل الحقل ID هنا (ID هو عبارة عن حقل فيه قيمة فريدة تميز السجلات)

نعم استاذ 

 مربع القائمة اول حقل به هو حقل فريد 

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

DoCmd.OpenForm "frm_QualityEvaluation", , , , , acDialog, LisetViewData

هل افهم من هذا ان الأمر لايصلح مع اضافة اسم النموذج لتنفيذ هذا الكود 

rs.Open "SELECT * FROM tbl_QualityEvaluation WHERE id_Ccallg = '" & OpenArgs & "' And Deletrecord =1  ORDER BY tbl_QualityEvaluation.id_Ccallg DESC;", sqldb

 

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

 

32 دقائق مضت, alsihran said:
DoCmd.OpenForm "frm_QualityEvaluation", , , , , acDialog, LisetViewData

الامر DoCmd.OpenForm لفتح النموذج frm_QualityEvaluation ، 

السؤال: ما هو الحقل LisetViewData وما قيمته ؟

سؤالك الاصل كان :

18 ساعات مضت, alsihran said:

frm1   و frm2  نقوم من خلالهما فتح النموذج frm

لهذا السبب انا اقترحت عليك استعمال المتغير OpenArgs في امر فتح النموذج (لاحظ اننا ارسلنا اسم النموذج الذي نحن عليه الآن me.name كقيمة عن المتغير OpenArgs) :

DoCmd.OpenForm "frm", , , , , , me.name

 

وانتهى الكلام عن فتح واغلاق النموذج 

----------------------------------------------------------

فتح النموذج على السجل الذي نحن عليه الآن

14 ساعات مضت, alsihran said:

كيف اضيف عامل التصفية حسب السجل الذي يقع عليه التركيز في مربع القائمة

.

والجواب كان (رجاء التركيز على جملة التصفية فقط  image.png.64d1d78df39a375dbb0d9ac82287c8e2.png ) :

docmd.OpenForm "frm",,,"[ID]='" & me.lst_1 & "'",,acDialog, me.name  

.

ولكنك في جملة rs التالية استعملت OpenArgs بدل عن me.lst_1

rs.Open "SELECT * FROM tbl_QualityEvaluation WHERE id_Ccallg = '" & OpenArgs & "' And Deletrecord =1  ORDER BY tbl_QualityEvaluation.id_Ccallg DESC;", sqldb

 

=======================================================

 

اعتقد سؤالك كان لازم يكون كالتالي:

1. frm1   و frm2  نقوم من خلالهما فتح النموذج frm ، وعند اغلاق frm اريد ارجع للنموذج الذي تم فتحة منه ،

2. عند فتح النموذج frm عندي جملة SQL لفتح سجل معين في النموذج frm ، وهذا السجل هو السجل الذي يقع عليه التركيز في مربع القائمة في النموذج frm1 او frm2 .

 

رجاء تأكد لي ان مفهومي صحيح علشان اكتب لك الرد ،

واذا كان مفهومي غير صحيح ، فرجاء تعطينا الصورة كامله عن قصدك ، لأني الى الآن ما فاهم !!

 

جعفر

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

6 دقائق مضت, jjafferr said:

اعتقد سؤالك كان لازم يكون كالتالي:

هذا صحيح استاذ 

كان سؤالي بقصد الرجوع للنموذج اللي استدعى النموذج 

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

الل هذا هو 

DoCmd.OpenForm "frm_QualityEvaluation", , , , , acDialog, LisetViewData

وعند فتح النموذج يتم طلب الذهاب الى السجل برقم Id الذي يحمله المتغير OpenArgs 

من خلال هذا الكود 

rs.Open "SELECT * FROM tbl_QualityEvaluation WHERE id_Ccallg = '" & OpenArgs & "' And Deletrecord =1  ORDER BY tbl_QualityEvaluation.id_Ccallg DESC;", sqldb

 

مع ملاحظة انه 

عند استدعاء النموذج من frm1 يتم بدون طلب تصفية سجلات 

وعند استدعائه من النموذج frm2 يتم طلب تصفية السجلات 

كنت اتمنى ارفع المثال لتكون الصورة اوضح 

لكن مشكلة الارتباط ب Sqlserver تجعل الامر معقد 

ان شاء الله قدرت اوضح الفكرة 

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

  • أفضل إجابة

جميل ،

اذن LisetViewData ليس اسم النموذج ،

 

سوف نرسل قيمتين في المتغير OpenArgs ،

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

DoCmd.OpenForm "frm_QualityEvaluation", , , , , acDialog, me.name & "|" & LisetViewData

.

عند اغلاق النموذج frm_QualityEvaluation ، اكتب :

dim x() as string
  x=split(me.openargs,"|")
Forms(x(0)).Visible = True
  
  
  او
Forms(split(me.openargs,"|")(0)).Visible = True  

.

وبالنسبة للسجل:

dim x() as string
  x=split(me.openargs,"|")
rs.Open "SELECT * FROM tbl_QualityEvaluation WHERE id_Ccallg = '" & x(1) & "' And Deletrecord =1  ORDER BY tbl_QualityEvaluation.id_Ccallg DESC;", sqldb

  
  
  او
rs.Open "SELECT * FROM tbl_QualityEvaluation WHERE id_Ccallg = '" & split(me.openargs,"|")(1) & "' And Deletrecord =1  ORDER BY tbl_QualityEvaluation.id_Ccallg DESC;", sqldb

.

جعفر

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

33 دقائق مضت, مبرمج سابق said:

لماذا استخدمت متغير نصي

من واقع خبرتي ، كنت استعمل متغير variant ، ولكن صادقتني مشاكل فيه ، فتحولت الى نص ، والحمدلله بدون مشاكل الى اليوم 🙂

طبعا لاحقا ، يمكننا تحويل كل جزء/قيمة الى اصلها عن طريق الاوامر CInt و Cdate .

 

هل فيه اشكال في هذا الاستعمال؟

 

جعفر

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

42 دقائق مضت, jjafferr said:

هل فيه اشكال في هذا الاستعمال؟

لا لايوجد اشكال

بعد ردك جربت مع OpenArgs لحقول مختلفة وبعضها null ولم اجد مشكلة

اما سبب السؤال فقد اعتدت ان استخدم متغير variant اذا كانت الحقول مختلطة

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

تحياتي ايها المعلم الفاضل

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

4 ساعات مضت, jjafferr said:

سوف نرسل قيمتين في المتغير OpenArgs ،

اظهر رسالة خطأ

مع العلمانه تم قرائة رقم السجل من المتغير بشكل صحيح كماهو في الصورة 

image.png.c4d31a41ae288d4f5e9d8ee9218c34c5.png

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

سيدي الفاضل ، ما اعرف وين المشكلة ، ولكن خلينا نحاول نصيدها ، بتجزئة الكود 🙂

 

شو نوع الحقل id_Ccallg ، نص او رقم ؟

 

1. اوقف عمل الاسطر 1 و 2 و 3 (اعمل الاشارة ' على يسار السطر ، او كلمة Rem) ، والمفروض الكود يعطيك كل النتائج حسب Deletedrecord=1 ،

2. اسمح للاسطر 1 و 3 بالعمل ، والمفروض تحصل على نفس الخطأ السابق (هنا نتعامل مع الحقل id_Ccallg كنص)

2. اوقف السطر 1 ، واجعل السطر 2 يعمل (هنا نتعامل مع الحقل id_Ccallg كرقم)

    Dim x() As String, myWhere As String
    x = Split(Me.OpenArgs, "|")
    
    myWhere = "[id_Ccallg]='" & x(1) & "'"     '1
    'myWhere = "[id_Ccallg]=" & CInt(x(1))     '2
    myWhere = myWhere & " And"                 '3
    myWhere = myWhere & " [Deletrecord]=1"
    
    rs.Open "SELECT * FROM tbl_QualityEvaluation WHERE myWhere ORDER BY id_Ccallg DESC;", sqldb

 

جعفر

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

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