-
Posts
9,756 -
تاريخ الانضمام
-
تاريخ اخر زياره
-
Days Won
396
Community Answers
-
jjafferr's post in لما وضعت كود لالغاء رسالة ادخل قيمه معلمه ... اصبح البحث مش شغال (معدل) was marked as the answer
وعليكم السلام 🙂
هذا لأن الاستعلام مصدر بيانات النموذج الفرعي ، لا يوجد فيه معيار التصفية ، فالظاهر انك حذفته بالخطأ 🙂
.
جعفر
-
jjafferr's post in كيف نأخذ التاريخ من أول سجل وأخر سجل ونضعهم في رأس الصفحة للتقرير was marked as the answer
السلام عليكم 🙂
في الواقع ، هذا السؤال من الاسئلة التي تُثار بين الحينه والاخرى ،
واليك السبب في عدم امكانية الحصول على قيمة ذيل الصفحة ، في رأس الصفحة :
التقرير عندك فيه 3 اقسام :
.
خلينا نشوف قيم التاريخ لصفحة:
.
والآن خلينا نشوف التاريخ ، بالطريقة اللي اقسام التقرير تشوفه ، بإستخدام حدث التنسيق لكل قسم:
Private Sub PageHeaderSection_Format(Cancel As Integer, FormatCount As Integer) Debug.Print "Header= " & Me.Edate End Sub Private Sub Detail_Format(Cancel As Integer, FormatCount As Integer) Debug.Print " Detail= " & Me.Edate End Sub Private Sub PageFooterSection_Format(Cancel As Integer, FormatCount As Integer) Debug.Print "Footer= " & Me.Edate Debug.Print End Sub .
والنتيجة لصفحتين :
Header= 18-Oct-20
Detail= 18-Oct-20
Detail= 19-Oct-20
Detail= 20-Oct-20
Detail= 21-Oct-20
Detail= 22-Oct-20
Detail= 23-Oct-20
Detail= 24-Oct-20
Detail= 25-Oct-20
Detail= 26-Oct-20
Detail= 27-Oct-20
Detail= 28-Oct-20
Detail= 29-Oct-20
Detail= 30-Oct-20
Detail= 31-Oct-20
Detail= 01-Nov-20
Detail= 02-Nov-20
Detail= 03-Nov-20
Detail= 04-Nov-20
Detail= 05-Nov-20
Detail= 06-Nov-20
Detail= 07-Nov-20
Detail= 08-Nov-20
Footer= 07-Nov-20
Header= 08-Nov-20
Detail= 08-Nov-20
Detail= 09-Nov-20
Detail= 10-Nov-20
Detail= 11-Nov-20
Detail= 12-Nov-20
Detail= 13-Nov-20
Detail= 14-Nov-20
Detail= 15-Nov-20
Detail= 14-Jan-21
Detail= 15-Jan-21
Detail= 16-Jan-21
Detail= 17-Jan-21
Detail= 18-Jan-21
Detail= 19-Jan-21
Detail= 20-Jan-21
Detail= 21-Jan-21
Detail= 22-Jan-21
Detail= 23-Jan-21
Detail= 24-Jan-21
Detail= 25-Jan-21
Detail= 26-Jan-21
Detail= 27-Jan-21
Footer= 26-Jan-21
.
من هنا نلاحظ ان رأس الصفحة يرى اول سجل ، بينما ذيل الصفحة يرى آخر سجل ، والتقرير يطبع / يُظهر رأس الصفحة قبل ان تكون البيانات وصلت الى ذيل الصفحة (يعني ذيل الصفحة لا يحتوي على اي قيمة حينها ، لما رأس الصفحة يحصل على القيمة) ، لهذا سبب ما نحصل على التاريخين معا في رأس الصفحة !!
-------------------------------------------------------------------------------------------------------
الآن وبعد ان عرفنا طريقة عمل التقرير ، خلينا نستفيد منه في عمل المطلوب :
خلينا نفتح التقرير بطريقة مخفية ، نأخذ قيمة سجل رأس صفحة التقرير وذيل صفحة التقرير لكل صفحة ، نحفظهم في مصفوفة Array ، ثم نفتح التقرير بالطريقة العادية ونأخذ بيانات رأس وذيل التقرير من المصفوفة ، ونضعهم في التقرير ، في رأس الصفحة 🙂
1. عمل نموذج لحصر البيانات بين قيمتين (مع اننا لسنا بحاجة الى هذه الخطوة ، ولكن لأن جدولك في سجلات بدون قيم تواريخ ، فهذا يعمل خلل في الكود) ،
ونعمل استعلام يصفي بيانات الجدول حسب تواريخ النموذج ، ويكون هذا الاستعلام مصدر بيانات التقرير:
.
2. النقر على زر فتح التقرير في النموذج ، يحتوي على هذا الكود :
والذي يعمل مصفوفة لـ 100 صفحة في التقرير (اذا تقريرك يحتوي على صفحات اكثر ، فقط اجعل هذا الرقم اكبر ، ما يضر اذا تركته = 200 او اكثر)
'accept adding dates Add_Dates = True 'initilize the arrays with a larg number of pages ReDim Fd(100) 'first E_date ReDim Ld(100) 'last E_date 'open the Report in Hidden mode, to put the E_dates in an array DoCmd.OpenReport "rpt_chfit", acViewPreview, , , acHidden 'close the Hidden Report DoCmd.Close acReport, "rpt_chfit" 'stop adding dates Add_Dates = False 'now open the Report in the normal way DoCmd.OpenReport "rpt_chfit", acViewPreview .
وهناك وحدة نمطية تحتفظ بقيم المصفوفة ، حتى تكون متوفرة لجميع كائنات البرنامج:
Option Compare Database Option Explicit Public Add_Dates As Boolean Public Fd() As Date 'first E_date Public Ld() As Date 'last E_date .
والتقرير فيه هذا الكود:
Private Sub PageHeaderSection_Format(Cancel As Integer, FormatCount As Integer) If Add_Dates = True Then 'add the array items, based on the Report page number Fd(Me.Page) = Me.F_Edate Else 'show the results Me.myF_Edate = Fd(Me.Page) Me.myL_Edate = Ld(Me.Page) End If End Sub Private Sub PageFooterSection_Format(Cancel As Integer, FormatCount As Integer) If Add_Dates = True Then 'add the array items Ld(Me.Page) = Me.L_Edate End If End Sub Private Sub Report_Close() If Add_Dates = False Then 'Empty the array ReDim Fd(0) 'first E_date ReDim Ld(0) 'last E_date End If End Sub .
فإذا قيمة Add_Dates = True في النموذج ، فيعمل التقرير المخفي لعمل المصفوفة ،
بينما عندما تتغير قيمة Add_Dates ، فيقوم التقرير بإظهار قيم المصفوفة في التقرير الغير مخفي ،
وعند اغلاق التقرير ، نقوم بحذف بيانات المصفوفة 🙂
لذلك ، وللحصول على النتائج الصحيحة ، يجب تشغيل التقرير من النموذج ، حتى يقوم الكود بما يجب 🙂
.
.
جعفر
1277.addDateHideRport.accdb.zip
-
jjafferr's post in كيف نأخذ التاريخ من أول سجل وأخر سجل ونضعهم في رأس الصفحة للتقرير was marked as the answer
السلام عليكم 🙂
في الواقع ، هذا السؤال من الاسئلة التي تُثار بين الحينه والاخرى ،
واليك السبب في عدم امكانية الحصول على قيمة ذيل الصفحة ، في رأس الصفحة :
التقرير عندك فيه 3 اقسام :
.
خلينا نشوف قيم التاريخ لصفحة:
.
والآن خلينا نشوف التاريخ ، بالطريقة اللي اقسام التقرير تشوفه ، بإستخدام حدث التنسيق لكل قسم:
Private Sub PageHeaderSection_Format(Cancel As Integer, FormatCount As Integer) Debug.Print "Header= " & Me.Edate End Sub Private Sub Detail_Format(Cancel As Integer, FormatCount As Integer) Debug.Print " Detail= " & Me.Edate End Sub Private Sub PageFooterSection_Format(Cancel As Integer, FormatCount As Integer) Debug.Print "Footer= " & Me.Edate Debug.Print End Sub .
والنتيجة لصفحتين :
Header= 18-Oct-20
Detail= 18-Oct-20
Detail= 19-Oct-20
Detail= 20-Oct-20
Detail= 21-Oct-20
Detail= 22-Oct-20
Detail= 23-Oct-20
Detail= 24-Oct-20
Detail= 25-Oct-20
Detail= 26-Oct-20
Detail= 27-Oct-20
Detail= 28-Oct-20
Detail= 29-Oct-20
Detail= 30-Oct-20
Detail= 31-Oct-20
Detail= 01-Nov-20
Detail= 02-Nov-20
Detail= 03-Nov-20
Detail= 04-Nov-20
Detail= 05-Nov-20
Detail= 06-Nov-20
Detail= 07-Nov-20
Detail= 08-Nov-20
Footer= 07-Nov-20
Header= 08-Nov-20
Detail= 08-Nov-20
Detail= 09-Nov-20
Detail= 10-Nov-20
Detail= 11-Nov-20
Detail= 12-Nov-20
Detail= 13-Nov-20
Detail= 14-Nov-20
Detail= 15-Nov-20
Detail= 14-Jan-21
Detail= 15-Jan-21
Detail= 16-Jan-21
Detail= 17-Jan-21
Detail= 18-Jan-21
Detail= 19-Jan-21
Detail= 20-Jan-21
Detail= 21-Jan-21
Detail= 22-Jan-21
Detail= 23-Jan-21
Detail= 24-Jan-21
Detail= 25-Jan-21
Detail= 26-Jan-21
Detail= 27-Jan-21
Footer= 26-Jan-21
.
من هنا نلاحظ ان رأس الصفحة يرى اول سجل ، بينما ذيل الصفحة يرى آخر سجل ، والتقرير يطبع / يُظهر رأس الصفحة قبل ان تكون البيانات وصلت الى ذيل الصفحة (يعني ذيل الصفحة لا يحتوي على اي قيمة حينها ، لما رأس الصفحة يحصل على القيمة) ، لهذا سبب ما نحصل على التاريخين معا في رأس الصفحة !!
-------------------------------------------------------------------------------------------------------
الآن وبعد ان عرفنا طريقة عمل التقرير ، خلينا نستفيد منه في عمل المطلوب :
خلينا نفتح التقرير بطريقة مخفية ، نأخذ قيمة سجل رأس صفحة التقرير وذيل صفحة التقرير لكل صفحة ، نحفظهم في مصفوفة Array ، ثم نفتح التقرير بالطريقة العادية ونأخذ بيانات رأس وذيل التقرير من المصفوفة ، ونضعهم في التقرير ، في رأس الصفحة 🙂
1. عمل نموذج لحصر البيانات بين قيمتين (مع اننا لسنا بحاجة الى هذه الخطوة ، ولكن لأن جدولك في سجلات بدون قيم تواريخ ، فهذا يعمل خلل في الكود) ،
ونعمل استعلام يصفي بيانات الجدول حسب تواريخ النموذج ، ويكون هذا الاستعلام مصدر بيانات التقرير:
.
2. النقر على زر فتح التقرير في النموذج ، يحتوي على هذا الكود :
والذي يعمل مصفوفة لـ 100 صفحة في التقرير (اذا تقريرك يحتوي على صفحات اكثر ، فقط اجعل هذا الرقم اكبر ، ما يضر اذا تركته = 200 او اكثر)
'accept adding dates Add_Dates = True 'initilize the arrays with a larg number of pages ReDim Fd(100) 'first E_date ReDim Ld(100) 'last E_date 'open the Report in Hidden mode, to put the E_dates in an array DoCmd.OpenReport "rpt_chfit", acViewPreview, , , acHidden 'close the Hidden Report DoCmd.Close acReport, "rpt_chfit" 'stop adding dates Add_Dates = False 'now open the Report in the normal way DoCmd.OpenReport "rpt_chfit", acViewPreview .
وهناك وحدة نمطية تحتفظ بقيم المصفوفة ، حتى تكون متوفرة لجميع كائنات البرنامج:
Option Compare Database Option Explicit Public Add_Dates As Boolean Public Fd() As Date 'first E_date Public Ld() As Date 'last E_date .
والتقرير فيه هذا الكود:
Private Sub PageHeaderSection_Format(Cancel As Integer, FormatCount As Integer) If Add_Dates = True Then 'add the array items, based on the Report page number Fd(Me.Page) = Me.F_Edate Else 'show the results Me.myF_Edate = Fd(Me.Page) Me.myL_Edate = Ld(Me.Page) End If End Sub Private Sub PageFooterSection_Format(Cancel As Integer, FormatCount As Integer) If Add_Dates = True Then 'add the array items Ld(Me.Page) = Me.L_Edate End If End Sub Private Sub Report_Close() If Add_Dates = False Then 'Empty the array ReDim Fd(0) 'first E_date ReDim Ld(0) 'last E_date End If End Sub .
فإذا قيمة Add_Dates = True في النموذج ، فيعمل التقرير المخفي لعمل المصفوفة ،
بينما عندما تتغير قيمة Add_Dates ، فيقوم التقرير بإظهار قيم المصفوفة في التقرير الغير مخفي ،
وعند اغلاق التقرير ، نقوم بحذف بيانات المصفوفة 🙂
لذلك ، وللحصول على النتائج الصحيحة ، يجب تشغيل التقرير من النموذج ، حتى يقوم الكود بما يجب 🙂
.
.
جعفر
1277.addDateHideRport.accdb.zip
-
jjafferr's post in كيف نأخذ التاريخ من أول سجل وأخر سجل ونضعهم في رأس الصفحة للتقرير was marked as the answer
السلام عليكم 🙂
في الواقع ، هذا السؤال من الاسئلة التي تُثار بين الحينه والاخرى ،
واليك السبب في عدم امكانية الحصول على قيمة ذيل الصفحة ، في رأس الصفحة :
التقرير عندك فيه 3 اقسام :
.
خلينا نشوف قيم التاريخ لصفحة:
.
والآن خلينا نشوف التاريخ ، بالطريقة اللي اقسام التقرير تشوفه ، بإستخدام حدث التنسيق لكل قسم:
Private Sub PageHeaderSection_Format(Cancel As Integer, FormatCount As Integer) Debug.Print "Header= " & Me.Edate End Sub Private Sub Detail_Format(Cancel As Integer, FormatCount As Integer) Debug.Print " Detail= " & Me.Edate End Sub Private Sub PageFooterSection_Format(Cancel As Integer, FormatCount As Integer) Debug.Print "Footer= " & Me.Edate Debug.Print End Sub .
والنتيجة لصفحتين :
Header= 18-Oct-20
Detail= 18-Oct-20
Detail= 19-Oct-20
Detail= 20-Oct-20
Detail= 21-Oct-20
Detail= 22-Oct-20
Detail= 23-Oct-20
Detail= 24-Oct-20
Detail= 25-Oct-20
Detail= 26-Oct-20
Detail= 27-Oct-20
Detail= 28-Oct-20
Detail= 29-Oct-20
Detail= 30-Oct-20
Detail= 31-Oct-20
Detail= 01-Nov-20
Detail= 02-Nov-20
Detail= 03-Nov-20
Detail= 04-Nov-20
Detail= 05-Nov-20
Detail= 06-Nov-20
Detail= 07-Nov-20
Detail= 08-Nov-20
Footer= 07-Nov-20
Header= 08-Nov-20
Detail= 08-Nov-20
Detail= 09-Nov-20
Detail= 10-Nov-20
Detail= 11-Nov-20
Detail= 12-Nov-20
Detail= 13-Nov-20
Detail= 14-Nov-20
Detail= 15-Nov-20
Detail= 14-Jan-21
Detail= 15-Jan-21
Detail= 16-Jan-21
Detail= 17-Jan-21
Detail= 18-Jan-21
Detail= 19-Jan-21
Detail= 20-Jan-21
Detail= 21-Jan-21
Detail= 22-Jan-21
Detail= 23-Jan-21
Detail= 24-Jan-21
Detail= 25-Jan-21
Detail= 26-Jan-21
Detail= 27-Jan-21
Footer= 26-Jan-21
.
من هنا نلاحظ ان رأس الصفحة يرى اول سجل ، بينما ذيل الصفحة يرى آخر سجل ، والتقرير يطبع / يُظهر رأس الصفحة قبل ان تكون البيانات وصلت الى ذيل الصفحة (يعني ذيل الصفحة لا يحتوي على اي قيمة حينها ، لما رأس الصفحة يحصل على القيمة) ، لهذا سبب ما نحصل على التاريخين معا في رأس الصفحة !!
-------------------------------------------------------------------------------------------------------
الآن وبعد ان عرفنا طريقة عمل التقرير ، خلينا نستفيد منه في عمل المطلوب :
خلينا نفتح التقرير بطريقة مخفية ، نأخذ قيمة سجل رأس صفحة التقرير وذيل صفحة التقرير لكل صفحة ، نحفظهم في مصفوفة Array ، ثم نفتح التقرير بالطريقة العادية ونأخذ بيانات رأس وذيل التقرير من المصفوفة ، ونضعهم في التقرير ، في رأس الصفحة 🙂
1. عمل نموذج لحصر البيانات بين قيمتين (مع اننا لسنا بحاجة الى هذه الخطوة ، ولكن لأن جدولك في سجلات بدون قيم تواريخ ، فهذا يعمل خلل في الكود) ،
ونعمل استعلام يصفي بيانات الجدول حسب تواريخ النموذج ، ويكون هذا الاستعلام مصدر بيانات التقرير:
.
2. النقر على زر فتح التقرير في النموذج ، يحتوي على هذا الكود :
والذي يعمل مصفوفة لـ 100 صفحة في التقرير (اذا تقريرك يحتوي على صفحات اكثر ، فقط اجعل هذا الرقم اكبر ، ما يضر اذا تركته = 200 او اكثر)
'accept adding dates Add_Dates = True 'initilize the arrays with a larg number of pages ReDim Fd(100) 'first E_date ReDim Ld(100) 'last E_date 'open the Report in Hidden mode, to put the E_dates in an array DoCmd.OpenReport "rpt_chfit", acViewPreview, , , acHidden 'close the Hidden Report DoCmd.Close acReport, "rpt_chfit" 'stop adding dates Add_Dates = False 'now open the Report in the normal way DoCmd.OpenReport "rpt_chfit", acViewPreview .
وهناك وحدة نمطية تحتفظ بقيم المصفوفة ، حتى تكون متوفرة لجميع كائنات البرنامج:
Option Compare Database Option Explicit Public Add_Dates As Boolean Public Fd() As Date 'first E_date Public Ld() As Date 'last E_date .
والتقرير فيه هذا الكود:
Private Sub PageHeaderSection_Format(Cancel As Integer, FormatCount As Integer) If Add_Dates = True Then 'add the array items, based on the Report page number Fd(Me.Page) = Me.F_Edate Else 'show the results Me.myF_Edate = Fd(Me.Page) Me.myL_Edate = Ld(Me.Page) End If End Sub Private Sub PageFooterSection_Format(Cancel As Integer, FormatCount As Integer) If Add_Dates = True Then 'add the array items Ld(Me.Page) = Me.L_Edate End If End Sub Private Sub Report_Close() If Add_Dates = False Then 'Empty the array ReDim Fd(0) 'first E_date ReDim Ld(0) 'last E_date End If End Sub .
فإذا قيمة Add_Dates = True في النموذج ، فيعمل التقرير المخفي لعمل المصفوفة ،
بينما عندما تتغير قيمة Add_Dates ، فيقوم التقرير بإظهار قيم المصفوفة في التقرير الغير مخفي ،
وعند اغلاق التقرير ، نقوم بحذف بيانات المصفوفة 🙂
لذلك ، وللحصول على النتائج الصحيحة ، يجب تشغيل التقرير من النموذج ، حتى يقوم الكود بما يجب 🙂
.
.
جعفر
1277.addDateHideRport.accdb.zip
-
jjafferr's post in مساعدة في انشاء كود was marked as the answer
وعليكم السلام 🙂
وبدون ان انزل المرفق :
if me.parent.name="F1" then me.parent!z=me!x * me!y else me.parent!z=me!x + me!y endif .
الامر Parent معناه الوالدين ، اي ان والدي النموذج الفرعي C.
جعفر
-
jjafferr's post in ظهر رأس العمود فى اعلي العمودين was marked as the answer
وعليكم السلام 🙂
نريد نعمل تجميع وهمي :
.
.
.
ونعطيه اي اسم خرافي ، مثلا نقطة (.)
.
.
.
.
والنتيجة
.
جعفر
1266.قائمة.accdb.zip
-
jjafferr's post in كود حذف اكثر من حقل was marked as the answer
تفضل يا سيدي 🙂
عملت لك جدول tbl_Student_info ،
بينما استعلام qry_Student_info يجمع الجدول السابق مع جدول الجدول الجديد :
.
ولما تريد تستعمل النماذج او التقارير ، استعمل الاستعلام qry_Student_info كمصدر بيانات لها ،
بس رجاء الانتباه ، تأكد ان اسماء الطلبة موجودة ف الجدول tbl_Student_info ، والا فإنها لن تظهر في الاستعلام 🙂
جعفر
StuData.zip
-
jjafferr's post in مساعدة في تحويل كود من نصي الى رقمي was marked as the answer
السلام عليكم 🙂
لو تتبع هذه الطريقة ، ما تتعب 🙂
جعفر
-
jjafferr's post in امر الرجوع الى الكومبوكس السابق was marked as the answer
اللي فهمته :
عندك الحقل A , وخرجت منه الى الكومبوبوكس ، وبعدين تريد ترجع مرة ثانية من الكومبوبوكس الى الحقل A :
هذا الكود يكون في احد احداث الكومبوبوكس :
Dim ctrl As Control Set ctrl = Screen.PreviousControl DoCmd.GoToControl ctrl.Name
واذا تريده بدلا من DoCmd.CancelEvent
If IsNull([Namee]) Then MsgBox "لاتترك الحقل فارغاً **هذا الحقل اجباري ** ادخل الاسم الرباعي", vbCritical + vbMsgBoxRight, "تحذير ..!!" 'DoCmd.CancelEvent Dim ctrl As Control Set ctrl = Screen.PreviousControl DoCmd.GoToControl ctrl.Name End If
جعفر
-
jjafferr's post in مساعدة في تشفير الرسائل was marked as the answer
السلام عليكم 🙂
ابسط انواع التشفير
التشفير ، Code : هو تغيير حرف مكان حرف آخر ، يعني بدل تفاح ، ممكن يصير ثقبخ ، كيف :
رجاء النظر في الجدول التالي:
الحرف الاصل ورقمه : الحرف البديل ورقمه
ت 1578 : ث 1579
ف 1601 : ق 1602
ا 1575 : ب 1576
ح 1581 : خ 1582
تفاح : ثقبح
نلاحظ اننا اضفنا الرقم 1 (مفتاح الشفرة) الى قيمة الحرف الاصل ، لنحصل على قيمة الحرف البديل .
في هذه الحالة لو غيرنا مفتاح الشفرة الى رقم آخر ، او جعلنا مفتاح الشفرة عبارة عن معادلة ، لأصبحت الشفرة اصعب 🙂
فك الشفرة ، DeCode : هو حذف مفتاح الشفرة من رقم الحرف الجديد ، حتى يرجع لقيمته السابق 🙂
فإذن قوة التشفير له علاقة بمفتاح الشفرة 🙂
لهذا السبب ، لا ترسل مفتاح الشفرة مع الرسالة 🙂
.
ارفق لك هذا المثال
.
وهذه الوحدة النمطية التي تقوم بالعمل
Public Function Code_it_T(txt As String, iKey As Integer) As String Dim i, L As Integer L = Len(txt) For i = 1 To L Code_it_T = Code_it_T & ChrW(AscW(Mid(txt, i, 1)) + iKey) Next i End Function Public Function DeCode_it_T(txt As String, iKey As Integer) As String Dim i, L As Integer L = Len(txt) For i = 1 To L DeCode_it_T = DeCode_it_T & ChrW(AscW(Mid(txt, i, 1)) - iKey) Next i End Function .
.
ويمكنك إضافة هذا المثال لمكتبتك ايضا 🙂
جعفر
1254.Code_Decode.mdb.zip
-
jjafferr's post in سؤوال مهم في خاصية تقسيم قاعدة البيانات was marked as the answer
وعليكم السلام 🙂
هذا رد على سؤالك :
.
والبرنامج يتحكم بهذا الكم الهائل من المرفقات في اول 2018 ، وفي 8/2019 وصل حجم المرفقات الى اكثر من 1 تيرا بايت :
جعفر
-
jjafferr's post in عدم فتح تقرير طالما البيانات الخاصة بة فارغة was marked as the answer
بس الظاهر انك فهمت السؤال صح ، بينما انا قرأت رأس الموضوع ، وما لاحظت الملاحظة إلا بعد ان وضعت ملاحظتي !!
على العموم ، هذه طريقتي ، لحدث الزر (طبعا بالاضافة الى الكود في مشاركتي السابقة) :
Private Sub T_m_Click() On Error GoTo err_T_m_Click If Len(Me.FROM & "") = 0 Then MsgBox "رجاء تعبئة التاريخ من" Me.FROM.SetFocus ElseIf Len(Me.TO & "") = 0 Then MsgBox "رجاء تعبئة التاريخ الى" Me.TO.SetFocus ElseIf Len(Me.PN & "") = 0 Then MsgBox "رجاء اختيار اسم المشروع" Me.PN.SetFocus Me.PN.Dropdown Else DoCmd.OpenReport "All_Proj", acViewPreview End If Exit_T_m_Click: Exit Sub err_T_m_Click: If Err.Number = 2501 Then 'No data Else MsgBox Err.Number & vbCrLf & Err.Description End If Resume Exit_T_m_Click End Sub .
جعفر
1253.APE (1).accdb.zip
-
jjafferr's post in تحويل ملفات pdf was marked as the answer
السلام عليكم 🙂
الخطوة الاولى وبالتفصيل هي تصفية البيانات :
.
وهذا الكود كاملا لبرنامجك ، وحفظ البيانات في الجدول:
Public Function Split_Names() Dim rst, rst2 As DAO.Recordset Dim x() As String: Dim x2() As String Dim i, j As Long Dim a As String Set rst = CurrentDb.OpenRecordset("Select * From MyTxt_from_pdf") Set rst2 = CurrentDb.OpenRecordset("Select * From tbl_Names") ' Do Until rst.EOF ' For i = 1 To Len(rst!Field1) ' a = Mid(rst!Field1, i, 1) 'الحروف/الارقام/العلامات ' a = a & "(" & AscW(a) & ") " 'رقمها AscW ' Debug.Print a ' Next i ' loop Do Until rst.EOF x = Split(rst!Field1, ChrW(8236) & ChrW(8236) & ChrW(32) & ChrW(32)) 'Name + ID For i = LBound(x) To UBound(x) 'Debug.Print x(i) x2 = Split(x(i), ChrW(8236) & ChrW(32) & ChrW(32)) For j = LBound(x2) To UBound(x2) 'Debug.Print x2(j) a = Replace(x2(j), ChrW(8234), "") a = Replace(a, ChrW(8235), "") a = Replace(a, ChrW(8236), "") a = Trim(a) 'If j / 2 = Int(j / 2) Then If j = 0 Then 'even rst2.AddNew rst2!iName = a Else 'odd 'the numbers in Arabic are different (text) than those in English, so we have to get the value of the normal number '0=1632, 1=1633, 2=1634, 3=1635, 4=1636, 5=1637, 6=1638, 7=1639, 8=1640, 9=1641 'Arabic Numbers '0=48, 1=49, 2=50, 3=51, 4=52, 5=53, 6=54, 7=55, 8=56, 9=57 'ascii 'instead of using long if statements, lets make a formula: 0=48=1632-1584 rst2!iID = ChrW(AscW(a) - 1584) rst2.Update End If 'Debug.Print a Next j Next i rst.MoveNext Loop rst.Close: Set rst = Nothing End Function .
اما البحث عن مشكلة مع اللغة العربية في ال او لفظ الجلالة ، فانا عملت وحدة نمطية تقوم بتغيير الاسم ، ولكن يتوجب عليك اضافة بقية الاسماء المقطوعة في الوحدة النمطية ، في المتغير arr :
Public Function Reconstruct_Allah_Name(N As String) As String Dim arr() Dim x arr = Array("عطاا", "عبدا") For Each x In arr If InStr(N, x & " ") > 0 Then 'there is a space after the missing name Reconstruct_Allah_Name = Replace(N, x, x & "لله") Exit Function ElseIf InStr(N, x) + Len(x) - 1 = Len(N) Then 'the missing name is at the end of the line Reconstruct_Allah_Name = Replace(N, x, x & "لله") Exit Function Else Reconstruct_Allah_Name = N End If Next x End Function .
ثم يقوم استعلام التحديث qry_Reconstruct_Allah_Name بمناداة الوحدة النمطية اعلاه ، وتغيير الكلمات 🙂
والعمل يتم بالنقر على الزر المشار اليه في الصورة ادناه ، في النموذج Form1 :
.
جعفر
1251.db1.mdb.zip
-
jjafferr's post in كود استيراد ملف اكسل من نوع CSV was marked as the answer
🙂
هذا الكود الكامل :
Dim TextLine Dim x() As String Dim TESTFILE As String Dim rst As DAO.Recordset Set rst = CurrentDb.OpenRecordset("Select * From Mobaile") TESTFILE = Application.CurrentProject.Path & "\Template.csv" Open TESTFILE For Input As #1 ' Open file. Do While Not EOF(1) ' Loop until end of file. Line Input #1, TextLine ' Read line into variable. 'Debug.Print TextLine ' Print to the Immediate window. x = Split(TextLine, ";") If x(0) <> "IdentificationID" Then rst.AddNew rst!IdentificationID = x(0) rst!FullName = x(1) rst!MobileNumber = x(2) rst!ClassName = x(3) rst.Update End If Loop Close #1 ' Close file. rst.close: set rst = nothing
جعفر
-
jjafferr's post in جلب تاريخ السيرفر بدل من تاريخ الجهاز الي به البرنامج was marked as the answer
وجدت كود ليقرأ من SQL Server مباشرة ، وتركته في البرنامج ، ولكني ام افعّله :
Dim cmd As New ADODB.Command Dim RS As New ADODB.Recordset cmd.ActiveConnection = "Provider=SQLOLEDB;DataSource=yourserver;Database=yourDB;UID=test;PWD=test;" cmd.ActiveConnection.CursorLocation = adUseClient cmd.CommandText = "Select getdate()" Set RS = cmd.Execute Debug.Print RS(0) RS.Close cmd.ActiveConnection.Close .
استخدم دالة Format ، بحيث time_date_server هو حقل تاريخ السيرفر ، هكذا:
if format(time_date_server ,"dd/mm/yy") <> format(date() ,"dd/mm/yy") then msgbox "تاريخ السيرفر لا يطابق تاريخ الكمبيوتر" elseif format(time_date_server ,"hh") <> format(date() ,"hh") then msgbox "ساعة السيرفر لا تطابق ساعة الكمبيوتر" end if
جعفر
-
jjafferr's post in مشكلة في جلب بيانات جدول المواد من اكسل was marked as the answer
اضفت الاستعلام الجديد add6 للصفوف ذات الـ 6 حصص , والاستعلام نسخة معدلة من الاستعلام السابق add ،
عندما يكون الحقل F25 الذي به رقم الطالب للحصص الـ 7 ، فارغ ، نستعمل الاستعلام add6 :
.
جعفر
stu_Table.zip
-
jjafferr's post in عدم استيراد صف محدد من اكسل was marked as the answer
انا دائما افضل ان استعمل الاستعلام العادي بدلا عن استعلام الكود ، مع ان استعلام الكود اصعب في انشائه ،
ولكن الاستعلام العادي ابسط في التعامل معاه ،
لذا ، قمت بطلب اعطائي جملة SQL من الكود هكذا :
.
ثم عمل استعلام فارغ ، ثم بالزر اليمين ، نختار SQL ، ونلصق جملة SQL التي في المربع الاخير (رجاء الانتباه ، اذا الجملة فيها كلمات عربية ، فقبل ان تعمل نسخ ، يجب ان تتأكد ان لغة الكيبورد هي العربية ، وإلا فبدل الكلمات العربية سترى كلمات اغريقية غريبة !! )
.
ثم نرى الاستعلام بالطريقة المعتادة في وضع التصميم:
.
وفي وضع العرض ، نريد ان نرى اي من بيانات السطر الاول الذ لا تريده:
.
سنأخذ كلمة "سنة الالتحاق" ونضعه في المعيار :
.
والنتيجة ، وقد تم ازالة السجل الاول :
.
الآن نعمل تغيير في الكود ، فنطلب من الكود استعمال هذا الاستعلام بدلا عن جملة SQL التي في الكود :
.
والسلام 🙂
كما لاحظت انك تحتفظ بنسخة من الملفات ، وبها تاريخ اليوم ، فالافضل ان تحفظه بتنسيق yyyy-mm-dd علشان تسلسل الملفات في المجلد يطلع صح 🙂
جعفر
stu_Table.zip
-
jjafferr's post in منع فتح قائمة منسدلة was marked as the answer
السلام عليكم 🙂
في عندنا مثل عماني يقول: ابيه (يعني اريده) بس تف عليه 🙂
يعني انت تريد الكومبوبوكس لميزاته ، وبعدين تريد ان توقف ميزاته
احد الحلول انك تستخدم مربع نص عادي ، وعلى حدث بعد التحديث تبحث في الجدول عن القيمة ، او
تظهر سطر واحد فقط ، وتظهر اسم العمود
جعفر
-
jjafferr's post in من أسرع DLookup أم Recordset was marked as the answer
وعليكم السلام 🙂
سيدي الفاضل ، سؤالك مهم ، ولكن صيغة الكود غير صحيحة !!
لما نقول ان Dlookup بطيء ، فمقارنته تكون مع نتائج استعلام بدون Dlookup ،
اما لما نقول لا تستعملوا Dlookup ، فهو في الاستعلام ، مثل:
.
اما اذا كانت مقارنتك في الكود بين Dlookup و Recordset :
1. لإستخراج قيمة واحدة فقط ، فطبيعي Recordset تكون ابطأ ، لأنها تعمل نسخة من البيانات وتحتفظه في الذاكرة المؤقته RAM في الكمبيوتر ، فهذه العملية تأخذ وقت ،
2. إستخراج اكثر من قيمة/سجل ، فيكون Recordset اسرع ، لأنه بعد حفظ القيمة في ذاكرة الكمبيوتر ، يكون الحصول على البيانات منها اسرع ، ولكن بشرط ان تعمل الكود بالطريقة الصحيحة (انظر الكود) ،
انا عملت نسخة من الجدول test واسميته test2 ، وعملت حقل tst مفهرس، لأنك تستخدمه كمعيار للحصول على النتائج التي تريدها ، ثم ضغط واصلاح للبرنامج حتى يستفيد البرنامج من فهرست الحقل،
وعليه ، اصبح جلب النتائج من الجدول الثاني اسرع بكثير !!
اليك بعض التجارب التي عملتها للجدولين :
Option Compare Database Private Sub Commande0_Click() Dim t, t11, t12, t13, t14, t21, t22, t23, t24 As Single Dim r As Long 'table test '1 Dlookup t = Timer r = Nz(DLookup("id", "test", "tst='mohamed'"), 0) t11 = Timer - t t11 = Format(t11, "#0.0####") '2 qry_test t = Timer r = DCount("*", "qry_test") t12 = Timer - t t12 = Format(t12, "#0.0####") '3 Recordset_1 t = Timer r = fff_1("test", "mohamed") t13 = Timer - t t13 = Format(t13, "#0.0####") '4 Recordset_2 t = Timer r = fff_2("test", "mohamed") t14 = Timer - t t14 = Format(t14, "#0.0####") 'table test2 '1 Dlookup t = Timer r = Nz(DLookup("id", "test2", "tst='mohamed'"), 0) t21 = Timer - t t21 = Format(t21, "#0.0####") '2 qry_test t = Timer r = DCount("*", "qry_test2") t22 = Timer - t t22 = Format(t22, "#0.0####") '3 Recordset_1 t = Timer r = fff_1("test2", "mohamed") t23 = Timer - t t23 = Format(t23, "#0.0####") '4 Recordset_2 t = Timer r = fff_2("test2", "mohamed") t24 = Timer - t t24 = Format(t24, "#0.0####") Debug.Print "Dlookup:" & vbCrLf & _ "table test: " & t11 & vbTab & " test2: " & t21 & vbCrLf Debug.Print "qry_test, test2:" & vbCrLf & _ "table test: " & t12 & vbTab & " test2: " & t22 & vbCrLf Debug.Print "Recordset_1:" & vbCrLf & _ "table test: " & t13 & vbTab & " test2: " & t23 & vbCrLf Debug.Print "Recordset_2:" & vbCrLf & _ "table test: " & t14 & vbTab & " test2: " & t24 MsgBox "Done" End Sub Public Function fff_1(tbl_Name As String, tt2 As String) As Long Dim db As DAO.Database Dim rs As DAO.Recordset Dim rr As Long Set db = CurrentDb Set rs = db.OpenRecordset("Select id, tst From " & tbl_Name) rs.FindFirst "[tst]='" & tt2 & "'" If rs.NoMatch Then fff_1 = 0 Else fff_1 = rs!id End If rs.Close: Set rs = Nothing End Function Public Function fff_2(tbl_Name As String, tt2 As String) As Long Dim db As DAO.Database Dim rs As DAO.Recordset Dim rr As Long Set db = CurrentDb Set rs = db.OpenRecordset("Select id, tst From " & tbl_Name & " WHERE tst='" & tt2 & "'") rs.MoveLast: rs.MoveFirst fff_2 = rs.RecordCount rs.Close: Set rs = Nothing End Function
والنتائج من "كمبيوتري القديم" بالثواني واجزاء من الثانية :
Dlookup: table test: 0.1875 test2: 0.0 qry_test, test2: table test: 0.375 test2: 0.00391 Recordset_1: table test: 1.19531 test2: 0.17578 Recordset_2: table test: 0.38281 test2: 0.00391
اما اذا وضعنا الدالة Dlookup في استعلام ، وهو الخطأ ، فنتيجة الاستعلام التالي ، والوقت الذي اخذته:
والوقت الذي اخذته بالثانية وجزء من الثانية 997.8555
جعفر
-
jjafferr's post in مساعدة في تعديل معادلة was marked as the answer
وعليكم السلام 🙂
طريقة اخوي ابوياسين هي ، اذا كان الحقل نص :
اما هذه الطريقة ، فلحقل النص والرقم كذلك :
=NZ(DSum("[chemical_element]","Qlaboratory","[typeelement]='active'"),0)
جعفر
-
jjafferr's post in مساعد في تحويل متغير من رقمي الى نصي في الكود was marked as the answer
وعليكم السلام 🙂
Dim X As Integer X = DCount("*", "[TBvirus]", "[virusid]='" & Me.idvirus & "' AND [idlaboratory]=Forms![Flaboratory]![idlaboratory]") If X > 0 Then MsgBox "error87", 48, "error" DoCmd.CancelEvent End If
جعفر
-
jjafferr's post in مساعدة في الترجع عن التغيرات في الحقول was marked as the answer
وعليكم السلام 🙂
هناك امر لكل جقل اسمه "القيمة القديمة/السابقة" ، هكذا:
me.ABC = me.ABC.oldvalue او me.ABC.value = me.ABC.oldvalue
والشرط الوحيد في توفر القيمة السابقة هي انك لم تقم بحفظ السجل بعد (او تنتقل الى سجل آخر).
جعفر
-
jjafferr's post in استفسار بخصوص متغيرات was marked as the answer
يعني قصدك:
بسبب ان النجار يستطيع استعمال مفك البراغي في كل اعماله:
.
فمافي داعي لبقية الادوات:
.
او لأننا ممكن نستعمل حقل النص لكل البيانات: نص و رقم و تاريخ ،
فمافي داعي استعمال انواع الحقول الاخرى !!
احد اهم الاسباب ان لكل نوع ومتغير عمله ، هو السرعة والدقة في العمل 🙂
جعفر
-
jjafferr's post in مساعدة في تعديل كود was marked as the answer
وعليكم السلام 🙂
اذا اعطيت القيمة في الكود mij= "jjafferr" u = mij اما اذا كانت القيمة في النموذج u = me.mij
جعفر