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

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

قام بنشر

السلام عليكم

عندى جدولين فى نفس قاعدة البيانات : الأساسي للصف الأول  tbl_student  ، الآخر للصف الثانى tbl_student2

المطلوب برمجياً  حذف الجدول الثانى (tbl_student2) تماماً ، ثم استنساخه مرة أخرى من الجدول الأول (tbl_student)

بنفس الأسم (tbl_student2)

ما سبق يجب وضعه فى زر أمر

 

ربما هذا الموضوع قد سبق شرحه هنا ، لكن بحثى لم يأتى بنتيجة

عموماً : شكراً مقدماً  لكل من سوف يشارك بأى فكرة

قام بنشر

وعليكم السلام ورحمة الله وبركاته..

مشاركة مع الذكاء الاصطناعي ، جرب هذا الكود التالي 

 

Private Sub CommandButton_Click()
    Dim db As DAO.Database
    Dim tblName As String
    Dim newTblName As String
    
    ' Set table names
    tblName = "tbl_student"
    newTblName = "tbl_student2"
    
    ' Get the current database
    Set db = CurrentDb
    
    ' Delete the second table if it exists
    On Error Resume Next
    db.TableDefs.Delete newTblName
    On Error GoTo 0
    
    ' Copy the first table to create the second table
    DoCmd.CopyObject , newTblName, acTable, tblName
    
    ' Clean up
    Set db = Nothing
    
    MsgBox "Table " & newTblName & " has been successfully recreated from " & tblName, vbInformation
End Sub

* لم يتم تجربة الكود لعدم تواجدي أمام جهاز الكمبيوتر 😁

قام بنشر
9 دقائق مضت, أحمد العيسى said:

للأسف

لم يعمل !

:blink:

 

نفس الكود في مرفق ، جربته ويعمل بكفاءة

Copy TBL.accdb

قام بنشر

سوف أجرب الكود  على أكسس 2024  لأننى الآن أعمل على أكسس 2003

كود حذف الجدول الذى يتوافق معى هو

DoCmd.DeleteObject acTable, "tbl_student2"

جاري البحث عن كود الإنشاء بالبيانات ..

 

قام بنشر
36 دقائق مضت, أحمد العيسى said:

سوف أجرب الكود  على أكسس 2024  لأننى الآن أعمل على أكسس 2003

 

للأسف ليس لدي إصدار أوفيس 2003 ، ولكن كتعديل جرب هذا الكود :-

Private Sub Command0_Click()
    Dim db As DAO.Database
    Dim tblName As String
    Dim newTblName As String
    Dim tempTblName As String
    Dim tdf As DAO.TableDef
    tblName = "tbl_student"
    newTblName = "tbl_student2"
    tempTblName = "temp_" & newTblName
    Set db = CurrentDb
    On Error Resume Next
    Set tdf = db.TableDefs(tempTblName)
    If Not tdf Is Nothing Then
        db.TableDefs.Delete tempTblName
    End If
    Set tdf = Nothing
    On Error GoTo 0
    DoCmd.CopyObject , tempTblName, acTable, tblName
    On Error Resume Next
    Set tdf = db.TableDefs(newTblName)
    If Not tdf Is Nothing Then
        db.TableDefs.Delete newTblName
    End If
    Set tdf = Nothing
    On Error GoTo 0
    db.TableDefs(tempTblName).Name = newTblName
    Set db = Nothing
    MsgBox "Table " & newTblName & " has been successfully recreated from " & tblName, vbInformation
End Sub

 

قام بنشر (معدل)

المشكلة أن مثل هذا السطر غير متوافق مع 2003

Dim db As DAO.Database

هل من الممكن البناء على الكود التالى فهو بعمل كما اريد ولكن بتحذيرات برنامج الأكسس التى لا أريد إظهارها :

Private Sub Cmd2_Click()
   DoCmd.DeleteObject acTable, "tbl_student2"
   DoCmd.RunSQL "SELECT tbl_student.* INTO tbl_student2 FROM tbl_student;"
End Sub    

 

تم تعديل بواسطه أحمد العيسى
قام بنشر
56 دقائق مضت, أحمد العيسى said:

المشكلة أن مثل هذا السطر غير متوافق مع 2003

Dim db As DAO.Database

هل من الممكن البناء على الكود التالى فهو بعمل كما اريد ولكن بتحذيرات برنامج الأكسس التى لا أريد إظهارها :

