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

الردود الموصى بها

قام بنشر

السلام عليكم 🙂

 

نعمل البرنامج ، ثم نقسمه الى قسمين ، FE الواجهة و BE الجداول ، ولما نعطيه للمستخدم ، نربط الجداول بمسار خاص به ، ويعمل البرنامج.

ولما المستخدم يحتاج الى تعديل/اضافات ، ويرسل لنا نسخته بالايميل (انا ممكن اكون مسافر وبعيد عن نسختي) ، فيجب علينا ان نغير مسار الجداول ليتناسب مع مجلدات الكمبيوتر عندنا ،

ولما ننتهي من التعديل ، نرسله بالايميل ، وهناك يجب على المستخدم ان يغير المسار الى ذلك الذي به BE الاصل 🙂

المشكلة انه:

1. بعض الاوقات نكون قد وضعنا الـ BE في مكان لا يجب ان يعرفه المستخدم ، فلا نريد تدخل منه لهذا التغيير ،

2. بعض الاوقات المستخدم لا يعرف مكان الـ BE اصلا ،

3. وبعض الاوقات ، المستخدم لا يكون فني ليعرف كيف يختار مكان الـ BE 🙂

 

صادفتني هذه المشكلة مراراً ، ومرة دفعت الثمن غالي لما ربطوه بالـ BE الغلط ، ربطوه بنسخة الـ Backup بدل عن النسخة الاصل 😁

 

الى ان اهتديت الى هذه الطريقة 🙂

الفكرة هي عبارة عن اضافة جدول tbl_ReLink_To_Original في الـ FE فيه سجلين ، سجل يحتوي على مسار BE المستخدم ، وسجل يحتوي على مسار BE المبرمج ،

وبدل هذا الجدول ، ممكن ان نضع ملف نص txt في مجلد FE ، ونكتب فيهم السجلين ، ثم نقرأهم ، ولكن الجداول في الـ FE تناسبني اكثر ، فإستعملتها 🙂

 

1. لمعرفة مسار BE المستخدم:

Clipboard01.jpg.c6c645402a589c85a090a0a9fa643d0c.jpg

.

Clipboard02.jpg.49fa0f1210605e5ff39e630442dd33d4.jpg

.

ثم ننسخه من (1) جدول MSysObjects الى السجل الاول (Seq = 1) في جدولنا (2) tbl_ReLink_To_Original

Clipboard03.jpg.9e5683f6d59145a8b7ec1af02ee1f873.jpg

.

ثم في السجل الثاني (Seq = 2) ، نكتب مسار الـ BE حسب مجلدات الكمبيوتر عندنا (3) .

 

 

طريقة العمل:

نعمل ماكرو Macro باسم Autoexec ، والذي يقوم الاكسس بفتحه وتنفيذ اوامره اول ما يفتح البرنامج ،

1. نقوم بتشغيل الكود الذي سيربط الـ BE الى المسار الصحيح للمستخدم (اما المبرمج فلا يسنخدم هذا الماكرو ، وانما يدخل في البرنامج بمسك مفتاح الشفت) ،

2. اذا لم يحصل البرنامج على المسار الصحيح ، فيجب ان نخبره ان يعطينا نافذة نختار منها المسار الصحيح ، وهناك عدة طرق ، واخترت طريقتي هنا ،

3.4.5.7.8 هذه لإخفاء جميع كائنات البرنامج من جداول واستعلامات ونماذج وماكرو وتقارير ووحدات نمطية ، وتوسيع البرنامج لحجم الشاشة (فلا نحتاج ان نجعل النموذج منبثق ، والذي به الكثير من المشاكل) ،

5. فتح النموذج الاول من البرنامج ،

Clipboard04.jpg.48d4797c357a7aabf2e4c486d4f93f18.jpg

.

 

هذه هي الوحدة النمطية التي تقوم بالعمل (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 ) :

image.png.19a595e3c5e36f5b7884c693614aab66.png

 

جعفر

Relink Tables.zip

  • Like 4
  • Thanks 4
قام بنشر

جزاك الله خيرا اخى واستاذنا الغالى جعفر :fff:

ربنا ما يحرمنا من هداياك القيمه وشروحاتك المبسطه جعلها الله فى ميزان حسناتك

تقبل تحياتى وتمنياتى لك وللجميع بالتوفيق

قام بنشر

احسنت يا مُعلمي، سيتم قراءة الموضوع بتمعن ودقة مع فنجان قهوة عند عودتي للمنزل

قام بنشر

وفقك الله أستاذنا الكبير الى كل خير بالتوفيق

ساقوم بمتابعة الموضوع في وقت لا حق

  • 2 years later...
قام بنشر

ما شاء الله تبارك الله ..

هذا من أهم المواضيع التي تواجهني في التعامل مع برامجي والتغيرات والتعديلات المستمرة عليها 😅

