jjafferr قام بنشر مارس 1, 2020 قام بنشر مارس 1, 2020 السلام عليكم 🙂 نعمل البرنامج ، ثم نقسمه الى قسمين ، FE الواجهة و BE الجداول ، ولما نعطيه للمستخدم ، نربط الجداول بمسار خاص به ، ويعمل البرنامج. ولما المستخدم يحتاج الى تعديل/اضافات ، ويرسل لنا نسخته بالايميل (انا ممكن اكون مسافر وبعيد عن نسختي) ، فيجب علينا ان نغير مسار الجداول ليتناسب مع مجلدات الكمبيوتر عندنا ، ولما ننتهي من التعديل ، نرسله بالايميل ، وهناك يجب على المستخدم ان يغير المسار الى ذلك الذي به BE الاصل 🙂 المشكلة انه: 1. بعض الاوقات نكون قد وضعنا الـ BE في مكان لا يجب ان يعرفه المستخدم ، فلا نريد تدخل منه لهذا التغيير ، 2. بعض الاوقات المستخدم لا يعرف مكان الـ BE اصلا ، 3. وبعض الاوقات ، المستخدم لا يكون فني ليعرف كيف يختار مكان الـ BE 🙂 صادفتني هذه المشكلة مراراً ، ومرة دفعت الثمن غالي لما ربطوه بالـ BE الغلط ، ربطوه بنسخة الـ Backup بدل عن النسخة الاصل 😁 الى ان اهتديت الى هذه الطريقة 🙂 الفكرة هي عبارة عن اضافة جدول tbl_ReLink_To_Original في الـ FE فيه سجلين ، سجل يحتوي على مسار BE المستخدم ، وسجل يحتوي على مسار BE المبرمج ، وبدل هذا الجدول ، ممكن ان نضع ملف نص txt في مجلد FE ، ونكتب فيهم السجلين ، ثم نقرأهم ، ولكن الجداول في الـ FE تناسبني اكثر ، فإستعملتها 🙂 1. لمعرفة مسار BE المستخدم: . . ثم ننسخه من (1) جدول MSysObjects الى السجل الاول (Seq = 1) في جدولنا (2) tbl_ReLink_To_Original . ثم في السجل الثاني (Seq = 2) ، نكتب مسار الـ BE حسب مجلدات الكمبيوتر عندنا (3) . طريقة العمل: نعمل ماكرو Macro باسم Autoexec ، والذي يقوم الاكسس بفتحه وتنفيذ اوامره اول ما يفتح البرنامج ، 1. نقوم بتشغيل الكود الذي سيربط الـ BE الى المسار الصحيح للمستخدم (اما المبرمج فلا يسنخدم هذا الماكرو ، وانما يدخل في البرنامج بمسك مفتاح الشفت) ، 2. اذا لم يحصل البرنامج على المسار الصحيح ، فيجب ان نخبره ان يعطينا نافذة نختار منها المسار الصحيح ، وهناك عدة طرق ، واخترت طريقتي هنا ، 3.4.5.7.8 هذه لإخفاء جميع كائنات البرنامج من جداول واستعلامات ونماذج وماكرو وتقارير ووحدات نمطية ، وتوسيع البرنامج لحجم الشاشة (فلا نحتاج ان نجعل النموذج منبثق ، والذي به الكثير من المشاكل) ، 5. فتح النموذج الاول من البرنامج ، . هذه هي الوحدة النمطية التي تقوم بالعمل (1) اعلاه : Public Function f_ReLink_To_Original(Optional Seq As Integer = 1) 'On Error GoTo err_f_ReLink_To_Original On Error GoTo Exit_f_ReLink_To_Original ' ' The client have his own path to the linked BE tables, ' yet for Development when we want to do change and modifications on the FE, ' we want to link this FE to our local BE tables, for testing, ' and we are done, we will send this FE back to the client, which will have our BE path!! ' ' Although the FE have a code on startup, which will prompt for the new BE path, but not all clients know how to use it!! ' So I added a table tbl_ReLink_To_Original to the FE, and the path to the client BE path, as Seq = 1 , ' and for the Developer BE, the Seq is 2 or other numbers. ' ' for the Development BE path, we call this Function, for the immediate window: ' ?f_ReLink_To_Original(2) ' ' or from a normal Event: ' Call Call f_ReLink_To_Original(2) ' ' and enter the DB with Shift key, ' ' and when the FE goes to the client, this Function will call Seq = 1 by default, thus returning their correct Path. ' ' ' by jjafferr ' ' v1. 24-Feb-2020 ' Dim db As dao.Database Dim tdf As dao.TableDef Dim ConnectionString As String, Linked_Connection As String Set db = CurrentDb 'which BackEnd the user selected ConnectionString = DLookup("[DB_Path]", "tbl_ReLink_To_Original", "[Seq]=" & Seq) 'the existing BackEnd Linked_Connection = DLookup("[Database]", "MSysObjects", "[flags] = 2097152") 'if the existing BackEnd = User Selected, then No need to connect again, just exit If ConnectionString = Linked_Connection Then GoTo Exit_f_ReLink_To_Original For Each tdf In db.TableDefs ' Only make a change if the table is a linked table If Len(tdf.Connect) Then tdf.Connect = ";DATABASE=" & ConnectionString tdf.RefreshLink End If Next Exit_f_ReLink_To_Original: Exit Function err_f_ReLink_To_Original: If Err.Number = 3170 Then 'MsgBox "رجاء التاكد من مسار القاعدة الموجوده في الجدول" & vbCrLf & "tbl_ReLink_To_Original" 'Resume Next Resume Exit_f_ReLink_To_Original Else MsgBox Err.Number & vbCrLf & Err.Description Resume Exit_f_ReLink_To_Original End If End Function . اما للمبرمج ، فيجب عليه ان يدخل الكود ويكتب (لاحظوا اننا استخدمنا الرقم Seq = 2 ، ليشير الى السجل الثاني في الجدول ، المشير الى مسار الـ BE حسب مجلدات الكمبيوتر عندنا (3) : من نافذة الكود السفلى: immediate ?f_ReLink_To_Original(2) او من اي حدث Call f_ReLink_To_Original(2) . واذا اردت الاستفادة من هذه الطريقة لبرامجك ، فيجب عليك استيراد هذه الكائنات الى برنامجك (مع الاخذ في الاعتبار تغيير اسم النموذج في ماكرو autoexec ) : جعفر Relink Tables.zip 4 4
Khalid Jnb قام بنشر مارس 1, 2020 قام بنشر مارس 1, 2020 بارك الله فيك استاذنا الكبير جعلها الله في ميزان حسناتك تحياتي
أبوبسمله قام بنشر مارس 1, 2020 قام بنشر مارس 1, 2020 جزاك الله خيرا اخى واستاذنا الغالى جعفر ربنا ما يحرمنا من هداياك القيمه وشروحاتك المبسطه جعلها الله فى ميزان حسناتك تقبل تحياتى وتمنياتى لك وللجميع بالتوفيق
SEMO.Pa3x قام بنشر مارس 2, 2020 قام بنشر مارس 2, 2020 احسنت يا مُعلمي، سيتم قراءة الموضوع بتمعن ودقة مع فنجان قهوة عند عودتي للمنزل
ابوآمنة قام بنشر مارس 3, 2020 قام بنشر مارس 3, 2020 ما شاء الله تبارك الله استاذي ومعلمي جعفر بوركت وجعله في ميزان حسناتك
qathi قام بنشر مارس 3, 2020 قام بنشر مارس 3, 2020 وفقك الله أستاذنا الكبير الى كل خير بالتوفيق ساقوم بمتابعة الموضوع في وقت لا حق
Moosak قام بنشر مارس 8, 2022 قام بنشر مارس 8, 2022 ما شاء الله تبارك الله .. هذا من أهم المواضيع التي تواجهني في التعامل مع برامجي والتغيرات والتعديلات المستمرة عليها 😅 وكانت عندي فكرة عمل شي مشابه لهذي الطريقة ولكن ما محصل وقت أطبقها 😁 فكرتي هي : أن الجدول الخاص بمسارات ال BE المتعددة أول ما تقوم الدالة باكتشاف أن الباك إند غير مرتبطة يظهر لك نموذج يخيرك بإعادة الربط حسب المكان الذي أنت فيه ( أي المبرمج - أو المستخدم ) بالمناسبة الرابط لا يظهر في النموذج لضمان السرية إنما اسم يعطى لمكان النسخة (حقل جديد تضيفه في جدول المسارات) ، وبمجرد الضغط على المكان المطلوب الربط به يفحص الكود هل المسار موجود أم لا ثم يقوم بعملية الربط بين ال FE و BE .. وإذا وجد الكود أن المسار غير متوفر يعيد العملية من جديد .. 🙂 الكلام سهل بس التطبيق يريدله شغل 😅 على العموم تشكر مهندس جعفر على هذا الإثراء الكبير والطرح المتميز 🙂 ما شاء الله أفكارك كلها خارج الصندوق 🙂 ربي يحفظك 🌹
jjafferr قام بنشر مارس 8, 2022 الكاتب قام بنشر مارس 8, 2022 2 ساعات مضت, Moosak said: ما شاء الله أفكارك كلها خارج الصندوق 🙂 لا وانت الصادق ، اضطر افكر بهذه الطرق لإنجاز عملي 🙂 لهذا السبب ترى انه ما عندي مشاركات في اخفاء خلفية الاكسس ، او طرق الحمايات ، او ... ، بينما تخصصي في التعامل مع البيانات 🙂 اخوي موسى ، اليك آخر تحديث للموصوع ، وطريقة عملي: لما استلم برنامج جديد مجزأ الى واجهة وخلفية: في الواجهة FE ، امسك مفتاح الشفت وافتح الواجهة في وضع التصميم ، ثم اضع الكائنات التالية: الجدول tbl_ReLink_To_Original (تم عمل تغييرات على الجدول في المرفق) ، مع حذف جميع بياناته ، الماكرو Autoexec ، مع تغيير اسم اول نموذج يتم فتحه ، الوحدة النمطية basJStreetAccessRelinker وبدون المساس بها ، الوحدة النمطية m_Arc_Subs ، مع مراعاة استخدام النسخة الاحدث من الدالة f_ReLink_To_Original (انظر الكود في الاسفل) ، واضافة الدالة الجديدة f_Original_DB_Path_Append ، الدالة الجديدة f_Original_DB_Path_Append تقوم بجميع الخطوات اليدوية التي شرحتها في اول مشاركة ، وتقوم بإدخال مسارات الجداول المرتبطة في VBA في نافذة immediate اكتب (لاحظ ان علامة الاستفهام بالانجيزي) ?f_Original_DB_Path_Append اغلق البرنامج بعد حفظ كل شيء اعلاه ، افتح البرنامج بدون مسك مفتاح الشفت ، وسيسألني البرنامج عن مسار الجداول ، واخبره عن المسار ، ويشتغل البرنامج بالبيانات ، اقوم بجميع التعديلات/الزيادة المطلوبة ، وبعد كل تعديل اغلق البرنامج ، ثم استخدم البرنامج في الرابط التالي ، حتى ينظف برنامجي ويعمل لي نسخة احتياطية (وكثر ما اقول ، ما اوفي البرنامج حقه ، فكثير من الاحيان وبعد ايام او اشهر ، اضطر للرجوع الى احد النسخ القديمة والذي كان فيه كود قديم يشتغل ، ولكني استبدلته بكود جديد وظهر به اخطاء) : وفي النهاية اضغط البرنامج وارسله لصاحبه ، لما صاحبه يفتحه ، تلقائيا البرنامج يفتح بالطريقة العادية وبدون تدخل المستخدم في اي شيء 🙂 هذا هو الكود المعدل: Public Function f_ReLink_To_Original(Optional Seq As Integer = 1) On Error GoTo err_f_ReLink_To_Original ' ' this Function runs from startup, from AutoExec Macro. ' ' The client have his own path to the linked BE tables, ' yet for Development when we want to do changes and modifications on the FE, ' we want to link this FE to our local BE tables, for testing, ' and when we are done, we will send this FE back to the client, which will have our BE path, and that is the problem !! ' ' The Developer: ' since this Function runs from startup, but will NOT find the client BE, ' then the startup will run the Function jstCheckTableLinks_Full, which will prompt for the new BE path, and Link the FE to the BE. ' ' So I added a table tbl_ReLink_To_Original to the FE, and the path to the client BE path, as Seq = 1 , ' and for the Developer BE, the Seq is Not 1. ' ' for the Development BE path, we can run the DB normally, ' and the Function jstCheckTableLinks_Full will prompt asking for the BE path (since the DB will NOT find the BE from this Function), ' ' Or, if entered the DB while holding the Shift key, we can: ' call this Function, from the immediate window: ' ?f_ReLink_To_Original(2) ' ' or call this Function from any Event: ' Call f_ReLink_To_Original(2) ' ' ' The Client: ' And when the FE goes to the client, this Function will call Seq = 1 by default, thus returning their correct Path. ' ' ' by jjafferr ' ' v1.0, 24-Feb-2020 , One BE ' v2.0, 10-Jul-2020 , Multiple BEs ' v2.1, 13-Jul-2020 , Multiple BEs, but each table should be connected to it's owen BE !! ' , the table might be in different BE, so this way we connect it to the right BE ' Dim db As DAO.Database Dim tdf As DAO.TableDef Dim rst As DAO.Recordset Set db = CurrentDb 'assuming it is the Client, loop through his BE path Set rst = CurrentDb.OpenRecordset("Select [tbl_Name], [DB_Path] From tbl_ReLink_To_Original Where [Seq]=" & Seq) For Each tdf In db.TableDefs ' Only make a change if the table is a linked table If Len(tdf.Connect) Then rst.FindFirst "[tbl_Name] = '" & tdf.Name & "'" tdf.Connect = ";DATABASE=" & rst![DB_Path] tdf.RefreshLink ' if the table is not found in the DB Path, the Function will generate error 3011 End If 'Len Next Exit_f_ReLink_To_Original: rst.Close: Set rst = Nothing Exit Function err_f_ReLink_To_Original: If Err.Number = 3170 Then 'MsgBox "رجاء التاكد من مسار القاعدة الموجوده في الجدول" & vbCrLf & "tbl_ReLink_To_Original" 'Resume Next Resume Exit_f_ReLink_To_Original ElseIf Err.Number = 3011 Or Err.Number = 3044 Then 'this Table belonges to another DB, ignore, 'as the other DB Path will be checked too Resume Next Else MsgBox Err.Number & vbCrLf & Err.Description Resume Exit_f_ReLink_To_Original End If End Function Public Function f_Original_DB_Path_Append() Dim mySQL As String DoCmd.SetWarnings False mySQL = "UPDATE tbl_ReLink_To_Original SET Seq = 5, Remarks = 'A different BE Path was added' WHERE Seq=1" DoCmd.RunSQL mySQL mySQL = "INSERT INTO tbl_ReLink_To_Original ( DB_Path, tbl_Name, Seq, Remarks )" mySQL = mySQL & " SELECT Database, Name, 1, 'Client'" mySQL = mySQL & " FROM MSysObjects WHERE Flags = 2097152 ORDER BY Database" DoCmd.RunSQL mySQL DoCmd.SetWarnings True End Function جعفر Relink Tables.zip 1
Moosak قام بنشر مارس 9, 2022 قام بنشر مارس 9, 2022 لله درك باش مهندس .. @jjafferr 😊🌺 كنت حاس يقينا أنه لديك إضافات وتحديثات للموضوع 👍😉 ما شاء الله عليك ، ومن وحي التجارب والحاجة تولد عجائب الأمور ... 😊 ولي إضافات من تجاربي على نفس هذا الموضوع ومحاولة لتطبيق الأفكار التي أثارها موضوعك في راسي قريبا إن شاء الله 😁 سأحاول تبسيط الأمور أكثر باستخدام نوافذ صديقة للمستخدم إن شاء الله 🤗 مستعينا بالله ثم خلاصة ما طورته أنت في هذا الشأن .. 1
ابوخليل قام بنشر مارس 9, 2022 قام بنشر مارس 9, 2022 شكرا اخوي جعفر انت شباب تحب الطريق وان طال واكيد تهوى السفر اما اخوك ابو خليل فعلى قولتهم حطني لقيتني .. لا ابتعد كثيرا .. حدي باب البيت او المسجد اللي هو ملاصق لبيتي الجدار بالجدار هذه مقدمة لوصف طريقتي مع برامجي غالبا اجعل قاعدة البيانات الخلفية في مكان محدد واحد في اجهزة العملاء .. لما اعمل تحديث وتطوير للواجهات وكنت رابطها على مسار الجداول التي في جهازي ومسارها هذا يختلف عن المسار الذي عند العملاء ، فقط ارسلها على وضعها الحالي ، والبرنامج هو من يبحث عن المكان الاصلي ويرتبط بقاعدة البيانات من دون ان يشعر العميل ، ولو فرضنا تم حذف مجلد البرنامج او ان العميل وضع الواجهات على جهاز آخر جديد .. هنا لن تعمل .. فقط تفتح لنصف ثانية ثم تقفل
ابوخليل قام بنشر مارس 9, 2022 قام بنشر مارس 9, 2022 وحدة نمطية صغيرة استخدمها في جميع برامجي ، اضع فيها مسار BE ونستدعيها في نموذج البداية . اذا اردت اشتغل عليها افتحها بالشفت واربط جداولي يدويا ولكني اذا نسيت وفتحتها مباشرة قبل الربط اليدوي تظهر لي هذه الرسالة على اعتبار ان ليس لدي BE في المكان الذي عند العملاء بمعنى : انه ينظر هل الربط صحيح والقاعدة المرتبط بها يدويا .. الآن موجودة فعلا فيفتح والا يذهب الى المسار المحدد فان لم يجد القاعدة اظهر الرسالة واغلق هل شغلي كذا تمام او من جنب القائم .. والموضوع يتحدث عن شيء آخر 1
jjafferr قام بنشر مارس 9, 2022 الكاتب قام بنشر مارس 9, 2022 اخوي ابوخليل ، ويقول المثل قديم البريسم ولا جديد الصوف 🙂 خلينا نشوف الكود لوسمحت علشان اطبق واجرب 🙂 جعفر 1
عمر ضاحى قام بنشر مارس 9, 2022 قام بنشر مارس 9, 2022 ما شاء الله بارك الله فيك استاذي الجليل ابو خليل ابداااع ربنا يجازيك عنا كل خير ويبارك لنا فى عمرك وصحتك وعلمك
ابوخليل قام بنشر مارس 9, 2022 قام بنشر مارس 9, 2022 3 ساعات مضت, jjafferr said: خلينا نشوف الكود لوسمحت علشان اطبق واجرب 🙂 الكود موجود في المنتدى وانا عرضته كاملا مع شروحات الأصل في اكثر من مشاركة تخص ربط الجداول ولكني هذبته لغرضي هذا الخاص هذا هو الكود: Public Function AutoLinks(ByVal strDBPassword As String) As Boolean On Error GoTo AutoLinksErr Dim tdf As TableDef Dim strNewMDB As String For Each tdf In CurrentDb.TableDefs If UCase(Left(tdf.name, 6)) <> "COMPAS" Then If Len(tdf.Connect) > 0 And tdf.Fields.Count = 0 Then strNewMDB = "c:\bader\BData.db" If (IsNull(strDBPassword) = True) Or (strDBPassword = "") Then tdf.Connect = ";DATABASE=" & strNewMDB Else tdf.Connect = ";DATABASE=" & strNewMDB & ";PWD=" & strDBPassword End If tdf.RefreshLink End If End If Next tdf AutoLinks = True ' AutoLinksDone: Exit Function AutoLinksErr: MsgBox "لا يوجد قاعدة بيانات فضلا اتصل بالدعم الفني" 'MsgBox "Error #" & err.Number & ": " & err.Description, vbCritical Resume AutoLinksDone End Function ويتم مناداته في نموذج البداية على هذا النحو : If AutoLinks("") = False Then Call Application.Quit End If وهذا مرفق صغير عبارة عن مجلد .. تم اعداده على ان يتم وضع المجلد على قرص C وللتجربة يمكن اخذ نسخة من القاعدة الخلفية BDAta.db ولصقها في اي مكان آخر وتغيير اللاحقة الى mdb واجراء التجربة bader.rar 1
jjafferr قام بنشر مارس 9, 2022 الكاتب قام بنشر مارس 9, 2022 شكرا جزيلا اخوي ابوخليل 🙂 بكرة الصباح اشوف الموضوع من اول وجديد ان شاء الله 🙂 جعفر
jjafferr قام بنشر مارس 11, 2022 الكاتب قام بنشر مارس 11, 2022 السلام عليكم اخوي ابوخليل 🙂 الهدف من هذا الموضوع: 1. عند عمل المبرمج واجهة برنامجه FE ، فيحتاج الى عمل ربط لجداوله BE في جهازه ، 2. عند ارسال الواجهة للمستخدم ، فيجب ان يعمل البرنامج بدون تدخل المستخدم بإختيار مسار قاعدة البيانات ، 1. عند استلام المبرمج واجهة البرنامج للتعديل/الاضافة ، فيحتاج الى عمل ربط لجداوله BE في جهازه ، 2. عند ارجاع الواجهة للمستخدم ، فيجب ان يعمل البرنامج بدون تدخل المستخدم بإختيار مسار قاعدة البيانات. وهناك تشابه كبير بين طريقتي وطريقتك ، وهناك نقاط قوة وضعف في الطريقتين 🙂 جعفر 1
Moosak قام بنشر مارس 11, 2022 قام بنشر مارس 11, 2022 36 دقائق مضت, jjafferr said: السلام عليكم اخوي ابوخليل 🙂 وعليكم السلام ورحمة الله وبركاته عمي جعفر 🌹😊 هل الكلام موجه لأبو خليل ؟ أم لكلينا ؟ 😅
jjafferr قام بنشر مارس 11, 2022 الكاتب قام بنشر مارس 11, 2022 انت اصبر دورك جاي🙂 في الواقع كتبت عدة اسطر في المشاركة السابقة ، بعدين اختصرتها في كلمتين 🙂 جعفر 1
Bshar قام بنشر نوفمبر 6, 2022 قام بنشر نوفمبر 6, 2022 بارك الله بك وجعله في ميزان حسناتك ، اجمل من رائع كل الاحترام والتقدير لك 1
abouelhassan قام بنشر الثلاثاء at 10:58 قام بنشر الثلاثاء at 10:58 السلام عليكم اخى فى الله لدى نفس المشكلة خطـأ57 ما سبل الحل اخى Moosak والشكر موصول لاخى واستاذى الاستاذ jjafferr
الردود الموصى بها
انشئ حساب جديد او قم بتسجيل دخولك لتتمكن من اضافه تعليق جديد
يجب ان تكون عضوا لدينا لتتمكن من التعليق
انشئ حساب جديد
سجل حسابك الجديد لدينا في الموقع بمنتهي السهوله .
سجل حساب جديدتسجيل دخول
هل تمتلك حساب بالفعل ؟ سجل دخولك من هنا.
سجل دخولك الان