Private Sub Cmd2_Click()
   DoCmd.DeleteObject acTable, "tbl_student2"
   DoCmd.RunSQL "SELECT tbl_student.* INTO tbl_student2 FROM tbl_student;"
End Sub    

 

Private Sub Cmd2_Click()
DoCmd.SetWarnings False
   DoCmd.DeleteObject acTable, "tbl_student2"
   DoCmd.RunSQL "SELECT tbl_student.* INTO tbl_student2 FROM tbl_student;"
DoCmd.SetWarnings True
End Sub

 

قام بنشر (معدل)

تمام

هذا ما أريده وقد قمت بالتعديل عليه بالإضافات اللازمة :

Private Sub Cmd2_Click()
 
 Dim Msg, Style, Title, result
 Msg = "ÓíÊã ÇáÂä ÍÐÝ ÌÏæá ÇáÕÝ ÇáËÇäì! ääÕÍ ÈÊÕÚíÏ ÇáÕÝ ÇáËÇäì Åáì ÇáËÇáË ÃæáÇ!!! åá ÊÑÛÈ Ýí ÇáÇÓÊãÑÇÑ ¿¿"
 Style = vbInformation + vbYesNo + vbMsgBoxRight
 Title = " ÊÍÐíÑ - ÍÐÝ ÌÏæá ÇáÕÝ ÇáËÇäì"
 result = MsgBox(Msg, Style, Title)
 If result = vbYes Then
   DoCmd.SetWarnings False
      DoCmd.DeleteObject acTable, "tbl_student2"
      DoCmd.RunSQL "SELECT tbl_student.* INTO tbl_student2 FROM tbl_student;"
   MsgBox "Êã ÍÐÝ ÌÏæá ÇáÕÝ ÇáËÇäì æÅÍáÇá ãÍÊæíÇÊ ÇáÕÝ ÇáÃæá Ýì ÌÏæá ÌÏíÏ ÈÇÓã ÇáÕÝ ÇáËÇäì", vbOKOnly + vbMsgBoxRight, "ÅÚáÇã ÍÐÝ"
   DoCmd.SetWarnings True
 ElseIf result = vbNo Then
   DoCmd.CancelEvent
   MsgBox "!!! áÞÏ Êã ÅíÞÇÝ ÚãáíÉ ÇáÍÐÝ ", vbOKOnly + vbMsgBoxRight, "ÅÚáÇã ÊæÞÝ Úä ÇáÍÐÝ"
 End If

End Sub

لكن الجدول الجديد لا يظهر التسميات التوضيحية

140220549.jpg

بل يظهر الحقول بالرؤوس الانجليزية المصممة بالبرنامج دون التسميات التوضيحية

145760788.jpg

308081855.jpg

تم تعديل بواسطه أحمد العيسى
قام بنشر
30 دقائق مضت, أحمد العيسى said:

تمام

هذا ما أريده وقد قمت بالتعديل عليه بالإضافات اللازمة :

Private Sub Cmd2_Click()
 
 Dim Msg, Style, Title, result
 Msg = "ÓíÊã ÇáÂä ÍÐÝ ÌÏæá ÇáÕÝ ÇáËÇäì! ääÕÍ ÈÊÕÚíÏ ÇáÕÝ ÇáËÇäì Åáì ÇáËÇáË ÃæáÇ!!! åá ÊÑÛÈ Ýí ÇáÇÓÊãÑÇÑ ¿¿"
 Style = vbInformation + vbYesNo + vbMsgBoxRight
 Title = " ÊÍÐíÑ - ÍÐÝ ÌÏæá ÇáÕÝ ÇáËÇäì"
 result = MsgBox(Msg, Style, Title)
 If result = vbYes Then
   DoCmd.SetWarnings False
      DoCmd.DeleteObject acTable, "tbl_student2"
      DoCmd.RunSQL "SELECT tbl_student.* INTO tbl_student2 FROM tbl_student;"
   MsgBox "Êã ÍÐÝ ÌÏæá ÇáÕÝ ÇáËÇäì æÅÍáÇá ãÍÊæíÇÊ ÇáÕÝ ÇáÃæá Ýì ÌÏæá ÌÏíÏ ÈÇÓã ÇáÕÝ ÇáËÇäì", vbOKOnly + vbMsgBoxRight, "ÅÚáÇã ÍÐÝ"
   DoCmd.SetWarnings True
 ElseIf result = vbNo Then
   DoCmd.CancelEvent
   MsgBox "!!! áÞÏ Êã ÅíÞÇÝ ÚãáíÉ ÇáÍÐÝ ", vbOKOnly + vbMsgBoxRight, "ÅÚáÇã ÊæÞÝ Úä ÇáÍÐÝ"
 End If

