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

Foksh

الخبراء
  • Posts

    2,358
  • تاريخ الانضمام

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

  • Days Won

    85

كل منشورات العضو Foksh

  1. مداخلة ، وقد سبقني اليها معلمنا @ابوخليل ، كنت اعمل على فكرة تقوم بتشفير جميع سجلات الجداول مرة واحدة بشكل مختلف قليلاً ويتيح للمستخدم تغيير مفتاح التشفير مع الإحاطة بأكثر من أمر أثناء عملية التشفير . واعتقد أنني سأقوم بفتح موضوع مستقل لهذه الأداة . والسبب هو شعوري بأننا خرجنا عن فكرة صاحب الموضوع في موضوعه . وأرجو من صديقنا @الحلبي / نقل الحوار لموضوع جديد . والموضوع الآخر هو أن الملف المرفق في مشاركة معلمي ومشاركتك أخي @الحلبي يعملان بشكل طبيعي عندي . وعليكم السلام ورحمة الله وبركاته أخونا @محمود حموده .
  2. العفو أخي الكريم ، الهدف من جملة السجل الجديد هو فقط عند الإضافة ، وتحصيل حاصل أنت عند تعبئة الحقول كسجل جديد وقمت مثلاً بالنقر على زر التالي او السابق على سبيل المثال فسيتم الحفظ التلقائي كما أشار معلمي @ابوخليل . لذا فباعتقادي لست بحاجة لتكرار استعلام التحديث او الإضافة ( لتقليل التكرار ) . هذه كانت وجهة نظري . أما فيما يتعلق في مشكلة الرسالة التي تظهر عند تحديث السجل ، ففي الكود يقوم آكسيس بإضافة سجل وتحديث سجل موجود وهنا كان التعارض وسبب الرسالة بالحفظ للسجل أو الغاء الحفظ ... إلخ وهذه كله وجهة نظر ليس إلا 🤗
  3. وعليكم السلام ورحمة الله وبركاته ،، اخي @عذاب الزمان تحقيق الهدف ليس صعباً ، ولكن !! ماذا لو كان الرقم التسلسلي الذي تريد اعادة ترتيبه حقلاً فريداً ومرتبط بعلاقة مع حقل في جدول آخر ❗ هذه من جهة ، ومن جهة أخرى ماذا لو كان هذا الحقل من نوع ترقيم تلقائي ❗❗
  4. شهادة أعتز بها معلمي الفاضل أشكرك على كلماتك ولكن صدقني بعض ما عندكم وبارك الله فيك وزادك من علمه وفضله وكرمه ولطفه وعفوه
  5. الآن تجري مباراة كرة قدم بين فريق المنتخب الأردني والمنتخب العراقي ، وأنا لست من متابعي كرة القدم ، ومتفرغ بانتظار انتهاء وقت العمل هل هذه النتيجة المرجوة والمطلوبة ؟ في الإستعلام Query2 فكرة بسيطة باستخدام IIF ، وهذا ما لا تريده . لكن في الاستعلام Query3 فكرة مختلفة باستخدام NZ كما يلي :- SELECT Table1.text1, Nz(Table2.text2,Table1.text2) AS text2 FROM Table1 LEFT JOIN Table2 ON Table1.txt_id = Table2.txt_id2 WHERE (((Table2.id)=(SELECT MAX(T2.id) FROM Table2 AS T2 WHERE T2.txt_id2 = Table1.txt_id) Or (Table2.id) Is Null)); Database2.accdb
  6. لا تعلو العين على الحاجب ,, انت معلمنا الأساس ومنكم نستفيد ونتعلم
  7. والله أنا خفت أكمل وأرد بعد آخر رد لي من إني أحبطك أو تحس أني قفلتها بإني أرد عليك أنه ممكن يكون في طريقة للإستيراد حتى لو الجداول غير ظاهرة بس الحمد لله ماجتش مني
  8. أهلاً بك أخي @Hema24 ، لتحقق الوصول الى طلبك ، نرجو منك الإلتزام بقواعد المنتدى ؛ وذلك بإرفاق ملف يعبر عن معطيات الطلب .
  9. قمت بإضافة الحقل id من الجدول Table2 في الاستعلام ، و استخدمت المعيار التالي (SELECT MAX(T2.id) FROM Table2 AS T2 WHERE T2.txt_id2 = Table1.txt_id) وقد استخدمت دالة من دوال التجميع المرفق مع الاستعلام الجديد "Query2" للوضوح فقط Database1.accdb
  10. وعليكم السلام ورحمة الله وبركاته ،، أهلاً بمعلمنا الحبيب @ابوخليل ، من باب التأكد ؛ هل هذه النتيجة المطلوبة
  11. ومشاركة لما أشار إليه والدنا الحبيب ومعلمنا الفاضل @ابوخليل ، تفضل أخي @yazan_2 ، هذا التعديل البسيط تفقد النموذج Main Test_Copy.accdb
  12. ومشاركة مع الأساتذة ، الخبر سليم وأيضاً آكسيس من ضمن التطبيقات التي سيتم ايقاف الـ ActiveX لبعض الوظائف منها :- Microsoft Web Browser Control Microsoft Windows Media Player Control Date and Time Picker Control Microsoft TreeView Control Microsoft ListView Control حيث سيتم تعطيل إعدادات ActiveX في مركز الثقة لجميع البرامج التي شملها الحظر ، بما في ذلك أكسس . وهذه مصادر خارجية :- الموقع الأول الموقع الثاني الموقع الثالث
  13. حلوة وقوية الحركة دي مهندسنا الغالي ,, اعتقد أن جملة : Exit Sub جعلت من هذا الجزء ErrorHandler: If Err.Number <> 0 Then MsgBox "حدث خطأ أثناء الحفظ: " & Err.Number & " - " & Err.Description, vbCritical Resume Next End If وكأنه غير موجود حتى لو ظهر خطأ ، فسيتم الخروج من الـ Sub قبل الوصوا الى ErrorHandler ، وعليه فإنه في الملف الأصلي لأخونا @yazan_2 لو استخدم Exit Sub قبل جملة ErrorHandler ، فأعتقد أنه لن تظهر عنده رسائل الخطأ بعد الحفظ أو التعديل . هذا من ناحية المشكلة التي تظهر بعد حفظ السجل أو تحديثه . من ناحية أخرى ، ارتأيت هذا التعديل على الكود لإتمام عملية الحفظ كسجل جديد أو تحديث السجل الحالي من خلال :- Private Sub BtnSave_Click() On Error GoTo ErrorHandler If IsNull(Me.NatiID) Or Trim(Me.NatiID) = "" Then MsgBox "يرجى إدخال قيمة في حقل رقم الهوية.", vbExclamation Exit Sub End If Set db = CurrentDb() strSQL = "SELECT * FROM Employees WHERE NatiID = '" & Me.NatiID & "'" Set rs = db.OpenRecordset(strSQL, dbOpenDynaset) If rs.EOF Then rs.AddNew MsgBox "تم إضافة موظف جديد." Else rs.Edit MsgBox "تم تحديث بيانات الموظف." End If rs!NatiID = Me.NatiID rs!FName = Me.FName rs!LName = Me.LName rs!GName = Me.GName rs!FamName = Me.FamName rs!Rank = Me.Rank rs!BirthDate = Me.BirthDate rs!Age = Me.Age rs!BirthPlace = Me.BirthPlace rs.Update rs.Close Set rs = Nothing Set db = Nothing Exit Sub ErrorHandler: MsgBox "حدث خطأ أثناء الحفظ: " & Err.Description, vbCritical Resume Next End Sub طبعاً فيما يخص المتغيرات فلم أعدل عليها شيء وتركتها كما هي في مكان حجزها أول الأكواد Option Compare Database Dim db As DAO.Database Dim rs As DAO.Recordset Dim strSQL As String هذا كله رأيي الشخصي وليس فرضاً
  14. دعماً لما أشار إليه الأستاذ @kanory ، راجع هذا الموضوع هنا .
  15. بالنسبة لي ، توجهي نحو رمز الاستجابة السريعة الـ QR لقي اهتمامي وحل لمشاكلي جميعها وبشكل مجاني دون الحاجة للخطوطومشاكلها ، مع الدعم للنصوص العربية وبالشكل الذي اريده كمحتوى للـ QR .
  16. اهلا وسهلا بك مرة اخرى وشكراً على مشاركتك لنا افكارك
  17. يسعدني مرورك العطر .. ونرجو افادتنا بالتجربة ونتيجتها لغايات التطوير وتحسين الأداء وتلافي الأخطاء وإصلاحها
  18. أهلا مهندسنا الغالي .. جزاك الله خيراً على ما أسلفت ، هل الصورة أدناه تكفي !!! أخي جو أسعد الله مسائك ، هل قمت بتوفير المطلوب بشكل عام ، وهو :- وجود جدولين بينهم حقول متشابهة ، فمثلاً اذا اخترت جدول المستخدمين وجدول الطلاب ( فهل بينهم حقول متشابهة ؟؟؟ ) أكيد لا فكيف سيكون هناك مقارنة بين جدولين للإيجاد الفرق . في الصورة السابقة تطبيق على قاعدة بيانات عادية فيها جدولين ولكن جعلنا بينهم اختلاف في البيانات والسجلات وتم تنفيذ المطلوب بشكل كامل كما رأيت . فلا اعلم ما الجداول التي اخترتها ، ولا طبيعة وبنية الجداول والحقول فيهما .
  19. بارك الله فيك .. وأرجو أن تقبل مني النصيحة كأخ لي .. لا تعتمد على الذكاء الإصطناعي بشكل كبير حتى في الردود والإجابات . أضراره أكبر من منافعه التي قد تكون لك كبيرة ورائعة وتجعلك تشعر بالرضا عما تقوم بتقديمه .. إلا أنه في نهاية المطاف سيجعل لأفكارك وقدراتك حدود ضيقة تجعلك لا تستغني عنه حتى في أصغر التفاصيل . ونصيحتي ليست لك كشخص صدقني ، وإنما بشكل عام .
  20. من أسباب عدم نجاح العلاقة بين الجدولين في الصورة .. وجود تكرار في البيانات في الجدول الذي ترغب بجعله مفتاحًا أساسيًا (Primary Key) عند الربط بين جدولين ، يجب أن تكون البيانات في الحقل المرتبط فريدة ( بدون تكرار ) إذا كنت تريد إنشاء علاقة من نوع ( One-to-Many ) . إذا كان هناك تكرار في هذا الحقل ، ستظهر رسالة خطأ . وجود سجلات لا تتطابق بين الجدولين إذا كنت تحاول إنشاء علاقة حيث يجب أن تتطابق القيم بين الجدولين ، ستواجه مشكلة إذا كانت هناك سجلات في أحد الجدولين لا يوجد لها سجلات مقابلة في الجدول الآخر . أنواع بيانات غير متطابقة يجب أن يكون نوع البيانات في الحقول المرتبطة متطابقًا ، مثلًا: إذا كان أحد الحقول "رقم" فيجب أن يكون الحقل الآخر "رقم" أيضًا ، وإلا ستظهر رسالة خطأ . وجود بيانات غير صحيحة أو غير صالحة أحيانًا ، تكون البيانات في الحقول مرتبطة بالقيم الافتراضية أو الحقول المحذوفة ، مما يتسبب في مشكلة عند محاولة الربط . هذا بشكل عام قد يكون أحدها أو معظمها سبباً في عدم نجاح العلاقة بين الجدولين . هذا والله أعلم
  21. من نفس المشاركة ، اضغط على النقاط الثلاث اللي في يسار المشاركة ، واختار تعديل لو حبيت تعدل مشاركتك ( طبعاً هذا له وقت محدد لهذه الميزة ) 👍
  22. استأنس بمشاركة معلمنا القدير @ابوخليل من هنا 👍 . ومن هنا مشاركة المهندس @ابو جودي 💡 .
  23. السلام عليكم ورحمة الله وبركاته ، أخواني وأساتذتي ومعلمينا ( دون استثناء ) قمت بتنفيذ فكرة تعقب التغييرات بين الجداول والمبنية على فكرة الأستاذ @ابو البشر ( مشكوراً ) مع إجراء بعض التعديلات ، بحيث تم منح المستخدم الحرية في اختيار جدولين ومفتاح ربط أساسي و مشترك فيما بينهم بشكل بسيط وسهل ، ولا يحتاج الأمر لأي مكتبات أو دعم خارجي . ⭐ ما احتجنا له هو كومبوبوكس عدد 3 ، وزر واحد فقط وظائفهم كالآتي :- cmbTable1 : التعرف على أسماء الجداول في قاعدة البيانات ، وهنا سيكون الجدول الأول . cmbTable2 : التعرف على أسماء الجداول في قاعدة البيانات باستثناء الجدول الذي تم اختياره في cmbTable1 ؛ والهدف هو عمل مقارنة بين جدولين وليس نفس الجدول . cmbPrimaryField : التعرف على أسماء الحقول في الجدول الأول ، ثم يتم اختيار الحقل المشترك أو المفتاح الأساسي من طرف المستخدم . btnExecute : منفّـذ العملية . ⭐ الأحداث والأكواد لكل جزء و عنصر في البرنامج :- في حدث عند التحميل للنموذج ، تم وضع الكود التالي لجلب أسماء الجداول إلى الكومبوبوكس ( cmbTable1 و cmbTable2 ) ، وطبعاً سيتم استثناء جداول النظام والجدول DifferencesTable الذي سيتم إدراج التغييرات فيه ( والذي سيتم انشائه بشكل ديناميكي في قاعدة البيانات عند المستخدم عند عدم وجوده ) . أي أنه وللإستفادة من البرنامج ما عليك إلا نسخ النموذج فقط الى مشروعك . Private Sub Form_Load() Me.cmbTable2.Enabled = False Me.cmbPrimaryField.Enabled = False Dim tdf As DAO.TableDef Me.cmbTable1.RowSource = "" Me.cmbTable2.RowSource = "" For Each tdf In CurrentDb.TableDefs If Left(tdf.Name, 4) <> "MSys" And tdf.Name <> "DifferencesTable" Then Me.cmbTable1.AddItem tdf.Name 'Me.cmbTable2.AddItem tdf.Name End If Next tdf End Sub في حدث بعد التحديث للكومبوبوكس cmbTable1 ، سيتم إدراج أسماء الجداول المتبقية كما ذكرت سابقاً في الكومبوبوكس cmbTable2 باستثناء ما تم اختياره في الجدول cmbTable1 :- Private Sub cmbTable1_AfterUpdate() Dim db As DAO.Database Dim tdf As DAO.TableDef Dim fld As DAO.Field Me.cmbPrimaryField.RowSource = "" Set db = CurrentDb Set tdf = db.TableDefs(Me.cmbTable1.Value) For Each fld In tdf.Fields Me.cmbPrimaryField.AddItem fld.Name Next fld Me.cmbTable2.RowSource = "" For Each tdf In db.TableDefs If Left(tdf.Name, 4) <> "MSys" And tdf.Name <> "DifferencesTable" And tdf.Name <> Me.cmbTable1.Value Then Me.cmbTable2.AddItem tdf.Name End If Next tdf Me.cmbTable2.Enabled = True Set fld = Nothing Set tdf = Nothing Set db = Nothing End Sub في حدث عند النقر على الزر btnExecute ، سيتم تنفيذ الكود التالي :- Private Sub btnExecute_Click() Dim db As DAO.Database Dim rsOld As DAO.Recordset Dim rsNew As DAO.Recordset Dim rsDifferences As DAO.Recordset Dim fld As DAO.Field Dim recordFound As Boolean Dim commonFields As Collection Dim fieldName As Variant Dim primaryField As String Dim table1 As String Dim table2 As String If IsNull(Me.cmbTable1) Then MsgBox "قم باختيار الجدول الأول", vbCritical, "" Me.cmbTable1.SetFocus Exit Sub ElseIf IsNull(Me.cmbTable2) Then MsgBox "قم باختيار الجدول الثاني", vbCritical, "" Me.cmbTable2.SetFocus Exit Sub ElseIf IsNull(Me.cmbPrimaryField) Then MsgBox "قم باختيار الحقل الأساسي", vbCritical, "" Me.cmbPrimaryField.SetFocus Exit Sub Else table1 = Me.cmbTable1.Value table2 = Me.cmbTable2.Value primaryField = Me.cmbPrimaryField.Value If IsNull(table1) Or IsNull(table2) Or IsNull(primaryField) Then MsgBox "Please select both tables and the primary field." Exit Sub End If Set db = CurrentDb If Not TableExists("DifferencesTable") Then CreateDifferencesTable db End If Set rsOld = db.OpenRecordset(table1) Set rsNew = db.OpenRecordset(table2) Set rsDifferences = db.OpenRecordset("DifferencesTable", dbOpenDynaset) DoCmd.SetWarnings False DoCmd.RunSQL "DELETE FROM DifferencesTable;" DoCmd.SetWarnings True Set commonFields = New Collection For Each fld In rsOld.Fields On Error Resume Next If Not IsNull(rsNew.Fields(fld.Name).Name) Then If fld.Name <> primaryField Then commonFields.Add fld.Name, fld.Name End If End If On Error GoTo 0 Next fld Do While Not rsOld.EOF recordFound = False rsNew.MoveFirst Do While Not rsNew.EOF If rsOld(primaryField) = rsNew(primaryField) Then recordFound = True For Each fieldName In commonFields If Nz(rsOld(fieldName), "") <> Nz(rsNew(fieldName), "") Then rsDifferences.AddNew rsDifferences("ID") = rsOld(primaryField) rsDifferences("ChangeType") = "Modification" rsDifferences("FieldName") = fieldName rsDifferences("OldValue") = rsOld(fieldName) rsDifferences("NewValue") = rsNew(fieldName) rsDifferences.Update End If Next fieldName Exit Do End If rsNew.MoveNext Loop If Not recordFound Then rsDifferences.AddNew rsDifferences("ID") = rsOld(primaryField) rsDifferences("ChangeType") = "Deletion" rsDifferences("FieldName") = "عمليات الحذف أو الإضافة" rsDifferences("OldValue") = "عملية حذف" rsDifferences("NewValue") = Null rsDifferences.Update End If rsOld.MoveNext Loop rsNew.MoveFirst Do While Not rsNew.EOF recordFound = False rsOld.MoveFirst Do While Not rsOld.EOF If rsNew(primaryField) = rsOld(primaryField) Then recordFound = True Exit Do End If rsOld.MoveNext Loop If Not recordFound Then rsDifferences.AddNew rsDifferences("ID") = rsNew(primaryField) rsDifferences("ChangeType") = "Addition" rsDifferences("FieldName") = "عمليات الحذف أو الإضافة" rsDifferences("OldValue") = Null rsDifferences("NewValue") = "عملية إضافة" rsDifferences.Update End If rsNew.MoveNext Loop rsOld.Close rsNew.Close rsDifferences.Close Set rsOld = Nothing Set rsNew = Nothing Set rsDifferences = Nothing Set db = Nothing End If CreatePivotQuery table1, table2 MsgBox "تمت عملية المقارنة في الجدولين ، وسيتم فتح الاستعلام بالنتائج", vbInformation, "" DoCmd.OpenQuery "Foksh", acViewNormal End Sub الكود يقوم بتنفيذ عملية مقارنة بين بيانات الجدولين ( من خلال اختيار الجدول الأول والجدول الثاني كما ذكرت سابقاً ) في أي قاعدة بيانات للمستخدم . وفيما يلي شرح مبسط للخطوات الرئيسية التي ينفذها هذا الكود ( للفائدة ):- التحقق من القيم في الكومبوبوكسات الثلاثة يتم التحقق مما إذا كان المستخدم قد اختار الجداول الأساسية ( الجدول الأول و الجدول الثاني ) وحقل المفتاح الأساسي للمقارنة . فإذا كانت أي من هذه المدخلات مفقودة أو لم يتم اختياره ، يعرض الكود رسالة تحذير بوجوب اختيار الجدول أو المفتاح الأساسي وبالتالي يوقف العملية . تحضير البيانات يتم فتح السجلات من الجداول المختارة (الجدول الأول والجدول الثاني) وإنشاء سجل جديد في جدول DifferencesTable لتخزين الفروقات والتغيرات . مقارنة البيانات سيقوم الكود بمقارنة السجلات في الجدولين اللذين تم اختيارهم سابقاً . فإذا كانت السجلات متطابقة في كلا الجدولين ، يتم مقارنة الحقول المشتركة فقط - أي الحقول الموجودة و المتشابهة بالإسم في الجدولين (باستثناء الحقل الأساسي) لتحديد التغييرات . فإذا كانت السجلات مفقودة في أحد الجدولين ( أي تم الحذف أو الإضافة في أي من الجدولين ) ، يتم تحديد نوع التغيير كـ ( عملية حذف ) أو ( عملية إضافة ). إدخال النتائج وإضافتها للجدول DifferencesTable يتم إضافة البيانات الناتجة عن التغييرات ( مثل القيمة القديمة والجديدة ) في جدول DifferencesTable ، مع تسجيل نوع التغيير ( إضافة، حذف، أو تعديل ) . إنشاء استعلام PIVOT أو ما يعرف بالإستعلام Crosstab بعد الانتهاء من المقارنة في الخطوة السابقة ، يتم إنشاء استعلام من نوع Pivot أو Crosstab ( استعلام جدولي كما يسمى في آكسس الواجهة العربية ) ؛ وهو يستخدم لتحويل البيانات من شكل الصفوف إلى شكل الأعمدة ( إن صح التعبير ) ، مما يجعل هذه البيانات أكثر تنظيماً وأسهل في التحليل و القراءةً . والهدف منه هو عرض التغييرات بطريقة منظمة باستخدام الحقول المشتركة بين الجدولين . فتح الاستعلام في نهاية الكود ، يتم فتح الاستعلام الذي يعرض الفروقات والتغيرات بين الجدولين بشكل عادي . ⭐ وظائف أخرى يتم استدعائها لأنشاء الجدول DifferencesTable بعد التأكد من وجوده أو لا . وأخرى لإنشاء الإستعلام الذي يحتوي التغيرات التي تم تعقبها :- وظيفة التأكد من وجود الجدول أو لا :- Function TableExists(tableName As String) As Boolean Dim db As DAO.Database Dim tdf As DAO.TableDef TableExists = False Set db = CurrentDb For Each tdf In db.TableDefs If tdf.Name = tableName Then TableExists = True Exit For End If Next tdf End Function في حال عدم وجود الجدول DifferencesTable ، سيتم استدعاء هذا الـ Sub لإنشائه مع الحقول التي سنحتاجها لعرض البيانات المختلفة في الجدولين :- Sub CreateDifferencesTable(db As DAO.Database) Dim tdf As DAO.TableDef Set tdf = db.CreateTableDef("DifferencesTable") tdf.Fields.Append tdf.CreateField("ID", dbLong) tdf.Fields.Append tdf.CreateField("ChangeType", dbText, 50) tdf.Fields.Append tdf.CreateField("FieldName", dbText, 50) tdf.Fields.Append tdf.CreateField("OldValue", dbMemo) tdf.Fields.Append tdf.CreateField("NewValue", dbMemo) db.TableDefs.Append tdf End Sub بعد تتبع التغيرات والفروقات ، سيتم انشاء استعلام باسم Foksh ، لعرض التغيرات التي تم التعرف عليها :- Sub CreatePivotQuery(table1 As String, table2 As String) Dim queryDef As DAO.queryDef Dim sql As String sql = "TRANSFORM First('" & table1 & " ' & [OldValue] & ' - ' & '" & table2 & " ' & [newvalue]) AS dd " & _ "SELECT DifferencesTable.ID " & _ "FROM DifferencesTable " & _ "GROUP BY DifferencesTable.ID " & _ "PIVOT DifferencesTable.FieldName;" On Error Resume Next CurrentDb.QueryDefs.Delete "Foksh" On Error GoTo 0 Set queryDef = CurrentDb.CreateQueryDef("Foksh", sql) Set queryDef = Nothing End Sub وأخيراً وليس آخراً :- UnMatched.accdb وهذه صورة للبرنامج :-
×
×
  • اضف...

Important Information