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

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


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

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

السلام عليكم

لدي نموذج fxy يحتوي على نموذجين  fx  , fy  احتاج عند الضغط على اي حقل في النموذج fx يبحث عن قيمة هذا الحقل في النموذج fy ثم ينقل التركيز للتشابه ان وجد وفي حال لم يكن هناك قيمة مشابهة تظهر سالة بعدم وجود تشابة

Capture.PNG

fxy.accdb

تم تعديل بواسطه ازهر عبد العزيز
رابط هذا التعليق
شارك

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

 

عملتها بطريقة تختلف ، عن طريق التنسيق الشرطي:

في النموذج fy اضفت حقل مخفي غير مربوط بمصدر بيانات ، اسميته tmp_yyy

وفي التنسيق الشرطي للحقل yyy استعملت :

image.png.74e4ad677f2fcde94f9b9237cdd447b5.png

.

بينما في النموذج fx ، وعلى حدث الحالي ، ارسل قيمة الحقل الذي انقر عليه ، الى الحقل tmp_yyy في النموذج fy :

Private Sub Form_Current()
On Error GoTo err_Form_Current

    Me.Parent!fy!tmp_yyy = Me.xxx

Exit_Form_Current:

    Exit Sub
err_Form_Current:

    If Err.Number = 2455 Then
        'could not see othe Form on startup
        Resume Next
    Else
        MsgBox Err.Number & vbCrLf & Err.Description
    End If
    
End Sub

 

جعفر

1470.fxy.accdb.zip

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

الاستاذ المبدع @jjafferr  شكرا لمرورك

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

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

12 ساعات مضت, ازهر عبد العزيز said:

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

اذا تغير النماذج الفرعية ، بدل ان تكون نموذج بيانات الى نموذج مستمر ، فالحل سيكون اسهل للجميع 🙂

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

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

اذا تغير النماذج الفرعية ، بدل ان تكون نموذج بيانات الى نموذج مستمر ، فالحل سيكون اسهل للجميع 🙂

🌼

 

تم تعديل بواسطه ازهر عبد العزيز
رابط هذا التعليق
شارك

  • أفضل إجابة

تفضل 🙂

 

ضع هذا الكود في النموذج fx

Option Compare Database
Option Explicit

    Dim rst_fy As DAO.Recordset
    Dim rst_n As Integer
'

Private Sub xxx_Click()

    'take the Recordset one time, use it many times
    If rst_n = 0 Then
        Set rst_fy = Forms!fxy!fy.Form.RecordsetClone
        rst_n = 1
    End If
    rst_fy.MoveFirst
    
    rst_fy.FindFirst "yyy='" & Me.xxx & "'"
    If rst_fy.NoMatch Then
        MsgBox "لا يوجد تطابق"
    Else
        MsgBox "يوجد تطابق"
        Me.Parent!fy.Form.Bookmark = rst_fy.Bookmark
        Me.Parent!fy.SetFocus
    End If
    
    rst_fy.Close
    
End Sub

.

جعفر

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

استاذ @jjafferr في حال لايوجد  بيانات في النموذج  FY يظهر ERROR  وضعت هذا  الامر ل 

rst_fy.OpenRecordset

بدل هذا الجزء 

rst_fy.MoveFirst

هل صحيح هذا التغير ام توجد طريقة افض

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

Dim rst_fy As DAO.Recordset
Dim rs As DAO.Recordset
Dim IsExists As Boolean
Set rs = [Forms]![fxy]![fy].Form.RecordsetClone
With rs
  If Not (.BOF And .EOF) Then .MoveFirst
    Do While Not .EOF
    IsExists = (!yyy = Me.xxx)

  If IsExists Then Exit Do
  .MoveNext
  Loop
  .Close
End With
Set rs = Nothing
If IsExists Then
MsgBox "الرقم موجود" & Me.xxx
        Set rst_fy = Forms!fxy!fy.Form.RecordsetClone
        Me.Parent!fy.Form.Bookmark = rst_fy.Bookmark
        Me.Parent!fy.SetFocus

Else

MsgBox " الرقم غير موجود"
End If

مع دمج الكودين 

الاستاذ @jjafferr الاستاذ @Eng.Qassim اعتقد اني استحق افضل اجابة 😁

تم تعديل بواسطه ازهر عبد العزيز
  • Haha 1
رابط هذا التعليق
شارك

10 دقائق مضت, ازهر عبد العزيز said:

لاحظت ان نقل التركيز بطئ

اعتقد لانه ينفذ امر التطابق ثم ينفذ امر التنسيق الشرطي

4 دقائق مضت, ازهر عبد العزيز said:

مع دمج الكودين 

ممتاز ..فكرة جيدة 

وبهذا لاتحتاج للتنسيق الشرطي

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

1 ساعه مضت, ازهر عبد العزيز said:

ي حال لايوجد  بيانات في النموذج  FY يظهر ERROR