End Sub

لكن الجدول الجديد لا يظهر التسميات التوضيحية

140220549.jpg

بل يظهر الحقول بالرؤوس الانجليزية المصممة بالبرنامج دون التسميات التوضيحية

145760788.jpg

308081855.jpg

جرب التعديل التالي :excl: :-

 

Private Sub Cmd2_Click()
 Dim Msg, Style, Title, result
 Msg = "سيتم الآن حذف جدول الصف الثاني! ننصح بتصدير الصف الثاني إلى الثالث أولاً!!! هل ترغب في الاستمرار؟؟"
 Style = vbInformation + vbYesNo + vbMsgBoxRight
 Title = "تحذير - حذف جدول الصف الثاني"
 result = MsgBox(Msg, Style, Title)
 If result = vbYes Then
   DoCmd.SetWarnings False
      DoCmd.DeleteObject acTable, "tbl_student2"
      DoCmd.RunSQL "SELECT tbl_student.* INTO tbl_student2 FROM tbl_student;"
      Dim db As DAO.Database
      Dim tdfSource As DAO.TableDef
      Dim tdfDest As DAO.TableDef
      Dim fldSource As DAO.Field
      Dim fldDest As DAO.Field
      Set db = CurrentDb
      Set tdfSource = db.TableDefs("tbl_student")
      Set tdfDest = db.TableDefs("tbl_student2")
      For Each fldSource In tdfSource.Fields
          For Each fldDest In tdfDest.Fields
              If fldDest.Name = fldSource.Name Then
                  fldDest.Properties("Caption").Value = fldSource.Properties("Caption").Value
              End If
          Next fldDest
      Next fldSource
   MsgBox "تم حذف جدول الصف الثاني وإحلال محتويات الصف الأول في جدول جديد باسم الصف الثاني", vbOKOnly + vbMsgBoxRight, "إعلام حذف"
   DoCmd.SetWarnings True
 ElseIf result = vbNo Then
   DoCmd.CancelEvent
   MsgBox "!!! لقد تم إيقاف عملية الحذف", vbOKOnly + vbMsgBoxRight, "إعلام توقف عن الحذف"
 End If
End Sub

 

قام بنشر
1 ساعه مضت, أحمد العيسى said:

معذرة .. تعبتك معايا

اكتشفت أن الكود التالى غير متوافق مع 2003

136204353.jpg

Dim db As DAO.Database

متوافق

ولكن المشكلة لديك في المكتبات

جرب استبدل  

 Dim db As DAO.Database

بـــ  

 Dim db As Database
  • Like 1
  • Thanks 1
قام بنشر
Dim db As Database

تعطى نفس الخطأ  أيضاً ؟

عموماً تغيير رؤوس الجدول لا تأثر على المخرجات المطلوبة ( التقارير )

إذن سأكتفى مؤقتاً بالكود الصحيح  ، وشكراً جزيلاً لكم

  • Like 1
قام بنشر
15 ساعات مضت, أحمد العيسى said:

معذرة .. تعبتك معايا

اكتشفت أن الكود التالى غير متوافق مع 2003

136204353.jpg

Dim db As DAO.Database

لعدم وجود اوفيس 2003 ، جرب اضافة المكتبة

Microsoft DAO 3.6 Object 

قام بنشر (معدل)
في 1‏/8‏/2024 at 11:43, Foksh said:

لعدم وجود اوفيس 2003 ، جرب اضافة المكتبة

Microsoft DAO 3.6 Object 

عذراً  على التأخر فى الرد لأسباب خارجة

تم إضافة المكتبة المذكورة .. لكن بعد ذلك ظهر خطأ جديد

img?id=921442

 

402262300.jpg

تم تعديل بواسطه أحمد العيسى
قام بنشر
8 دقائق مضت, أحمد العيسى said:

عذراً  على التأخر فى الرد لأسباب خارجة

تم إضافة المكتبة المذكورة .. لكن بعد ذلك ظهر خطأ جديد

img?id=921442

 

402262300.jpg

