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

jjafferr

أوفيسنا
  • Posts

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

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

  • Days Won

    415

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

  1. تفضل 🙂 زر لليوم اللي انت فيه ، و زر للأيام اللي تدخلها بين "التاريخ من" الى "التاريخ الى" . . على فكرة ، عدد الموظفين لكل سطر في النموذج الفرعي ، مثل تاريخ 19 اكتوبر ، الشفت الاول ، عندنا : السطر الاول: احالحمد, السعد, السطر الثاني: كاظم, مح الحمد نقدر نتحكم في العدد لكل سطر (طبعا اذا كان السطر طويل ، فطبعا بقية السطر تلقائيا ينتقل للسطر التالي) ، مما يجعل سجلات النموذج الفرعي تطول وتقصر على حسب الاسطر اللي بها 🙂 التحكم من الاستعلام qry_Group_Shifts_by_Dates ، من الرقم اللي يؤشر عليه السهم ، والبرمجة هكذا : الرقم 1 : يعطيك اسم واحد لكل سطر ، الرقم 2 : يعطيك اسمين لكل سطر ، الرقم 3 او اكثر : يعطيك الاسماء بالعدد المكتوب لكل سطر ، الرقم 0 : يعطيك كل الاسماء في سطر واحد (وحتى تقدر ان تحذف الرقم والفاصلة اللي قبله) ، هكذا : S2: Group_Shifts(2,[tbl_Shifts].[nDate]) . والحمدلله قدرت اخلي تحميل النموذج الفرعي اسرع بنسبة 30% (عد لا تسألني كيف حسبتها 🙂 ) جعفر 1281.2.FRm_Refresh.accdb.zip
  2. اذن في هذه الحالة نكون خلصنا من العمل بالمرفق السابق ، صح؟ جعفر
  3. هو بالفعل معقد 🙂 النسخة الماضية كانت فكرة ، والآن التطبيق : 1281.1.FRm_Refresh.accdb.zip . وتم تطبيق رقم 2 🙂 الياقي الآن تاريخ ام القرى 🙂 جعفر
  4. خليني اشوف اللي عملته ، علشان اقدر اعلق عليه 🙂 ومن الخطأ وضع دوال DCount و اخواتها في استعلام ، لأنها تجعل الاستعلام جدا بطيء ، إلا طبعا في حالات جدا خاصة 🙂 جعفر
  5. السلام عليكم 🙂 اولا خليني ادافع عن نفسي واخبرك سبب التأخير 🙂 الجدول الاول مستحيل تكون نتائجة مثل ما هو موضح في الجدول الثاني ، لأن الفرع ليس نفسه في كل السجلات ، بينما الجمع في الجدول الثاني كان على اعتبار ان جميع الفروع هي نفسها (شوف اسم الفروع اللي عليها السهم ، فهي مختلفة) 🙂 وهذا اخذ مني بقية الشعر اللي على راسي ، من كثر ما حكيت رأسي بالمعادلات والنتائج الخطأ 😁 . والان الى الحل: 1. عملت استعلام مجاميع لكل مجموعة ،المجموعة الاولى للتاريخ ، والثانية للشهر ، بينما الاستعلام الثالث هو لحقول الجدول : . والنتيجة . وعملنا استعلام اخير لجمع هذه الاستعلامات الثلاث: . والنتيجة . جعفر 1285.DCOUNT.mdb.zip
  6. السلام عليكم 🙂 . ايش رايك في هذا النموذج ، بس النموذج الفرعي يأخذ وقت عند فتج النموذج !! . جعفر 1281.1.FRm_Refresh.accdb.zip
  7. السلام عليكم 🙂 قمت بدمج دالة اخوي ابوخليل الى برنامجك 🙂 Private Sub Command44_Click() Dim reportName As String Dim fileName As String Dim criteria As String reportName = "r_buy" fileName = GetDesktop & "\" & "r_buy" & ".pdf" criteria = "masterid='" & masterid & "'" DoCmd.OpenReport reportName, acViewPreview, , criteria, acHidden DoCmd.OutputTo acOutputReport, reportName, acFormatPDF, fileName DoCmd.Close acReport, reportName, acSaveNo End Sub Function GetDesktop() As String Dim oWSHShell As Object Set oWSHShell = CreateObject("WScript.Shell") GetDesktop = oWSHShell.SpecialFolders("Desktop") Set oWSHShell = Nothing End Function . جعفر
  8. وعليكم السلام 🙂 ما فهمت 😒 ممكن مثال ببيانات من برنامجك 🙂 جعفر
  9. وعليكم السلام 🙂 الافضل لك ان تترك الاصفار في الجدول ، لأن قيمة الحقل في الجدول اذا كانت Null فيتطلب عمل بعض الخطوات للتعامل مع هذه القيمة ، واما اذا اردت في التقرير ان تُدرج "فراغ"/Null بدل الصفر ، فيمكنك استعمال هذا الكود ، سواء في الاستعلام مصدر بيانات التقرير ، او في التقرير نفسه : A = iif([M02]= 0 , "" , [M02]) جعفر
  10. التجربة اللي عملتها هي: ضبطت برنامج واحد واستخدمت 0.25 ثانيه للإنتظار ، ثم عملت منه 4 نسخ j1 و j2 و j3 و j4 ، ونضعهم مع البرنامج الاصل 1282.1.InvoiceSale_6_FE.accdb في نفس المجلد: . عملت دالتين في هذه الوحدة النمطية في البرنامج الاصل 1282.1.InvoiceSale_6_FE.accdb ، وجعلت اسماء المتغيرات في رأس الوحدة النمطية ، حتى تكون متوفرة للبرنامج كاملا ، حتى اغلاقه : Option Compare Database Option Explicit Dim oAccess1 As Access.Application Dim oAccess2 As Access.Application Dim oAccess3 As Access.Application Dim oAccess4 As Access.Application Dim db1 As String: Dim db2 As String Dim db3 As String: Dim db4 As String ' Public Function Open_Other_DBs() db1 = Application.CurrentProject.Path & "\j1.accdb" db2 = Application.CurrentProject.Path & "\j1.accdb" db3 = Application.CurrentProject.Path & "\j3.accdb" db4 = Application.CurrentProject.Path & "\j4.accdb" ' Dim oAccess As Object Set oAccess1 = CreateObject("Access.Application") 'Create a new Access instance With oAccess1 .OpenCurrentDatabase db1 'Open the specified db .Visible = True 'Ensure it is visible to the end-user .UserControl = True .DoCmd.OpenForm "InvoiceHT_F" 'Open a form? End With Set oAccess2 = CreateObject("Access.Application") 'Create a new Access instance With oAccess2 .OpenCurrentDatabase db1 'Open the specified db .Visible = True 'Ensure it is visible to the end-user .UserControl = True .DoCmd.OpenForm "InvoiceHT_F" 'Open a form? End With Set oAccess3 = CreateObject("Access.Application") 'Create a new Access instance With oAccess3 .OpenCurrentDatabase db1 'Open the specified db .Visible = True 'Ensure it is visible to the end-user .UserControl = True .DoCmd.OpenForm "InvoiceHT_F" 'Open a form? End With Set oAccess4 = CreateObject("Access.Application") 'Create a new Access instance With oAccess4 .OpenCurrentDatabase db1 'Open the specified db .Visible = True 'Ensure it is visible to the end-user .UserControl = True .DoCmd.OpenForm "InvoiceHT_F" 'Open a form? End With End Function Public Function Click_Other_DBs() oAccess1.Forms![InvoiceHT_F].New_Click oAccess2.Forms![InvoiceHT_F].New_Click oAccess3.Forms![InvoiceHT_F].New_Click oAccess4.Forms![InvoiceHT_F].New_Click End Function . وناديتهم كالتالي: . الدالة Open_Other_DBs مرة واحدة تفتح البرامج الاربعة ، هكذا : . . وبما ان المتغيرات موجودة في رأس الوحدة النمطية ، فيمكننا التحكم بالبرامج الاربعة مفتوحة ، يعني عندنا 4 مستخدمين ، الآن نستخدم الدالة Click_Other_DBs ، والتي تنقر على زر "جديد" للبرامج الاربعه في نفس الجزء من الثانية ، يعني المستخدمين الاربعة يدخلون سجل جديد في نفس الجزء من الثانية ، يعني مافي مزاح في الموضوع 😁 ولما اشوف الايقونه ترمش ، اعطي الامر مرة اخرى للدالة Click_Other_DBs ، وهكذا ، والحمدلله النتائج صحيحة 🙂 واكون فاتح الجداول ، واشوف ان الارقام الحمدلله مافيها تكرار ، ولا تعطي البرامج الاربعة اي خطأ عن وجود تكرار 🙂 جعفر 1281.1.zip
  11. السلام عليكم 🙂 اعتقد بأني توصلت لحل ، وبعد عدة محاولات على الشبكة ، على كمبيوترين 🙂 1. النموذج ، تم حذف الجدول CustomersT من استعلام النموذج : . 2. الكومبوبوكس يقوم بإعطاء قيمة اسم الزبون CustomerName ، 3. تم حذف امر حفظ السجلات من الوحدة النمطية ، لأنها لم تكن على سجل النموذج ، فإنها لا تحفظ السجل المطلوب ، 4. تم استعمال هذا الكود لحفظ الترقيم : Private Sub New_Invoice() On Error GoTo err_New_Invoice Try_Again: If Me.NewRecord Then Me.InvoiceNum = Next_Seq("A") DoCmd.RunCommand acCmdSaveRecord End If Exit_New_Invoice: Exit Sub err_New_Invoice: If Err.Number = 3022 Then Dim PauseTime, Start PauseTime = 0.5 ' Set duration. Start = Timer ' Set start time. Do While Timer < Start + PauseTime DoEvents ' Yield to other processes. Loop Resume Try_Again Else MsgBox Err.Number & vbCrLf & Err.Description End If Resume Exit_New_Invoice End Sub . ولما البرنامج يلاحظ وجود تكرار في الرقم ، فإنه يذهب الى رقم الخطأ (3022 كما ذكره اخونا حسام) ، وهنا ينتظر 0.5 (نصف ثانية ، ويمكنك تقليلها ، وبالتجربة ستعرف الرقم الاصح ، والافضل ان تتركه كما هو) ، ثم يعاود المحاوله في الحصول على ترقيم جديد غير مكرر (وهذا الكود وضعته في حدثين) ، وتم تجربته عدة مرات واثبت جدارته 🙂 البرنامج بعده طازه وطالع من الشبكة ، فلازم تعمل له ربط للجداول قبل تشغيله ، فهو بدون جداول 🙂 جعفر 1282.1.InvoiceSale_6_FE.accdb.zip
  12. على حسب ما تراه في التقرير لما يكون في وضع "معاينة الطباعة" ، بعدد صفحاته 🙂 جعفر
  13. وعليكم السلام اختي الفاضلة 🙂 هناك العديد من الطرق للبحث ، وموضوعك كان البحث عن طريق "نافذة البحث" ، والتي لها حدودها ، مثل ما شرحت سابقا ، ولا يمكن دمجها مع طريقتك 🙂 نعم ممكن ان نعمل نموذج مخفي ، نبحث فيه ، ونُظهر النتيجة في النموذج الظاهر امامنا ، ولكن الموضوع ما يستاهل كل هذا التعقيد 🙂 والكود الذي يقوم بعمل البحث في المرفق ، هو طريقة اخرى للبحث ، ولكنه يحتاج الى تعديل ، لأنه سيكون جدا بطيء اذا كان عندك آلاف السجلات !! دائما علشان يكون عملك صحيح ، احسبي حساب اسوء الاحتمالات ، واحسبي حساب انك تتعاملين مع 50 الف سجل على الاقل ، وبهذه الطريقة يكون عملك مُتقن 🙂 جعفر
  14. وعليكم السلام 🙂 رجاء وضع عنوان يدل على الموضوع ، شكرا 🙂 فكرة اخوي حسام هي الافضل ، ولكن ولإثراء الموضوع ، يمكننا استخدام كائن صورة واحد في النموذج الرئيسي (المكان المكتوب عليه "اختر نوع الرقبة") ، ولنسميه img_main والموجود في النموذج الرئيسي "نموذج1" ، . وعند النقر في النموذج الفرعي على الصورة المطلوبة ، على حدث "النقر" يمكننا كتابة الكود التالي : Forms![نموذج1]!img_Main.PictureData = me.t4.PictureData او عمل وحدة نمطية ، وارسال اسم الكائن اليها في المتغير prev_img Forms![نموذج1]!img_Main.PictureData = Forms![نموذج1]![قائمة الياقات](prev_img).PictureData . الفكرة هنا ، انه اذا عندنا شعار المؤسسة في النموذج الرئيسي ، واردنا في كل تقرير نطبعه ، ان نضع هذا الشعار ، فلا يوجد داعي الى الرجوع الى المجلد/الجدول الذي به هذه الصورة وجلبها من هناك ، وانما يمكننا استخدام الامر PictureData (اي نسخ الصورة) لإظهار هذا الشعار في التقارير/النماذج التي نريدها 🙂 جعفر تجربةالصور.zip
  15. السلام عليكم اخي احمد 🙂 رجاء الالتزام بقوانين المنتدى ، وعمل موضوع منفصل لكل سؤال 🙂 تمت الاجابة على السؤال اصل الموضوع ، لذلك ، رجاء فتح موضوع جديد لبقية اسئلتك ، ولا مانع من ان يرد الاخ حسام على آخر حيثية من سؤالك 🙂 جعفر
  16. هاي سهلة ، برنامجي يدخل تاريخ اليوم عن طريق الدالة Date في الاستعلام الالحاقي ، فبدلا عنه يمكننا استعمال طريقتك ، وشفت ان الحقل TxtUm يعطي اليوم كاملا ، فممكن نستعمل هذا اليوم الهجري من تقويم ام القرى ، ولكن ، شفت ان عندك تواريخ ام القرى وتواريخ ميلادية ، فهل سيكون عندك خلط بينهم ، وكيف؟ ممكن اضافة حقل في الجدول Emp يدل على وجود ان الموظف مداوم لذلك اليوم ، حقل نعم/لا مثلا ، وفي جميع الاستعلامات مثل qry_1 ، نصفي الموظفين المداومين في ذلك اليوم. اشرح لي هذه النقطة وبالتفصيل ، فعسى ان نتوصل الى طريقة سهلة ومرضية ان شاء الله 🙂 جعفر
  17. طريقة العمل : عند عمل يوم جديد ، نقوم بإدراج جميع الموظفين من الجدول Emp الى الجدول tbl_Shifts ، ويكون رقم الشفت امام كل سجل = 0 ، في النموذج : كل نموذج فرعي يأخذ بياناته من الجدول tbl_Shifts ، ومن نفس الحقل (لا توجد جقول مختلفة لكل شفت) ، ويعتمد على رقم النموذج الفرعي (رقم الشفت) ، فيُظهر رقم الشفت الخاص به ، او صفر (ومعناه السجلات التي لم يتم اختيارها بعد) ، ولما نختار اسم الموظف في النموذج الفرعي ،فهو يغير رقم الشفت من صفر الى رقم الشفت ، بإستخدام الدالة De_Select(1) مثلا ، والتي تدل على اننا في الشفت 1. هناك الكثير من الاختصارات في الكود ، فمثلا ، بدل ان نعمل كود خاص لكل نموذج فرعي ، عند اختيار الاسم : نغير الشفت من صفر الى رقم الشفت ، نحفظ السجل ، نطلب البيانات من اول وجديد لجميع هذه النماذج الفرعية ، حيت ان الاختيار سيغير مكان الموظف الى شفت الذي ينتمي (وهذه كانت المعضلة في برنامجك السابق) ، ثم نجمع الحقول التي تم اختيارها في كل نموذج فرعي ، ونضع القيمة في الاسفل ، هنا الدالة De_Select تقوم بجميع هذه الخطوات ، ولكل النماذج 🙂 وتلاحظ ان النماذج الفرعيه لا يوجد بها كود اصلا ، وذلك لأننا ننادي الكود من اعدادات الحقل nSelected (بدل ان نعمل حدث بعد التحديث 🙂 ) . جعفر
  18. وعليكم السلام 🙂 اخي الفاضل ، في المرات القادمة ، رجاء مراعاة قوانين المنتدى بوضع عنوان يدل على محتوى السؤال 🙂 اما سؤالك : خطأ Over Flow معناه ان القيمة اكبر من حجم المتغير ، المتغير x و i عندك integer ، فيجب تكبير هم الى Long . جعفر
  19. وعليكم السلام 🙂 طريقة العمل: 1. انا بعمل حقل جديد ، ونوعه لازم يكون رقم . 2. في النموذج ، نختار نعمل "اختيار مجموعة" . نعمل مربع ، ونلغي بقية العملية . وعندك الاختيار في اختيار احد هذه الاشكال . نلاحظ انه لما يجي الماوس على المربع ، تلقائيا لونه يتغير للأسود ، مما يعني ان المربع تعرف على ان هذا الكائن الجديد هو تابع للمربع . ونعمل تغيير في اسم الكائن ، ونجعله مرتبط بالحقل Paid . الشيء الاخير اللي لازم نعمله هو ، نعطي لكل اختيار رقمه ، والاختيار الثاني ممكن يكون 2 ، والثالث 3 ، والرابع 4 ، ولا يكون لإختيارين نفس الرقم ، ولا يهم الاسم Option36 . نلاحظ الآن عند الاختيار ، فتلقائيا يعطينا اختيار واحد فقط : . وبما اننا في النهاية اخترنا الاختيار الثالث ، نرى في الجدول انه تم حفظ الرقم 3 : . هذه الطريقة تُغنينا عن مجموعة من الحقول 🙂 جعفر 1284.officna_q.accdb.zip
  20. السلام عليكم 🙂 في اعتقادي ان هذه اسهل طريقة ، واذا استعملت التنسيق الشرطي لتلوين السجلات اللي تم اختيارها ، سيكون الفت للنظر 🙂 ما بدخل في تفاصيل ، لأنه في الواقع مافي تفاصيل ، جرب ببيانات آخر يوم مثل تاريخ اللي في الصوره ، وبعدها اعمل سجل جديد بواسطة "ادخال سجل جديد لليوم" 🙂 صحيح اني استعملت 5 نماذج فرعيه ، لأنه في الواقع مافي فرق بينها وبين ComboBox و ListBox (في استغلالهم طاقات الاكسس) ، ولكن النموذج فيه امكانيات اكثر ، ونحن متعودين على التعامل معاه اكثر ، فيكون التعامل معاه اسهل ، وكل نموذج فرعي له استعلام 🙂 . هذه احداث النموذج Private Sub cmd_Add_New_Click() 'check if Records exist for this date If DCount("*", "tbl_Shifts", "[nDate]=#" & Date & "#") = 0 Then DoCmd.SetWarnings False DoCmd.OpenQuery "qry_Append_Today" DoCmd.SetWarnings True End If 'go to this Record Me.Requery DoCmd.GoToRecord , , acLast End Sub Private Sub cmd_Requery_Click() 'get the data based on the selected Dates Me.Requery End Sub Private Sub Form_Current() 'Count the Selected Call Count_Selected End Sub . والحدث "بعد التحديث" لزر الاختيار في النموذج الفرعي ، ينادي الوحدة النمطية De_Select ، ويرسل معها رقم الشفت ، اللي يتماشى مع رقم النموذج الفرعي : . وهذه هي الوحدة النمطية : Option Compare Database Option Explicit Dim frm As String Dim sfrm As String Dim ctrl As Control ' Public Function De_Select(sShift As Integer) frm = Screen.ActiveForm.Name 'Main Form name sfrm = Forms(frm).Controls("sfrm_" & sShift).Name 'SubForm name 'change the nShift of the Record, based on the selection of nSelected If Forms(frm)(sfrm)("nSelected") = -1 Then Forms(frm)(sfrm)("nShift") = sShift Else Forms(frm)(sfrm)("nShift") = 0 End If 'save the Record to show the change on other sfrm If Forms(frm)(sfrm).Form.Dirty Then Forms(frm)(sfrm).Form.Dirty = False 'requery all the SubForms to show the correct Selection Call Re_query End Function Public Function Re_query() 'requery all the SubForms on the Main Form For Each ctrl In Forms!frm_Daily_Shift.Form.Controls If ctrl.ControlType = acSubform Then Forms!frm_Daily_Shift(ctrl.ControlName).Form.Requery End If Next 'show the number of Selected Records Call Count_Selected End Function Public Function Count_Selected() As Integer On Error GoTo err_Count_Selected Dim rst As DAO.Recordset Dim i As Integer '5 subForms For i = 1 To 5 Count_Selected = 0 Set rst = Forms!frm_Daily_Shift("sfrm_" & i).Form.RecordsetClone rst.MoveFirst Do Until rst.EOF If rst!nSelected = -1 Then Count_Selected = Count_Selected + 1 End If rst.MoveNext Loop 'show the result of the sfrm Selected Count Forms!frm_Daily_Shift("Sum_" & i) = Count_Selected Next i Exit_Count_Selected: rst.Close: Set rst = Nothing Exit Function err_Count_Selected: If Err.Number = 3021 Then 'no Records Resume Exit_Count_Selected Else MsgBox Err.Number & Err.Description End If Resume Exit_Count_Selected End Function . جعفر 1281.FRm_Refresh.accdb.zip
  21. انا سأحاول ان اطبق على شبكة بأكثر من كمبيوترين ، وان شاء الله خير 🙂 جعفر
  22. وعليكم السلام 🙂 ممكن تشرح لي كيف عملت التجربة ، خليني اقوم بمثلها ، واجرب 🙂 جعفر
×
×
  • اضف...

Important Information