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

الردود الموصى بها

قام بنشر
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

 

قام بنشر
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

 

ممكن اسكرين شوت من النموذج يا فؤش بعد تجربتتك ؟

قام بنشر
6 دقائق مضت, ابو جودي said:

ممكن اسكرين شوت من النموذج يا فؤش بعد تجربتتك ؟

على فكرة ، ممكن يكون في لبس في فهم ftraName .

انا ربط الموضوع انه ممكن يكون اسم الفترات في جدول منفصل وان 1 و 2 دونل معرفات الفترات في جدول أسماء الفترات ، وليس الحقل ID اللي في الجدول الحالي tbl_Ftrat ..

 

 

يعني انا اشتغلت على ان الفترات ليها جدول منفصل وان القيمة ممكن تكون معرف الفترة بناءً على الجملة دي

اقتباس

اعتمدتما على اسم الفترة .. ولكن معرف الفترة اثبت .. لأن الفترة قد يتم تعديلها مثلا من الفترة الصباحية الى كلمة الصباح فقط

فهمت قصدي !؟

  • Haha 1
قام بنشر

والان أستاذى الجليل و معلمى القدير و والدى الحبيب الاستاذ @ابوخليل 

انا محتاج بس اعرف شوية حجات علشان اشوف اظبط الكود ازاى 

 

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

 

 

الان سوف يقوم بعمل لوب على كل الجدول لإجراء عملية الجمع

انا لو فهمت الية العمل اقدر اتحكم فى العملية 

 

 

قام بنشر
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 الخاص بالسجل وليس الخاص بالفترة . على أساس انها ممكن تكون سجلات وحيدة ويتم تحديثها حسب الحاجة .

قام بنشر
1 ساعه مضت, Foksh said:

لأنه هنا هو حدد الـ ID الخاص بالسجل وليس الخاص بالفترة . على أساس انها ممكن تكون سجلات وحيدة ويتم تحديثها حسب الحاجة .

ما هو انا مش فاهم 
اعتقد المفروض فى جدول مساعد خدمى المفروض يكون به اسماء الفترات والرقم المعرف لكل فترة


وكان السبب فى الاتجاه الى التعامل مع المعرف هو رد الاستاذ ابو خليل

3 ساعات مضت, ابوخليل said:

اعتمدتما على اسم الفترة .. ولكن معرف الفترة اثبت .. لأن الفترة قد يتم تعديلها مثلا من الفترة الصباحية الى كلمة الصباح فقط ...

 

الموضوع محتاج لفهم جيد

فهم السؤال شطر الجواب

قام بنشر

اللي يدخل مع مبرمجين في : ( لو ) و ( إذا )  حيودوه في ستين سكة .. الله يعينه 🤣

 

1 ساعه مضت, Foksh said:

هنا ، ممكن يكون أكتر من سيناريو للفكرة ..

هل الفترات ستكون مقرونة بتاريخ مثلاً لكل شهر ( متغيرة في حال وجود أشهر مثل شهر رمضان على سبيل المثال انه ممكن يكون وقت العمل أقصر أو متأخر عن الأشهر العادية ... إلخ من سيناريوهات ؟؟؟)

ولكن إن كان يحتوي أكثر من سجل فحتماً لازم يكون هناك شرط إضافي .

طبعاً كل دي احتمالات قد تكون وهمية بناءً على فكرة استاذي ابو خليل هنا :-

لأنه هنا هو حدد الـ ID الخاص بالسجل وليس الخاص بالفترة . على أساس انها ممكن تكون سجلات وحيدة ويتم تحديثها حسب الحاجة .

صحيح انتم شعبتوها .. سكك وطرق

المسألة كلها  سجلات ثابتة كل سجل له آي دي خاص ثابت ثبات الى الممات :angry:

هذه السجلات غير قابلة للحذف  .. صباح / مساء / دوام كامل / دوام خاص

المتغير فيها هو حقول الوقت فقط .. فيمكن تغيير وقت الدخول او الخروج حسب الحاجة ، وبناء عليه سيتغير عدد الساعات

هذا كل شي  .

 

 

 

  • Thanks 1
  • Haha 1
قام بنشر
18 دقائق مضت, ابوخليل said:

المسألة كلها  سجلات ثابتة كل سجل له آي دي خاص ثابت ثبات الى الممات :angry:

 

اذا هذا الحل بالكود التالى لزر الامر
 

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

قام بنشر

دالة حساب الوقت اللى كانت فى الوحدة النمطية فى المرفق الاول 
 

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)
  • صياغتها أوضح ولا تفقد الدقائق عند الحساب
  • دقيقة في كل الحالات

    لو أردت دعم الثواني بنفس الأسلوب أقدر أعدل لك الدالة فقط أخبرنى
  • Thanks 1
قام بنشر
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


الان معك كل الخيارات لتختر ما يناسبك ويلبى رغباتك

قام بنشر
منذ ساعه, ابوخليل said:

اللي يدخل مع مبرمجين في : ( لو ) و ( إذا )  حيودوه في ستين سكة .. الله يعينه 🤣

 

صحيح انتم شعبتوها .. سكك وطرق

المسألة كلها  سجلات ثابتة كل سجل له آي دي خاص ثابت ثبات الى الممات :angry:

هذه السجلات غير قابلة للحذف  .. صباح / مساء / دوام كامل / دوام خاص

المتغير فيها هو حقول الوقت فقط .. فيمكن تغيير وقت الدخول او الخروج حسب الحاجة ، وبناء عليه سيتغير عدد الساعات

هذا كل شي  .

 

 

 

ذهت أفكارنا في تشعبات كثيرة فعلاً ، ولكن يمكن نقصان المعلومات كان أحد الأسباب 😅

 

على العموم أعتقد ذهابك إلك مقترحك أنسب حل يلبي مطلبك بشكل وافي 😇

 

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

زائر
اضف رد علي هذا الموضوع....

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

  • تصفح هذا الموضوع مؤخراً   1 عضو متواجد الان

×
×
  • اضف...

Important Information