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

أبو آدم

أوفيسنا
  • Posts

    3,292
  • تاريخ الانضمام

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

  • Days Won

    29

كل منشورات العضو أبو آدم

  1. حال إستكمال الفحص وعدم وجود جداول مكسور إرتباطها Brocken Back End تظهر لك الصفحة الرئيسية للأداة ( نموذج ) ، وأفضل عند التطبيق أن يتم إستبدالها بالصفحة الرئيسية للتطبيق ( من خلال الماكرو ). النموذج الحالي ، تتم فيه عمليات الربط و إلغاء الربط وإختيار ربط BE جديد للربط : يتم إستدعاء مربع الحوار / إختيار ملف من خلال الضغط على زر أمر Browser - استعراض ، حين يتم إختيار الملف الهدف BE ، يتم لصق المسار في مربع النص ، ثم يتم الضغط على زر أمر Link لتتم عملية الربط . ولغايات الربط مع BE أخرى يتم تكرار الخطوات السابقة.
  2. في بداية التطبيق ، يتم تشغيل ماكرو AutoExec لتدرج إجراءات الفحص للجداول المرتبطة في أوله نموذج ترحيب وعرض لعدد السجلات المرتبطة التي تم العثور عليها ضمن قاعدة البيانات وذلك باستدعاء الوحدة النمطية ModCountLinks
  3. إخوتي الفضلاء أرفق لكم طياً نسخة عن الأداة ( لإدارة الجداول المرتبطة ) ولنعتبرها الإصدار الأول وسادرج تباعاً مشاركات وملاحظات وصور لتوضيح تصوراتي للاستخدام ... بعد تجربة أربعة أيام ورحم الله من أهدى إلي عيوبي والله من وراء القصد وهو حسبي NA_AccessRelink.rar
  4. الأخ محمد ايمن أثار مسألة الجداول المرتبطة والتنبيه بان الجداول مرتبطة عند تنفيذ الربط بنفس القاعدة مرة أخرى ، وهذا يستلزم التأكد من الربط لكل ملف قبل تنفيذ أمر الربط مرة أخرى ، و أمور أخرى تكاثرت عند التطبيق ... الأخ الفاضل SSM أثار مسألة اختيار نسخة احتياطية معينة باعتبارها BE ، وهذا استلزم معي عمليات الغاء الربط والبدء بإرتباط جديد ، و أمور أخرى تكاثر عند التطبيق ... والأخ راعي الغنم أثار مسألة إعادة الربط بين FE و أكثر من BE ، وهذه فيها الكثير الكثير فحدث ولا حرج ... ولكن كما هو الأمر دوماً وبفضل من الله ، فكل شيئ متاح ، ما دمت خلفه ساعياً وله طالباً ، ولله الأمر من قبل ومن بعد ، فتحاً و تيسيراً و تفهيماً. توقفت عن الشرح و الإسهاب به بعد هذه المسائل الثلاثة ، فكل منها في مسار فوددت أن أجمعها في جهد واحد ( حسب تصوري ، وقدرتي ، وفهمي ) و الأفهام كثيرة لا يضير بعضها إختلافها عن البعض الآخر ، والتصورات لا تنتهي فعددها بعد الخلق و البشر ، ولا يعيب أحدها إختلافه عن الآخر ، فهذا علم لا مطلق فيه ولا حدود إلا بأمر الله. أعمل حالياً ، وأظنني انتهيت ، و أحتاج بعض التطبيق و التجربة حتى لا تكثر الثغرات من أخطائي ويصعب عليكم التعديل ، فإصبروا معي جزاكم الله خيراً ، فالمسعى مستمر إن قدر الله لنا وكان في العمر بقية . و للحديث بقية .... ........
  5. أعذرني أخي الطيب انا اتابع موضوعك ، ولن أنساه باذن الله ولكنني منشغل بموضوع متشعب قليلاً ، التزمت بحله باذن الله ... فإصبر معي قليلاً ، جزيت خيراً ، وإن سبقني أحد الاخوة ففضل من الله وللحديث بقية .... .......
  6. بالنتيجة ، وبتوفيق من الله ، فقد توصلت لحل مسائل الاخوة المطروحة جميعها ربط جميع الجدول مع BE واحد ربط جميع الجدول مع أكثر من BE ربط جداول مختارة من BE ربط جداول مختارة من أكثر من BE إلغاء الربط نهائياً وهناك نتجاوز مسألة الربط بين جزئي القاعدة أو أجزائها إلى تعقيدات إختلال الارتباط ومسألة Broken Back End ، حيث تختل أجزاء القاعدة وتتوقف عن العمل ويبدأ المستخدم بالتخبط نتيجة توقف قاعدة البيانات . جربت خلال اليومين المنصرمين مجموعة من السيناريوهات على موضفي الشركة لدي ، وكسرت الربط عن قاعدة البيانات ، سواء بتغيير إسم ملف أو مجلد ضمن المسار على الخادم / السيرفر ، واستجبت لنداءات الموظفين وحاولت ( كمسخدم ) إعادة ربط الجداول ، فكانت مهمة شاقة لأي مستخدم - مالم يكن جيد الإلمام بالبرمجة. ثم أعدت الأمور لنصابها ، وبدأت بمحاولة لحصر التصورات و الافكار و الاحتمالات ، فوجدتها كثيرة جداً ، وتحتاج لتركيز وبعض الحصر بأطرعامة ، لا بد أن يأخذها المبرمج بعين الإعتبار. ربما أكثرت من التنظير ، ولكن ما سردت واقع وليس محض تنظير .... وللحديث بقية ..... .............
  7. إخوتي الأعزاء حين تتشعب الامور تزداد الحاجات و تتراكم ، ولا بد من التعامل بهدوء وروية مع ما يلزم بتصميم وتصور لسدّ الثغرات حتى نصل لنتائج طيبة كنت فيما سبق أشرت الى كودات لربط كافة الجداول في BE ، حيث تم تضمين المسار ضمن الكود ، وبالتجربة والتطبيق وجدت أنه من الأصح و الاكثر منطقية و احترافاً ، ولكي يكون الامر أكثر مرونة عند التطبيق ، مع أهمية عدم العودة للكود عند الحاجة للربط لمسار جديد ، أن يتم الاستعانة بمربع حوار اختيار الملف ، وكان الامر بحاجة لبعض البحث و التروي ، حيث وجدتني اتعامل مع إصدارين من الأكسيس 2003 و 2007 ، و أضع هنا ما يلزم ويعمل مع الاصدارين ، حيث نقوم بإنشاء وحدة نمطية جديدة نسميها ModOpenfilename ونكتب خلفها : Option Compare Database Private Declare Function GetOpenFileName Lib "comdlg32.dll" Alias _ "GetOpenFileNameA" (pOpenfilename As OPENFILENAME) As Long Private Type OPENFILENAME lStructSize As Long hwndOwner As Long hInstance As Long lpstrFilter As String lpstrCustomFilter As String nMaxCustFilter As Long nFilterIndex As Long lpstrFile As String nMaxFile As Long lpstrFileTitle As String nMaxFileTitle As Long lpstrInitialDir As String lpstrTitle As String flags As Long nFileOffset As Integer nFileExtension As Integer lpstrDefExt As String lCustData As Long lpfnHook As Long lpTemplateName As String End Type Function LaunchCD(strform As Form) As String Dim OpenFile As OPENFILENAME Dim lReturn As Long Dim sFilter As String OpenFile.lStructSize = Len(OpenFile) OpenFile.hwndOwner = strform.Hwnd sFilter = "Access Databases (*.mdb;*.accdb)" & Chr(0) & "*.mdb;*.accdb" & Chr(0) & _ "All Files (*.*)" & Chr(0) & "*.*" & Chr(0) OpenFile.lpstrFilter = sFilter OpenFile.nFilterIndex = 1 OpenFile.lpstrFile = String(257, 0) OpenFile.nMaxFile = Len(OpenFile.lpstrFile) - 1 OpenFile.lpstrFileTitle = OpenFile.lpstrFile OpenFile.nMaxFileTitle = OpenFile.nMaxFile OpenFile.lpstrInitialDir = "C:\" OpenFile.lpstrTitle = "Officena.net ... Find The location of Back End File" OpenFile.flags = 0 lReturn = GetOpenFileName(OpenFile) If lReturn = 0 Then MsgBox "A file was not selected!", vbInformation, _ "Select a file using the Common Dialog " Else LaunchCD = Trim(Left(OpenFile.lpstrFile, InStr(1, OpenFile.lpstrFile, vbNullChar) - 1)) End If End Function ونستحدث في النموذج مربع نص لتلقي الملف الذي سيتم إختياره كمصدر BE للربط ونسميه Text1 أو أي اسم مناسب لنموذجنا ، ثم ننشيئ زر أمر لتشغيل مربع الحوار / فتح ملف ، ونضع خلفه الكود التالي : Me!Text1 = LaunchCD(Me) وبعد ظهور مربع الحوار / اختيار ملف ، وقيامنا باختيار الملف الهدف ، يحمل مربع النص مسار الملف .
  8. شكرا لإطلالتك الطيبة أخي العزيز ، الامر على الجدول وقريبا ما جعلني اتمهل بالاستمرار كثرة الحالات ومحاولة لوضع الامور بقوالب عامة حتى لا ندخل في متاهات والله من وراء القصد وهو حسبي
  9. بالتصور و التطبيق برزت لنا حاجة بضرورة وجود وحدة نمطية لفحص الجداول المرتبطة ومعرفة عددها فكان لنا حاجة بهذه الوحدة الجديدة صممتها وسميتها ModCountLinks وخلفها نكتب : 'By Nart Lebzo for Officena.net Public Function CountLinks() Dim TblCount As Integer TblCount = 0 For Each tdf In CurrentDb.TableDefs ' If the table has a connect string, it's a linked table. If Len(tdf.Connect) > 0 Then TblCount = TblCount + 1 End If Next tdf CountLinks = TblCount 'MsgBox " عدد الجداول المرتبطة بقاعدة البيانات " & vbCrLf & CountLinks, vbExclamation, "Linked with Back End" End Function وهذه تقوم بالتعرف على الجداول المرتبطة و تمر عليها وتعدها كي نتمكن من التعرف على العدد و استخدامه لاحقاً وطبعاً يظهر لكم أنني عطلت ظهور الرسالة لبيان الخيار فقد تحتاج ظهور رسالة و قد لاتحتاجه ضمن الوحدة ، وقد تضمنه لأي كود ضمن النموذج مثلاً. و للحديث بقية ...... .............
  10. أعتذر منك ، ولكنني لم أستوعب ما تريد هل يمكننا الحصول على قاعدة بسيطة لفهم مرادك ......
  11. وصلت أخي العزيز وأنا أنظر فيها لكنني لم اتمكن من فهم بنية الجدول ليس هناك تاريخ الاستلام للوثيقة الذي أظنه يمثل حجر الزاوية في تنقل الوثائق بين الغرف ثم شؤال هل هناك غرف فعلية ينقل لها فعلا وتحتاج ما يذكرك بالنقل الفعلي ، أم غرف افتراضية وانقضاء فترات قانونية فقط ؟! .......
  12. أخي SSM سجلنا هنا ملاحظة بتفصيل مسألة النسخ الاحتياطي للجداول المحلية و المرتبطة اختيار النسخة التي يود العمل عليها من النسخ الاحتياطية أرجو تذكيري حين نصل لمسألة النسخ الاحتياطي وشكرا لتواصلك الطيب آملا منك التفضل علينا وتعديل اسم الظهور باسمكم الطيب حتى نحسن ندائنا لكم باحب الاسماء اليكم ....
  13. أخي محمد ايمن الربط وانهاء الربط مسألة تخضع كما أسلفنا للتحليل و روتينات العمل ، ونسق حركة الأداء سيأتى معنا لاحقا - قيد العمل - كيفية التأكد من الربط وسأجيبك عنه في حينه واعذرني لان جهازي هذا هو جهازي العزيز 2003 ويحمل معظم اعمالي القديمة ولا يحمل 2007 ساطلع على مرفقكم غدا صباحا بإذن الله .........
  14. شاكرين ومقدرين مشاركة الأخ محمد ايمن لنا بوحدة نمطية لأخينا BlueMind لتسريع الاتصال بقاعدة البيانات ، نتابع تقدمنا بدراسة تصورات الحاجات التي تتصل بموضوعنا ، وقد نعود لأي نقطة نحتاج للعودة اليها، وأنتقل لتفعيل تصور تغيير مسار جزء BE ، حيث ينقطع الاتصال بين الجزئين FE و BE . وبذلك تنعدم الفائدة والفاعلية لقاعدة البيانات بجزئيها ، ونبدأ توضيح التصورات وبناء سيناريوهاتها والحلول المقترحة . و للحديث بقية .... .............
  15. و نعود قليلاً لربط كافة الجداول في BE مرة واحدة ، ونطرح أمامكم وحدة نمطية أخرى بمنهج مختلف تؤدي نفس الغرض ، ونسميها ModLinkAll_1 Function LinkTables(DbPath As String) As Boolean Dim rs As Recordset On Error Resume Next 'get tables in back end database Set rs = CurrentDb.OpenRecordset("SELECT Name " & _ "FROM MSysObjects IN '" & DbPath & "' " & _ "WHERE Type=1 AND Flags=0") If Err <> 0 Then Exit Function 'link the tables While Not rs.EOF If DbPath <> Nz(DLookup("Database", "MSysObjects", "Name='" & rs!Name & "' And Type=6")) Then 'delete old link, assuming front and back end table have the same name DoCmd.DeleteObject acTable, rs!Name 'make new link DoCmd.TransferDatabase acLink, "Microsoft Access", DbPath, acTable, rs!Name, rs!Name End If rs.MoveNext Wend rs.Close LinkTables = True End Function ونستدعيها بنفس المنهج خلف زر أمر Private Sub cmdLink1_Click() Call LinkTables("H:\Manager\Operations09\Data09.mdb") End Sub ولكم حرية الخيار في التطبيق .... وللحديث بقية .....
  16. حياك الله أبا عمر ولك مثله وزيادة من الله لمن تحب وترضى عليه وتتصدق عليه بالدعاء
  17. وكما يمكننا التعامل مع الوحدة النمطية ModTableLink باستدعائها كما نشاء لربط وجلب أي جدول من أي BE نشاء ، ولطرح المثال و التوضيح ، يمكننا : Call CreateTableLink("H:\Manager\Operations09\Data09.mdb", "co", "") Call CreateTableLink("H:\Manager\Operations09\Data09.mdb", "Emp", "1256") Call CreateTableLink("\\Server\Manager\Operations2014\Data14.accdb ", " tblSeaLine ", "") من أي مسار و أي إمتداد ، ووفق المتغيرات المحددة ، فكل ما ضمن العلم متاح ... وللحديث بقية ...
  18. ربط FE مع جدول أو جداول مختارة مسألة أتصورها في بعض الأحيان ، ولحاجات محددة ، فإفترضت تصوراً معيناً بأنني بحاجة لإجراء ارتباط مع BE بجدول محدد ، لاجراء تعديل أو تنفيذ استعلام أو تقرير ما ، فقمت بتحليل الامر وتثبيت المتغيرات وخرجت بوحدة نمطية دعونا نسميها ModTableLink ، نقوم من خلالها باجراء عملية ربط مع BE معينة و مع جدول معين محدد Co ، كما احتسبت بالبال مسألة كلمة السر للجدول ، و حاجتي لتغيير اسم الجدول لأنني أتعامل مع وضع استثنائي افترض به انني أنبه نفسي و أذكرها بانني أتعامل مع جدول مرتبط فاضفت لاسم الجدول المرتبط في FE عبارة link_to . وللتنفيذ ننشيئ الوحدة النمطية الجديدة ونسخ البها : Public Function CreateTableLink(strBEPath, strSourceTableName, strPassword) As Boolean Dim db As DAO.Database Dim tdf As DAO.TableDef Dim strConnect As String Dim strLinkName As String strLinkName = "link_to_" & strSourceTableName strConnect = "MS Access;PWD=" & strPassword & _ ";DATABASE=" & strBEPath Debug.Print strConnect Set db = CurrentDb Set tdf = db.CreateTableDef tdf.Connect = strConnect tdf.SourceTableName = strSourceTableName tdf.Name = strLinkName db.TableDefs.Append tdf Set tdf = Nothing Set db = Nothing End Function حيث نتعامل عند الاستدعاء مع المتغيرات الثلاثة الرئيسية : مسار القاعدة كاملاً ، واسم الجدول ، وكلمة السر حال وجودها ، واذا لم تكن موجودة نترك فراغاً بين حاصرتين "" . ونتعرف على الجزء BE واسم الجدول وكلمة السر ونقوم بإجراء الربط . أما الاستدعاء فيتم كمقترح ، خلف زر أمر إسمه cmdTableLink ، وبعنوان Table Link ونضع خلفه الكود التالي : Call CreateTableLink("H:\Manager\Operations09\Data09.mdb", "co", "") حيث يتم التعامل مع مسار قاعدة البيانات Data09 ثم الجدول Co وبدون كلمة سر ، ويتم الربط حسب هذه الضوابط و المتغيرات . وللحديث بقية .....
  19. أتمنى على الإخوة الفضلاء التطبيق وموافاتي بأي إشكالات تعترضكم ورحم الله من أهدي الي عيوبي .... ..........
  20. حياكم الله أخي محمد ايمن و أخي راعي الغنم شرفتمونا بمروركم الطيب ، ومتابعتكم لجهدنا المتواضع .......
  21. وقبل أن نزيد من تعقيد الأمور و التصورات و التطبيقات نود أن نطرح بعض الامور التي قد تلزمنا ضمن محاور سابقة من التحليل ، ومنها مثلاً ، ما قد يقال : أريد أن أجري إرتباطاً مع جدول معين أو جدولين من BE محدد ، وليس لجميع الجداول ؟ وهذا متصور وله أحوله ، وله ما يلزم وهو متصور ، فدعونا نعود اليه .... وللحديث بقية .... ......
  22. وللتصور و التطبيق نقول : يمكننا أن نقوم بربط جزء FE بأكثر من جزء BE ، حيث نقوم باستدعاء الوحدة النمطية ModLinkAll كما نشاء و لاكثر من BE Call CreateLinks("C:\Users\user\Desktop\My Library\LinkedTableDemo\Officena Link Project\be.accdb") Call CreateLinks("H:\Manager\Operations09\Data09.mdb") وبالتالي يصبح لديك جداول مرتبطة من أكثر من Backend Table ، أي أكثر من جزء. واذا كنت مستخدما للاصدار 2007 مثلاً يمكنك الربط مع جداولك ضمن ملفات accdb الخاصة به ، و ملفات mdb الخاصة بالاصدار 2003 ، والعكس طبعاً غير متاح فالاصدار الجديد يستوعب و يتعامل مع ملفات الاصدار السابق ، أما لاصدار السابق فلا يتعرف طبعاً على ملفات الاصدار اللاحق. وللحديث بقية .....
  23. ويلزمنا وفق روتينات العمل و تصورنا لبعض الحالات ان نقوم بإلغاء الربط للجداول ، ولتحقيق ذلك ، نستخدم الوحدة النمطية ModDeleteLinks التالية : Public Function DeleteLinks() As Boolean On Error GoTo Err_Handler Dim dbs As DAO.Database Dim lng As Long Set dbs = CurrentDb With dbs.TableDefs For lng = .Count - 1 To 0 Step -1 If (.Item(lng).Attributes And dbAttachedTable) <> 0 Then .Delete .Item(lng).Name End If Next lng End With DeleteLinks = True Exit_Handler: On Error Resume Next Set dbs = Nothing Exit Function Err_Handler: MsgBox Err.Description, vbExclamation, "Error No: " & Err.Number Resume Exit_Handler End Function حيث يقوم بتفقد الجداول وتحديد الجداول المرتبطة ويلغيها تاركاً الجداول المحلية ويمكننا طبعاً إستدعاؤها بالتوقيت و الحدث او الروتين الذي نراه مناسباً ، ونقترح زر الأمربإسم cmdDeleteLink وعنوانه Delet Link ، وخلفه الكود التالي : Private Sub cmdDeleteLink_Click() Call DeleteLinks End Sub وننوه هنا لوجود نص وحدة نمطية أخرى تفي بالغرض في كشكول VBA وعلى الرابط ..... http://www.officena.net/ib/index.php?showtopic=38385&p=233619 وهنا نصل لنتيجة جيدة ، فيمكننا ومن خلال استدعاء هاتين الوحدتين إجراء الربط و إنهاؤه متى نشاء ، وللجميع أن يتخيل و يطبق وفق ما لديه ، من تحليل وتطبيق. وللحديث بقية ....
  24. فاتني هنا ان أنوه بان استدعاء هذه الوظيفة يحقق الغاية سواء كان جزء القاعدة BE في نفس المجلد و على نفس الجهاز ، أو كان بمجلد مستقل أوعلى جهاز آخر أو على الخادم ، المهم أن يتم تزويد كود استدعاء الوحدة النمطية بالمسار الكامل للملف
  25. ونبحث الآن في ما يلزم لربط جزء قاعدة البيانات FE مع جزء BE ، بحيث يتم ربط جزء الجداول مع جزء النماذج وبقية الكائنات . وهنا نطبق مسألة ربط كافة الجداول مرة واحدة ، وهذا يلزم ببداية التنفيذ ، وقد يلزم عند تعديل بنية جدول معين أو عدة جداول ، أو عند إضافة جداول جديدة ، أو عند أي حال يستلزم ربط جميع الجداول . يلزم أولاً إنشاء وحدة نمطية جديدة ضمن FE وينسخ اليها الكود التالي : Public Function CreateLinks(strBEPath) As Boolean On Error GoTo Err_Handler Dim dbsFE As DAO.Database Dim dbsBE As DAO.Database Dim wksJET As DAO.Workspace Dim strTableName As String Dim strConnect As String Dim tdfBE As DAO.TableDef Dim tdfFE As DAO.TableDef Set wksJET = DBEngine.Workspaces(0) Set dbsBE = wksJET.OpenDatabase(strBEPath) Set dbsFE = CurrentDb For Each tdfBE In dbsBE.TableDefs If Left$(tdfBE.Name, 4) <> "MSys" And _ Len(tdfBE.Connect) = 0 Then strTableName = tdfBE.Name strConnect = ";DATABASE=" & strBEPath Set tdfFE = dbsFE.CreateTableDef(strTableName) tdfFE.Connect = strConnect tdfFE.SourceTableName = strTableName dbsFE.TableDefs.Append tdfFE Set tdfFE = Nothing End If Next tdfBE CreateLinks = True Exit_Handler: On Error Resume Next Set tdfFE = Nothing Set tdfBE = Nothing Set dbsFE = Nothing dbsBE.Close Set dbsBE = Nothing Set wksJET = Nothing Exit Function Err_Handler: MsgBox Err.Description, vbExclamation, "Error No: " & Err.Number Resume Exit_Handler End Function ونقوم بحفظها بإسم ModLinkAll حيث يقوم الكود بالتوجه لجزء القاعدة BE و يقوم بفحص الكائنات من نوع الجدول ويستثني منها جداول النظام MSys ثم يقوم بربط كل الجداول واحداً تلو الآخر بجزء FE ، كإرتباط وليس كجدول فعلي مستورد ، وبنفس الإسم. ولتنفيذ هذا الربط يمكننا نثلاً أن نقوم بإنشاء نموذج جديد وننشيئ به زر أمر بإسم cmdLinkAll وعنوانه Link وخلف هذا الزر نضع الكود التالي : Private Sub cmdLinkAll_Click() Call CreateLinks("C:\Users\user\Desktop\My Library\LinkedTableDemo\Officena Link Project\be.accdb") End Sub هذا الكود يستدعي الوحدة النمطية لتعمل على إجراء الربط بين جداول جزء القاعدة BE المحدد مسارها ضمن الكود ، وبين جزء القاعدة FE التي تحوي النموذج و الوحدة النمطية. وبهذا تكون جميع الجداول جاهزة لاستخدامها و التعامل معها من قبل المستخدم أو مجموعة المستخدمين في آن واحد . وللحديث بقية ...
×
×
  • اضف...

Important Information