محمد طاهر عرفه قام بنشر ديسمبر 28, 2003 قام بنشر ديسمبر 28, 2003 هذا الموضوع جمعه أبو حمود --------------------------------- و هو لاضافة قيمة الي الجدول المبني عليه قائمة عند عدم وجودها فى الجدول الموضوع : وهذه خمس طرق للإضافة : أولاً : طريقة للإضافة الى القائمة بدون الحاجة لإظهار نموذج : 1- ضع التزام بالقائمة إلى نعم 2- في حدث عند عدم الوجود في القائمة ضع الإجراء التالي : On Error GoTo HandleErr Dim db As Database Dim strSQL As String Const فاصلة = """" strSQL = "Insert into اسم الجدول (اسم حقل بيانات القائمة في الجدول) Values " _ & "(" & فاصلة & NewData & فاصلة & ")" Set db = CurrentDb If MsgBox("هل ترغب في إضافة هذا البند إلى القائمة ؟", vbYesNo, "تسجيل بند جديد") = vbYes Then db.Execute strSQL Response = acDataErrAdded Else Response = acDataErrDisplay End If ExitHere: Exit Sub HandleErr: Select Case Err Case Else MsgBox Err & ": " & Err.Description, , "خطأ" End Select Resume ExitHere 3- حدد كلمتي "اسم الجدول" ثم غيرهما الى اسم الجدول الذي تأخذ القائمة البيانات منه ، لاحظ أنه إذا كان اسم الجدول مركب من كلمتين فأكثر فضعه بين قوسين مربعين مثال : [جدول الأسماء] . 4- حدد عبارة "اسم حقل بيانات القائمة في الجدول" واستبدلها باسم الحقل في الجدول ، انتبه اسم الحقل في الجدول الذي تأخذ القائمة البيانات منه . 5- إذا أردته أن يضيف مباشرة دون رسالة فأزل العبارة الشرطية If . ثانيا : طريقة مع فتح النموذج على سجل جديد وعند كتابة البيانات وإغلاقه من قبل المستخدم تظهر القيمة في الحقل مباشرة : في حدث عند عدم الوجود في القائمة اكتب مع تعديل الأسماء : Response = acDataErrContinue If MsgBox("البند غير موجود بالقائمة ." & vbCrLf & _ "هل ترغب في إضافته الى القائمة ؟", vbYesNo, "بند غير موجود") = vbYes Then [اسم القائمة على النموذج] = DFirst("[حقل مصدر البيانات]", "[اسم الجدول]") DoCmd.OpenForm "النموذج الذي سيتم إدخال البيانات فيه", , , , , acDialog, "gotonew" Me![اسم القائمة على النموذج].Requery [اسم القائمة على النموذج] = DLast("[حقل مصدر البيانات]", "[اسم الجدول]") DoCmd.GoToControl "اكتب الحقل الذي تود الانتقال إليه بعد إدخال البيانات في القائمة" End If في حدث عند التحميل للنموذج اكتب : If Me.OpenArgs = "gotonew" Then DoCmd.GoToRecord , , acNewRec ثالثاً : طريقة للإضافة مع إظهار النموذج والإضافة إليه تلقائيا ثم إغلاقه وكتابة الكلمة أو العبارة المضافة في الحقل والانتقال الى الحقل التالي : ملاحظة لن ترى النموذج لسرعة الإجراء . في حدث عند عدم الوجود في القائمة اكتب : If MsgBox("البند غير موجود بالقائمة ." & vbCrLf & _ "هل ترغب في إضافته الى القائمة ؟", vbYesNo, "بند غير موجود") = vbYes Then Response = acDataErrAdded DoCmd.OpenForm "اسم النموذج الذي ستضاف البيانات فيه", , , , acAdd, acDialog, NewData Else Response = acDataErrContinue End If وفي حدث عند التحميل للنموذج المذكور سابق اكتب : If Not IsNull(Me.OpenArgs) Then Me![اسم الحقل المبنيه عليه القائمة] = Me.OpenArgs DoCmd.Close End If يعيب هذه الطريقة أنك إذا كنت تفتح هذا النموذج مع تحديد OpenArgs من نموذج آخر غير النموذج الذي تم فتح هذا النموذج منه فسوف تتم إضافة القيمة التي تحملها OpenArgs تلقائيا (لغزعبارة غامضه) ولتوضيح ذلك : لنفرض أن اسم النموذج الذي فيه القائمة "نموذج الذي توجد فيه القائمة" والنموذج الذي ندخل فيه البيانات اسمه "نموذج تسجيل بيانات القائمة" لو طبقنا كل الكلام الوارد في ثالثا ستتم الإضافة بدون مشاكل ، ولكن لو كان لدينا نموذج آخر بأي اسم يحتاج هذا النموذج الى فتح "نموذج تسجيل بيانات القائمة" لأي غرض آخر غير الإضافة الى القائمة وكان يستخدم OpenArgs فالنتيجة ستتم إضافة قيمة OpenArgs إلى بيانات القائمة لأن النموذج عنده قصر نظر فلا يفرق بين النماذج أرجو أن تكون المسألة قد وضحت ، وكحل لذلك يمكنك استخدم دالة IsLoaded للتأكد من كون النموذج "نموذج الذي توجد فيه القائمة" مفتوح ، وإليك دالة Isloaded : Public Function IsLoaded(ByValstrformname As String) As Integer Const CondesignView = 0 Const ConObjectClosed = 0 IsLoaded = False If SysCmd(acSysCmdGetObjectState, acForm, strformname) <> ConObjectClosed Then If Forms(strformname).CurrentView <> CondesignView Then IsLoaded = True End If End If End Function ولمعرفة هل نموذج مفتوح أم لا اكتب : If IsLoaded("اسم النموذج المطلوب التأكد من كونه مفتوحاً") Then بقيه الإجراء ... ويعدل حدث التحميل ليكون كالتالي : If IsLoaded("اسم النموذج المطلوب التأكد من كونه مفتوحاً") Then If Not IsNull(Me.OpenArgs) Then Me![اسم الحقل المبنيه عليه القائمة] = Me.OpenArgs DoCmd.Close End If end if ملاحظة : لدي طريقة أخرى للتأكد من كون نموذج مفتوح أم لا ، وكذلك طريقة للتأكد من كون التقرير مفتوحا ، إذا رغبها أحد كتبتها . هناك تشبه الطريقة السابقة ولكن باستخدام متغير عام . رابعا : باستخدام DAO في حدث عند عدم الوجود في القائمة ضع الكود التالي : Dim db As Database Dim rst As Recordset If MsgBox("البند غير موجود بالقائمة ." & vbCrLf & _ "هل ترغب في إضافته الى القائمة ؟", vbYesNo, "بند غير موجود") = vbYes Then ' Response = acDataErrAdded Set db = Application.CurrentDb Set rst = db.OpenRecordset("اسم الجدول الذي تأخذ القائمة البيانات منه") rst.AddNew rst![اسم الحقل المبنيه عليه القائمة] = NewData rst.Update rst.Close db.Close Response = acDataErrAdded [اسم القائمة على النموذج]= DLast("[حقل بيانات القائمة في الجدول]", "[اسم الجدول]") Else Response = acDataErrContinue End If End Sub خامساً : باستخدام ADO في حدث عند عدم الوجود في القائمة اكتب If MsgBox("البند غير موجود بالقائمة ." & vbCrLf & _ "هل ترغب في إضافته الى القائمة ؟", vbYesNo, "بند غير موجود") = vbYes Then Dim rst As New ADODB.Recordset rst.Open "[جدول الأسماء]", CurrentProject.Connection, _ adOpenStatic, adLockOptimistic rst.AddNew rst![اسم الحقل المبنيه عليه القائمة] = NewData rst.Update rst.Close Response = acDataErrAdded [اسم القائمة على النموذج]= DLast("[حقل بيانات القائمة في الجدول]", "[اسم الجدول]") Else Response = acDataErrContinue End If ======================================= هذه هديه خاصة لك أخوي حارث ولا يهون الجميع : ======================================= إظهار البند التالي في قائمة منسدلة عند النقر المزدوج ضع في وحدة نمطية عامة الدالة التالية : Public Function عرض_بنود_القائمة(قائمة As ComboBox) Dim مجموع_الإدخالات As Byte, رقم_فهرس_حالي As Byte مجموع_الإدخالات = قائمة.ListCount If مجموع_الإدخالات = 0 Then DoCmd.Beep MsgBox "لايوجد أي بند مسجل في القائمة .", vbMsgBoxRight + vbMsgBoxRtlReading + vbInformation, "قائمة فارغة" Exit Function End If If قائمة.ListIndex <> -1 Then رقم_فهرس_حالي = قائمة.ListIndex End If If رقم_فهرس_حالي <> مجموع_الإدخالات And قائمة.ListIndex <> -1 Then قائمة = قائمة.ItemData(رقم_فهرس_حالي + 1) Else قائمة = قائمة.ItemData(0) End If If قائمة.ListIndex = -1 Then قائمة = قائمة.ItemData(0) End Function وضع الاستدعاء التالي لها في حدث عند النقر المزدوج للقائمة : Call عرض_بنود_القائمة(Me![اسم القائمة]) 1
الردود الموصى بها
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.