هناك عدة طرق للتعامل مع رسائل الخطأ ،

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

Option Compare Database
Option Explicit

    Dim rst_fy As DAO.Recordset
    Dim rst_n As Integer
'

Private Sub xxx_Click()
On Error GoTo err_xxx_Click

    'take the Recordset one time, use it many times
    If rst_n = 0 Then
        Set rst_fy = Forms!fxy!fy.Form.RecordsetClone
        rst_n = 1
    End If
    rst_fy.MoveFirst
    
    rst_fy.FindFirst "yyy='" & Me.xxx & "'"
    If rst_fy.NoMatch Then
        MsgBox "لا يوجد تطابق"
    Else
        MsgBox "يوجد تطابق"
        Me.Parent!fy.Form.Bookmark = rst_fy.Bookmark
        Me.Parent!fy.SetFocus
    End If
    
Exit_xxx_Click:

    rst_fy.Close
    Exit Sub
err_xxx_Click:

    If Err.Number = 3021 Then
        'No data
        Resume Exit_xxx_Click
    Else
        MsgBox Err.Number & vbCrLf & Err.Description
    End If
    
End Sub


Private Sub Form_Close()

    Set rst_fy = Nothing
End Sub

.

اما التنسيق الشرطي الذي يمكن استعماله هنا ، فيكون ابسط :

image.png.a3d38472474bc7b1526cc5c2bf457c33.png

.

 

 

فيه ملاحظة كتبتها بالانجليزي في الكود ، وعليه قمت بهذا العدد من الاسطر ، بالاضافة الى سطر تعريف المتغير Dim rst_n ،

بينما كان ممكن ان اكتب سطر واحد من Set rst_fy = Forms!fxy!fy.Form.RecordsetClone والسلام :

3 ساعات مضت, jjafferr said:
    'take the Recordset one time, use it many times
    If rst_n = 0 Then
        Set rst_fy = Forms!fxy!fy.Form.RecordsetClone
        rst_n = 1
    End If

.

السبب هو :

رجاء ، لما تشتغل على اي برنامج ، ابدا لا تنظر للبرنامج بعدد بياناته الآن ، وانما انظر كأنك تتعامل مع 10 او 100 الف سجل ، لهذا السبب رفعت قاعدة بيانات للتجربة:

.

فلما عندك كود تريد تجربه ، ممكن تجربه على هذا العدد الهائل من البيانات ، فعليه ستعرف اذا الكود الذي عملته بطيء او سريع.

 

لما تستخدم الامر Recordset او RecordsetClone ، فانت تأخذ نسخة من بيانات الجدول/الجداول (اذا كان استعلام) ، وتُبقي هذه البينات في ذاكرة الكمبيوتر المؤقته Ram ، فيصبح التعامل مع البيانات من الذاكرة مباشرة ، لذلك من المهم ان تحذف البيانات لما تنتهي من استعمالها ، وعادة نعمل هذا في آخر الكود بالامر Set rst_fy = Nothing .

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

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

 

جعفر

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

الله يفتح عليك استاذنا ومعلمنا الكبير / @jjafferr

كذلك الله يبارك فيك استاذ @Eng.Qassim

احنا عاوزين دلوقت مثال شامل على كل التغيرات به السرعة وغير بطئ

جزاكم الله خيرا

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

2 ساعات مضت, الحلبي said:

احنا عاوزين دلوقت مثال شامل على كل التغيرات به السرعة وغير بطئ

حيا الله دكتور حلبي 🙂

في الواقع هذا سؤال لا حدود له ، فكل شيء في برنامجك وبرمجتة ، يصب فيه !!

وفي كل مشاركة اضعها ، اشرح فيها ميزاتها وعيوبها 🙂

 

خذ مثال من الموضوع الذي نحن به الآن:

عادة في استعمال الامر Recordset :

المبرمج عادة يستعمل
Set rst_fy = currentdb.openRecordset("Select * From tbx")
 
  
بينما انااستعملت
Set rst_fy = Forms!fxy!fy.Form.RecordsetClone  

.

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

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

بينما مفهوم الطريقة الثانية: بما ان النموذج الفرعي fy عند فتحه ، فقد اخذ جميع بياناته من الجدول ، مفلترة وجاهزة ، فلماذا اشغل الشبكة والجدول بأخذ البيانات منه مرة اخرى ، بينما يمكنني اخذ هذه البيانات من النموذج مباشرة ، فهو اسرع (لأنه على كمبيوتري) ، ولا يشغل الشبكة او الجدول 🙂

 

وهذا مثال اشرح فيه كيف البرمجة لها تأثير في سرعة عمل الاستعلام :

 

جعفر

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

حياك استاذنا العظيم / @jjafferr

اشكرك على الشرح الوافى والان قد فهمت قصدك

الله يزيدك من علمه وينفعك به 

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

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