Foksh قام بنشر منذ 5 ساعات قام بنشر منذ 5 ساعات 11 دقائق مضت, ابو جودي said: اصلا المفروض تكون كده يا فؤش "tbl_Ftrat", "id IN (2, 3)" لحقل id مش حقل : ftraName ولو عاوز أريحك برضو .. جرب ده برضو :- Dim totalMinutes As Double totalMinutes = Nz(DSum("countWorkHours", "tbl_Ftrat", "ftraName IN (1, 2)"), 0) CurrentDb.Execute "UPDATE tbl_Ftrat SET countWorkHours = " & totalMinutes & " WHERE ID = 1", dbFailOnError Me.Refresh
ابو جودي قام بنشر منذ 5 ساعات قام بنشر منذ 5 ساعات 9 دقائق مضت, ابوخليل said: رأيكم بهذه الحيلة على اعتبار ان النموذج تحكم ومعرفات السجلات لن تتغير ابدا .. ولو تم اضافة سجلات جديدة كفترات اضافية لا مشكلة هو علشان اكون فاهم هو النموذج ده ممكن يكون فيه سجلات كتير؟؟ وهل ممكن تريد استثناء اى سجل منهم عند عملية الحساب ؟؟ هل عملية الحساب هذه لابد ان تكون مقترنة بشرط او عدة شروط ؟؟ 4 دقائق مضت, Foksh said: ولو عاوز أريحك برضو .. جرب ده برضو :- Dim totalMinutes As Double totalMinutes = Nz(DSum("countWorkHours", "tbl_Ftrat", "ftraName IN (1, 2)"), 0) CurrentDb.Execute "UPDATE tbl_Ftrat SET countWorkHours = " & totalMinutes & " WHERE ID = 1", dbFailOnError Me.Refresh ممكن اسكرين شوت من النموذج يا فؤش بعد تجربتتك ؟
ابو جودي قام بنشر منذ 5 ساعات قام بنشر منذ 5 ساعات بلاش انا اجيب لك الاسكرين شوت من مرفقك انت عرفت هو شغال ليه لانك غيرت اسم الفترات يا افندم 1
Foksh قام بنشر منذ 5 ساعات قام بنشر منذ 5 ساعات 6 دقائق مضت, ابو جودي said: ممكن اسكرين شوت من النموذج يا فؤش بعد تجربتتك ؟ على فكرة ، ممكن يكون في لبس في فهم ftraName . انا ربط الموضوع انه ممكن يكون اسم الفترات في جدول منفصل وان 1 و 2 دونل معرفات الفترات في جدول أسماء الفترات ، وليس الحقل ID اللي في الجدول الحالي tbl_Ftrat .. يعني انا اشتغلت على ان الفترات ليها جدول منفصل وان القيمة ممكن تكون معرف الفترة بناءً على الجملة دي اقتباس اعتمدتما على اسم الفترة .. ولكن معرف الفترة اثبت .. لأن الفترة قد يتم تعديلها مثلا من الفترة الصباحية الى كلمة الصباح فقط فهمت قصدي !؟ 1
ابو جودي قام بنشر منذ 5 ساعات قام بنشر منذ 5 ساعات والان أستاذى الجليل و معلمى القدير و والدى الحبيب الاستاذ @ابوخليل انا محتاج بس اعرف شوية حجات علشان اشوف اظبط الكود ازاى 1- النموذج ده ممكن يكون فيه سجلات كتير؟؟ 2- هل تريد استثناء اى سجل منهم عند عملية الحساب ؟؟ 3- هل عملية الحساب هذه لابد ان تكون مقترنة بشرط او عدة شروط ؟؟ طبعا لو فيه سجلات كتير ممكن تزيد يبقى ما ينفع نعتمد على الحقل id نهائيا وحضرتك مش عاوز تعتمد على اسماء الفترات لان ده الكود الحالى اللى فكرت فيه Private Sub cmdSave_Click() Dim rstFtrat As DAO.Recordset Dim lngTotalMinutes As Long Dim lngCurrentMinutes As Long Dim datResult As Date '' === فتح كل السجلات باستثناء السجل المجمّع (ID=1) Set rstFtrat = CurrentDb.OpenRecordset("SELECT countWorkHours FROM tbl_Ftrat WHERE ID <> 1", dbOpenSnapshot) '' === المرور على كل الفترات لحساب مجموع الدقائق Do While Not rstFtrat.EOF If Not IsNull(rstFtrat!countWorkHours) Then lngCurrentMinutes = DateDiff("n", #00:00#, rstFtrat!countWorkHours) lngTotalMinutes = lngTotalMinutes + lngCurrentMinutes End If rstFtrat.MoveNext Loop rstFtrat.Close Set rstFtrat = Nothing '' === تحويل مجموع الدقائق إلى نسبة يوم datResult = lngTotalMinutes / 1440 '' === تحديث السجل المجمّع (ID = 1) CurrentDb.Execute "UPDATE tbl_Ftrat SET countWorkHours = #" & Format(datResult, "hh:nn") & "# WHERE ID = 1", dbFailOnError Me.Repaint End Sub الان سوف يقوم بعمل لوب على كل الجدول لإجراء عملية الجمع انا لو فهمت الية العمل اقدر اتحكم فى العملية
Foksh قام بنشر منذ 5 ساعات قام بنشر منذ 5 ساعات 3 دقائق مضت, ابو جودي said: الان سوف يقوم بعمل لوب على كل الجدول الجراء عملية الجمع هنا ، ممكن يكون أكتر من سيناريو للفكرة .. هل الفترات ستكون مقرونة بتاريخ مثلاً لكل شهر ( متغيرة في حال وجود أشهر مثل شهر رمضان على سبيل المثال انه ممكن يكون وقت العمل أقصر أو متأخر عن الأشهر العادية ... إلخ من سيناريوهات ؟؟؟) ولكن إن كان يحتوي أكثر من سجل فحتماً لازم يكون هناك شرط إضافي . طبعاً كل دي احتمالات قد تكون وهمية بناءً على فكرة استاذي ابو خليل هنا :- اقتباس Dim i, ii As Date Me.Recordset.FindFirst "id =2 " i = countWorkHours Me.Recordset.FindFirst "id =3 " ii = countWorkHours Me.Recordset.FindFirst "id =1 " countWorkHours = i + ii لأنه هنا هو حدد الـ ID الخاص بالسجل وليس الخاص بالفترة . على أساس انها ممكن تكون سجلات وحيدة ويتم تحديثها حسب الحاجة .
ابو جودي قام بنشر منذ 3 ساعات قام بنشر منذ 3 ساعات 1 ساعه مضت, Foksh said: لأنه هنا هو حدد الـ ID الخاص بالسجل وليس الخاص بالفترة . على أساس انها ممكن تكون سجلات وحيدة ويتم تحديثها حسب الحاجة . ما هو انا مش فاهم اعتقد المفروض فى جدول مساعد خدمى المفروض يكون به اسماء الفترات والرقم المعرف لكل فترة وكان السبب فى الاتجاه الى التعامل مع المعرف هو رد الاستاذ ابو خليل 3 ساعات مضت, ابوخليل said: اعتمدتما على اسم الفترة .. ولكن معرف الفترة اثبت .. لأن الفترة قد يتم تعديلها مثلا من الفترة الصباحية الى كلمة الصباح فقط ... الموضوع محتاج لفهم جيد فهم السؤال شطر الجواب
ابوخليل قام بنشر منذ 3 ساعات الكاتب قام بنشر منذ 3 ساعات اللي يدخل مع مبرمجين في : ( لو ) و ( إذا ) حيودوه في ستين سكة .. الله يعينه 🤣 1 ساعه مضت, Foksh said: هنا ، ممكن يكون أكتر من سيناريو للفكرة .. هل الفترات ستكون مقرونة بتاريخ مثلاً لكل شهر ( متغيرة في حال وجود أشهر مثل شهر رمضان على سبيل المثال انه ممكن يكون وقت العمل أقصر أو متأخر عن الأشهر العادية ... إلخ من سيناريوهات ؟؟؟) ولكن إن كان يحتوي أكثر من سجل فحتماً لازم يكون هناك شرط إضافي . طبعاً كل دي احتمالات قد تكون وهمية بناءً على فكرة استاذي ابو خليل هنا :- لأنه هنا هو حدد الـ ID الخاص بالسجل وليس الخاص بالفترة . على أساس انها ممكن تكون سجلات وحيدة ويتم تحديثها حسب الحاجة . صحيح انتم شعبتوها .. سكك وطرق المسألة كلها سجلات ثابتة كل سجل له آي دي خاص ثابت ثبات الى الممات هذه السجلات غير قابلة للحذف .. صباح / مساء / دوام كامل / دوام خاص المتغير فيها هو حقول الوقت فقط .. فيمكن تغيير وقت الدخول او الخروج حسب الحاجة ، وبناء عليه سيتغير عدد الساعات هذا كل شي . 1 1
ابو جودي قام بنشر منذ 3 ساعات قام بنشر منذ 3 ساعات 18 دقائق مضت, ابوخليل said: المسألة كلها سجلات ثابتة كل سجل له آي دي خاص ثابت ثبات الى الممات اذا هذا الحل بالكود التالى لزر الامر Private Sub cmdSave_Click() Dim lngMinutesMorning As Long Dim lngMinutesEvening As Long Dim lngTotalMinutes As Long Dim datResult As Date '' === احسب عدد الدقائق للفترتين lngMinutesMorning = DateDiff("n", #00:00#, DLookup("countWorkHours", "tbl_Ftrat", "id=2")) lngMinutesEvening = DateDiff("n", #00:00#, DLookup("countWorkHours", "tbl_Ftrat", "id=3")) '' === إجمالي عدد الدقائق lngTotalMinutes = lngMinutesMorning + lngMinutesEvening '' === تحويله إلى نسبة يوم Date/Time datResult = lngTotalMinutes / 1440 '' === تحديث السجل للمعرف رقم 1 CurrentDb.Execute "UPDATE tbl_Ftrat SET countWorkHours = #" & Format(datResult, "hh:nn") & "# WHERE id = 1", dbFailOnError countWorkHours.Requery Me.Repaint End Sub وهذا تطوير كود الوحدة النمطية '' ========================================================== '' الدالة: HoursAndMinutes '' الوصف: تحويل قيمة وقت مخزنة كنسبة من اليوم (Date/Time) إلى نص يحتوي على عدد الساعات والدقائق '' المعامل: interval - متغير يمثل مدة زمنية كنسبة من اليوم (مثلاً 0.5 = 12 ساعة) '' الناتج: نص بصيغة "ساعات:دقائق" '' ========================================================== Public Function HoursAndMinutes(interval As Variant) As String Dim lngTotalMinutes As Long Dim lngHours As Long Dim lngMinutes As Long If IsNull(interval) Then Exit Function lngTotalMinutes = Int(CSng(interval * 24 * 60)) ' تحويل إلى عدد الدقائق lngHours = lngTotalMinutes \ 60 ' الساعات الكاملة lngMinutes = lngTotalMinutes Mod 60 ' باقي الدقائق HoursAndMinutes = lngHours & ":" & Format(lngMinutes, "00") ' تنسيق بدقائق صفرية عند الحاجة End Function مرفق التجربة Database21.accdb
ابو جودي قام بنشر منذ 3 ساعات قام بنشر منذ 3 ساعات دالة حساب الوقت اللى كانت فى الوحدة النمطية فى المرفق الاول Public Function HoursAndMinutes(interval As Variant) As String Dim totalMinutes As Long, totalseconds As Long Dim hours As Long, minutes As Long, seconds As Long If IsNull(interval) = True Then Exit Function hours = Int(CSng(interval * 24)) totalMinutes = Int(CSng(interval * 1440)) minutes = totalMinutes Mod 60 HoursAndMinutes = hours & ":" & minutes End Function تقوم بحساب الساعات بشكل منفصل عن الدقائق باستخدام interval * 24 ثم تحسب الدقائق من إجمالي الدقائق وهذا قد يسبب تعارض لا تستخدم Format(minutes, "00") بالتالي قد تظهر النتيجة مثل 5:3 بدلا من 5:03 وجود المتغير totalseconds وseconds بدون استخدام فعلي (زيادة غير مفيدة) منطق مزدوج: سطر يحسب الساعات من معامل معين وسطر يحسب الدقائق من معامل آخر — وهذا قد يسبب أخطاء دقيقة في الحالات الطرفية -------- الدالة الأخيرة بعض التطوير '' ========================================================== '' الدالة: HoursAndMinutes '' الوصف: تحويل قيمة وقت مخزنة كنسبة من اليوم (Date/Time) إلى نص يحتوي على عدد الساعات والدقائق '' المعامل: interval - متغير يمثل مدة زمنية كنسبة من اليوم (مثلاً 0.5 = 12 ساعة) '' الناتج: نص بصيغة "ساعات:دقائق" '' ========================================================== Public Function HoursAndMinutes(interval As Variant) As String Dim lngTotalMinutes As Long Dim lngHours As Long Dim lngMinutes As Long If IsNull(interval) Then Exit Function lngTotalMinutes = Int(CSng(interval * 24 * 60)) ' تحويل إلى عدد الدقائق lngHours = lngTotalMinutes \ 60 ' الساعات الكاملة lngMinutes = lngTotalMinutes Mod 60 ' باقي الدقائق HoursAndMinutes = lngHours & ":" & Format(lngMinutes, "00") ' تنسيق بدقائق صفرية عند الحاجة End Function تقوم بحساب إجمالي الدقائق أولا ثم تفصل منها الساعات والدقائق بدقة تستخدم Format(..., "00") لضمان ظهور الدقائق بصيغة مزدوجة (مثل: 5 → 05) صياغتها أوضح ولا تفقد الدقائق عند الحساب دقيقة في كل الحالات لو أردت دعم الثواني بنفس الأسلوب أقدر أعدل لك الدالة فقط أخبرنى 1
ابو جودي قام بنشر منذ 2 ساعات قام بنشر منذ 2 ساعات 16 دقائق مضت, ابوخليل said: الف شكر ابا جودي .. حفظك الله ورعاك أتتمنى فقط أن تكون راض عن الحل و وجدت ضالتك هذا أفصى ما استطعت تقديمه بل كل الشكر لكم استاذى الجليل و معلمى القدير و والدى الحبيب حياكم الله وبياكم وهذه طريقة أخرى بدون الاعتماد على دوال :DLookup Private Sub cmdSave_Click() Dim lngMinutesTotal As Long Dim datWorkTotal As Date Dim rst As DAO.Recordset On Error GoTo Err_Handler ' ' --- حساب مجموع الدقائق من كافة السجلات التي لا تمثل المجموع (يستثني id = 1 و id = 4) Set rst = CurrentDb.OpenRecordset("SELECT countWorkHours FROM tbl_Ftrat WHERE id NOT IN (1, 4) AND countWorkHours Is Not Null", dbOpenSnapshot) Do While Not rst.EOF lngMinutesTotal = lngMinutesTotal + DateDiff("n", #00:00#, rst!countWorkHours) rst.MoveNext Loop rst.Close Set rst = Nothing ' ' --- تحويل الدقائق إلى نسبة من اليوم (1 يوم = 1440 دقيقة) datWorkTotal = lngMinutesTotal / 1440 ' ' --- تحديث السجل الذي يحتوي على المجموع (id = 1) CurrentDb.Execute "UPDATE tbl_Ftrat SET countWorkHours = #" & Format(datWorkTotal, "hh:nn") & "# WHERE id = 1", dbFailOnError ' ' --- تحديث الفورم Me.countWorkHours.Requery Me.Repaint Exit Sub Err_Handler: MsgBox "حدث خطأ: " & Err.Description, vbCritical, "خطأ" Resume Next End Sub ------------------------------------------------------------------------------------ وده تطوير كود الوحده النمطية بشكل كامل ليشمل الساعات و الدقائق و الثوان Public Function HoursMinutesSeconds(vntInterval As Variant) As String Dim lngTotalSeconds As Long Dim lngHours As Long Dim lngMinutes As Long Dim lngSeconds As Long If IsNull(vntInterval) Then Exit Function ' ' --- تحويل النسبة إلى عدد الثواني lngTotalSeconds = Int(CSng(vntInterval * 24 * 60 * 60)) ' ' --- استخراج الساعات، الدقائق، الثواني lngHours = lngTotalSeconds \ 3600 lngMinutes = (lngTotalSeconds Mod 3600) \ 60 lngSeconds = lngTotalSeconds Mod 60 ' ' --- النتيجة بصيغة "hh:mm:ss" HoursMinutesSeconds = lngHours & ":" & Format(lngMinutes, "00") & ":" & Format(lngSeconds, "00") End Function الان معك كل الخيارات لتختر ما يناسبك ويلبى رغباتك
Foksh قام بنشر منذ 2 ساعات قام بنشر منذ 2 ساعات منذ ساعه, ابوخليل said: اللي يدخل مع مبرمجين في : ( لو ) و ( إذا ) حيودوه في ستين سكة .. الله يعينه 🤣 صحيح انتم شعبتوها .. سكك وطرق المسألة كلها سجلات ثابتة كل سجل له آي دي خاص ثابت ثبات الى الممات هذه السجلات غير قابلة للحذف .. صباح / مساء / دوام كامل / دوام خاص المتغير فيها هو حقول الوقت فقط .. فيمكن تغيير وقت الدخول او الخروج حسب الحاجة ، وبناء عليه سيتغير عدد الساعات هذا كل شي . ذهت أفكارنا في تشعبات كثيرة فعلاً ، ولكن يمكن نقصان المعلومات كان أحد الأسباب 😅 على العموم أعتقد ذهابك إلك مقترحك أنسب حل يلبي مطلبك بشكل وافي 😇
الردود الموصى بها
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.