وكانت عندي فكرة عمل شي مشابه لهذي الطريقة ولكن ما محصل وقت أطبقها 😁

فكرتي هي أن الجدول الخاص بمسارات ال BE  المتعددة أول ما تقوم الدالة باكتشاف أن الباك إند غير مرتبطة يظهر لك نموذج يخيرك بإعادة الربط حسب المكان الذي أنت فيه ( أي المبرمج - أو المستخدم ) بالمناسبة الرابط لا يظهر في النموذج لضمان السرية إنما اسم يعطى لمكان النسخة (حقل جديد تضيفه في جدول المسارات) ، وبمجرد الضغط على المكان المطلوب الربط به يفحص الكود هل المسار موجود أم لا ثم يقوم بعملية الربط بين ال FE و BE ..

وإذا وجد الكود أن المسار غير متوفر يعيد العملية من جديد .. 🙂 

 

الكلام سهل بس التطبيق يريدله شغل 😅

 

على العموم تشكر مهندس جعفر على هذا الإثراء الكبير والطرح المتميز 🙂 

ما شاء الله أفكارك كلها خارج الصندوق 🙂 ربي يحفظك 🌹

قام بنشر
2 ساعات مضت, Moosak said:

ما شاء الله أفكارك كلها خارج الصندوق 🙂

لا وانت الصادق ، اضطر افكر بهذه الطرق لإنجاز عملي 🙂

لهذا السبب ترى انه ما عندي مشاركات في اخفاء خلفية الاكسس ، او طرق الحمايات ، او ... ، بينما تخصصي في التعامل مع البيانات 🙂

 

اخوي موسى ، اليك آخر تحديث للموصوع ، وطريقة عملي:

 

لما استلم برنامج جديد مجزأ الى واجهة وخلفية:

في الواجهة FE ، امسك مفتاح الشفت وافتح الواجهة في وضع التصميم ، ثم اضع الكائنات التالية:

  1. الجدول tbl_ReLink_To_Original (تم عمل تغييرات على الجدول في المرفق) ، مع حذف جميع بياناته ،
  2. الماكرو Autoexec ، مع تغيير اسم اول نموذج يتم فتحه ،
  3. الوحدة النمطية basJStreetAccessRelinker وبدون المساس بها ، 
  4. الوحدة النمطية m_Arc_Subs ، مع مراعاة استخدام النسخة الاحدث من الدالة f_ReLink_To_Original (انظر الكود في الاسفل) ، واضافة الدالة الجديدة f_Original_DB_Path_Append ،
  5. الدالة الجديدة f_Original_DB_Path_Append تقوم بجميع الخطوات اليدوية التي شرحتها في اول مشاركة ، وتقوم بإدخال مسارات الجداول المرتبطة
  6. في VBA في نافذة immediate اكتب (لاحظ ان علامة الاستفهام بالانجيزي) 
    ?f_Original_DB_Path_Append

     

  7. اغلق البرنامج بعد حفظ كل شيء اعلاه ،
  8. افتح البرنامج بدون مسك مفتاح الشفت ، وسيسألني البرنامج عن مسار الجداول ، واخبره عن المسار ، ويشتغل البرنامج بالبيانات ،
  9. اقوم بجميع التعديلات/الزيادة المطلوبة ، وبعد كل تعديل اغلق البرنامج ، ثم استخدم البرنامج في الرابط التالي ، حتى ينظف برنامجي ويعمل لي نسخة احتياطية (وكثر ما اقول ، ما اوفي البرنامج حقه ، فكثير من الاحيان وبعد ايام او اشهر ، اضطر للرجوع الى احد النسخ القديمة والذي كان فيه كود قديم يشتغل ، ولكني استبدلته بكود جديد وظهر به اخطاء) :
  10. وفي النهاية اضغط البرنامج وارسله لصاحبه ،
  11. لما صاحبه يفتحه ، تلقائيا البرنامج يفتح بالطريقة العادية وبدون تدخل المستخدم في اي شيء 🙂

 

هذا هو الكود المعدل:

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

  • Like 1
قام بنشر

لله درك باش مهندس .. @jjafferr 😊🌺


كنت حاس يقينا أنه لديك إضافات وتحديثات للموضوع 👍😉

ما شاء الله عليك ، ومن وحي التجارب والحاجة تولد عجائب الأمور ... 😊 

 

ولي إضافات من تجاربي على نفس هذا الموضوع ومحاولة لتطبيق الأفكار التي أثارها موضوعك في راسي قريبا إن شاء الله 😁

سأحاول تبسيط الأمور أكثر باستخدام نوافذ صديقة للمستخدم إن شاء الله 🤗

مستعينا بالله ثم خلاصة ما طورته أنت في هذا الشأن ..

  • Like 1
قام بنشر

شكرا اخوي جعفر

