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

jjafferr

أوفيسنا
  • Posts

    10148
  • تاريخ الانضمام

  • تاريخ اخر زياره

  • Days Won

    415

كل منشورات العضو jjafferr

  1. السلام عليكم اخوي ابوخليل اسمح لي ادخل في النص ، واحاول اطبق الفكرة اللي شرحتها هنا: في المرفق ، يوجد زر اسمه "وزّع" ، وذلك لعمل سجلات الاجازات للجدول tbl_mn7_Details ، وذلك لمنح الاجازة ، وزر "استقطع" ، وذلك للتأشير على السجلات التي سوف تُستقطع من الاجازات الممنوحة ، في الجدول tbl_mn7_Details . الآن ، الجدول tbl_mn7_Details به الاجازات الممنوحة ، والمستقطعة ، لذلك يمكن عمل استعلام لحساب الاشياء الاخرى المطلوبة أعتذر مسبقا عن عدم تمكني من عمل اي شئ إضافي ، لأني على سفر بعد اقل من 11 ساعة ولمدة عدة اسابيع جعفر 413.الاجازات.mdb.zip
  2. وعليكم السلام الكود يقوم بفتح الملف الموجود مساره واسمه في الحقل DTPath فمثلا الملف التالي سيفتحه الكود اعلاه بإستخدام البرنامج الافتراضي في الوندوز لفتح هذه الصيغة: DTPath= "F:\Officena\Report_Time.txt" جعفر
  3. السلام عليكم تكملة للتجربة اعلاه ، وبعد وضع كود جديد في المشاركة الاخيرة ، وهذا الكود يعتمد على انشاء جدول مؤقت ، اضع لكم النتائج: 1-7-2016 to 30-7-2016 j = 335.2969 R = 239.1992 Transpose = 148.8281 والكود على هيئة دالة Option Compare Database Function transposer() 'http://www.access-programmers.co.uk/forums/showpost.php?p=907107&postcount=15 'Edited by jjafferr on 22-7-2016 Dim db As DAO.Database Dim tdfNewDef As DAO.TableDef Dim fldNewField As DAO.Field Dim rstSource As DAO.Recordset Dim rstTarget As DAO.Recordset Dim i As Integer, j As Integer Dim strSource As String Dim strTarget As String Dim sqlcode As String Dim t_array() As Variant Dim t_no_of_rows As Integer Dim t_no_of_columns As Integer Dim s_no_of_rows As Integer Dim s_no_of_columns As Integer Dim T As Long On Error GoTo Transposer_Err 'strSource = "tbl_input" strSource = "qry_blagh_2" strTarget = "tbl_output" Set db = CurrentDb() 'Set rstSource = db.OpenRecordset("SELECT * FROM tbl_input ORDER BY sample_type", dbOpenDynaset) Set rstSource = db.OpenRecordset("SELECT * FROM " & strSource, dbOpenDynaset) rstSource.MoveLast t_no_of_rows = rstSource.Fields.count t_no_of_columns = rstSource.RecordCount + 1 s_no_of_columns = rstSource.Fields.count s_no_of_rows = rstSource.RecordCount + 1 DoCmd.SetWarnings False sqlcode = "DELETE tbl_output.* FROM tbl_output" DoCmd.RunSQL sqlcode DoCmd.SetWarnings True ReDim t_array(t_no_of_rows, t_no_of_columns) ' Fill the first field of the array with ' field names from the original table. For i = 0 To t_no_of_rows - 1 t_array(i, 0) = rstSource.Fields(i).Name Next i rstSource.MoveFirst ' Fill each column of the array ' with a record from the original table. For j = 0 To t_no_of_rows - 1 ' Begin with the second field, because the first field ' already contains the field names. For i = 1 To t_no_of_columns - 1 ' Debug.Print i & " " & j t_array(j, i) = rstSource.Fields(j) rstSource.MoveNext Next i rstSource.MoveFirst Next j ' Fill the target table with fields from the array Set rstTarget = db.OpenRecordset(strTarget) For j = 0 To t_no_of_rows - 1 rstTarget.AddNew T = 0 For i = 0 To t_no_of_columns - 1 'rstTarget.Fields(i) = t_array(j, i) rstTarget.Fields(i + 1) = t_array(j, i) 'j If j > 0 And IsNumeric(t_array(j, i)) Then T = T + Val(t_array(j, i)) End If Next i rstTarget!Totals = T rstTarget.Update Next j db.Close 'MsgBox ("finished") Exit Function Transposer_Err: Select Case Err Case 3061 'Too Few parameters, expect 2 Set db = CurrentDb Set qdf = db.QueryDefs(strSource) For Each prm In qdf.Parameters prm.Value = Eval(prm.Name) Next prm Set rstSource = qdf.OpenRecordset(dbOpenDynaset) Resume Next Case 3010 MsgBox "The table " & strTarget & " already exists." Case 3078 MsgBox "The table " & strSource & " doesn't exist." Case Else MsgBox CStr(Err) & " " & Err.Description End Select Exit Function End Function اما الجدول المؤقت فهكذا شكله: وهذه نتيجته جعفر
  4. السلام عليكم أخي صالح ، شرحك هو حول الامر NZ هنا تحدثت عن هذا الامر: فالدالة Len هي لحساب عدد الحروف في حقل او قيمة ، بغض النظر عن نوع الحقل ، نص او رقم او تاريخ او .. جعفر
  5. تستطيع استعمال اي من هذه الطرق الثلاث: Private Sub أمر1_Click() 'On Error Resume Next '1. ' Me.dd.SetFocus ' DoCmd.GoToRecord , , acNext '2. Me.dd.Form.Recordset.MoveNext '3. ' Me.dd.SetFocus ' DoCmd.RunCommand acCmdRecordsGoToNext End Sub Private Sub أمر3_Click() On Error Resume Next '1. ' Me.dd.SetFocus ' DoCmd.GoToRecord , , acPrevious '2. Me.dd.Form.Recordset.MovePrevious '3. ' Me.dd.SetFocus ' DoCmd.RunCommand acCmdRecordsGoToPrevious End Sub جعفر
  6. وعليكم السلام Option Compare Database Private Sub أمر1_Click() On Error Resume Next Me.dd.SetFocus DoCmd.GoToRecord , , acNext End Sub Private Sub أمر3_Click() On Error Resume Next Me.dd.SetFocus DoCmd.GoToRecord , , acPrevious End Sub جعفر
  7. السلام عليكم ادلو بدلوي اللي انا عملته في مجموعة من برامجي ، وخصوصا عند حساب الحضور في برنامج البصمة ، ان يكون عندي جدول خاص بالاجازات: حقل واحد للتاريخ (مفهرس) ، وليس حقلين: من تاريخ والى تاريخ ، وانما هو حقل واحد للتاريخ ، حيث في النموذج اجعل البرنامج يعمل سجلات بعدد ايام الاجازة ، حقل نوع الاجازة ، حقل قطع اجازته ، نعم/لا ، الفائدة من جعل حقل واحد للتاريخ ، هو امكانية عمل الامر Between بين تاريخين ، وإلا فنضطر الى عمل كود ليحسب بين التاريخين !! والفرق: عندما نتعامل مع قاعدة بيانات فيها 100 او 1000 سجل ، فما في مشكلة ، جميع الطرق تحقق لك سرعة مقبولة ، ولكن لما تتعامل مع اكثر من 300,000 سجل شهريا ، وعندك اكثر من جدول يجب التعامل معه ، فسترى ان طريقة الحقل الواحد اسرع واريح في العمل طبعا باستخدام الامر Between بين تاريخين جعفر
  8. السلام عليكم أخي محمود ، للأسف الشديد ، لا برنامجي كان ينفع ولا برنامج أخي رمهان ، لأن برنامجك المرفق الجديد يختلف عن البرنامج السابق ، للأسف الشديد ما ممكن نعمل تقرير للنتيجة ، لأن عدد الحقول غير معروف (نعم عندك 10 انواع بلاغ الآن ، ولكن قد يزيدوا لاحقا ، فلا يمكن عمل تقرير ثابت) !! رجاء استخدم النموذج frm_Main ، ونتيجة الزر الآن تكون الجدول tbl_Output ، واللي يمكنك عمل ما تشاء به. جعفر 411.Blagh_OK.accdb.zip
  9. حياك الله يمكن يكون اسهل لك بأن تعمل استعلام ، وفي وضع تصميم SQL ، استعمل هذه الجملة والتي ستعطيك سجل واحد فقط ، واجعل هذا الاستعلام مصدر معلومات النموذج: Select TOP 1 * From task Order by Auto_ID Desc جعفر
  10. تفضل: dim rst as dao.recordset mySQL = "Select * From task Order by Auto_ID Desc" set rst=currentdb.openrecordset (mySQL) rst.MoveLast: rst.MoveFirst Me.textbox15 = rst!cash جعفر
  11. وعليكم السلام اليك هذا الرابط ، ولكن للقيمة الاولى ، وما عليك إلا استخدام Desc ، هكذا: mySQL = "Select * From tbl2 Order by Auto_ID Desc" جعفر
  12. السلا عليكم الموضوع هذا اصبح له حلّان: حلّي انا بإستخدام الاستعلام الجدولي ولأكثر من مرة ، وحل اخوي رمهان بإستخدام دالة Dcount في التقرير اكثر من مرة (اما موضوع النتائج الغير صحيحة كما اشرت اليها في مشاركتي السابقة ، فهو موضوع سهل حلّه على اخوي رمهان) . السؤال الذي طرأ على بالي هو: اي الطريقتين هي الاسرع (على اساس ان الطريقتين تعطيان النتائج الصحيحة) ، وبذلك نقترح هذه الطريقة على الاخ محمود سعيد في برنامجه لحساب السرعة ، يجب ان تكون الجداول كبيرة ، حتى يكون للمقارنة معنى ، لذلك عملت التالي: 1. عملت الفهرسة للحقول التي تحتاج فهرسة ، 2. جعلت عدد السجلات في الجداول كالتالي: Blagh = 3,845,966 ، المصابين = 1,922,966 ، الوفيات = 1,538,373 3. بحيث اصبح حجم قاعدة البيانات حوالي 328MB الموضوع اخذ مني يوم كامل ، والنتائج: وطريقة احتساب الوقت الذي أخذه كل تقرير على حده هو: t = Timer docmd.openreport .... Time_Took = Timer - t والنتيجة بالثوان: j = جعفر ، R = رمهان 1-7-2016 to 7-7-2016 j = 109.8164 R = 132.0977 1-7-2016 to 15-7-2016 j = 230.1016 R = 187.8359 1-7-2016 to 30-7-2016 j = 335.2969 R = 239.1992 وهذه صور التقرير النهائي: جعفر: . رمهان: لهذا السبب ، فانا اقترح على الاخ محمود سعيد ان يستخدم طريقة الاخ رمهان (طبعا بعد ان يتم تصحيح النتائج بها) ، فهي الاسرع في الاداء جعفر
  13. السلام عليكم نعم أخوي رمهان اللي تقوله يصير ، ولكني كنت اشير الى الطريقة التي عملت فيها برنامجي ، فبرنامجي معتمد عليه: وبالبرمجة ممكن عمل اي شئ وانزلت برنامجك واتضح انك تستخدم دالة Dcount في التقرير ، وعملت مقارنة بين نتائجي ونتائجك ، بس الظاهر ان عندك خطأ في الجمع: نتيجتي (بعد ان اخذت بيانات جداولك): . ونتيجتك: ورجاء متابعة المشاركة التالية جعفر
  14. السلام عليكم نعم ، عندك كود إخفاء الخلفية في نموذج الافتتاح ، فتم توقيفه عن العمل ، هكذا: Private Sub Form_Open(Cancel As Integer) 'fSetAccessWindow (SW_SHOWMINIMIZED) End Sub جعفر 412.برنامج تدريبي.accdb.zip
  15. مثل ما اختي أم خلود قالت ، يُفضل ان ترفق برنامجك ، وتخبرنا متى (عند ضغط اي زر) يحصل هذا. ما كنت اعنيه: المرفق في الرابط التالي يخفي خلفية اكسس: http://www.officena.net/ib/topic/66410-ارغب-في-اخفاء-اطار-اكسس-عنوان-معدل/?do=findComment&comment=431836 اسم المستخدم وكلمة السر 123 فاذا كان برنامجك فيه الكود ليعمل هذا ، فيجب ازالت الكود او تضبيطه جعفر
  16. السلام عليكم الظاهر عندك كود اللي يخفي خلفية الاكسس ، ويمكن فيه شروط معينة تخلي الكود يشتغل !! جعفر
  17. وعليكم السلام اخوي رمهان 1. حياك الله ، ولك مثل ما دعوت لي وزيادة ان شاء الله 2. كلامك صحيح ، هذا لأن الاخ محمود سعيد اخبرني ان الموضوع كله متعلق بالجدول Blagh ، فلهذا السبب شغلي كله كان عليه ، مع اني شفت الجدولين الثانيين ، ولكني لم اربط بينهما ، ولكن وبعد ملاحظتك ، قمت بتعديل البرنامج ، بحيث اصبح يأخذ من الجداول الثلاثة: Blagh والمصابين والوفيات ، ومرفق نسخة منه ، 3. لا تستطيع ان تستغني عن حقلي المصابين والوفيات في الجدول Blagh ، وذلك لأنه في حالات يوجد بلاغ ولا يوجد مصابين ولا وفيات ، ولا يوجد جدول مستقل لحالات البلاغ ، وقد عملت البرنامج على حساب هذين الحقلين في الجدول شكرا على المتابعة وعليكم السلام اخي محمود لوسمحت المرات الجاية ، لوسمحت لا تضع ملف تجريبي ، لأن العمل يصير مرتين استعمل احد برامج الضغط مثل winzip او winrar ، وارفق ملفك في الموضوع ، فانا لا املك حساب في الموقع الذي رفعت فيه الملف. جعفر 411.Database11.accdb.zip
  18. الله يسلمك اخوي محمد اذا تلاحظ ، مافي كود في العملية كلها في طريقة ثانية عن طريق الكود ، بس تحتاج نكتب في جدول مؤقت ، بحيث يأخذ التقرير بياناته من هذا الجدول المؤقت ، وانا اتفادى الجداول المؤقته ، لأنها تُكبّر من جحم البرنامج ، ويجب عليك الضغط والاصلاح لتصغير البرنامج جعفر
  19. وعليكم السلام ورحمة الله وبركاته السؤال ظاهرا سهل ، ولكني لم اجد طريقة سهلة لحلّه اليك خطوات عملي: الجدول الذي نأخذ منه البيانات: . والنموذج الذي يجب ان نحتار التاريخين فيه: . استعلام المجاميع Totals لجمع البيانات حسب الحالات المتشابهة بين تاريخي النموذج: . ونتيجته: . وفي الواقع ، كل العمل التالي هو لجعل معلومات الاستعلام اعلاه تدور 90 درجة الاى اليمين ، ليصبح: . لعمل الدوران لكل حالة ، نحن محتاجين نعمل استعلام جدولي Crosstab Query ، وفي حالتنا عندنا 3 حالات ، عدد البلاغات ، عدد المصابين ، عدد الوفيات: . والنتيجة لكل حالة: . ولكن الاستعلام الجدولي محتاج تضبيط قبل ان يشتغل بالطريقة الصحيحة: اولا: بإدخال جميع الحالات الموجودة ، حتى تظهر لنا في التقرير (وإن لم يكن فيها قيمة للفترة بين تاريخين): . ثانيا: بتعريف المعايير التي تم استخدامها في استعلام المجاميع سابقا: . الآن لدينا 3 استعلامات جدولية ، وفي كل واحد منها قيمة ، ولكننا نريد القيم الثلاث ، لذا يجب ان نعمل استعلام تجميع Union query لهذه الاستعلامات الثلاث: . والنتيجة: . ولكن الاستعلام اعلاه جدا حساس ، واذا غيّرت شئ ، فلن يعمل الاستعلام!! ولكننا بحاجة الى عمل مجموع للقيم !! لذا ، سنأخذ الاستعلام السابق ، ونعمل منه استعلام جديد عادي Select ، بحيث نجمع القيم في الحقل Total ، كمل عملنا حقل للملاحظات (طبعا انت يجب ان تربطه بجدول): . والنتيجة: . بس انت ولا يهمك كل الكلام اعلاه ، فقط اضغط في النموذج على زر معاينة التقرير ، علشان تحصل على نتيجة جميع الاستعلامات اعلاه: سهله هاه جعفر 411.Database11.accdb.zip
  20. موضوع متكرر
  21. ان شاء الله بس بعض الاوقات لازم نفتح النموذج ، وفي الامر نخبر البرنامج اننا نريد فتحه على هيئة ورقة بيانات ، هكذا: DoCmd.OpenForm "frm_Silver", acFormDS جعفر
  22. بالاضافة الى ملاحظة أخي رمهان ، يُفضل ان ترفق هذه الجزئية من برنامجك ، وتخبرنا عن طريقة عرض النموذج (عن طريق الزر الفلاني) ، ومنها الجواب يكون ادق جعفر
  23. وعليكم السلام هاي احنا ما طلّعنا الزار ولا عزمنا ولا عملنا بخور ولبان وحرمل ولا استعنّا بالشيخ الحل كان بسبب شرحك ومثالك الواضح (مب شرحك الاول ) ، المشكلة تصير لما السائل يسأل بكلمتين ويرفق برنامجه ، وبدون مثال ، وبدون ما يقول اي نموذج / جدول يتكلم عنه ، ولا حتى اي حقل ، بل بعض الاوقات يطلب الجواب بصيغة معينة (يعني هو يكون الـ Navigator وانت السائق ، هو يوجّهك في الاتجاه الذي يريد) ، وبهذه الطريقة ياتوصل الى طريق مسدود او الى طريق وعر حياك الله جعفر
  24. السلام عليكم عملي كله معتمد على: لتسهيل الامر ، اضفت الى النموذج زر: أ. اذا النموذج الفرعي فارغ ، فعند النقر على الزر فانه يضيف 5 سجلات فيه حسب ما وضحت انت ، ولا يعمل الزر اذا كان فيه سجلات ، ب. سواء استخدمت الزر او ادخلت البيانات يدويا بنفس الترتيب (نفس الوجبات ونفس الترتيب) ، فهنا يبدأ الكود في العمل ، مثلا: لا يسمح لك بإدخال سجل سادس ، لا يسمح لك تغيير قيمة حقل الكميات في السجل الرابع والخامس ، عند تغيير قيمة حقل الكميات في اي سجل ، فانه يقوم بعملية الحساب من جديد. هذا كود زر الاضافة: Private Sub cmd_add_5_Click() On Error GoTo err_cmd_add_5_Click Dim rst As DAO.Recordset Dim food_list 'save the Record of the Main Form, if not saved If Me.Dirty Then Me.Dirty = False Set rst = Me.main.Form.RecordsetClone rst.MoveLast: rst.MoveFirst RC = rst.RecordCount 'this should be a new set, make sure we don't have Records If RC <> 0 Then MsgBox "لا يمكن الاضافة ، توجد سجلات مسبقا" & vbCrLf & _ "Can't add on existing Records" GoTo Exit_cmd_add_5_Click End If food_list = Array("hamor", "zbedy", "nweby", "sheep", "tona") For i = 1 To 5 rst.AddNew rst!cid = Me.ID rst!food = food_list(i - 1) rst.Update Next i Exit_cmd_add_5_Click: rst.Close: Set rst = Nothing Exit Sub err_cmd_add_5_Click: If Err.Number = 3021 Then 'No Records Resume Next ElseIf Err.Number = 3201 Then 'No Record in main Form MsgBox "رجاء تعبئة بيانات النموذج الرئيسي اولا" & vbCrLf & _ "Please fill Main Form first" Resume Exit_cmd_add_5_Click Else MsgBox Err.Number & vbCrLf & Err.Description End If End Sub وهذا كود النموذج الفرعي: Private Sub food_AfterUpdate() 'do the calculations for Records 4 and 5 Call Check_Record End Sub Function Check_Record() On Error GoTo err_Check_Record ' If Me.NewRecord = True Then Exit Function If Me.Dirty Then Me.Dirty = False 'DoCmd.RunCommand acCmdSaveRecord Dim food_list Dim rst As DAO.Recordset 'if we have the same list, then DON'T ALLOW CHANGES TO QTY Set rst = Me.RecordsetClone rst.MoveLast: rst.MoveFirst RC = rst.RecordCount food_list = Array("hamor", "zbedy", "nweby", "sheep", "tona") Counter = 0 For i = 1 To 5 If rst!food = food_list(i - 1) Then Counter = Counter + 1 End If rst.MoveNext Next i If Counter = 5 Then 'get the 4th and 5th Records values rst.MoveFirst Q1 = rst!qty rst.MoveNext Q2 = rst!qty RQ5 = Q2 / 5 rst.MoveNext Q3 = rst!qty RQ4 = Q1 - (Q3 + RQ5) rst.MoveNext rst.Edit rst!qty = RQ4 rst.Update rst.MoveNext rst.Edit rst!qty = RQ5 rst.Update End If Exit_Check_Record: rst.Close: Set rst = Nothing Exit Function err_Check_Record: If Err.Number = 3021 Then Resume Exit_Check_Record Else MsgBox Err.Number & vbCrLf & Err.Description End If End Function Private Sub Form_Current() On Error GoTo err_Form_Current If Me.NewRecord = False Then Exit Sub Dim food_list Dim rst As DAO.Recordset 'if we have the same list, then DON'T ALLOW CHANGES TO QTY Set rst = Me.RecordsetClone rst.MoveLast: rst.MoveFirst RC = rst.RecordCount food_list = Array("hamor", "zbedy", "nweby", "sheep", "tona") Counter = 0 For i = 1 To 5 If rst!food = food_list(i - 1) Then Counter = Counter + 1 End If rst.MoveNext Next i If Counter = 5 Then Cancel = True Me.Undo DoCmd.GoToRecord , , acPrevious MsgBox "لا يمكنك اضافة سجل جديد" & vbCrLf & _ "Can't add a new Record" Exit Sub End If Exit_Form_Current: rst.Close: Set rst = Nothing Exit Sub err_Form_Current: If Err.Number = 3021 Then Resume Exit_Form_Current Else MsgBox Err.Number & vbCrLf & Err.Description End If End Sub Private Sub qty_AfterUpdate() 'do the calculations for Records 4 and 5 Call Check_Record End Sub Private Sub qty_BeforeUpdate(Cancel As Integer) On Error GoTo err_qty_BeforeUpdate Dim food_list Dim rst As DAO.Recordset 'if we have the same list, then DON'T ALLOW CHANGES TO QTY Set rst = Me.RecordsetClone rst.MoveLast: rst.MoveFirst RC = rst.RecordCount food_list = Array("hamor", "zbedy", "nweby", "sheep", "tona") Counter = 0 For i = 1 To 5 If rst!food = food_list(i - 1) Then Counter = Counter + 1 End If rst.MoveNext Next i If Counter = 5 Then If Me.food = "sheep" Or Me.food = "tona" Then Cancel = True Me.Undo MsgBox "لا يمكنك تغيير قيمة الكمية اذا كانت الوجبة " & vbCrLf & Me.food & vbCrLf & _ "Can't change Qty if food is " & Me.food Exit Sub End If End If Exit_qty_BeforeUpdate: rst.Close: Set rst = Nothing Exit Sub err_qty_BeforeUpdate: If Err.Number = 3021 Then Resume Exit_qty_BeforeUpdate Else MsgBox Err.Number & vbCrLf & Err.Description End If End Sub جعفر 407.قيمة محسوبة.mdb.zip
  25. وهل اصبح الموضوع واضح الان ، ام تحتاج لمزيد من التوضيح ؟ جعفر
×
×
  • اضف...

Important Information