هذا الخلل قد يكون ناتج عن عدم وجود تسمية توضيحية لبعض الحقول ، إن لم أكن مخطئاً ..

محاولةً لتلافي وتجاوز الحقول التي ليس لها تسمية توضيحية جرب الكود بالتعديل التالي :-

 

Private Sub Cmd2_Click()
    Dim Msg, Style, Title, result
    Msg = "سيتم الآن حذف جدول الصف الثاني! ننصح بتصدير الصف الثاني إلى الثالث أولاً!!! هل ترغب في الاستمرار؟؟"
    Style = vbInformation + vbYesNo + vbMsgBoxRight
    Title = "تحذير - حذف جدول الصف الثاني"
    result = MsgBox(Msg, Style, Title)
    If result = vbYes Then
        DoCmd.SetWarnings False
        DoCmd.DeleteObject acTable, "tbl_student2"
        DoCmd.RunSQL "SELECT tbl_student.* INTO tbl_student2 FROM tbl_student;"
        Dim db As DAO.Database
        Dim tdfSource As DAO.TableDef
        Dim tdfDest As DAO.TableDef
        Dim fldSource As DAO.Field
        Dim fldDest As DAO.Field
        Set db = CurrentDb
        Set tdfSource = db.TableDefs("tbl_student")
        Set tdfDest = db.TableDefs("tbl_student2")
        For Each fldSource In tdfSource.Fields
            For Each fldDest In tdfDest.Fields
                If fldDest.Name = fldSource.Name Then
                    On Error Resume Next
                    Dim prop As DAO.Property
                    Set prop = fldSource.Properties("Caption")
                    If Err.Number = 0 Then
                        fldDest.Properties("Caption").Value = prop.Value
                    End If
                    On Error GoTo 0
                End If
            Next fldDest
        Next fldSource
        MsgBox "تم حذف جدول الصف الثاني وإحلال محتويات الصف الأول في جدول جديد باسم الصف الثاني", vbOKOnly + vbMsgBoxRight, "إعلام حذف"
        DoCmd.SetWarnings True
    ElseIf result = vbNo Then
        DoCmd.CancelEvent
        MsgBox "!!! لقد تم إيقاف عملية الحذف", vbOKOnly + vbMsgBoxRight, "إعلام توقف عن الحذف"
    End If
End Sub

 

  • Like 1
قام بنشر
25 دقائق مضت, أحمد العيسى said:

تمام أصبح بلا أخطاء

لكن ما زال رؤوس الجدول الجديد الناتج بأسماء الحقول الإنجليزية وليست بأسماء التسمية التوضيحية

 

انت لو وضعت مثالا صغيرا  (مرفق)

لما احتجت الى كل هذه المشاركات والانتظار

على كل حال الحل هو  حسب الخطوات:

1- سطر لحذف الجدول 2

2- سطر لاانشاء جدول بواسطة الاستعلام باسم جدول 2 من المصدر جدول1

 

  • Like 1
قام بنشر
24 دقائق مضت, ابوخليل said:

على كل حال الحل هو  حسب الخطوات:

1- سطر لحذف الجدول 2

2- انشاء جدول بواسطة الاستعلام باسم جدول 2 من جدول1


بعد اذن استاذى الجليل ومعلمى القدير و والدى الحبيب الاستاذ @ابوخليل :fff:

حياكم الله وبياكم
الموضوع به تحد كبير فعلا على استحياء دعنى اوضح لك الامور لتتضح الرؤية

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

يعنى ابه الكلام دة ببساطة سوف اشرح على الصور الاتية

000000.JPG.67fd712eceb958c6dcc8a940d4a0027f.JPG

الجزء المأطر بالازرق والذى يحمل العنوان Description ( Optional ) والذى يتم فيه كتابة وصف لكل حقل
والجزء المأطر بالاسفل باللون البنفسجى وهو الـ Caption  لكل حقل 

هذان يعدان من خصائص الحقول داخل الجدول 


عند عمل حذف للجدول الثانوى ونسخ الجدول الاساسى لا يأتى الجدول الجديد وليد عملية الاستنساخ بهذه الخصائص لاعداد الحقول فى الجدول الاساسى

ولكن  ولكن ولكن

 

والله اعلم اعتقد قد يكون لها حل برمجى وانا ان شاء الله اعمل على ذلك 


 

  • Like 1
قام بنشر

قد يكون الترتيب التالي أفضل

