إعادة ربط مربع التحرير والسرد الوصول

StackOverflow https://stackoverflow.com/questions/80832

  •  09-06-2019
  •  | 
  •  

سؤال

لدي نموذج Access 2007 يمكن البحث فيه بواسطة combobox.عندما أقوم بإضافة سجل جديد، أحتاج إلى تحديث مربع التحرير والسرد ليشمل العنصر المضاف حديثًا.

أفترض أنه يجب القيام بشيء ما في حدث AfterInsert للنموذج ولكن لا يمكنني معرفة ما هو.

كيف يمكنني إعادة ربط صندوق التحرير والسرد بعد الإدراج بحيث يظهر العنصر الجديد في القائمة؟

هل كانت مفيدة؟

المحلول

أسهل طريقة هي ضمان تحديث صندوق التحرير والسرد دائمًا من خلال إعادة الاستعلام عن صندوق التحرير والسرد بمجرد حصوله على التركيز.حتى إذا تم تحديث مجموعة السجلات في مكان آخر، فإن صندوق التحرير والسرد الخاص بك يكون محدثًا دائمًا.يجب أن يكون TheCombobox.Requery البسيط في حدث OnFocus كافيًا.

نصائح أخرى

هناك إجابتان محتملتان هنا فعالتان:

  1. استخدم حدث AfterInsert الخاص بالنموذج لإعادة الاستعلام عن مربع التحرير والسرد (بالإضافة إلى حدث OnDeleteConfirm).سيكون هذا كافيًا إذا لم يعرض مربع التحرير والسرد البيانات التي يمكن للمستخدم تحديثها والتي تحتاج إلى تحديث إذا تم تحديث السجل الأساسي.

  2. إذا كان من الضروري أن تنعكس تحديثات البيانات في مربع التحرير والسرد، فمن المنطقي إضافة طلب إعادة استعلام في أحداث AfterUpdate لعناصر التحكم المستخدمة لتحرير البيانات المعروضة في مربع التحرير والسرد.

على سبيل المثال، إذا كان مربع التحرير والسرد الخاص بك يسرد أسماء الأشخاص في الجدول، فستحتاج إلى استخدام الطريقة رقم 2، وفي حدث AfterUpdate الخاص بـ Me!txtFirstName وMe!txtLastName، أعد الاستعلام عن مربع التحرير والسرد.نظرًا لأنك تقوم بنفس العملية في أربعة أماكن، فسوف تحتاج إلى كتابة روتين فرعي للقيام بإعادة الاستعلام.لذا، سيبدو الجزء الفرعي كما يلي:

  Private Sub RequerySearchCombo()
    If Me.Dirty Then Me.Dirty = False
    Me!MyCombo.Requery
  End Sub

السبب وراء التأكد من إعادة الاستعلام فقط عندما يكون هناك تحديث فعلي للبيانات المعروضة في مربع التحرير والسرد هو أنه إذا كنت تقوم بملء مربع التحرير والسرد بقائمة الجدول بأكمله، فقد تستغرق إعادة الاستعلام وقتًا طويلاً جدًا إذا كنت لديك 10 من 1000 من السجلات.

البديل الآخر الذي يحفظ جميع طلبات البحث هو أن يكون لديك مصدر صف فارغ لمربع التحرير والسرد، وملؤه فقط بعد كتابة حرف واحد أو حرفين، وتصفية النتائج التي يعرضها التحرير والسرد بناءً على الأحرف المكتوبة.للقيام بذلك، يمكنك استخدام حدث OnChange الخاص بمربع التحرير والسرد:

Private Sub MyCombo_Change()
  Dim strSQL As String

  If Len(Me!MyCombo.Text) = 2 Then
     strSQL = "SELECT MyID, LastName & ', ' & FirstName FROM MyTable "
     strSQL = strSQL & "WHERE LastName LIKE " & Chr(34) & Me!MyCombo.Text & Chr(34) & "*"
     Me!MyCombo.Rowsource = strSQL 
  End If
End Sub

يفترض الكود أعلاه أنك تبحث عن اسم شخص ما في مربع التحرير والسرد الذي يعرض "اسم العائلة، الاسم الأول".

هناك تحذير مهم آخر:إذا كنت تبحث عن نموذج منضم إلى جدول كامل (أو عبارة SQL التي تُرجع جميع السجلات الموجودة في الجدول) وتستخدم التنقل بين الإشارات المرجعية لتحديد موقع السجلات، فلن يتم قياس هذه الطريقة جيدًا، لأنها تتطلب سحب الفهرس بأكمله للحقول التي تم البحث فيها عبر السلك.في حالة مربع التحرير والسرد التخيلي الخاص بي أعلاه، ستستخدم FindFirst للانتقال إلى السجل باستخدام قيمة MyID المقابلة، لذا فإن فهرس MyID هو الذي يجب سحبه (على الرغم من وجود عدد من صفحات الفهرس حسب الضرورة لتلبية سيتم سحب البحث بالفعل).هذه ليست مشكلة بالنسبة للجداول التي تحتوي على بضعة آلاف من السجلات، ولكن بعد حوالي 15 إلى 20 كيلو بايت، يمكن أن يكون ذلك بمثابة اختناق في الشبكة.

