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

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

قام بنشر

هذا الموضوع جمعه أبو حمود

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

و هو لاضافة قيمة الي الجدول المبني عليه قائمة عند عدم وجودها فى الجدول

الموضوع :

وهذه خمس طرق للإضافة :

أولاً : طريقة للإضافة الى القائمة بدون الحاجة لإظهار نموذج :

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![اسم القائمة])

  • Thanks 1

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