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

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

قام بنشر

السلام عليكم ..

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

المثال المبسط مرفق ادناه..مع التقدير

مثال1.rar

قام بنشر

وعليكم السلام:smile:

 

ضعي هذا الكود على زر:

 


    Dim strSQL As String
    Dim rst As DAO.Recordset
    Dim childrst As DAO.Recordset
    Dim db As DAO.Database
    Dim RC As Integer
    Dim i As Integer
    
    
    'from https://stackoverflow.com/a/42239279
    
    strSQL = "SELECT * FROM Table1 WHERE Not (Table1.image.FileData) Is Null;"

    Set db = CurrentDb
    Set rst = db.OpenRecordset(strSQL, dbOpenDynaset, dbSeeChanges)

    If Not rst.BOF And Not rst.EOF Then
        rst.MoveFirst
    End If

    Do Until rst.EOF

        Set childrst = rst.Fields("image").Value
        childrst.MoveLast: childrst.MoveFirst
        RC = childrst.RecordCount
        
        For i = 1 To RC
            'Debug.Print rst!ID & " > " & childrst.Fields("FileName")
            'If childrst.Fields("FileName") = "11.jpg" Then
                childrst.Delete
            'End If
            
            childrst.MoveNext
        Next i

        rst.MoveNext
    Loop

.

جعفر

  • Like 3
  • Thanks 1
قام بنشر

اهلا استاذ جعفر سلمت الايادي ..

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

strSQL = "SELECT Table1.ID, Table1.image FROM Table1 WHERE (((Table1.ID) Like [Forms]![Form1]![ID]) AND ((Table1.image.FileName) Is Not Null));"
Option Compare Database
    Private Sub Command32_Click()
    Dim strSQL As String
    Dim rst As DAO.Recordset '1_________>> DAO.Recordset
    Dim childrst As DAO.Recordset
    Dim db As DAO.Database
    Dim RC As Integer
    Dim i As Integer
    'from https://stackoverflow.com/a/42239279
    strSQL = "SELECT * FROM Table1 WHERE Not (Table1.image.FileData) Is Null;"
    Set db = CurrentDb
    Set rst = db.OpenRecordset(strSQL, dbOpenDynaset, dbSeeChanges) '2__>>.OpenRecordset(strSQL, dbOpenDynaset, dbSeeChanges)

    If Not rst.BOF And Not rst.EOF Then '3_______>> BOF
        rst.MoveFirst___________________ '4_______>>MoveFirst
    End If
    Do Until rst.EOF
        Set childrst = rst.Fields("image").Value
        childrst.MoveLast: childrst.MoveFirst '5___>> childrst.MoveLast (:) childrst.MoveFirst
        RC = childrst.RecordCount
                For i = 1 To RC
                childrst.Delete
                childrst.MoveNext
        Next i

        rst.MoveNext
        
        Loop
End Sub

 

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

كود حذف المرفق.accdbبعد إذن أستاذنا الكبير @jjafferr

هذا الكود لحذف المرفق فى السجل الحالى

وفقكم الله

    Dim rst As DAO.Recordset
    Dim childrst As DAO.Recordset
    Dim db As DAO.Database
    Dim nn As String
    nn = "update table1 set [image].filedata =null WHERE Table1.ID =" & Me.ID
    strSQL = "SELECT * FROM Table1"
    Set db = CurrentDb
    Set rst = db.OpenRecordset(strSQL, dbOpenDynaset, dbSeeChanges)
    rst.MoveFirst
    db.Execute nn
    Me.Requery

كود حذف المرفق.accdb

تم تعديل بواسطه عبد الفتاح كيرة
  • Like 1
  • Thanks 1
قام بنشر

هلا والله اخوي عبد الفتاح:smile:

 

فكرة حلوة ، بس:blink:

شوف الحقل في الجدول بعد الحذف ، وحاول تفتح المرفق من هناك!!

 

هذا الحقل ليس كحقل آخر عادي ، فيجب التعامل معه بطريقة اخرى:smile:

 

جعفر

  • Like 1
قام بنشر

انظر الى الحقل في الجدول الآن ، ستجد ان المرفقات لاتزال موجودة ، ولكن الاكسس لا يستطيع فتحها!!

 

 

 

تفضلي اختي :

1. لكي تحذفي مرفقات السجل الذي انتي عليه فقط ،

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

929.Clipboard01.jpg.243be381a13eae2ed8f915df2708e761.jpg

 

جعفر

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

والآن اجيب على اسئلتك:

 

21 ساعات مضت, ام ناصر said:

    Dim rst As DAO.Recordset '1_________>> DAO.Recordset
    
    Set rst = db.OpenRecordset(strSQL, dbOpenDynaset, dbSeeChanges) '2__>>.OpenRecordset(strSQL, dbOpenDynaset, dbSeeChanges)

    If Not rst.BOF And Not rst.EOF Then '3_______>> BOF
        rst.MoveFirst___________________ '4_______>>MoveFirst
    
        childrst.MoveLast: childrst.MoveFirst '5___>> childrst.MoveLast (:) childrst.MoveFirst
    

 

1. هناك نوعين من Recordset ، نوع يخص DAO وآخر يخص ADO ، ومع تشابههما ، إلا ان هناك الكثير من الاوامر التي تختلف بينهم ،

فإذا لم نخصص نوع الـ Recordset ، فالاكسس يستعمل مكتبة الاولى في القائمة ، مثلا ، في الصور التالية ، مكتبة ADO قبل مكتبة DAO ، فعند كتابة Recordset فقط ، فالاكسس يعتبرها تابعه لـ ADO:

في الاكسس 2003

929.Clipboard03.jpg.1b0c5953e47c0085eb1712d4af73a5db.jpg

.