انت شباب تحب الطريق وان طال واكيد تهوى السفر

اما اخوك ابو خليل فعلى قولتهم حطني لقيتني .. لا ابتعد كثيرا .. حدي باب البيت او المسجد اللي هو ملاصق لبيتي الجدار بالجدار

هذه مقدمة  لوصف طريقتي مع برامجي 

غالبا اجعل قاعدة البيانات الخلفية في مكان محدد واحد في اجهزة العملاء .. 

لما اعمل تحديث وتطوير للواجهات وكنت رابطها على مسار  الجداول التي في جهازي ومسارها هذا يختلف عن المسار الذي عند العملاء  ،  فقط ارسلها على وضعها الحالي ، والبرنامج هو من يبحث عن المكان الاصلي  ويرتبط بقاعدة البيانات من دون ان يشعر العميل ،

ولو فرضنا تم حذف مجلد البرنامج او ان العميل وضع الواجهات على جهاز آخر جديد .. هنا لن تعمل .. فقط تفتح لنصف ثانية ثم تقفل

قام بنشر

وحدة نمطية صغيرة استخدمها في جميع برامجي ، اضع فيها مسار BE

ونستدعيها في نموذج البداية .

اذا اردت اشتغل عليها افتحها بالشفت واربط جداولي يدويا

ولكني اذا نسيت وفتحتها مباشرة قبل الربط اليدوي تظهر لي هذه الرسالة

على اعتبار ان ليس لدي BE في المكان الذي عند العملاء

بمعنى : انه ينظر هل الربط صحيح والقاعدة المرتبط بها يدويا .. الآن موجودة فعلا فيفتح

والا يذهب الى المسار المحدد فان لم يجد القاعدة اظهر الرسالة واغلق

 

Untitled.jpg

هل شغلي كذا تمام

او من جنب القائم .. والموضوع يتحدث عن شيء آخر

  • Like 1
قام بنشر

اخوي ابوخليل ، ويقول المثل قديم البريسم ولا جديد الصوف 🙂

 

خلينا نشوف الكود لوسمحت علشان اطبق واجرب 🙂

 

جعفر

 

 

  • Haha 1
قام بنشر

ما شاء الله 

بارك الله فيك استاذي الجليل ابو خليل

ابداااع 

ربنا يجازيك عنا كل خير ويبارك لنا فى عمرك وصحتك وعلمك

قام بنشر
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

  • Like 1
قام بنشر

شكرا جزيلا اخوي ابوخليل 🙂

بكرة الصباح اشوف الموضوع من اول وجديد ان شاء الله 🙂

 

جعفر

قام بنشر

السلام عليكم اخوي ابوخليل 🙂

 

 الهدف من هذا الموضوع:

1. عند عمل المبرمج واجهة برنامجه FE ، فيحتاج الى عمل ربط لجداوله BE في جهازه ،

2. عند ارسال الواجهة للمستخدم ، فيجب ان يعمل البرنامج بدون تدخل المستخدم بإختيار مسار قاعدة البيانات ،

1. عند استلام المبرمج واجهة البرنامج للتعديل/الاضافة ، فيحتاج الى عمل ربط لجداوله BE في جهازه ،

2. عند ارجاع الواجهة للمستخدم ، فيجب ان يعمل البرنامج بدون تدخل المستخدم بإختيار مسار قاعدة البيانات.

 

وهناك تشابه كبير بين طريقتي وطريقتك ،

وهناك نقاط قوة وضعف في الطريقتين 🙂

 

جعفر

 

  • Like 1
قام بنشر
36 دقائق مضت, jjafferr said:

السلام عليكم اخوي ابوخليل 🙂

 

وعليكم السلام ورحمة الله وبركاته عمي جعفر 🌹😊

هل الكلام موجه لأبو خليل ؟ أم لكلينا ؟ 😅

قام بنشر

انت اصبر دورك جاي🙂

 

في الواقع كتبت عدة اسطر في المشاركة السابقة ، بعدين اختصرتها في كلمتين 🙂

 

جعفر

  • Haha 1
  • 7 months later...
قام بنشر

بارك الله بك وجعله في ميزان حسناتك ، اجمل من رائع  كل الاحترام والتقدير لك

  • Thanks 1
  • 3 years later...

انشئ حساب جديد او قم بتسجيل دخولك لتتمكن من اضافه تعليق جديد

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

انشئ حساب جديد

سجل حسابك الجديد لدينا في الموقع بمنتهي السهوله .

سجل حساب جديد

تسجيل دخول

هل تمتلك حساب بالفعل ؟ سجل دخولك من هنا.

سجل دخولك الان
  • تصفح هذا الموضوع مؤخراً   0 اعضاء متواجدين الان

    • لايوجد اعضاء مسجلون يتصفحون هذه الصفحه
×
×
  • اضف...

Important Information