بحث مخصص من جوجل فى أوفيسنا
![]()
Custom Search
|
كل الانشطه
- الساعة الأخيرة
-
في النموذج المستمر ؛ اضافة قيمة الى حقل بناء على قيمتين في سجلات أخرى
Foksh replied to ابوخليل's topic in قسم الأكسيس Access
على فكرة ، ممكن يكون في لبس في فهم ftraName . انا ربط الموضوع انه ممكن يكون اسم الفترات في جدول منفصل وان 1 و 2 دونل معرفات الفترات في جدول أسماء الفترات ، وليس الحقل ID اللي في الجدول الحالي tbl_Ftrat .. يعني انا اشتغلت على ان الفترات ليها جدول منفصل وان القيمة ممكن تكون معرف الفترة بناءً على الجملة دي فهمت قصدي !؟ -
في النموذج المستمر ؛ اضافة قيمة الى حقل بناء على قيمتين في سجلات أخرى
Foksh replied to ابوخليل's topic in قسم الأكسيس Access
ولو عاوز أريحك برضو .. جرب ده برضو :- 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 -
ولكن ولكن ولكن خلينى اقول وجهة نظرى برضو الكود الأول: 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 بيجمع كأنك بتجمع تواريخ/أوقات كنسب من اليوم وليس بالضرورة عدد دقائق فعلي ممكن القيم تطلع غير دقيقة إذا كانت محفوظة بصيغة غير متناسقة
-
ما رأيكم بهذه الحيلة على اعتبار ان النموذج تحكم ومعرفات السجلات لن تتغير ابدا .. ولو تم اضافة سجلات جديدة كفترات اضافية لا مشكلة .. 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
-
في النموذج المستمر ؛ اضافة قيمة الى حقل بناء على قيمتين في سجلات أخرى
Foksh replied to ابوخليل's topic in قسم الأكسيس Access
يا صاحبي ، شوف :- totalminutes = Nz(DSum("countWorkHours", "tbl_Ftrat", "ftraName IN ('1','2') AND ID > 1"), 0) انا حددتله الشرط في الحقل countWorkHours ، اللي عاوز اجمع قيمه اللي هو : ftraName والشرط كان IN ('1','2') وشرط السجل اللي عاوز أحدثه : WHERE ID = 1" تبقى فين امشكلة ؟؟ جرب عدل القيم أو نوع الحقل واحكيلي الخلل !!!! -
اصلا المفروض تكون كده يا فؤش "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
-
في النموذج المستمر ؛ اضافة قيمة الى حقل بناء على قيمتين في سجلات أخرى
Foksh replied to ابوخليل's topic in قسم الأكسيس Access
-
في النموذج المستمر ؛ اضافة قيمة الى حقل بناء على قيمتين في سجلات أخرى
Foksh replied to ابوخليل's topic in قسم الأكسيس Access
فيما لو كانت القيمة المخزنة في جدولك يمثل رقم الفترة من جدولها ( معرف الفترة افترضت انه 1 = الصباحية ، 2 = المسائية بغض النظر عن التسمية ) -
الكود الأول أفضل لأنه: يضمن كتابة قيمة منسقة بشكل صحيح لنوع 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
-
لا تكتفى بما لديك كلف نفسك عناء محاولة ايجاد و معرفة الفرق بين 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
-
في النموذج المستمر ؛ اضافة قيمة الى حقل بناء على قيمتين في سجلات أخرى
Foksh replied to ابوخليل's topic in قسم الأكسيس Access
أنا سأكتفي بما لدي في آخر محاولة ,, في الزر :- 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 - Today
-
ماشى ممكن كده سطر واحد استعلام تحديث لتحقيق المطلوب وكمان الاعتماد الى المعرف 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
-
في النموذج المستمر ؛ اضافة قيمة الى حقل بناء على قيمتين في سجلات أخرى
Foksh replied to ابوخليل's topic in قسم الأكسيس Access
طيب ، كفكرة أخرى بتحديد شروط الفلترة أكثر من خلال الاستدعاء ، جرب هذا التعديل :- 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", _ "فترة صباحية", _ "فترة مسائية") -
الشكر مقدما لكما فجزاكما الله خيرا اعتمدتما على اسم الفترة .. ولكن معرف الفترة اثبت .. لأن الفترة قد يتم تعديلها مثلا من الفترة الصباحية الى كلمة الصباح فقط ... ما علينا لا مشكلة يمكن التعديل .. ولكني افكر بسطر واحد فقط !! يقوم بالمهمة .. هل يمكن سطر واحد استعلام Update ان يحقق المطلوب ؟ افكر بصوت مكتوب فقط
-
هل يفى ذلك بالغرض و يحقق المطلوب ؟ Private Sub cmdSave_Click() On Error GoTo ErrorHandler Dim rst As DAO.Recordset Dim datInterval As Date Dim dblTotalMinutes As Double Dim strFtraName As String Set rst = CurrentDb.OpenRecordset("tbl_Ftrat", dbOpenDynaset) dblTotalMinutes = 0 Do While Not rst.EOF strFtraName = Trim(Nz(rst!ftraName, "")) If strFtraName = "فترة صباحية" Or strFtraName = "فترة مسائية" Then If Not IsNull(rst!countWorkHours) Then ' تحويل الوقت إلى دقائق: القيمة * 24 * 60 dblTotalMinutes = dblTotalMinutes + (rst!countWorkHours * 24 * 60) If DebugMode Then Debug.Print "تمت إضافة عدد الدقائق: "; rst!countWorkHours End If End If rst.MoveNext Loop ' تحويل عدد الدقائق الإجمالية إلى قيمة Time لتخزينها في الحقل Date/Time datInterval = dblTotalMinutes / (24 * 60) rst.MoveFirst Do While Not rst.EOF strFtraName = Trim(Nz(rst!ftraName, "")) If strFtraName Like "*فترتين*" Then rst.Edit rst!countWorkHours = datInterval rst.Update Exit Do End If rst.MoveNext Loop countWorkHours.Requery Me.Repaint rst.Close Set rst = Nothing MsgBox " تم تحديث عدد ساعات الفترة المجمعة بنجاح.", vbInformation Exit Sub ErrorHandler: MsgBox " خطأ: " & Err.Description, vbCritical If Not rst Is Nothing Then rst.Close Set rst = Nothing End Sub
-
Foksh started following في النموذج المستمر ؛ اضافة قيمة الى حقل بناء على قيمتين في سجلات أخرى
-
في النموذج المستمر ؛ اضافة قيمة الى حقل بناء على قيمتين في سجلات أخرى
Foksh replied to ابوخليل's topic in قسم الأكسيس Access
بغض النظر عن الخطأ الذي ذكره أبو جودي ، ومن المؤكد أن السجلات هي للتجربة فقط لا غير .. في الدالة العامة التالية :- Public Sub UpdateRecordWithID(frm As Form, idField As String, idValue As Variant, targetField As String, sumField As String) Dim rs As DAO.Recordset Dim total As Double Dim foundTarget As Boolean Set rs = frm.RecordsetClone rs.MoveFirst Do Until rs.EOF If foundTarget Then If rs!ftraName = "فترة صباحية" Or rs!ftraName = "فترة مسائية" Then total = total + Nz(rs.Fields(sumField).Value, 0) End If ElseIf rs.Fields(idField).Value = idValue Then foundTarget = True End If rs.MoveNext Loop If Not foundTarget Then rs.Close: Set rs = Nothing Exit Sub End If rs.MoveFirst Do Until rs.EOF If rs.Fields(idField).Value = idValue Then frm.Recordset.Bookmark = rs.Bookmark frm.Controls(targetField).Value = total frm.Dirty = False Exit Do End If rs.MoveNext Loop rs.Close: Set rs = Nothing End Sub تركت لك حرية تحديد اسم الحقل الفريد ورقمه ، واسم الحقل المستهدف تحديثه بالقيم التي تريدها من خلال الاستدعاء كالآتي :- Call UpdateRecordWithID(Me, "ID", 1, "countWorkHours", "countWorkHours") الملف مع الفكرة المقترحة :- Database1.zip