وفي الاكسس 2010 فما فوق تم دمج مكتبة DAO في MS Office 14 Access Database engine object

929.Clipboard02.jpg.47d70d4d095cd3140d2f8641b312a6ae.jpg

.

 

2. هذا امر OpenRecordset ، فيه عدة اختيارات ، والمبرمج اختار هذه لأسبابه ، ويمكنك الاستغناء عن الجزئين الاخيرين منها ، حيث هذا يكفي:

(Set rst = db.OpenRecordset(strSQL

.

3. المؤشر في سجلات Recordset يكون كما في القائمة التالية:

BOF

Record1

Record2

..

..

EOF

 

حيث BOF = Begining Of File

EOF = End Of File

فإذا كنا على BOF  او EOF فلا يوجد هناك سجلات ،

فالسطر معناه ، اننا مادمنا لسنا قبل بداية ولا بعد نهاية الـ Recordset ، فقم بالخطوة التالية ،

 

4. انتقل الى اول سجل تصادفه (رجاء متابعة النقطة التالية) ،

5. اذا اردنا ان نجعل الـ Recordset بالكامل في ذاكرة الكمبيوتر ، فعلينا ان نأخذ المؤشر الى آخر سجل ، ثم عندما نأخذ المؤشر الى اول سجل ، فيعرف البرنامج عدد سجلات هذا الـ Recordset ،

بينما في الرقم#4 اعلاه ، فنحن طلبنا منه البدء من اول سطر وبدون معرفة عدد السجلات ،

والنقطتين معناها سطر جديد في الكود ، يعني:

بدل كتابة
For i = 1 To RC
    childrst.Delete
    childrst.MoveNext
Next i


يمكننا كتابة
For i = 1 To RC: childrst.Delete : childrst.MoveNext : Next i

.

ولكننا اذا عملنا هذا الشيء لكل الكود ، فلن نعرف كيف نتصيد الخطأ ، ولا نستطيع استعمال Goto ،

فنحن نستعمله في نطاق نعمل انه لن تكون لدينا اخطاء فيه:smile:

 

جعفر

  • Like 3
  • Thanks 3
قام بنشر
53 دقائق مضت, jjafferr said:

والآن اجيب على اسئلتك:

 

 

1. هناك نوعين من Recordset ، نوع يخص DAO وآخر يخص ADO ، ومع تشابههما ، إلا ان هناك الكثير من الاوامر التي تختلف بينهم ،

فإذا لم نخصص نوع الـ Recordset ، فالاكسس يستعمل مكتبة الاولى في القائمة ، مثلا ، في الصور التالية ، مكتبة ADO قبل مكتبة DAO ، فعند كتابة Recordset فقط ، فالاكسس يعتبرها تابعه لـ ADO:

في الاكسس 2003

929.Clipboard03.jpg.1b0c5953e47c0085eb1712d4af73a5db.jpg

.

وفي الاكسس 2010 فما فوق تم دمج مكتبة DAO في MS Office 14 Access Database engine object

929.Clipboard02.jpg.47d70d4d095cd3140d2f8641b312a6ae.jpg

.

 

2. هذا امر OpenRecordset ، فيه عدة اختيارات ، والمبرمج اختار هذه لأسبابه ، ويمكنك الاستغناء عن الجزئين الاخيرين منها ، حيث هذا يكفي:


(Set rst = db.OpenRecordset(strSQL

.

3. المؤشر في سجلات Recordset يكون كما في القائمة التالية:

BOF

Record1

Record2

..

..

EOF

 

حيث BOF = Begining Of File

EOF = End Of File

فإذا كنا على BOF  او EOF فلا يوجد هناك سجلات ،

فالسطر معناه ، اننا مادمنا لسنا قبل بداية ولا بعد نهاية الـ Recordset ، فقم بالخطوة التالية ،

 

4. انتقل الى اول سجل تصادفه (رجاء متابعة النقطة التالية) ،

5. اذا اردنا ان نجعل الـ Recordset بالكامل في ذاكرة الكمبيوتر ، فعلينا ان نأخذ المؤشر الى آخر سجل ، ثم عندما نأخذ المؤشر الى اول سجل ، فيعرف البرنامج عدد سجلات هذا الـ Recordset ،

بينما في الرقم#4 اعلاه ، فنحن طلبنا منه البدء من اول سطر وبدون معرفة عدد السجلات ،

والنقطتين معناها سطر جديد في الكود ، يعني:


بدل كتابة
For i = 1 To RC
    childrst.Delete
    childrst.MoveNext
Next i


يمكننا كتابة
For i = 1 To RC: childrst.Delete : childrst.MoveNext : Next i

.

ولكننا اذا عملنا هذا الشيء لكل الكود ، فلن نعرف كيف نتصيد الخطأ ، ولا نستطيع استعمال Goto ،

فنحن نستعمله في نطاق نعمل انه لن تكون لدينا اخطاء فيه:smile:

 

جعفر

معلومات قيمة أستاذ جعفر

أظنها رد فى موضوع آخر

عموما شكرا لك

قام بنشر
2 دقائق مضت, عبد الفتاح كيرة said:

معلومات قيمة أستاذ جعفر

أظنها رد فى موضوع آخر

عموما شكرا لك

 

حياك الله:smile:

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

 

جعفر

  • Like 1
  • Thanks 2
قام بنشر (معدل)

كل الشكر والتقدير لأستاذنا الفاضل جعفر لسعة الصدر في الرد على تساؤلاتنا  فعلاً كنت طالبة شرح للاختصارات الموجودة في الكود لعدم معرفتي في آلية أستخدامها اضافةً لطلبي حذف المرفق وفق شرط  والنتيجة كانت مرضية  

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

تم تعديل بواسطه ام ناصر
  • Like 1

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.

×
×
  • اضف...

Important Information