في هذه الحالة، بدلاً من التنقل عبر الإشارة المرجعية، يمكنك استخدام مربع التحرير والسرد الخاص بك لتصفية مجموعة النتائج وصولاً إلى السجل الفردي.وهذا بالطبع فعال للغاية، بغض النظر عما إذا كنت تستخدم واجهة Jet الخلفية أو الخادم الخلفي.من المستحسن للغاية البدء في دمج هذه الأنواع من الكفاءات في تطبيقك في أقرب وقت ممكن.إذا قمت بذلك، فسيصبح من الأسهل بكثير زيادة الحجم إلى الواجهة الخلفية للخادم، أو يجعل الأمر غير مؤلم إلى حد كبير إذا وصلت إلى نقطة التحول هذه بكمية كبيرة من البيانات الجديدة التي تجعل الطريقة القديمة غير فعالة للغاية بحيث لا تكون سهلة الاستخدام.

أفترض أن مربع التحرير والسرد الخاص بك هو عنصر تحكم في النموذج، وليس عنصر تحكم مربع التحرير والسرد في شريط الأوامر.يحتوي مربع التحرير والسرد هذا على خاصية تسمى مصدر الصف، والتي يمكن أن تكون إما قائمة قيم (الزوج؛ الزوجة؛ الابن؛ الفتاة) أو تعليمات SQL SELECT (SELECT RelationDescription FROM Table_relationType).

أفترض أيضًا أن مجموعة سجلات النموذج الخاصة بك لها علاقة بمجموعة سجلات combobox الخاصة بك.ما عليك القيام به هو، بمجرد أن تكون مجموعة سجلات النموذج الخاصة بك تم تحديثها بشكل صحيح (حدث ما بعد التحديث على ما أعتقد)، لإعادة تهيئة خاصية مصدر الصف لعنصر تحكم مربع التحرير والسرد

إذا كان مصدر السجل عبارة عن تعليمات SQL:

myComboBoxControl.recordsource = _
    "SELECT relationDescription FROM Table_relationType"

أو إذا كانت قائمة القيم

myComboBoxControl.recordsource = myComboBoxControl.recordsource & ";nephew"

لكن على العموم أجد طلبك غريبًا جدًا.هل لديك علاقة انعكاسية (بين الوالدين والطفل) على طاولتك؟

عادةً ما أستخدم حدث NotInList لإضافة البيانات إلى مجموعة التحرير والسرد

   Response = acDataErrAdded

لتحديث التحرير والسرد.

يحتوي مرجع مطوري Access 2007 على كافة التفاصيل، بما في ذلك نموذج التعليمات البرمجية:http://msdn.microsoft.com/en-us/library/bb214329.aspx

أعد الاستعلام عن مربع التحرير والسرد في حدث ما بعد التحديث وحدث الحذف الخاص بالنموذج.سيكون مربع التحرير والسرد الخاص بك محدثًا عندما يقوم المستخدم بإجراء تغييرات على مجموعة السجلات، سواء كان سجلًا جديدًا أو تغييرًا أو حذفًا.

ما لم يكن من الضروري أن يحصل المستخدمون على تغييرات الجميع بمجرد إجرائها، فلا تعيد الاستعلام عن مربع التحرير والسرد في كل مرة يحصل فيها على التركيز لأنه لن يضطر المستخدم إلى الانتظار فقط (وهو ما يمكن ملاحظته في مجموعات السجلات الكبيرة)، بل إنه غير ضروري إذا كان لم تتغير مجموعة السجلات.ولكن إذا كان الأمر كذلك، فيجب إعادة الاستعلام عن النموذج بأكمله بمجرد قيام أي شخص آخر بإجراء تغيير، وليس فقط مربع التحرير والسرد.سيكون هذا سيناريو غير عادي للغاية.

بعد التحديث:

Private Sub Form_AfterUpdate()    
    On Error GoTo Proc_Err 

    Me.cboSearch.Requery   

    Exit Sub    
Proc_Err:    
    MsgBox Err.Number & vbCrLf & vbCrLf & Err.Description
    Err.Clear        
End Sub

بعد الحذف:

Private Sub Form_Delete(Cancel As Integer)    
    On Error GoTo Proc_Err 

    Me.cboSearch.Requery   

    Exit Sub    
Proc_Err:    
    MsgBox Err.Number & vbCrLf & vbCrLf & Err.Description
    Err.Clear        
End Sub
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top