nssj قام بنشر ديسمبر 21, 2021 قام بنشر ديسمبر 21, 2021 الإخوة الكرام .. إذا كنت في سجل معين في نموذج (FRM1) وأردت فتح نموذج آخر (FRM2) على نفس الموضع من خلال هذا الكود DoCmd.OpenForm "FRM2", acNormal, , "[ID]=" & ID, , acDialog يفتح هذا السجل فقط ولا يمكنني الانتقال بين السجلات حتى أزيل عامل التصفية فهل من طريقة لجعله يؤدي نفس المهمة ولكن بدون فلترة يعني وكأنني فتحت النموذج يدويا ثم طلبت الانتقال للسجل المطلوب
محمد أبوعبدالله قام بنشر ديسمبر 22, 2021 قام بنشر ديسمبر 22, 2021 السلام عليكم تفضل اخي الكريم Database3.rar تحياتي 2
jjafferr قام بنشر ديسمبر 22, 2021 قام بنشر ديسمبر 22, 2021 وعليكم السلام 🙂 وانا ادلو بدلوي : DoCmd.OpenForm "frm_03" Forms!frm_03!Id.SetFocus 'لست بحاجة الى هذا السطر DoCmd.FindRecord Me.Id, , , , , , True . الطريقة : كأنك فتحت النموذج الآخر وعملت Ctl+F ، فعندك جميع الاعدادات في نافذة البحث ، في السطر الاخير من الكود 🙂 جعفر 1
nssj قام بنشر ديسمبر 22, 2021 الكاتب قام بنشر ديسمبر 22, 2021 جزاك الله خيرا أخي الكريم محمد أبوعبدالله .. ولكن في هذه الطريقة إشكاليتان: 1- فبعد استخدامها ولو لمرة واحدة: فعند فتح النموذج الآخر بشكل عادي يفتح على السجل المخزن في الذاكرة، وتجاوزت هذه الإشكالية بأن أضفت في آخر الكود i = 0 ثم رأيت مشاركة الأخ jjafferr.. وطريقته ليست فيها هذه الإشكالية لكن تبقى الإشكالية الثانية في الطريقتين 2- النماذج المطلوب التطبيق عليها ليست في وضع منبثق، وأنا أفضل أن تفتح عند الطلب بهذا الكود بشكل منبثق أو مربع حوار، دون تغيير خصائص النموذج، لذلك استخدمت في الكود (acDialog) والخطأ مني منذ البداية كان ينبغي أن أرفق ملفا للتطبيق عليه .. فهذا هو الملف، مع العلم أني بعد إجراء المزيد من التجارب عدلت على الكود ليصبح DoCmd.OpenForm "FRM2", acNormal, , , , acDialog [Forms]![Frm2].Recordset.FindFirst "[ID]=" & ID ولكن أصبحت تخرج هذه الرسالة فهل هذا يعني أن علي أن أصرف النظر عن قضية فتح النموذج المستدعى بهذه الطريقة في وضع منبثق، وأكتفي بأن يفتح بطريقته الافتراضية ؟ OpenForm.accdb
تمت الإجابة jjafferr قام بنشر ديسمبر 22, 2021 تمت الإجابة قام بنشر ديسمبر 22, 2021 لما يكون النموذج في وضع Dialog (مو منبثق Popup) فيكون مثل نافذة رسائل الاكسس: بحيث لا تستطيع ان تستخدم اي من كائنات قاعدة البيانات ، غير الموجودة في نافذة الرسالة ، يتوقف الكود عند هذا السطر ولا يتحرك للسطر التالي إلا بعد اغلاق النافذة. لهذا السبب يجب عدم استخدام هذه الخاصية (النماذج) إلا في حالات جدا خاصة. الطريقة الاولى: لحل هذه المشكلة ، يجب علينا ارسال جميع المعلومات المطلوبة ، ضمن امر فتح النموذج FRM2 ، ويمكننا عمل هذا عن طريق المتغير OpenArgs الموجود كآخر متغير في امر فتح النموذج ، فيكون الكود: Private Sub Frm2_Click() 'since we open the Form in a Dialog mode, 'we cannot send any further lines of code until the Form is closed 'so while opening the Form, we will send further info in "OpenArgs" variable 'so that when Form 2 is open, we can process this data there. 'Coming from:FRM1, setfocus field:TNO, TNO value: me.TNO DoCmd.OpenForm "FRM2", acNormal, , , , acDialog, "FRM1|TNO|" & Me.TNO End Sub . وفي حدث "تحميل" النموذج FRM2 ، نطلب منه تحليل هذه المعلومة ، والقيام بالمطلوب : Private Sub Form_Load() On Error GoTo err_Form_Load If IsNull(Me.OpenArgs) Then GoTo No_OpenArgs Dim x() As String 'OpenArgs info: 'Coming from:FRM1 'setfocus field:TNO 'TNO value: me.TNO If Split(Me.OpenArgs, "|")(0) = "FRM1" Then x = Split(Me.OpenArgs, "|") Me(x(1)).SetFocus DoCmd.FindRecord x(2), , , , , , True End If No_OpenArgs: 'continue code here Exit_Form_Load: Exit Sub err_Form_Load: If Err.Number = 2142 Or Err.Number = 94 Or Err.Number = 9 Then 'ignore, No proper value from OpenArgs Resume No_OpenArgs Else MsgBox Err.Number & vbCrLf & Err.Description Resume Exit_Form_Load End If End Sub . الطريقة الثانية: Private Sub Frm2_Click() DoCmd.OpenForm "FRM_02", acNormal, , , , acDialog End Sub . وفي حدث "تحميل" النموذج FRM2 ، Private Sub Form_Load() On Error GoTo err_Form_Load Me.TNO.SetFocus DoCmd.FindRecord Forms!FRM_01!TNO, , , , , , True No_FRM: 'continue code here Exit_Form_Load: Exit Sub err_Form_Load: If Err.Number = 2145 Then 'ignore, No proper value from incoming Form Resume No_FRM Else MsgBox Err.Number & vbCrLf & Err.Description Resume Exit_Form_Load End If End Sub . جعفر 1
nssj قام بنشر ديسمبر 22, 2021 الكاتب قام بنشر ديسمبر 22, 2021 جزاك الله خيرا أخي الكريم جعفر .. لكن بصراحة لما شفت الأكواد قلت لحالي: ياااااه .. كل هذا عشان تعرض النموذج بهالطريقة .. وكان مالها الطريقة الافتراضية 😅 وكنت متخوف من الكود في حدث عند التحميل ، لأن لكل نموذج أكواد خاصة فيه عند التحميل وخفت تتعارض الأكواد أو يتسبب في بطء الفتح لكن بعد التطبيق هديت أعصابي 🙂 .. وما لاحظت بطء في فتح النماذج لكن في الطريقة الثانية كانت تخرج رسالة برقم (2450) عند فتح النموذج الثاني بطريقة عادية وليس من خلال النموذج الآخر .. وتمت معالجة المشكلة بإضافتها للكود If Err.Number = 2145 Or Err.Number = 2450 Then وختاما .. بحكم خبرتك أخي الكريم: بأي الطريقتين تنصحني، أنا بنظرتي السطحية أميل للطريقة الثانية لأن عدد أسطر الكود فيها أقل، وأنا مش قادر أتخلص من فكرة إنو قلة عدد أسطر الكود يعني إنو أسرع وأقل تعقيدا
jjafferr قام بنشر ديسمبر 23, 2021 قام بنشر ديسمبر 23, 2021 السلام عليكم 🙂 9 ساعات مضت, nssj said: كانت تخرج رسالة برقم (2450) عند فتح النموذج الثاني بطريقة عادية وليس من خلال النموذج الآخر .. وتمت معالجة المشكلة بإضافتها للكود If Err.Number = 2145 Or Err.Number = 2450 Then نعم هذه هي الطريقة الصحيحة ، ولا انصح ابدا بإستخدام On Error Resume Next إلا في حالات جدا ضيقة 🙂 9 ساعات مضت, nssj said: بأي الطريقتين تنصحني، أنا بنظرتي السطحية أميل للطريقة الثانية لأن عدد أسطر الكود فيها أقل بالنسبة لعملك ، فخذ الطريقة التي تريحك 🙂 وطبيعي ان الكمبيوتر يحتاج وقت لمعالجة كل سطر في الكود ، والوقت يعتمد على الامر الموجود في ذلك السطر ، وفي معظم الاحيان هذا الوقت جدا تافه ولا نعيره اهتماما ، خصوصا في الكمبيوترات الجديدة 🙂 اما الطريقة الاولى ، OpenArgs ، فلا يعرف الكثير من المبرمجين عنها ، والكثير من الذين يعرفون ، لا يعرفون بأن بامكانهم ارسال اكثر من معلومة بها 🙂 جعفر 1
الردود الموصى بها
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.