اذهب الي المحتوي
أوفيسنا
بحث مخصص من جوجل فى أوفيسنا
Custom Search

jjafferr

أوفيسنا
  • Posts

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

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

  • Days Won

    415

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

  1. وعليكم السلام 🙂 بدلا عن Listbox ، اعمل نموذج جدولي ، واضبط الاعدادات ، وخليه مثل Listbox ، وبتقدر تعمل طلبك 🙂
  2. السلام عليكم 🙂 - تم الغاء الجدول tbl_V_Seq ، - تم اضافة الحقل Seq الى الجدول tblVacations ، - يمكنك نقل هذه الدالة الى برنامج الواجهة ، واستعماله هناك ، - يجب استعمال هذه الدالة مرة واحدة فقط ، لأنها في كل مرة تحذف البيانات السابقة ، - اقترح اضافة الحقل Seq الى نموذج الاجازات ، ويدويا تعطيه: رقم التسلسل للاجازة السابقة ، اذا كانت الاجازة الجديدة استمرار للاجازة السابقة ، الرقم التسلسل التالي. Option Compare Database Option Explicit Function Make_Groups() 'نريد عمل لكل اجازات مستمرة ، مجموعة خاصة بها 'وبما انه لا توجد معلومة مميزة في السجل لتوضح الفرق بين الاجازة العادية والاجازة المستمرة 'فوجب التفكير في عمل هذه المجموعات 'ورأيت ان اسهل طريقة لعمل هذه المجموعات ، هو عمل رقم مسلسل لكل سجل 'فالاجازات المستمرة يكون لها نفس الرقم ، وعند انتهائها ، فالسجل التالي يحصل على الرقم المسلسل التالي ' ' 'بعد تحليل البيانات، اتضح ان الاجازة المستمرة معناها 'تاريخ بداية الاجازة الجديدة = تاريخ نهاية الاجازة السابقة + 1 (يوم واحد) ' 'فعليه، بدأنا بأول اجازة وتم اعطاءها رقم مسلسل 'ثم ننتقل الى السجل التالي ، ونتأكد من نتائج المعادلة اعلاه 'فإذا كانت النتيجة نفسها ، فمعناه انها اجازة مستمرة ونعطي السجل نفس الرقم 'واذا كانت الاجازة منقطعة ، فنقوم بإضافة 1 الى الرقم المسلسل ، وهكذا ' ' 'tbl_V_Seq تم الغاء الجدول 'واضافة الحقل Seq 'الى الجدول 'tblVacations ' Dim rstV As DAO.Recordset Dim rstVG As DAO.Recordset Dim Seq As Long Dim Last_EndDate As Date 'rstV = tblVacation بيانات الجدول 'rstVG = tblVacation Group By emp_code ارقام الموظفين بدون تكرار من الجول 'تنظيف الحقل Seq من البيانات السابقة CurrentDb.Execute ("UPDATE tblVacation SET Seq = Null") 'ارقام الموظفين بدون تكرار، والفرز تصاعدي Set rstVG = CurrentDb.OpenRecordset("SELECT emp_code FROM tblVacation GROUP BY emp_code ORDER BY emp_code") rstVG.MoveFirst 'حلقة دوران حتى نشمل جميع الموظفين Do Until rstVG.EOF 'سجلات كل موظف Set rstV = CurrentDb.OpenRecordset("SELECT * FROM tblVacation WHERE emp_code=" & rstVG!emp_code) 'اذا لا توجد بيانات للموظف، ابدأ التسلسل 1 If rstV.RecordCount = 0 Then 'No Record Seq = 1 End If 'اول قيمة للمقارنة ، ونجعلها فارغة Last_EndDate = 0 'حلقة دوران لمقارنة سجلات الموظف Do Until rstV.EOF 'اذا تاريخ نهاية الاجازة تساوي تاريخ نهاية الاجازة السابقة+1 If rstV!VacationStartDate = Last_EndDate Then 'نعم 'اعمل تعديل على السجل، واعطيه رقم التسلسل السابق rstV.Edit rstV!Seq = Seq rstV.Update Else 'لا 'اعمل تعديل على السجل، واعطيه رقم التسلسل السابق+1 rstV.Edit Seq = Seq + 1 rstV!Seq = Seq rstV.Update End If 'تاريخ نهاية الاجازة+1 Last_EndDate = rstV!VacationEndDate + 1 rstV.MoveNext Loop rstVG.MoveNext Loop rstV.Close: Set rstV = Nothing rstVG.Close: Set rstVG = Nothing MsgBox "Done" End Function جعفر 1581.1.سجل المحضرين_be.accdb.zip
  3. السلام عليكم 🙂 للتجربة والتأكد من اني فهمت الموضوع ، رجاء عمل التالي: 1. شغل الدالة Make_Groups ، وذلك بكتابة اسمها في الاسفل ، ورجاء التأكد ان علامة الاستفهام بالانجليزي ، ثم انقر على زر Enter على الكيبورد . عندما تنتهي الدالة من عملها ، ستظهر لك رسالة "Done" ، عندها رجاء تشغيل الاستعلام qry_Vacations والتأكد بأن بياناتها كما تريد 🙂 الدالة تضع بياناتها في الجدول tbl_V_Seq ، وهو جدول تجميع الاجازات المستمرة 🙂 1581.سجل المحضرين_be.accdb.zip
  4. في احد برامجي عملت نفس طريقتك ، "برواز" نموذج فرعي ، واستعملت النماذج الفرعية داخله (بدلا عن عمل تبويب لكل نموذج فرعي) ، في الواقع العمل كان اكثر صعوبة واخذ جهد اكبر في العمل ، لأنه يجب ان نشير "للبرواز" في كل خطوة ، وفي نفس الوقت نشير لإسم النموذج الفرعي لكل عملية خاصة به ، وبدلا عن التبويب للإنتقال من نموذج فرعي لآخر ، استعمل Navigation buttons ، والتي لا يمكن ربطها/لصقها مع النموذج ، سواء الرئيسي او الفرعي !! ولكن ، البرنامج لا يزال الافضل ولا يوجد له مثيل في المؤسسات 🙂
  5. وهل جربت مثالي؟ للعلم ، انت لم تخبرنا الى الآن كيف تريد عمل النموذج الفرعي ، فنحن هنا اعطيناك الكود الذي يقوم بالعمل ، وانت تضع الكود الصحيح على الزر الصحيح على الحدث الصحيح
  6. تفضل 🙂 اضف النموذج الفرعي ، ثم قم بالتعديل على البيانات ، ثم انقر على زر تعديل ، وحاول تعديل البيانات. كود عدم السماح بتعديل بيانات النموذج الفرعي: Private Sub x22_Click() Me.frm.Form.AllowEdits = False End Sub 1583.Database32.accdb True يعني اسمح (بالتعديل ، او الاضافة او ... ) False يعني لا تسمح (بالتعديل ، او الاضافة او ... )
  7. عملت لك التعديل في مشاركتي السابقة 🙂
  8. وعليكم السلام 🙂 لما تحدد النموذج الفرعي بالطريقة : me.frm.SourceObject = "frm3" . تستطيع استعمال التالي للتحكم فيه: me.frm.form.AllowEdits = true 'اسمح بتغيير البيانات me.frm.form.AllowDeletions = true 'اسمح بحذف السجل me.frm.form.AllowAdditions = true 'اسمح بإضافة سجلات جديدة
  9. حيا الله اخوي ابوخليل 🙂 نعم ملاحظتي انه دمج قيمتين في حقل واحد ، معرف الطالب - والصف ، لهذا السبب اقترحت عليه ان يفصلهم ويكون لكل واحد منهم حقل مستقل ، اذا الشباب نجحوا جميعا ، فسهل تنقل الصف كله مرة واحدة ، ولكن اذا عندك راسب ، وعندك حقل ناجح/راسب ، وحقل قيمة معرف الطالب ، وحقل الصف ، فببساطة تنقلهم 🙂 بس بما ان اخوي ابوخليل توسط لك ، فاليك الحل بطريقتك : الجدول: . استعلام لتحديث جميع الصفوف ، للناجحين فقط : . والشرح: ناخذ مثلا الرقم 11-002 لا تنسى انك تتعامل مع حقل نص اول حرفين من القيمة (يبدأ باول الحقل ، ويأخذ حرفين) Mid([Class_ID],1,2) وبما ان القيمة نص ، فيجب تحويلها الى رقم Val(Mid([Class_ID],1,2)) ثم نضيف اليها واحد (للانتقال الى الصف التالي) +Val(1) بهذه الطريقة يتم تحويل الرقم 11 الى 12 وتحويل الرقم 13 الى 14 ، وهكذا ثم نريد نستخرج معرّف الطالب (يبدأ من الحرف الثالث ، ويأخذ 4 قيم) Mid([Class_ID],3,4) ولما ندمج جميع الخطوات اعلاه ، تصبح لدينا قيمة التحديث Val(Mid([Class_ID],1,2))+Val(1) & Mid([Class_ID],3,4) 1582.update_student_next_class.accdb.zip
  10. وعليكم السلام اذا البرنامج مقسم عندك الى جزئين: - جزء الجداول (الجزء الخلفي او BE) : فالمنتدى مليء بطرق اخذ النسخ الاحتياطية ، بما لذ وطاب ، فقط استخدم خاصية البحث فيه ، - جزء البرنامج (الجزء امام المستخدم او FE) : فهذا تاخذ منه نسخة واحدة فقط عند عمل تغيير به ، ولا تحتاج الى عمل نسخ اضافية اخرى منه.
  11. اخي الفاضل عبدالعزيز ، اجابتي واجابة الدكتور حسين لا تخص النموذج.
  12. اخي الفاضل ، رجاء تخبرنا وين البيانات ، فلا يوجد تقرير اسمه بيان حالة !!
  13. رجاء تخبرنا وين البيانات
  14. الظاهر من بياناتك في الصورة في او مشاركة ، الاجازة المتصلة: تاريخ بداية الاجازة = تاريخ نهاية الاجازة السابقة + 1 يوم يمكننا عمل كود ليعمل المطلوب ، ولا ارى طريقة لعمله في استعلام !! اذن نحن بحاجة الى بيانات كثيرة ومتنوعة لتحليل وعمل اللازم 🙂
  15. شو تحليلك لهذا المصطلح من واقع بياناتك ؟
  16. وعليكم السلام 🙂 اعمل استعلام تجميعي بنوع الاجازة (Group by) ، واختار الاقل (Min) للتاريخ الاعتباري ، واختار الاكبر (Max) لتاريخ نهاية الاجازة.
  17. وعليكم السلام 🙂 تفضل
  18. السلام عليكم 🙂 او عمل نموذج جدولي ، للنموذج الرئيسي والفرعي: 1579.DataSheet_Form_inside_DS_Form.accdb.zip
  19. وعليكم السلام 🙂 الطريقة الصحيحة هي ، بإعطاء الطالب رقم لا يتغير (حقل رقم الطالب) ، وحقل آخر للصف ، وكلما انتقل الطالب الى الصف التالي ، يمكنك اضافة رقم 1 الى الصف الحالي 🙂 خذها قاعدة: في قواعد البيانات ، وبما ان السرعة مطلوبة ، فإجعل لكل معلومة حقل خاص بها ، وهذا سيسهل عليك ربط الجداول بطريقة مباشرة كذلك.
  20. المنتدى به الكثير من المواضيع لجلب الوقت من الانترنت ، ولكن لم ارى موضوع لتوحيد تاريخ/وقت كمبيوترات الشبكة ، وهذا هو صلب الموضوع 🙂 قمت بإضافة شرح لسبب استخدامي لهذا الموضوع 🙂 جعفر
  21. السلام عليكم 🙂 لما يكون فيه مجموعة كمبيوترات تعمل على نفس البرنامج في الشبكة ، وتكون البيانات/الجداول سواء على السيرفر او على احد الكمبيوترات في الشبكة ، ولأنه تاريخ/وقت هذه الكمبيوترات يختلف من كمبيوتر الى آخر ، فهذا يعمل لنا اختلاف في قيمة وقت ادخال السجل ، من كبيوتر الى آخر. احد المؤسسات تشتغل على برنامج يستخدمه حوالي 6 اشخاص ، ويتم ادخال حوالي 2000 سجل يوميا ، والجدول فيه حقل رقم تلقائي ، وحقل التاريخ/الوقت وفيه قيمة افتراضية Now ، طبعا بالاضافة الى بقية الحقول. حقل الرقم التلقائي ما فيه اشكالية في تسلسل الارقام ، ولكن حقل التاريخ/الوقت لا يأخذ قيمة Now من السيرفر ، وانما يأخذه من الكمبيوتر الذي يعمل السجل ، واذا تاريخ/وقت اي من الكمبيوترات خطأ ، مما يعني انه من الصعب/المستحيل معرفة متى تم ادخال هذا السجل بوقته الصحيح مقارنة مع باقي السجلات. قد لا يشكل هذا مشكلة عند البعض ، ولكنه يشكل مشكلة ومعضله عندما تكون البيانات حساسة ومهمة ، ومعرفة من ادخل المعلومة و متى. توصلت الى الاستعانة بالدوال التالية ، واستعملها اول ما افتح البرنامج (ولمرة واحدة فقط) ، و اضع في المتغير Diff_Sec فرق التاريخ/الوقت بالثواني ، بين السيرفر والكمبيوتر ، ولما اضيف السجل اضيف قيمة هذا المتغير الى Now الكمبيوتر ، مما يعطي السجل وقت السيرفر ، وعليه تكون جميع السجلات تعمل على نفس التوقيت 🙂 اقوم بمناداة الدالة هكذا: call Get_Remote_PC_Time("\\192.168.100.88") Option Compare Database Option Explicit 'Fetch and display Net Remote Time Of Day from a 'remote Windows system. Supply a UNC hostname '(or a DNS name), or empty string for the local 'host's time and date. ' Private Const NERR_SUCCESS As Long = 0 Private Type TIME_OF_DAY_INFO tod_elapsedt As Long tod_msecs As Long tod_hours As Long tod_mins As Long tod_secs As Long tod_hunds As Long tod_timezone As Long tod_tinterval As Long tod_day As Long tod_month As Long tod_year As Long tod_weekday As Long End Type #If Win64 Or VBA7 Then Dim lngBufPtr As LongPtr Private Declare PtrSafe Function NetApiBufferFree Lib "netapi32" _ (ByVal lpBuffer As LongPtr) As Long Private Declare PtrSafe Function NetRemoteTOD Lib "netapi32" _ (UncServerName As Byte, BufferPtr As LongPtr) As Long Private Declare PtrSafe Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" _ (pTo As Any, uFrom As Any, ByVal lSize As LongPtr) #Else Dim lngBufPtr As Long Private Declare Function NetApiBufferFree Lib "netapi32" _ (ByVal lpBuffer As Long) As Long Private Declare Function NetRemoteTOD Lib "netapi32" _ (UncServerName As Byte, BufferPtr As Long) As Long Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" _ (pTo As Any, uFrom As Any, ByVal lSize As Long) #End If ' Public Diff_Sec As Double ' Public Function GetTOD(ByVal Server As String) As Date Dim bytServer() As Byte 'Dim lngBufPtr As Long Dim todReturned As TIME_OF_DAY_INFO bytServer = Trim$(Server) & vbNullChar If NetRemoteTOD(bytServer(0), lngBufPtr) = NERR_SUCCESS Then CopyMemory todReturned, ByVal lngBufPtr, LenB(todReturned) NetApiBufferFree lngBufPtr With todReturned GetTOD = DateAdd("n", _ -.tod_timezone, _ DateSerial(.tod_year, .tod_month, .tod_day) _ + TimeSerial(.tod_hours, .tod_mins, .tod_secs)) End With Else Err.Raise vbObjectError + 2000, _ "GetTOD", _ "Failed to obtain server time" End If End Function Public Function Get_Remote_PC_Time(txtServer As String) ' ' calling it: 'Get_Remote_PC_Time("\\192.168.100.88") ' Dim dtServerTime As Date 'Dim Diff_Sec As Double On Error Resume Next dtServerTime = GetTOD(txtServer) Diff_Sec = DateDiff("s", Now, dtServerTime) Debug.Print "Diff=" & Diff_Sec Debug.Print "Server=" & dtServerTime Debug.Print "Local ok= " & DateAdd("s", Diff_Sec, Now) ' If Err.Number <> 0 Then ' Debug.Print Err.Description ' Else ' Debug.Print CStr(dtServerTime) ' End If ' On Error GoTo 0 '' txtServer.SetFocus End Function . جعفر
  22. السلام عليكم 🙂 ضع هذا الملف مع ملف الاكسل "Unmanaged.xlsx" في نفس المجلد "D:\nw" ، وإلا ، فيجب تعديل المسار في الاستعلام qry_1_Excel_File (وهذا سيأخذ وقت لفتح الاستعلام 🙂) : استخدم الزر في النموذج ، حتى تعمل جدول جديد بإسم tbl_Data وبه بيانات الاكسل جاهزة لتحويلها الى اي جدول آخر ، او استعماله مباشرة في الاكسس ، ملاحظة ، يتم حذف الجدول tbl_Data ، ويتم عمله من جديد في كل مرة ، حتى نتأكد بأننا حصلنا على جميع حقول ملف الاكسل . 1569.as_Final.accdb.zip
  23. شكرا لك اخوي خالد على التجربة واخبارنا بذلك 🙂
  24. السلام عليكم اخوي خالد 🙂 هل اصبح التقرير اسرع من برنامجك السابق ، وخصوصا لما تنتقل بين الصفحات 😁 وهل اكملت تضبيط بقية حقول التقرير ؟
×
×
  • اضف...

Important Information