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

كل الانشطه

هذه الصفحة تحدث تلقائياً

  1. الساعة الأخيرة
  2. انظر الاستعلام SALESQT قمت بحذف الحقلين وممكن تستخدم عبارة تعبير Expression كما في الصورة
  3. Today
  4. هنا ، ممكن يكون أكتر من سيناريو للفكرة .. هل الفترات ستكون مقرونة بتاريخ مثلاً لكل شهر ( متغيرة في حال وجود أشهر مثل شهر رمضان على سبيل المثال انه ممكن يكون وقت العمل أقصر أو متأخر عن الأشهر العادية ... إلخ من سيناريوهات ؟؟؟) ولكن إن كان يحتوي أكثر من سجل فحتماً لازم يكون هناك شرط إضافي . طبعاً كل دي احتمالات قد تكون وهمية بناءً على فكرة استاذي ابو خليل هنا :- لأنه هنا هو حدد الـ ID الخاص بالسجل وليس الخاص بالفترة . على أساس انها ممكن تكون سجلات وحيدة ويتم تحديثها حسب الحاجة .
  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 الان سوف يقوم بعمل لوب على كل الجدول لإجراء عملية الجمع انا لو فهمت الية العمل اقدر اتحكم فى العملية
  6. على فكرة ، ممكن يكون في لبس في فهم ftraName . انا ربط الموضوع انه ممكن يكون اسم الفترات في جدول منفصل وان 1 و 2 دونل معرفات الفترات في جدول أسماء الفترات ، وليس الحقل ID اللي في الجدول الحالي tbl_Ftrat .. يعني انا اشتغلت على ان الفترات ليها جدول منفصل وان القيمة ممكن تكون معرف الفترة بناءً على الجملة دي فهمت قصدي !؟
  7. بلاش انا اجيب لك الاسكرين شوت من مرفقك انت عرفت هو شغال ليه لانك غيرت اسم الفترات يا افندم
  8. هو علشان اكون فاهم هو النموذج ده ممكن يكون فيه سجلات كتير؟؟ وهل ممكن تريد استثناء اى سجل منهم عند عملية الحساب ؟؟ هل عملية الحساب هذه لابد ان تكون مقترنة بشرط او عدة شروط ؟؟ ممكن اسكرين شوت من النموذج يا فؤش بعد تجربتتك ؟
  9. ولو عاوز أريحك برضو .. جرب ده برضو :- 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
  10. ولكن ولكن ولكن خلينى اقول وجهة نظرى برضو الكود الأول: 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 الكود الثانى: Private Sub cmdSave_Click() Dim dblTotalMinutes As Double ' ' === جمع ساعات العمل للفترتين (المعرف 2 و 3) dblTotalMinutes = DSum("countWorkHours", "tbl_Ftrat", "id IN (2, 3)") ' ' === تحديث السجل للمعرف 1 بالقيمة المجمعة CurrentDb.Execute "UPDATE tbl_Ftrat SET countWorkHours = #" & Format(dblTotalMinutes, "hh:nn") & "# WHERE id = 1", dbFailOnError Me.Refresh End Sub الكود الأول أكثر دقة واحترافية لأنه: يتعامل مع القيم كـ وقت Time فعلي (وليس كنسبة أو رقم عائم فقط) يحوّل القيم يدويا من وقت إلى دقائق ثم يعيدها كنسبة من اليوم (وهذا هو التنسيق الفعلي المخزن في حقول Date/Time عند تمثيل مدة) يستخدم DateDiff("n", #00:00#, ...)، ما يضمن أنك لا تتأثر بأي أخطاء ناتجة عن صيغ تخزين الوقت الداخلية في Access (زي ما ممكن يحصل عند استخدام DSum على Date/Time) يضمن أن القيمة النهائية محسوبة بدقة ويتم تحويلها إلى تنسيق "hh:nn" صريح مع تمريرها باستخدام علامات # في جملة UPDATE وهو المطلوب تماما لـ Date/Time داخل SQL-Access الكود الثاني أقل ملاءمة لأنه: يجمع وقتين باستخدام DSum مباشرة وده مش مضمون 100% DSum بيجمع كأنك بتجمع تواريخ/أوقات كنسب من اليوم وليس بالضرورة عدد دقائق فعلي ممكن القيم تطلع غير دقيقة إذا كانت محفوظة بصيغة غير متناسقة
  11. ما رأيكم بهذه الحيلة على اعتبار ان النموذج تحكم ومعرفات السجلات لن تتغير ابدا .. ولو تم اضافة سجلات جديدة كفترات اضافية لا مشكلة .. 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 Database2.rar
  12. يا صاحبي ، شوف :- totalminutes = Nz(DSum("countWorkHours", "tbl_Ftrat", "ftraName IN ('1','2') AND ID > 1"), 0) انا حددتله الشرط في الحقل countWorkHours ، اللي عاوز اجمع قيمه اللي هو : ftraName والشرط كان IN ('1','2') وشرط السجل اللي عاوز أحدثه : WHERE ID = 1" تبقى فين امشكلة ؟؟ جرب عدل القيم أو نوع الحقل واحكيلي الخلل !!!!
  13. اصلا المفروض تكون كده يا فؤش "tbl_Ftrat", "id IN (2, 3)" لحقل id مش حقل : ftraName والله يا فؤش بالمنطق انا مش عارف ليه جاب النتيجه صح لكن المفروض يكون كده طالما هنعتمد على المعرف Private Sub cmdSave_Click() Dim dblTotalMinutes As Double ' ' === جمع ساعات العمل للفترتين (المعرف 2 و 3) dblTotalMinutes = DSum("countWorkHours", "tbl_Ftrat", "id IN (2, 3)") ' ' === تحديث السجل للمعرف 1 بالقيمة المجمعة CurrentDb.Execute "UPDATE tbl_Ftrat SET countWorkHours = #" & Format(dblTotalMinutes, "hh:nn") & "# WHERE id = 1", dbFailOnError Me.Refresh End Sub
  14. في المرفق :- وحتى لو كانت رقمية ، جربت النتيجة وبدون أخطاء او خلل فيها
  15. بس يا فؤش عندك غلط ftraName IN (1, 2) ده المفروض لان الحقول رقمية مش نصية انت استخدمتها: ftraName IN ('1','2') والمفروض ده لو كانت الحقول نصية يا فؤش المفروض دى ارقام المعرف id
  16. فيما لو كانت القيمة المخزنة في جدولك يمثل رقم الفترة من جدولها ( معرف الفترة افترضت انه 1 = الصباحية ، 2 = المسائية بغض النظر عن التسمية )
  17. ولكن جميع القيم النصية لا تشتمل على هذه الارقام .... لم افهم
  18. معنى ftraName IN ('1','2'): هذا الشرط يعني أن الاستعلام سيختار السجلات من جدول tbl_Ftrat التي يكون فيها حقل ftraName يساوي إما 1 أو 2 بمعنى آخر: سيتم تضمين أي سجل يكون فيه ftraName مساويا للقيمة 1 أو 2
  19. شكرا على الاضافة الجميلة ماذا يعني الرقمين هنا ftraName IN ('1','2')
  20. الكود الأول أفضل لأنه: يضمن كتابة قيمة منسقة بشكل صحيح لنوع Date/Time باستخدام Format(datResult, "hh:nn") ورمزي # يحدد السجلات بدقة (id=2 وid=3) وبذلك يتجنب أي سجلات غير مرغوبة أكثر وضوحا للوضع الحالي حيث الهدف هو جمع ساعتين محددتين فقط الكود الثاني أقل ملاءمة لأنه: يكتب قيمة رقمية (Double) مباشرة مما قد يؤدي إلى تخزين غير صحيح (مثل أيام بدلا من ساعات) في حقل Date/Time شرط ftraName IN ('1','2') AND ID > 1 قد يشمل سجلات غير مرغوبة إذا كانت هناك سجلات إضافية بـ ftraName='1' أو '2' وID > 3
  21. لا تكتفى بما لديك كلف نفسك عناء محاولة ايجاد و معرفة الفرق بين 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 وبين الحل الاخير لك Dim totalMinutes As Double totalMinutes = DSum("countWorkHours", "tbl_Ftrat", "ftraName IN ('1','2') AND ID > 1") CurrentDb.Execute "UPDATE tbl_Ftrat SET countWorkHours = " & totalMinutes & " WHERE ID = 1", dbFailOnError Me.Refresh
  22. أنا سأكتفي بما لدي في آخر محاولة ,, في الزر :- Dim totalminutes As Double totalminutes = Nz(DSum("countWorkHours", "tbl_Ftrat", "ftraName IN ('1','2') AND ID > 1"), 0) CurrentDb.Execute "UPDATE tbl_Ftrat SET countWorkHours = " & totalminutes & " WHERE ID = 1", dbFailOnError Me.Refresh الملف المرفق :- Database2.zip
  23. ماشى ممكن كده سطر واحد استعلام تحديث لتحقيق المطلوب وكمان الاعتماد الى المعرف 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
  24. طيب ، كفكرة أخرى بتحديد شروط الفلترة أكثر من خلال الاستدعاء ، جرب هذا التعديل :- Public Sub UpdateRecordSumAfterID_ByFilter(tableName As String, idField As String, idValue As Variant, targetField As String, sumField As String, Optional filterField As String = "", Optional filterValue1 As String = "", Optional filterValue2 As String = "") Dim rs As DAO.Recordset Dim total As Double Dim foundTarget As Boolean Set rs = CurrentDb.OpenRecordset(tableName, dbOpenDynaset) If rs.EOF Then Exit Sub rs.MoveFirst foundTarget = False Do Until rs.EOF If foundTarget Then If filterField <> "" Then If rs.Fields(filterField).Value = filterValue1 Or rs.Fields(filterField).Value = filterValue2 Then total = total + Nz(rs.Fields(sumField).Value, 0) End If Else total = total + Nz(rs.Fields(sumField).Value, 0) End If ElseIf rs.Fields(idField).Value = idValue Then foundTarget = True End If rs.MoveNext Loop rs.MoveFirst Do Until rs.EOF If rs.Fields(idField).Value = idValue Then rs.Edit rs.Fields(targetField).Value = total rs.Update Exit Do End If rs.MoveNext Loop rs.Close Set rs = Nothing DoCmd.RunCommand acCmdRefresh End Sub وسيكون الإستدعاء كالآتي :- Call UpdateRecordSumAfterID_ByFilter( _ "tbl_Ftrat", _ "ID", 1, _ "countWorkHours", _ "countWorkHours", _ "ftraName", _ "فترة صباحية", _ "فترة مسائية")
  25. الشكر مقدما لكما فجزاكما الله خيرا اعتمدتما على اسم الفترة .. ولكن معرف الفترة اثبت .. لأن الفترة قد يتم تعديلها مثلا من الفترة الصباحية الى كلمة الصباح فقط ... ما علينا لا مشكلة يمكن التعديل .. ولكني افكر بسطر واحد فقط !! يقوم بالمهمة .. هل يمكن سطر واحد استعلام Update ان يحقق المطلوب ؟ افكر بصوت مكتوب فقط
  26. انت يا عم الحاج فؤش افندى ماشى معايا بالعكس اكتب انا الاجابة من خلال كود فى وحده نمطية تقولى انت احب اكون مباشر والاجابة مباشرة اكتب انا الكود مباشر للحالات المباشرة تكتب انت الكود فى وحده نمطيه احنا هنلعب بئه واللا ايــــه
  1. أظهر المزيد
×
×
  • اضف...

Important Information