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

نجوم المشاركات

  1. jjafferr

    jjafferr

    أوفيسنا


    • نقاط

      10

    • Posts

      9960


  2. Eng.Qassim

    Eng.Qassim

    الخبراء


    • نقاط

      10

    • Posts

      2384


  3. Amr Ashraf

    Amr Ashraf

    الخبراء


    • نقاط

      10

    • Posts

      946


  4. Ahmed_J

    Ahmed_J

    04 عضو فضي


    • نقاط

      9

    • Posts

      781


Popular Content

Showing content with the highest reputation on 02/19/22 in مشاركات

  1. السلام عليكم .. الاخوة الأعزاء موضوعنا اليوم عن القائمة المختصرة مجددا ولكن بتطبيقات اكثر تقدما مثل جعلها متعددة المستويات وتتغير ديناميكياً طبقاً لشروط تضعها بيدك .. نبدأ بسم الله بداية يجب ان يكون هذا الموضوع مرجعك فى اى موضوع يتعلق بالقائمة المختصرة .. هذا الموضوع بقلم أستاذنا المبدع @jjafferr ويمكنك ايضا استعراض هذا الموضوع لتطبيقات مختلفة على القائمة المختصرة نبدأ الموضوع الجديد : بداية لن استفيض فى شرح الكيفية لأن بعد استعراضك للموضوعين السابقين سنفترض انك فهمت كافة التفاصيل المتعلقة بالقائمة المختصرة . التطبيق الاول : كيف يتم ربط القائمة المختصرة بالكائنات Objects الموجودة بقاعدتك ( نماذج - تقارير- استعلامات - ماكروهات ) مثال : الطريقة هنا تعتمد على مجموعة استعلامات تقوم باستخلاص انواع الكائنات من جداول النظام وتقوم الموديول الخاص بالقائمة المختصرة بعرض هذه الكائنات فى القائمة . المثال الخاص بها مرفق بإسم Amr Multi Level Menu-All Objects . عيوب الطريقة : انها ستعرض لك الكثير من الكائنات التى لن تحتاجها فى القاعدة مثل النماذج الفرعية و ماكروهات الالحاق والتحديث والحذف Append,Update,Delete , مما يأخذنا للتطبيق الثاني . التطبيق الثانى : فى هذا التطبيق سنقوم بوضع نوع و اسماء الكائنات المطلوب عرضها فى القائمة المختصرة فى جدول اسميته TblConditions . مثال: المثال الخاص بها مرفق بإسم Amr Multi Level Menu-Some Objects . التطبيق الثالث : يعتمد هذا التطبيق بربط التطبيق الثانى بصلاحيات المستخدمين, افترضت فى المثال ان عندى 3 مجموعات رئيسية للمستخدمين اول مجموعة Admins او المدراء ولهم كافة الصلاحيات , المجموعة الثانية المستخدم العادى ولهم بعض الصلاحيات , المجموعة الثالثة الضيوف ولهم صلاحية واحدة فقط وهو عرض الشاشة الرئيسية او نموذج واحد مثلا , ويتم تحديد المجموعات التى لها صلاحية استعراض الكائنات فى سجل بجانب اسم الكائن ونوعه فى الجدول TblConditions . مثال : ملاحظة : القائمة الأخيرة " صنعت خصيصاً " جعلتها حصراً على الAdmins فقط وبالتالى لن تظهر لباقى المجموعات . ستجد المثال الخاص بهذا التطبيق باسم Amr Multi Level Menu-Some Objects - Users - V2.0 . وبهذا انتهى الموضوع . ملاحظات عامة : استوحيت فكرة القائمة المتعددة المستويات من شخص اجنبى اسمه MaJip وقمت ببناء افكارى عليها . يمكن استدعاء القائمة عند فتح النموذج او عند النقر على الصورة الموجودة فى الامثلة ومرفق الطريقتين استخدم ما يناسبك . القوائم التى تنحدر منها قوائم اخرى لا يمكن تخصيص ايقونة لها ولكن القوائم الفرعية يمكن تخصيص ايقونة لها سواء عن طريق خاصية Face ID او عن طريقة خاصية Picture لارفاق صورة خارجية . فكرة صلاحيات المستخدمين طلبها الأخ @عمر ضاحى وبالتالى صممتها وارفقتها للموضوع . أستاذنا @jjafferr يرجى مراجعة الموضوع وتصحيح ما أخطأت به ان وجد 😅 جزاكم الله خير الأخ العزيز @ابو جودي اعتذر عن استخدام مثالك لأنى كنت قد جهزت الامثلة المستخدمة بالفعل .. جزاك الله خير دمتم بخير Amr Multi Level Menu -All Objects.accdb Amr Multi Level Menu-Some Objects - Users - V2.0.accdb Amr Multi Level Menu-Some Objects.accdb
    4 points
  2. حيا الله دكتور حلبي 🙂 في الواقع هذا سؤال لا حدود له ، فكل شيء في برنامجك وبرمجتة ، يصب فيه !! وفي كل مشاركة اضعها ، اشرح فيها ميزاتها وعيوبها 🙂 خذ مثال من الموضوع الذي نحن به الآن: عادة في استعمال الامر Recordset : المبرمج عادة يستعمل Set rst_fy = currentdb.openRecordset("Select * From tbx") بينما انااستعملت Set rst_fy = Forms!fxy!fy.Form.RecordsetClone . والاثنين يعطون نفس النتيجة ، ولكن الفرق بينهم كبير ، فالطريقة الاولى ، البرنامج يذهب الى الجدول لأخذ جميع بياناته ، ووضعها في المتغير rst_fy ، بينما مفهوم الطريقة الثانية: بما ان النموذج الفرعي fy عند فتحه ، فقد اخذ جميع بياناته من الجدول ، مفلترة وجاهزة ، فلماذا اشغل الشبكة والجدول بأخذ البيانات منه مرة اخرى ، بينما يمكنني اخذ هذه البيانات من النموذج مباشرة ، فهو اسرع (لأنه على كمبيوتري) ، ولا يشغل الشبكة او الجدول 🙂 وهذا مثال اشرح فيه كيف البرمجة لها تأثير في سرعة عمل الاستعلام : جعفر
    4 points
  3. وعليكم السلام 1- قم بتغيير اسم الزر (caption) حسبما تريد 2- من خصائص الزر.. اختار General من Picture Caption Arrangement 3- اضغط على النقاط الثلاثة (…) من Picture لفتح نافذة الصور واختر منها ماتشاء
    3 points
  4. السلام عليكم ورحمة الله وبركاته... قمت ببرمجة هذه الاداة تلبية لطلب اخونا @ابوخليل في هذا الموضوع هنا: الاداة مبرمجة 100% بلغة NET. وهي تستعمل مكتبات Google.Apis.Drive وهي تحتاج منصة الفريم ورك 4.5 ملاحظة: انا طبقت الشرح على نسخة احتياطية حيث وضعت الـ Path عبارة عن CurrentProject.FullName يمكنك استبداله بأي مسار صورة او فيديو او ملف او اي شي الشرح بصوتي الجميل😂: https://youtu.be/Uzj68nCaEbo الرابط الذي استعملته في التسجيل: https://console.developers.google.com/apis/credentials/oauthclient/ لا تنسوني ووالدي من صالح دعائكم. تم بحمد الله. GoogleDriveUploader.rar
    2 points
  5. السلام عليكم جرب الكود بعد تغيير اسم التقرير تبعك DoCmd.SelectObject acReport, "TAB01", True DoCmd.PrintOut , 1, 1, , 1
    2 points
  6. نفس الفكرة تقريبا بحث باي جزء في القائمة المنسدلة.rar
    2 points
  7. اختر اسم الشيت من الخلية الصفراء ثم ادخل كلمة المرور في الخلية الخضراء تفضل كلمة مرور لكل شيت.xlsm
    2 points
  8. تفضل 🙂 ضع هذا الكود في النموذج fx Option Compare Database Option Explicit Dim rst_fy As DAO.Recordset Dim rst_n As Integer ' Private Sub xxx_Click() 'take the Recordset one time, use it many times If rst_n = 0 Then Set rst_fy = Forms!fxy!fy.Form.RecordsetClone rst_n = 1 End If rst_fy.MoveFirst rst_fy.FindFirst "yyy='" & Me.xxx & "'" If rst_fy.NoMatch Then MsgBox "لا يوجد تطابق" Else MsgBox "يوجد تطابق" Me.Parent!fy.Form.Bookmark = rst_fy.Bookmark Me.Parent!fy.SetFocus End If rst_fy.Close End Sub . جعفر
    2 points
  9. نعم العدد مفتوح لعدد X من المستخدمين معنى الـ X مثلا لو كان لديك مليون شخص او الف او غيره يمكنك الارسال لهم بدون اي جهد. فقط حدد الاشخاص المطلوبين واكتب الرسالة ودع الاداة تقوم بالباقي.
    2 points
  10. تفضل 1- قمت بتغيير المسميات في الجدول الى اللغة الانكليزية لسهولة التعامل معها مستقبلا في الاكواد 2- عملت لك استعلام لسهولة اجراء العمليات الحسابية فية او الفرز او اي شيء اخر 3- عملت لك نموذجين واحد نموذج منفرد والاخر نموذج مستمر (انت اختار اللي يعجبك منهم) 4- عملت لك تقرير تحياتي test.accdb
    2 points
  11. Sub Test() Dim Last As Long, i As Long Last = Sheet4.Range("A100000").End(xlUp).Row + 1 For i = 1 To 7 Sheet4.Cells(Last, i).Value = Me.Controls("TextBox" & i + 1).Value Next i End Sub
    2 points
  12. السلام عليكم ورحمة الله وبركاته.. من المعروف ان الواتس اب يسمح لك بارسال 5 رسائل فقط في كل مرة يعني لو كان لدينا 15 شخص نريد ان نرسل له رسالة علينا ان نقوم باعادة توجيه الرسالة 3 مرات كل مرة 5 اشخاص.. قمت بعمل اداة صغيرة في الـ NET. لتقوم بهذه المهمة. صورة مشروع الاكسس: قم بتحديد الاشخاص الذين تريد ارسال الرسالة لهم مع وضع نص الرسالة مع امكانية تحديد الكل يمكنك شروط البرنامج بحسب ماتراه مناسباً. النتيجة: ملاحظة يجب ان يكون برنامج الواتس اب موجود في جهاز الكومبيوتر واهم ملاحظة هي يجب كتاب رقم الواتس اب الذي تريد ان ترسل له الرسالة كما يظهر في البرنامج، مثال: لتحميل الواتس اب من الرابط الاتي: https://www.whatsapp.com/download لا تنسوني ووالدي من صالح دعائكم. تم بحمد الله. Whatsapp-Message-Sender.rar
    1 point
  13. السلام عليكم ورحمة الله تعالى وبركاته الشرح الاتى لا يخص الأكسس بصفة خاصة ولكن لحماية حذف القاعدة او اى ملف داخل مجلد او المجلد الذى يحتوى قاعدة البيانات بالخطأ اولا نقوم بعمل مجلد جديد ونعطيه الاسم الذى نريد على سبيل المثال نضع مجلد جديد داخل القطاع D ونعطى المجلد اسم BackDB نقوم بتحديد المسار ونقوم بنسخه فيكون D:\Test\BackDB ولو كان اسم المجلد من مقطعين مثل Back DB سوف يكون المسار نسخ المسار الى ملف نصى ونقوم بتعديله ليكون D:\Test\Back_DB بعد ذلك نقوم بفتح موجه الاومر DOS ونقوم بكتابة او لصق الامر الاتى cacls D:\Test\BackDB /P everyone:n ولو اسم المجلد من مقطعين يكون cacls D:\Test\Back_DB /P everyone:n ثم نضغط على المقتاح Enter من لوحة المقاتيح ثم نضغط على المفتاح Y من لوحة المفاتيح كما هو موضح فى الصورة بعد ذلك نغلق موجه الاوامر DOS ونذهب الى المجلد ونقوم بالضغط عليه كليك يمين ونختار Properties تظهر لنا النافذة الاتية نحدد التبويب Security ثم نضغط بعد ذلك على Advanced كما هو موضع بالصورة ثم بعد ذلك تظهر لنا النافذة الاتية نقوم بالتحديد اولا كما هو فى الخطوة رقم 1 بالصورة ثم بعد ذلك كما هو بالخطوة رقم 2 نقوم بالضغط على Edit ثم بعد ذلك تظهر لنا النافذة الاتية نقوم بالضعط على Show Advanced Permissions ثم بعد ذلك تظهر لنا النافذة الاتية 1- فى الـ Type نختار Allow 2- فى اختيارات الـ Permissions نقوم بإزالة التأشير من على الاتى Delete Delete Subfolders and files لتصبح الاعدادت كما بالشكل الاتى ثم نضغط OK الان انسخ قاعدة البيانات داخل المجلد او اى ملفات تخاف من فقدانها جرب حذف الملفات لن يتم حذفها حاول حذف القاعدة كذلك لن يتم حذفها كذلك اقتح القاعدة واضف اليها بيانات او عدل او احذف منها اى بيانات سوف تعمل القاعدة بشكل طبيعى جدا لو اردت حذف المجلد او اى شئ بداخلة فقط استخدم الامر الاتى فى موجه اوامر الـ DOS cacls D:\Test\BackDB /P everyone:f وبعد حذف ما تريد يمكنك اعادة الخطوات ان اردت ارجاع الحماية مرة اخرى انتهى الشرح دمتم فى امان الله...
    1 point
  14. 1 point
  15. اخي العزيز مع ان ليس لدي طابعة الملف يعمل لدي بصورة صحيحة بدون مشاكل على الطابعة الافتراضية للوندوز اتمنى احد الاخوة ان يجد الحل لك تحياتي
    1 point
  16. بعد اذنك استاذي العزيز @husamwahab الاخ صاحب المشاركة لايريد اظهار الوحدة السكنية التي تم اخلائها وفي نفس الوقت تظهر حين ايجارها المؤجر محمد انتهى ايجاره فيجب ان لا يظهر ...بينما يظهر سالم الذي قام باستجار نفس الشقة انا عملت جدول اخر لالحاق البيانات للشقة التي تم اخلاءها وبنفس الوقت احذفها من الجدول الرئيسي حتى تسهل عملية التصفية لكن الاخ غير متفاعل مع موضوعه
    1 point
  17. السلام عليكم .. اضافة جديدة على التطبيق الثالث صلاحيات المستخدمين .. قمت بالتعديل على الكود قليلا الآن اذا لم يكن للمستخد الحالى صلاحية عرض التقارير مثلا لن تظهر القائمة الفرعية فارغة كما فى السابق ولكن قائمة التقارير الاساسية لن تظهر من الاساس وستظهر فقط اذا كان عدد العناصر فى القائمة الفرعية اكبر من صفر ,, مرفق التعديل Amr Multi Level Menu-Some Objects - Users - V3.0.accdb
    1 point
  18. احسنت استاذ احمد @Ahmed_J ما شاء الله ... العراقيون جاي يبدعون هاي الايام
    1 point
  19. learning is a continuous process and we were not born know anything. Try and you will be able to do it yourself
    1 point
  20. اخي mra63 لماذا لا تعطي من ساعدك حقة بألضغط علي افضل اجابه جزاك الله خيراً
    1 point
  21. I can't help you anymore as there are no clear steps But generally you can use IF statement and the property NAME to refer to sepcific worksheet If worksheets(i).Name = "NAMEOFSHEET" Then 'Do Something Else 'Do Another Thing End If
    1 point
  22. السلام عليكم يوضع بزر في النموذج DoCmd.SelectObject acReport, "CHEMM", True DoCmd.PrintOut , 1, 1, , 1 جرب هذا المرفق تحياتي test.accdb
    1 point
  23. وعليكم السلام اخي عبد الله السعيد تفضل طلبك Zeroo.xlsm
    1 point
  24. انا بالفعل عملت كل حاجه بالاكواد وفعلت نظام الصلاحيات لكن كنت عاوز اعرف كيف اجعل القوائم دينماكيه ف بارك الله فيك وزادك من علمه والحمد لله اشتغل الكود كده على اكمل وجه باقى ان اشوف كيف ممكن استفيد من القائمه التلقائيه دي ^_^
    1 point
  25. يسلموا اديك ، كل الاحترام والله ، هذا المطلوب .. زادك الله علما ... ♥
    1 point
  26. اتدلل اخوي العزيز بالخدمة
    1 point
  27. كل الشكر والتقدير لمرورك الكريم كانت اجابتك هي المطلوبة مودتي واحترامي
    1 point
  28. هناك عدة طرق للتعامل مع رسائل الخطأ ، الطريقة اللي انا استعملها ، هي اصطياد رقم الخطأ ، ثم التعامل معه ، فعليه ، يصبح الكود : Option Compare Database Option Explicit Dim rst_fy As DAO.Recordset Dim rst_n As Integer ' Private Sub xxx_Click() On Error GoTo err_xxx_Click 'take the Recordset one time, use it many times If rst_n = 0 Then Set rst_fy = Forms!fxy!fy.Form.RecordsetClone rst_n = 1 End If rst_fy.MoveFirst rst_fy.FindFirst "yyy='" & Me.xxx & "'" If rst_fy.NoMatch Then MsgBox "لا يوجد تطابق" Else MsgBox "يوجد تطابق" Me.Parent!fy.Form.Bookmark = rst_fy.Bookmark Me.Parent!fy.SetFocus End If Exit_xxx_Click: rst_fy.Close Exit Sub err_xxx_Click: If Err.Number = 3021 Then 'No data Resume Exit_xxx_Click Else MsgBox Err.Number & vbCrLf & Err.Description End If End Sub Private Sub Form_Close() Set rst_fy = Nothing End Sub . اما التنسيق الشرطي الذي يمكن استعماله هنا ، فيكون ابسط : . فيه ملاحظة كتبتها بالانجليزي في الكود ، وعليه قمت بهذا العدد من الاسطر ، بالاضافة الى سطر تعريف المتغير Dim rst_n ، بينما كان ممكن ان اكتب سطر واحد من Set rst_fy = Forms!fxy!fy.Form.RecordsetClone والسلام : . السبب هو : رجاء ، لما تشتغل على اي برنامج ، ابدا لا تنظر للبرنامج بعدد بياناته الآن ، وانما انظر كأنك تتعامل مع 10 او 100 الف سجل ، لهذا السبب رفعت قاعدة بيانات للتجربة: . فلما عندك كود تريد تجربه ، ممكن تجربه على هذا العدد الهائل من البيانات ، فعليه ستعرف اذا الكود الذي عملته بطيء او سريع. لما تستخدم الامر Recordset او RecordsetClone ، فانت تأخذ نسخة من بيانات الجدول/الجداول (اذا كان استعلام) ، وتُبقي هذه البينات في ذاكرة الكمبيوتر المؤقته Ram ، فيصبح التعامل مع البيانات من الذاكرة مباشرة ، لذلك من المهم ان تحذف البيانات لما تنتهي من استعمالها ، وعادة نعمل هذا في آخر الكود بالامر Set rst_fy = Nothing . في حالة برنامجنا اعلاه ، في الكود الذي وضعته انا ، فأنا أخذ بيانات الجدول مرة واحدة فقط ، ويبقى في الذاكرة الى ان نغلق النموذج ، فنحذفه من الذاكرة ، ولكن الكود الذي وضعته انت ، فأنت تأخذ البيانات من الجدول كلما تدخل في الكود (لا تنسى قد تكون الجداول في الشبكة ، وقد تكون سجلات الجدول كبيرة) ، وهذا يجعل البرنامج ابطئ !! جعفر
    1 point
  29. 1 point
  30. Dim rst_fy As DAO.Recordset Dim rs As DAO.Recordset Dim IsExists As Boolean Set rs = [Forms]![fxy]![fy].Form.RecordsetClone With rs If Not (.BOF And .EOF) Then .MoveFirst Do While Not .EOF IsExists = (!yyy = Me.xxx) If IsExists Then Exit Do .MoveNext Loop .Close End With Set rs = Nothing If IsExists Then MsgBox "الرقم موجود" & Me.xxx Set rst_fy = Forms!fxy!fy.Form.RecordsetClone Me.Parent!fy.Form.Bookmark = rst_fy.Bookmark Me.Parent!fy.SetFocus Else MsgBox " الرقم غير موجود" End If مع دمج الكودين الاستاذ @jjafferr الاستاذ @Eng.Qassim اعتقد اني استحق افضل اجابة 😁
    1 point
  31. 1 point
  32. كل الشكر والتقدير لحضرتك فعلا كتبتها وضبطت معايا 🙏🙏🙏
    1 point
  33. حياك الله 🙂 عملت تغيير طفيف في الكود اعلاه ، حتى يصبح اسرع ، واخف على الكمبيوتر 🙂 جعفر
    1 point
  34. 1 point
  35. سرني كثيراً انك وجدت ضالتك واستفدت من موضوعي، لم امر ابدا بنافذة الكريدت كارد لا اعلم ما الذي حدث معك بالضبط. بالمناسبة خطرت ببالي النسخة القادمة ان يقوم بضغط الملف winRAR ومحمي بباسورد ان شاء الله ساقوم بتعديله قريباً وارفاق النسخة في هذا الموضوع.
    1 point
  36. اذا تغير النماذج الفرعية ، بدل ان تكون نموذج بيانات الى نموذج مستمر ، فالحل سيكون اسهل للجميع 🙂
    1 point
  37. In cell S3 you can use this formula instead of hard-coding the formula in that terrible way =IFERROR(INDEX(XEX:XEX,MATCH(R3,XEY:XEY,0)),"")
    1 point
  38. Before the loop in the code use this line Me.ListBox1.Clear
    1 point
  39. There are not enought details but try the following code study it well and change it to suit your needs Option Explicit Private Sub ComboBox1_Change() Dim ws As Worksheet, i As Integer, m As Long, r As Long, k As Long For i = 2 To 5 Set ws = ThisWorkbook.Worksheets(i) With ws m = .Cells(Rows.Count, "D").End(xlUp).Row If m <= 1 Then GoTo NXT For r = 2 To m If .Cells(r, "D").Value = ComboBox1.Value Then With Me.ListBox1 If k = 0 Then .ColumnCount = 3 .AddItem .List(k, 0) = ws.Cells(r, 1).Value .List(k, 1) = ws.Cells(r, 2).Value .List(k, 2) = ws.Cells(r, 6).Value k = k + 1 End With End If Next r NXT: End With Next i End Sub
    1 point
  40. عليكم السلام، نعم يمكن ذلك بواسطة الـ Commandline Sub Extract() Dim RarIt As String Dim Source As String Dim Desti As String Dim WinRarPath As String WinRarPath = "C:\Program Files\WinRar\" Source = "C:\Users\SEMO\Desktop\DBS\GoogleDriveUploader.rar" Desti = "C:\Users\SEMO\Desktop\DBS\" RarIt = Shell(Chr(34) & WinRarPath & "WinRar.exe" & Chr(34) & " e " & Chr(34) & Source & Chr(34) & " " & Chr(34) & Desti & Chr(34), vbNormalFocus) End Sub Sub Compress() Dim RarIt As String Dim Source As String Dim Desti As String Dim WinRarPath As String WinRarPath = "C:\Program Files\WinRar\" Desti = "C:\Users\SEMO\Desktop\DBS\" Source = "C:\Users\SEMO\Desktop\DBS\NameFolderRar.rar" RarIt = Shell(Chr(34) & WinRarPath & "WinRar.exe" & Chr(34) & " a " & Chr(34) & Source & Chr(34) & " " & Chr(34) & Desti & Chr(34), vbNormalFocus) End Sub
    1 point
  41. السلام عليكم ورحمة الله اخيرا تم اجراء التعديلات اللازمة لشيت كنترول الصف الثانى التجارى ارجو مراجعة الملف و ابداء الملاحظات و ان شاء الله اى تعديلات مطلوبة ارجو ذكرها و الله ولى التوفيق اليكم الملف 996653921_.xlsm
    1 point
  42. تفضل أخي الكريم. 0.0_3rEd.0_3rEd!attachment!0_مواد دراسية (1).xlsx
    1 point
  43. السلام عليكم .. الاساتذة الكرام الموضوع اليوم عن تتبع التغييرات التى تقوم بها على اى سجل موجود فى قاعدة البيانات .. لنبدأ لنفترض ان لدى مجموعة من النماذج التى تقوم بتعديل بيانات معينة فى الجداول واريد ان اتتبع التغييرات التى تمت بحيث يتم تسجيل البيانات قبل التعديل وبعد التعديل مثال : لدى هذا النموذج ومهمته التعديل على رصيد المخزن .. انظر للقيمة قبل التعديل : قمت بالتعديل وضغطت على زر الأمر .. النتيجة .. فى جدول التعديلات TblAudit تم تسجيل التالى : القيمة قبل التعديل وبعد التعديل .. والشخص القائم بالتعديل .. وتاريخ ووقت التعديل .. و النموذج المستخدم فى التعديل .. ومصدر بيانات هذا النموذج . فلنجرب تعديل اكثير من حقل فى النموذج دفعة واحدة : النتيجة : تابع معى لتعرف الطريقة : مبدأياً لم اكتب الكود ولكن قمت بالتعديل عليه وعملت امثلة مصمم الكود كتبت اسمها فى الكود نفسه .. افتح موديول جديد والصق هذا الكود : Public Function WriteAudit(frm As Form, lngID As Long) As Boolean On Error GoTo err_WriteAudit Dim ctlC As Control Dim strSQL As String Dim bOK As Boolean bOK = False DoCmd.SetWarnings False ' For each control. For Each ctlC In frm.Controls If TypeOf ctlC Is TextBox Or TypeOf ctlC Is ComboBox Then If ctlC.Value <> ctlC.OldValue Or IsNull(ctlC.OldValue) Then If Not IsNull(ctlC.Value) Then strSQL = "INSERT INTO tblAudit ( ID, FieldChanged, FieldChangedFrom, FieldChangedTo, User, DateofHit, FrmName , FrmRcrdSrc ) " & _ " SELECT " & lngID & " , " & _ "'" & ctlC.Name & "', " & _ "'" & ctlC.OldValue & "', " & _ "'" & ctlC.Value & "', " & _ "'" & GetUserName_TSB & "', " & _ "'" & Now & "' , " & _ "'" & M & "', " & _ "'" & R & "'" 'Debug.Print strSQL DoCmd.RunSQL strSQL End If End If End If Next ctlC WriteAudit = bOK exit_WriteAudit: DoCmd.SetWarnings True Exit Function err_WriteAudit: MsgBox Err.Description Resume exit_WriteAudit End Function اذا اردت ان تنادى هذا الكود يتم بهذه الطريقة WriteAudit(Form Name, Record ID) مثلا كالتالى فى زر امر : On Error GoTo Err_cmdClose_Click If Not IsNull(Me!ID) Then M = Me.Name ' Debug.Print M R = Me.RecordSource ' Debug.Print R X = WriteAudit(Me, Me!ID) End If DoCmd.Close Exit_cmdClose_Click: Exit Sub Err_cmdClose_Click: MsgBox Err.Description Resume Exit_cmdClose_Click ملاحظة : - يمكن استخدام الكود فى اى نموذج يقوم بتعديل البيانات وسيقوم الكود بتسجيل التعديلات وبياناتها كما اشرت سابقاً. قام استاذنا جعفر @jjafferr بعمل موضوع رائع مشابه فى الفكرة ولكن يقوم بتسجيل التعديلات التى تتم على الجداول عن طريق الماكرو يمكنك مشاهدته من هنا : مرفق مثال به نموذجين وتم استخدام نفس الاكواد فيهما .. دمتم بود Dynamic Audit Trail - Amr Ashraf.accdb
    1 point
  44. السلام عليكم ورحمة الله اخى الكريم اليك ملف الصف الاول و للعلم انا اعمل علية من بعد توقيت الموضوع بفترة وجيزة و لكن العمل على شيت جديد اهون كثيرا من اصلاح او تعديل شيت قديم اما شيت الدور الثانى فارجو امهالى من الوقت ما يكفى الا اذا كنت مستعجل فشيت الصف الثانى اصعب بكثير و الله ولى التوفيق 879671290_-201999.xlsm
    1 point
  45. في الاستعلام ضع المعيار التالي Is Not Null تفضل التعديل asd.accdb
    1 point
  46. السلام عليكم تفضل التعديل حسب فهمي لطلبك so-1.rar
    1 point
  47. السلام عليكم اساتذتي الافاضل ورحمة الله وبركاته طلبي مشروح في الصورة المرفقة مع البرنامج حيث اريد كالاتي : في البرنامج بيانات للموظف خالد هي تاريخ اخر علاوة وتاريخ الاستحقاق مثلا : من 1/1/2000 الى 1/1/2001 هذه سنة كاملة في حقل الدرجة انا ادخل الدرجة والتي هي 10 بينما المرحلة اريدها تلقائيا والتي هي 1 من 1/1/2001 الى 1/1/2002 راح يصبح الدرجة 10 المرحلة راح تتغير الى 2 من 1/1/2002 الى 1/1/2013 الدرجة 10 المرحلة راح تصبح 3 من 1/1/2003 الى 1/1/2004 الدرجة 10 المرحلة 4 ثم ينتقل الى من 1/1/2004 الى 1/1/2005 الدرجة 9 المرحلة 1 من 1/1/2005 الى 1/1/2006 الدرجة 9 المرحلة 2 وهكذا بحيث فقط المرحلة هي التي تتغير حسب بيانات العلاوات مع فائق الشكر والتقدير Prog5000.rar
    1 point
×
×
  • اضف...

Important Information