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

ابو جودي

المشرفين السابقين
  • Posts

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

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

  • Days Won

    219

كل منشورات العضو ابو جودي

  1. مش توضح الرد ده مع انهو طريقه بالظبط
  2. وعليكم السلام ورحمة الله تعالى وبركاته ده معناه فى نموذج مش موجود اللى اسمه مكتوب بالرسالة دى ارجع للمصدر اللى حضرتك نقلت منه أو لو كنت حضرتك غيرت اسماء النماذج لازم تتبعها وتغيرها فى الكود من الداخل كمان
  3. يا هلا والله باستاذى القدير و معلمى الجليل الاستاذ @منتصر الانسي هذا الحل ينفع بس فى حالة واحدة فتح التقرير : DoCmd.OpenReport strRptName, acViewPreview ولكن لو اردت الطباعة : DoCmd.OpenReport "Period Report", acViewNormal للاسف لو ما فى بيانات سوف يتم طباعة ورقة بيضاء
  4. وتم بحمد الله الذى تتم بنعمته الصالحات بعد خناقة كبيرة كبيرة كبيـــــــــرة مع بنات أفكارى الكود فى الوحدى النمطية العامة كود ذكى وسحرى ومرن وابن حلال وحيفهمك ويريحك ويلبى كل متطلباتك تقريبا فى التعامل مع التقارير و .... هو انا لسه هاتلكم كتير ما تيجوا نشوف على طول
  5. السلام عليكم ورحمة الله وبركاته سوف أقدم وحدة نمطية عامة متقدمة تتيح لك فتح أي تقرير في الاكسس بطريقة ديناميكية مع التحقق من وجود التقرير ومصدر بياناته واحتوائه على بيانات قبل العرض أو الطباعة الخصائص والمميزات تحقق تلقائي من وجود التقرير قبل عرضه دعم التصفية من خلال تمرير شروط WhereCondition لتحديد البيانات ادارة المصدر وذلك من خلال استخراج RecordSource بشكل ديناميكي مع التخزين المؤقت داخل قاموس مرونة التعامل مع اوضاع التقارير المختلفه بحيث يدعم الطباعة - المعاينة - او اى وضع عرض الصمت المطلق للاستخدامات البرمجية من خلال اختيار تفعيل الوضع "بدون رسائل" للاستخدام البرمجى عند الحاجة بدون ازعاج استجابة ذكية ومعالجة اخطاء احترافية من خلال تعامل متكامل مع الأخطاء الشائعة تقريبا طريقة الدمج في مشاريعك و قواعد بياناتك : ضع الكود فى وحدة نمطية عامة مثلا باسم : basReportUtils استدعِ الدالة OpenReportSmart كما يناسب سيناريو العرض الذى تفضلة او المعالحة التى ترغب بها يمكن تمرير المعلمات بسهولة أو الاعتماد على القيم الافتراضية المستخدمة فى التكويد وأخيرا الكود المستخدم داخل الوحدة النمطية : basReportUtils ' __ ' / /\ ' / / \www.officena.net™ ' / / \__________ ' / / \ /\ ' /_/ \ / / ' ___\ \ ___\____/_/_ ' /____\ \ /___________/\ ' \ \ \ \ \ \ ' \ \ \ \____ \ \ ' \ \ \ / /\ \ \ ' \ / \_\/ / / \ \ ' \ / / /__________\/ ' / / / / ' /ابو جودى/ / / ' /________/ /\ / 21/07/2025 ' \________\/\ \ / منتديات أوفيسنا عالم من الابداع ' \_\/_____________________________________ Option Compare Database Option Explicit '' ==== متغير خاص لتخزين مؤقت لمصادر البيانات ==== ' --- Dictionary لتخزين RecordSource للتقارير Private m_dictRecordSource As Object '' ==== دالة: التحقق من وجود تقرير داخل قاعدة البيانات ==== Private Function ReportExists(ByVal strReportName As String) As Boolean On Error Resume Next ReportExists = Not CurrentProject.AllReports(strReportName) Is Nothing On Error GoTo 0 End Function '' ==== دالة: الحصول على مصدر البيانات لتقرير معين مع تخزين مؤقت ==== Private Function GetRecordSource(ByVal strReportName As String) As String If m_dictRecordSource Is Nothing Then Set m_dictRecordSource = CreateObject("Scripting.Dictionary") End If If m_dictRecordSource.Exists(strReportName) Then GetRecordSource = m_dictRecordSource(strReportName) Exit Function End If On Error GoTo ErrHandler DoCmd.OpenReport strReportName, acDesign, , , acHidden GetRecordSource = Trim(Reports(strReportName).RecordSource) DoCmd.Close acReport, strReportName, acSaveNo m_dictRecordSource.Add strReportName, GetRecordSource Exit Function ErrHandler: GetRecordSource = "" End Function '' ==== دالة: التحقق من احتواء التقرير على بيانات ==== Private Function ReportHasData(ByVal strReportName As String, ByVal strRecordSource As String, _ Optional ByVal strWhereCondition As String = "", _ Optional ByVal strOpenArgs As String = "") As Boolean Dim dbs As DAO.Database Dim rst As DAO.Recordset Dim qdf As DAO.QueryDef Dim lngCount As Long Dim bolIsQuery As Boolean On Error GoTo ErrHandler Set dbs = CurrentDb ''---- التحقق مما إذا كان strRecordSource يشير إلى استعلام محفوظ On Error Resume Next Set qdf = dbs.QueryDefs(strRecordSource) If Err.Number = 0 Then bolIsQuery = True Else Err.Clear bolIsQuery = False End If On Error GoTo ErrHandler ''---- محاولة حساب عدد السجلات If bolIsQuery Or InStr(1, strRecordSource, "SELECT", vbTextCompare) = 1 Then On Error Resume Next If bolIsQuery Then ''---- إذا كان استعلامًا محفوظًا، تحقق من المعلمات If qdf.Parameters.Count > 0 Then ReportHasData = False ' لا يمكن معالجة معلمات بدون قيم GoTo CleanUp End If Set rst = qdf.OpenRecordset(dbOpenSnapshot, dbReadOnly) Else ''---- إنشاء استعلام مؤقت مع strWhereCondition Dim strSQL As String strSQL = strRecordSource If Len(strWhereCondition) > 0 Then strSQL = strSQL & " WHERE " & strWhereCondition End If Set rst = dbs.OpenRecordset(strSQL, dbOpenSnapshot, dbReadOnly) End If If Err.Number = 0 Then lngCount = IIf(rst.EOF, 0, rst.RecordCount) rst.Close Set rst = Nothing Else Err.Clear lngCount = 0 End If On Error GoTo ErrHandler Else On Error Resume Next lngCount = Nz(DCount("*", strRecordSource, strWhereCondition), 0) If Err.Number <> 0 Then Err.Clear lngCount = 0 End If On Error GoTo ErrHandler End If ''---- إذا لم يكن هناك سجلات، تحقق من HasData If lngCount = 0 Then On Error Resume Next DoCmd.OpenReport strReportName, acViewPreview, , strWhereCondition, acHidden, strOpenArgs If Err.Number = 0 Then ReportHasData = Reports(strReportName).HasData DoCmd.Close acReport, strReportName, acSaveNo Else Err.Clear ReportHasData = False End If On Error GoTo ErrHandler Else ReportHasData = True End If CleanUp: If Not rst Is Nothing Then rst.Close Set rst = Nothing End If If Not qdf Is Nothing Then Set qdf = Nothing End If Set dbs = Nothing Exit Function ErrHandler: ReportHasData = False GoTo CleanUp End Function '' ==== إجراء عام: عرض تقرير بعد التحقق من وجوده واحتوائه على بيانات من وجود بيانات وطلب تأكيد الطباعة ==== Public Sub OpenReportSmart(ByVal strReportName As String, _ Optional ByVal bolAskToPrint As Boolean = True, _ Optional ByVal strViewMode As AcView = acViewNormal, _ Optional ByVal strWhereCondition As String = "", _ Optional ByVal strOpenArgs As String = "", _ Optional ByVal bolSilent As Boolean = False) Const strTitleConfirm As String = "تأكيد الطباعة" Const strTitleAlert As String = "تنبيه" Const strTitleError As String = "خطأ" Dim strRecordSource As String On Error GoTo ErrHandler ''---- التحقق من وجود التقرير If Not ReportExists(strReportName) Then If Not bolSilent Then MsgBox "التقرير '" & strReportName & "' غير موجود.", vbExclamation + vbMsgBoxRight + vbMsgBoxRtlReading, strTitleAlert End If Exit Sub End If ''---- الحصول على مصدر البيانات strRecordSource = GetRecordSource(strReportName) If Nz(strRecordSource, "") = "" Then If Not bolSilent Then MsgBox "التقرير '" & strReportName & "' لا يحتوي على مصدر بيانات.", vbExclamation + vbMsgBoxRight + vbMsgBoxRtlReading, strTitleAlert End If Exit Sub End If ''---- التحقق من وجود بيانات If Not ReportHasData(strReportName, strRecordSource, strWhereCondition, strOpenArgs) Then If Not bolSilent Then MsgBox "التقرير '" & strReportName & "' لا يحتوي على بيانات.", vbExclamation + vbMsgBoxRight + vbMsgBoxRtlReading, strTitleAlert End If Exit Sub End If ''---- طلب تأكيد الطباعة If bolAskToPrint And Not bolSilent Then If MsgBox("هل تريد طباعة التقرير '" & strReportName & "'؟", vbYesNo + vbQuestion + vbMsgBoxRight + vbMsgBoxRtlReading, strTitleConfirm) = vbNo Then Exit Sub End If End If ''---- فتح التقرير DoCmd.OpenReport strReportName, strViewMode, , strWhereCondition, acWindowNormal, strOpenArgs CleanUp: Exit Sub ErrHandler: Select Case Err.Number Case 2501 ''---- تم إلغاء العملية Case 2212 If Not bolSilent Then MsgBox "تم إلغاء عملية الطباعة أو تعذر العثور على التقرير '" & strReportName & "'.", _ vbExclamation + vbMsgBoxRight + vbMsgBoxRtlReading, strTitleAlert End If Case Else If Not bolSilent Then MsgBox "حدث خطأ أثناء فتح التقرير '" & strReportName & "'!" & vbCrLf & _ "رقم الخطأ: " & Err.Number & vbCrLf & _ "الوصف: " & Err.Description, vbCritical + vbMsgBoxRight + vbMsgBoxRtlReading, strTitleError End If End Select GoTo CleanUp End Sub وفى هذا الجزء استعرض بعض الامثلة لطرق الاستدعاء واستخدام الكود ' ====== (OpenReportSmart) طرق استدعاء الإجراء الرئيسي ====== '' 01 --- أبسط استدعاء بدون معلمات إضافية '' --- يعرض التقرير rptEmployees في الوضع الافتراضي للطباعة، مع تأكيد وظهور الرسائل Call OpenReportSmart("rptEmployees") '' 02 --- استدعاء بدون تأكيد '' --- يعرض التقرير بدون سؤال المستخدم عن التأكيد قبل الطباعة Call OpenReportSmart("rptEmployees", False) '' 03 --- فتح التقرير في وضع المعاينة Preview '' --- يفتح التقرير في وضع المعاينة، مع تأكيد قبل العرض Call OpenReportSmart("rptEmployees", True, acViewPreview) '' 04 --- تمرير شرط تصفية Where '' --- عرض التقرير فقط للموظفين في قسم معين Call OpenReportSmart("rptEmployees", True, acViewPreview, "DepartmentID = 5") '' 05 --- تمرير بيانات عبر OpenArgs '' --- يستخدم OpenArgs داخل التقرير لتخصيص العرض Call OpenReportSmart("rptEmployees", True, acViewPreview, , "ShowSummary") '' 06 --- الوضع الصامت (لا يظهر أي رسائل) '' --- يفترض صحة كل شيء، ولا يعرض أي تنبيهات للمستخدم Call OpenReportSmart("rptEmployees", , , , , True) '' 07 --- مثال كامل بجميع المعاملات '' --- عرض بالتصفية، ووسائط OpenArgs، مع تأكيد، بدون صمت Call OpenReportSmart("rptEmployees", True, acViewPreview, "IsActive = True", "FromMainMenu", False) '' 08 --- مثال طباعة تقرير بناءً على اختيار موظف من نموذج Public Sub Example5_PrintReportWithDynamicFilter() ' ' --- التحقق من تحميل نموذج اختيار الموظف If CurrentProject.AllForms("frmEmployeeSelector").IsLoaded Then Dim strFilter As String strFilter = "EmployeeID = " & Forms!frmEmployeeSelector!cboEmployeeID Call OpenReportSmart("rptEmployeeAttendance", True, acViewNormal, strFilter) Else MsgBox "يرجى فتح نموذج اختيار الموظف أولاً.", _ vbExclamation + vbMsgBoxRight + vbMsgBoxRtlReading, "تنبيه" End If End Sub '' 09 --- معاينة تقرير ليوم محدد (تاريخ اليوم) Public Sub Example6_PreviewReportWithDateFilter() Dim strFilter As String strFilter = "ReportDate = #" & Format(Date, "mm/dd/yyyy") & "#" Call OpenReportSmart("rptDailySummary", True, acViewPreview, strFilter) End Sub '' 10 --- استدعاء التقرير باستخدام متغير شرط بتنسيقات مختلفة (نصي، رقمي، تاريخي) '' --- المثال الاساسى Call OpenReportSmart("rptEmployees", True, acViewPreview, "DepartmentID = 5") ''>>--> رقمي (رقم قسم مثلاً) Public Sub Example_NumericFilter() Dim lngDepartmentID As Long lngDepartmentID = 5 Dim strFilter As String strFilter = "DepartmentID = " & lngDepartmentID Call OpenReportSmart("rptEmployees", True, acViewPreview, strFilter) End Sub ''>>--> نصي (اسم الموظف مثلاً) Public Sub Example_TextFilter() Dim strEmployeeName As String strEmployeeName = "محمد علي" Dim strFilter As String strFilter = "EmployeeName = '" & strEmployeeName & "'" Call OpenReportSmart("rptEmployees", True, acViewPreview, strFilter) End Sub ''>>--> تاريخ (بيانات ليوم معين) Public Sub Example_DateFilter() Dim datTargetDate As Date datTargetDate = DateSerial(2025, 7, 1) Dim strFilter As String strFilter = "HireDate = #" & Format(datTargetDate, "mm/dd/yyyy") & "#" Call OpenReportSmart("rptEmployees", True, acViewPreview, strFilter) End Sub ' ======================= استخدام المعايير حسب انواع البيانات ======================= '>>--> رقمي-----Long / Integer : "FieldName = " & Numeric '>>--> نصي----String : "FieldName = '" & النص & "'" '>>--> تاريخ----Date : "FieldName = #" & Format(date, "mm/dd/yyyy") & "#" ' ===================================================================================== ولكن وجب التنويه الى شئ : الأكواد قيد التجربـــة أنا لسه كاتب الاكواد بناء على سؤال فى المنتدى
  6. ودى فكرة لتحقيق طلبك بشكل مباشر ولكن لا احب اعادة استخدام الاكواد فى نماذج مختلفة او تعديلها كل شوية ان شاء الله تعالى سوف أقوم ببناء وحدة نمطية متخصصة للتحكم فى كل كبيرة وصغيرة لمن يهتم بهذا الموضوع ينتظر ان شاء الله مفاجأه سارة
  7. ماشى هنقول بسبة من 80 الى 85 % ذهب الوميض والاهتنزاز ولكن ما زال هناك مشاكل اهتزاز عند البدء واستخدام Transparent مع ال Buffering ليس علاج ما هو الا مسكنات فقط ومشكلة اختفاء العناصر حتى يتم التكبير وعمل استعادة لحجم النموذج مرة أخرى وطبعا مع الانظمة والاجهزة الدنيا سوف يكون الوضع اسوء ناهيكم عن الشبكة وهذا مثال خفيف ناهيكم عن نموذج يعتمد على احداث فى التيمر -------------- وهذا ما يثيت قولى اكسس ليس مصمم ليكون بيئة رسوميات عالية الأداء نماذج اكسس ليست مهيأة لتحديثات واجهة المستخدم السريعة مثل Windows Forms لذلك سوف تبقى هذه مشكلة أزلية الوميض (Flickering) والارتعاش (Shaking or Jittering) والاكسس اصدقاء لن يتخلى احدهم عن الاخر
  8. على العموم بوجه عام فى كود فتح التقرير من خلا زر امر استخدم Dim strRptName As String Dim strMsgNoData As String Dim strMsgConfirm As String '' --- اسم التقرير strRptName = "" '' --- الرسالة إذا لم توجد بيانات strMsgNoData = "التقرير فارغ." '' --- رسالة التأكيد strMsgConfirm = "هل تريد طباعة هذا التقرير؟" '' === فتح التقرير بشكل غير ظاهر للمستخدم (يتم عرضه في الخلفية للتحقق) === DoCmd.OpenReport strRptName, acViewPreview, , , acHidden '' === التحقق من وجود بيانات === If Reports(strRptName).HasData Then '' --- توجد بيانات، نسأل المستخدم If MsgBox(strMsgConfirm, vbYesNo + vbQuestion + vbMsgBoxRtlReading + vbMsgBoxRight, "تأكيد الطباعة") = vbNo Then DoCmd.Close acReport, strRptName, acSaveNo Else '' --- إظهار التقرير لأنه كان مخفي DoCmd.SelectObject acReport, strRptName, True End If Else '' --- لا توجد بيانات، نغلق التقرير ونعرض رسالة DoCmd.Close acReport, strRptName, acSaveNo MsgBox strMsgNoData, vbExclamation + vbMsgBoxRtlReading + vbMsgBoxRight, "تنبيه" End If Exit Sub
  9. الموضوع ده قبل الرد لازم نكون عارفين ايه مصدر بيانات التقرير وهل فيه فرز او تصفيه بتتم واللا لاء يعنى ضع مرفقك بالحالة اللى انت عاوزها بالظبط
  10. لا لا لا فى فرق بين ماشي معاه وفرق بين بعد ما أكود اطلب منه يكتب لى التعليقات فرق كبيــــــــــــر جدا جدا
  11. في معظم نسخ ويندوز الحديثة وخاصة 64 بت + الوفيس باللغة العربية نعم vbMsgBoxRtlReading غالبا يفرض تلقائيا المحاذاة لليمين بشكل تلقائي لكن في بعض النسخ (خاصة الإنجليزية 32 بت أو البيئات غير المهيأة للعربية) قد لا يفرض تلقائيا المحاذاة لليمين بشكل تلقائي بل يظهر النص محاذى لليسار رغم أن اتجاهه RTL تمام يا برنس الجيل خليك انت ماشى ورا شات جى بى تى بتاعك ده وربنا دا غبى وفى الاحر انت هتزعل وتجيب ناس معاك تزعل بسببه ---------------------------- انا مش مقدم شرح لكود ولو جزئية من فكرة أنا قدمت قاعدة متكاملة تعمل كما هى ... فمشمشطلتى بقه انك عاوز تلعب ولكن حاضر قلت لك هبهرك ---------------------------- والله انا ماليش دعوة بنظام الصوت ولا انا اللى مسجله هو جالى كده من اول مشاركة اشارت ليها مش عاجبك نظام الصوت يا عسل ؟ اشترى لك مايك وسجل بنفسك وبصوتك وعلى هواك اعمل النظام اللى يعجبك أو روح لاخوك @Moosak يسجل لك بصوتة الكروان ---------------------------- فى أول اصدار صممته كنت اعتمد عليه بس فى التحديث الاخير ولا له لازمة بس انا نسيت ازالة التاجات من الازرار زهايمر بئه بعيد عنك انتظر وسترى العجب العجاب
  12. مثل ما بينحكى عنا بالمصرى بيقولوا " الجمل طلع النخله " ادى الجمل المرفق ده مطلوب منك انت تطلعه النخله زى ما بتحكى وتمنع الوميض يا بطل ولا تزعل نفسك صفحة رئيسية مطورة - النموذج السادس.rar
  13. بمناسبة موضوع الارتعاش والاهتزاز اللى @hanan_ms دائم الكلام عنه كل شويه اللى بيعتمد على خاصية Double Buffering أو Buffering لتقليل الوميض باستخدام WS_EX_COMPOSITED غير فعال وبيعفرت التطبيق هذا للتنويه فقط من الاخـــــــــر اكسس ليس مصمم ليكون بيئة رسوميات عالية الأداء نماذج اكسس ليست مهيأة لتحديثات واجهة المستخدم السريعة مثل Windows Forms لذلك سوف تبقى هذه مشكلة أزلية الوميض (Flickering) والارتعاش (Shaking or Jittering) والاكسس اصدقاء لن يتخلى احدهم عن الاخر
  14. ادخل على الصورتين فى تبويب الاحداث غير كلمة [إجراء حدث] فى الحدث On Mouse Move فى الصورتين لـ [Event Procedure] انا مش عارف ليه المشكلة الغريبة دى بصراحة
  15. وبكده الحمد لله انا ضمنت ان خلاص مبقاش فاضل تكـــه كلنا وصلنا لاخر السكـــــــــــــــــه
  16. وانا داخل ادور ورا @Moosak , @Foksh لا تعليق .... eye.accdb
  17. اشارة الى الموضوع وكذلك الموضوع التالى وبناء على طلب احد الاخوة الافاضل بعمل التعديل على قاعدة بيانات الخاصة بالمعلمين لطريقة برايل واشارة سريعة للطريقة للتعريف بالقاعدة وبالطريقة المعلم المبصر هو من سوف يستخدم هذا التطبيق فى التعليم وهو من سوف ينقر ازرار الحروف والمتلقون للعلم هم من سوف يستمع لحركة كل حرف ترجمة الحرف هذه هى طريقة برايل تعتمد الطريقة على ان كل الحروف تتكون من خلية من ست نقاط وعدد النقاط بترتيب معين داخل الخلية يدل على كل حرف وهذا شكل الخلية وتتم قراءة النقاط البارزة/المحفورة من خلال معرفة رقم موضعها طبقا للخلية الاتية من خلال التحسس باللمس من إخواننا الغير مبصرين وجدول برايل اجمالا يعنى عندما يتحسس غير المبصر ويجد النقطة البارزة/المحفورة طبقا للترتيب فى الخلية الاتية رقم 1 اى ان هذا حرف الاف وهندما يتحثث النقاط البارزة/المحفورة ويجدها حسب موضعها 2 ، 3 ، 4 ، 5 فهذا حرف التاء كان الملطلوب منى تعديل النموذج ليمثل محاكاة حقيقية لشكل الخلية ومواضع الحروف عليها عند النقر على كل حرف وبحمد الله وبفضله تم عمل ذلك وهذه صورة من داخل النموذج Braille V.3.zip
  18. أتتمنى فقط أن تكون راض عن الحل و وجدت ضالتك هذا أفصى ما استطعت تقديمه بل كل الشكر لكم استاذى الجليل و معلمى القدير و والدى الحبيب حياكم الله وبياكم وهذه طريقة أخرى بدون الاعتماد على دوال :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 الان معك كل الخيارات لتختر ما يناسبك ويلبى رغباتك
  19. دالة حساب الوقت اللى كانت فى الوحدة النمطية فى المرفق الاول 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) صياغتها أوضح ولا تفقد الدقائق عند الحساب دقيقة في كل الحالات لو أردت دعم الثواني بنفس الأسلوب أقدر أعدل لك الدالة فقط أخبرنى
  20. اذا هذا الحل بالكود التالى لزر الامر 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
  21. ما هو انا مش فاهم اعتقد المفروض فى جدول مساعد خدمى المفروض يكون به اسماء الفترات والرقم المعرف لكل فترة وكان السبب فى الاتجاه الى التعامل مع المعرف هو رد الاستاذ ابو خليل الموضوع محتاج لفهم جيد فهم السؤال شطر الجواب
×
×
  • اضف...

Important Information