1. حذف الجدول المستهدف كاملاً ،

2. إنشاء نسخة ثانية من الجدول المصدر ،

3. إعادة تسمية الجدول الجديد بالاسم المطلوب ،

4. جملة استعلام حذف جميع السجلات في الجدول الجديد ،

 

وهذا كفيل بإبقاء التسمية التوضيحية موجودة كما في الجدول الأصل ( المصدر )

 

* وجهة نظر قابلة للنقاش

  • Like 1
  • Haha 1
قام بنشر
1 دقيقه مضت, Foksh said:

2. إنشاء نسخة ثانية من الجدول المصدر ،

 

لو ركزت شوية فى كلامى 

8 دقائق مضت, ابو جودي said:

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

بدون نقاش انت جرب وشوف علشان تتأكد 

قام بنشر

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

لو عاوز الفكرة اللى بتدور فى مخيلتى نظريا 

ارجع لموضوع الجداول بتاعك بتاع انشاء الجدول الديناميكى

فى جزء يخص خضائص الحقل عند انشاء الجدول الجديد

ده شق الاجابة الثانى والمطلوب لتحقيق اجابة السؤال

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

اسم الحقل نوع الحقل وصف الحقل تسمية الحقل 
 

ويتم تمرير البسانات دى للكود بتاعك اللى اتكلمنا عنه فى الشق الاول  :eek2:

لفة رخمة وعاوزة روقان بجد

قام بنشر

عملت حل سابقاً لهذا الموضوع

وهو إنشاء نسخة أخرى جديدة من الجدول المستهدف ( البنية فقط )

فى هذه الحالة التسمية سوف تكون موجودة

ثم حذف محتوى الجدول بهذا السطر ( وسوف يكون التسمية موجودة بعد الحذف ) إذا كان تم ملئه

DoCmd.RunSQL "DELETE tbl_Student2.* FROM tbl_Student2;"

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

DoCmd.RunSQL "SELECT tbl_student.* INTO tbl_student2 FROM tbl_student;"

أما فى عدم إرفاقى قاعدة البيانات السبب هو أنه تم عملها  على 2003  كما أن بها الكثير من الخصوصيات

قام بنشر
15 دقائق مضت, ابو جودي said:

لو ركزت شوية فى كلامى 

بدون نقاش انت جرب وشوف علشان تتأكد 

اعتذر فعلاً ، لإن الصفحة كانت مفتوحة عند رد معلمي وأستاذي أبو خليل ولم أقم بالتحديث ( متابع من الجوال 😅 )

 

12 دقائق مضت, ابو جودي said:

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

لو عاوز الفكرة اللى بتدور فى مخيلتى نظريا 

ارجع لموضوع الجداول بتاعك بتاع انشاء الجدول الديناميكى

فى جزء يخص خضائص الحقل عند انشاء الجدول الجديد

ده شق الاجابة الثانى والمطلوب لتحقيق اجابة السؤال

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

اسم الحقل نوع الحقل وصف الحقل تسمية الحقل 
 

ويتم تمرير البسانات دى للكود بتاعك اللى اتكلمنا عنه فى الشق الاول  :eek2:

لفة رخمة وعاوزة روقان بجد

كلامك صحيح ، والروقان هييجي بعد ما اعمل ريفريش لكل صفحة علشان أحفظ خط الرجعة 🤣😂

 

جايلك يا حبيبي جايلك ، بس أما أروووق

  • أفضل إجابة
قام بنشر
5 ساعات مضت, أحمد العيسى said:

 

أما فى عدم إرفاقى قاعدة البيانات السبب هو أنه تم عملها  على 2003  كما أن بها الكثير من الخصوصيات

 2003 .. جميع الاصدارات اللاحقة تتعامل معه

على كل حال اليك الحل :

بعد حذف الجدول table2

خلف الزر الصق هذا السطر :

DoCmd.CopyObject , "table2", acTable, "table1"

على اعتبار  table1 هو الجدول الأساس

 

وحسب تسمياتك في مشروعك سيكون الكود كاملا :

DoCmd.SetWarnings False
DoCmd.DeleteObject acTable, "tbl_Student2"
DoCmd.CopyObject , "tbl_Student2", acTable, "tbl_Student"
DoCmd.SetWarnings True

 

  • Like 2

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

زائر
اضف رد علي هذا الموضوع....

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

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

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

Important Information