• 0
هانى عوض

[ تمت الإجابة ]حذف مجلدات النسخ الاحتياطى التى تتعدى 5 مجلدات

سؤال

أخوانى الكرام عمتم مساءً

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

	Call Shell("xcopy /y d:\Delta\Data.mdb D:\Delta\Backup\" & Format(date, "dd-mm-yyyy") & "\", 3)
MsgBox "تم عمل نسخة احتياطية لهذا اليوم بنجاح", , "نسخة احتياطية"

ويتم عمل هذا الكود فى كل مرة يتم غلق البرنامج!!

وطبعاً بعد فترة من الزمن تكدست المجلدات التى تحتوى على النسخة الاحتياطية!!

حاولت عمل كود يتحكم فى عدد المجلدات الموجودة ومن ثم يقوم بالاحتفاظ بآخر خمس مجلدات فقط على اعتبار أن هذه المجلدات هى آخر خمس أيام تم التعامل معها فى ادخال البيانات ولكن للأسف لم تجدى معى أى طريقة.. فتقريباً أغلب الطرق التى أعرفها تتحكم فى الملفات وليست المجلدات..

المطلوب:

عمل كود يقوم بالاحتفاظ بآخر خمس مجلدات .. مع العلم أن أسماء المجلدات تأخذ اسم تاريخ اليوم الذى تم عمل به النسخة هكذا {01-05-2008} مثل الفورمات الموجود بالكود من اليسار إلى اليمين وهى بالانجليزى..

وشكراً مقدماً أخوانى الكرام على الاهتمام

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

33 إجابة على هذا السؤال .

  • 0

مرحب يا هاني :rolleyes:

جرب امر الالغاء delete او erase داخل الدالة call shell مع وضع السطر داخل Loop من 5 مرات

مثلا ...

For X = 1 To 5

سطر الالغاء

Next X

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

بسم الله الرحمن الرحيم

بارك الله فيك اخي هاني ان طرحت هذا السؤال فهو يواجه اعضاء كثر انا اولهم واضطر الى المسح اليدوي للملفات

وبارك الله فيك اخي ايهاب ان تحاول الحل ولكن هل يمكن التوضيح اكثر ووضع المثال الذي ينهي هذه المشكلة

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

شكراً جزيلاً أخى إيهاب على الفكرة... :unsure:

ومرحباً بأخى sx1 على مروره وكذلك تنشيط الموضوع أكثر...

ولكن أظن الموضوع أصعب من ذلك...

فالمجلد يحمل اسم تارياخ الأيام التى يتم بها الحفظ

لذلك نحتاج لدالة تقوم بالبحث أولاً... متحسسة حالة تسمية المجلد..

ومن ثم حذف ما زاد تاريخه عن خمس أيام من تاريخ اليوم

والله أعلم :unsure:

وشكراً مجددا على محاولة المساعدة.

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

هذه مثلاً محاولة... ولكن لم أتوصل للحل!!

Dim i As Integer
Set fs = Application.FileSearch
With fs
.LookIn = "D:\Delta\Backup\"
If .Execute > 0 Then
For i = 1 To .FoundFiles.Count - 5
If .FoundFiles(i) > 5 Then
Kill .FoundFiles(i)
End If
Next i
Else
MsgBox "folder not found"

End If
End With

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

السلام عليكم

ولكن أظن الموضوع أصعب من ذلك...

انا كنت أتوقع أن الموضوع سهل .. لكن !! طلع معقد بعض الشيء

عموما عملت مثال ( إن شاء الله يفي بالغرض - شرح المثال كما يلي

عملت جدول Tablpath به حقلين - أحدهما نص يمثل المسار الاولى للفهرس

والحقل الثاني - تاريخ - يمثل تاريخ انشاء الباكب - ووضعت قيمته الافتراضيه

Date()

وبعد كود الباكب عملت عبارة SQL هذه

DoCmd.RunSQL ("INSERT INTO Tablpath ( Foldersname )SELECT 'C:\Delta\Backup\'")

مهمة هذا الكود هو انشاء الدليل - كلما ضغط المستخدم - زر الباكب - تمام

ثم عملت استعلام مبني على الجدول - من أجل ضبط تنسيق المسار - وحساب فرق الايام

path: ([Dirname] & "" & Format([DirDate];"dd-mm-yyyy"))

Df: DateDiff("d";[DirDate];Date())

ووضعت شرط للحقل فرق الايام هو

>=5

مهمته تحديدا - إظهار جميع التواريخ التي تسبق تاريخ اليوم بـ 5 أيام فما فوق - زين

الأن تبقى شيئين مهمين ( نريد دالة تحذف مجلد بما فيه من محتوى) لأن أكواد التعامل مع المجلدات قليلة ؟ جدا

ولايوجد دالة جاهزة لذات الوظيفة - جميع الدوال تتعامل مع الملفات - وجدت دالة تحذف الفهرس اذا كان فاضي

وبالطبع لا تنفع مع مثالنا هذا ؟ لإن الادالة بها القاعدة ؟ المهم وجدت أخيرا الحل بهذه الوظيفة ( أنظر الكود )

Function DelTree(ByVal strDir As String) As Long
Dim x As Long
Dim intAttr As Integer
Dim strAllDirs As String
Dim strFile As String
DelTree = -1
On Error Resume Next
strDir = Trim$(strDir)
If Len(strDir) = 0 Then Exit Function
If Right$(strDir, 1) = "\" Then strDir = Left$(strDir, Len(strDir) - 1)
If InStr(strDir, "\") = 0 Then Exit Function
intAttr = GetAttr(strDir)
If (intAttr And vbDirectory) = 0 Then Exit Function
strFile = Dir$(strDir & "\*.*", vbSystem Or vbDirectory Or vbHidden)
Do While Len(strFile)
If strFile <> "." And strFile <> ".." Then
intAttr = GetAttr(strDir & "\" & strFile)
If (intAttr And vbDirectory) Then
strAllDirs = strAllDirs & strFile & Chr$(0)
Else
If intAttr <> vbNormal Then
SetAttr strDir & "\" & strFile, vbNormal
If Err Then DelTree = Err: Exit Function
End If
Kill strDir & "\" & strFile
If Err Then DelTree = Err: Exit Function
End If
End If
strFile = Dir$
Loop
Do While Len(strAllDirs)
x = InStr(strAllDirs, Chr$(0))
strFile = Left$(strAllDirs, x - 1)
strAllDirs = Mid$(strAllDirs, x + 1)
x = DelTree(strDir & "\" & strFile)
If x Then DelTree = x: Exit Function
Loop
RmDir strDir
If Err Then
DelTree = Err
Else
DelTree = 0
End If
End Function

وهذا كود اللوب المطلوب ( للحذف )

Public Sub sevlop()
Dim rst As ADODB.Recordset
Set rst = New ADODB.Recordset
rst.Open "[Qmaster]", CurrentProject.Connection, _
adOpenDynamic, adCmdTable
Do Until rst.EOF
x = DelTree(rst!Path)
rst.Update
rst.MoveNext
Loop
rst.Close
DoCmd.RunSQL "DELETE Qmaster.* FROM Qmaster;"
MsgBox "تم حذف الباكب القديم", _
vbInformation + vbOKOnly, _
"EKSEER"
End Sub

الأن في الملف المرفق - القاعدة + مجلد باسم Delta

القاعدة الأكسس ضعها في أي مكان تشاء - أما المجلد Delta فيجب وضعه على الدرايف C:\

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

من مجلدات .. ثم اذهب للجدول - والاستعلام ثم تفحصهما ( وبعدها اذهب للبرنامج .. وشغل حذف الباكب القديم

تجد ان البرنامج حذف أليا جميع المجلدات التي تكون تواريخها قبل تاريخ اليوم بـ خمسة ايام )

- قد يواجهك رسائل التحذير الاستعلامات ( الحذف والالحاق ) - اعمل لها موافقة لأني لم اعطلها بالكود

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

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

لتاريخ اليوم ( لاتنس هذا ) لو لم تعملها سوف لن يفعل شيء - بعدها جرب مرة أخرى

أرجو أن أكون وفقت - والسلام

أخوكم اكسيرالحياة

Ek3_Backup.rar

تم تعديل بواسطه ekseer
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

بسم الله الرحمن الرحيم

بارك الله فيك اخي همام

جاري التجربة

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

كنت أظن الموضوع صعب قليلاً...

ولكن من طريقة حلكم "أخى ekseer" الذى تم عرضه .. وجدت أنه صعب جداً...

لم يخطر ببالى أن الموضوع يستحق عمل له جدول ومن ثم جملة Sql...

ولكن معك حق أخى الكريم فهذه الطريقة بالرغم من أنها صعبة ولكنها صحيحة 100% وهو المطلوب

هناك ملحوظة صغيرة على ما أظن يوجد خطأ سهواً فى جملة Sql فى اسم حقل الجدول

DoCmd.RunSQL ("INSERT INTO Tablpath ( Foldersname )SELECT 'C:\Delta\Backup\'")

تبدل إلى

DoCmd.RunSQL ("INSERT INTO Tablpath ( Dirname )SELECT 'C:\Delta\Backup\'")

أرجو تعديله فى الملف المرفق للفائدة

وشكراً جزيلاً أخى القدير Ekseer...

وآسف على تعبكم ومجهودكم المبذول لحل هذه المشكلة..

أخوك هانى

تم تعديل بواسطه هانى عوض
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0
بسم الله الرحمن الرحيم

بارك الله فيك اخي همام

جاري التجربة

:D - أنا وهمام واحد .. بارك الله فيك

هناك ملحوظة صغيرة على ما أظن يوجد خطأ سهواً فى جملة Sql فى اسم حقل الجدول

تبدل إلى

DoCmd.RunSQL ("INSERT INTO Tablpath ( Dirname )SELECT 'C:\Delta\Backup\'")

أرجو تعديله فى الملف المرفق للفائدة

وشكراً جزيلاً أخى القدير Ekseer...

وآسف على تعبكم ومجهودكم المبذول لحل هذه المشكلة..

أخوك هانى

مرحبا هاني تستاهل كل خير

وتم عمل التبديل المطلوب / ملاحظة جيدة / كنت قد جربت على مجموعة حقول وفاتني التعديل

أعرف أن الطريقة طويلة ومعقدة .. ومتيقن تماما أن هناك طريقة أسهل وأقصر .. لكن للأسف

هذا ما أسعفتني به الذاكرة حاليا

أخوكم : اكسيرالحياة

تم تعديل بواسطه ekseer
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

بسم الله الرحمن الرحيم

تمت الإجابة على الموضوع

إدارة الفريق العربي للبرمجة

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0
بارك الله فيك اخي همام

غريبة والله مع انني لم افعل اي شي.. ولكن الله يخليك وباذن الله اخدم في مكان اخر..

- أنا وهمام واحد .. بارك الله فيك

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

همام

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

أخى الكريم Ekseer

حتى لا يصبح هناك أى قصور فى المثال الذى أرفقته أخى.. وحتى يعمل 100% بكفاءة

لاحظ أنه يتم وضع هذا الكود تلقائياً عند غلق أى قاعدة ليقوم بعمل نسخة احتياطية ومن ثم يقوم بحذف ما زاد عن 5 أيام

فإذا قمت بفتح وغلق القاعدة أكثر من مرة فى اليوم المحدد طبعاً فى المجلد لن يكون هناك تكراراً للأسماء ولكن لاحظ الجدول "Tablpath" الخاص باسم المجلد المنسوخ ستجد أنه فى كل مرة يتم غلق البرنامج سيتكرر وضع مسمى للمجلد باسم اليوم وستجد أنه لليوم الواحد سيتكرر أكثر من مرة ومن ثم ستظهر عدة أخطأ

لذا وجب التعديل على خصائص الحقل الموجود فى الجدول"Tablpath" المسمى "DirDate" وجعل خاصية مفهرس = نعم (بدون تكرار)

وتفادى لظهور الرسائل التحذيرية يجب وضع الكود بهذه الطريقة "وقد تم دمج كود النسخ الاحتياطى مع كود حذف Backup"

	Call Shell("xcopy /y d:\Delta\Data.mdb D:\Delta\Backup\" & Format(date, "dd-mm-yyyy") & "\", 3)
MsgBox "تم عمل نسخة احتياطية لهذا اليوم بنجاح", , "نسخة احتياطية"

DoCmd.SetWarnings False
DoCmd.RunSQL ("INSERT INTO Tablpath (Dirname)SELECT 'd:\Delta\Backup\'")
Call sevlop
DoCmd.SetWarnings True

وشكراً

تم تعديل بواسطه هانى عوض
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

السلام عليكم

أخى الكريم Ekseer

أخي الكريم هاني عوض

جزاكم الله كل خير على هذا الابداع وجعل الله هذا العمل في ميزان حسناتكم ولي استفسار لو سمحتم لي على البرنامج الرائع

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

ارجو ان يكون هناك حل لمثل هذا الوضع وبارك الله بكم جميعا

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

أخى moh samer ali

يمكنك تحديد ما تريده من خلال سطر نسخ الملف كالآتى

Call Shell("xcopy /y d:\Delta\*.* D:\Delta\Backup\" & Format(date, "dd-mm-yyyy") & "\", 3)

لاحظ قد تم استبدال اسم الملف "Data.mdb" بـ "*.*" بذلك سيتم نسخ كافة الملفات الموجودة داخل مجلد "Delta" إلى مجلد النسخ الاحتياطى.

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

مرحبا - استاذ هاني

وفقك الله ياغالي .. الكود مؤكد به بعض القصور ولكن

مع مزيدا من التنقيح ومعالجة الاخطاء .. اكيد بيصبح أقوى

اتمنى منك - وضع النسخة النهائية من المثال هنا بعد التنقيح ( الذي ذكرته ) ياليت

ختى يستفيد منها أكبر عدد ممكن .. وفقك الله

أخي همام .. وفقك الله اينما كنت .. ولا داعي للإعتذار .. لكل انسان مشاغله

اكسيرالحياة

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

بارك الله بك اخي هاني عوض على سرعة تجاوبك

بعد التجربة تبين ان الكود بذلك نسخ كافة الملفات الموجودة داخل مجلد "Delta" إلى مجلد النسخ الاحتياطي فقط

واذا وضعنا مثلا مجلد اسمه مثلا "مجلد الصور" ضمن المجلد :Delta" لا ينسخه الكود فما السبب جزاك الله كل خير وبارك الله بك وبعلمك.

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

أخوانى الأعضاء الكرام

تم وضع النسخة النهائية من المثال الذى قام بعمله مشرفنا Ekseer بعد التنقيح حتى تعم الفائدة

وبالنسبة لأخى moh samer ali

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

سلام

Ek_Final_Backup.rar

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

شكرا يا استاذ هاني - على تنقيح الكود واعادة ارساله

واذا وضعنا مثلا مجلد اسمه مثلا "مجلد الصور" ضمن المجلد :Delta" لا ينسخه الكود فما السبب جزاك الله

أخي moh samer ali

اجابة على سؤالك في النص المقتبس

لسبب بسيط لأن الكود السابق ينسخ الملفات وليس المجلد ( هناك فرق ) الست معي !

ekseer

تم تعديل بواسطه ekseer
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

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

جزاك الله كل خير اخي الكريم ekseer على جهودك وجهود جميع الاخوة في هذا المنتدى والسلام عليكم .

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

اخواني بارك الله بكم

البرنامج يعمل 100% ولكن بعد نقل النموذج والجدول الى قاعدة بيانات جديدة للأسف يظهر خطأ في الكود الخاص بالغاء الملفات التي تزيد عن خمسة

رغم انني جربت اكسس 2002 واكسس 2003 ونفس المشكل رغم التأكد من تطابق المكتبات

وهذه صورة عن الخطأ

post-139265-1210056802_thumb.gif

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

أخي moh samer ali

هذه المشكلة سببها عدم نسخ الاستعلام الموجود مع المثال

قم باستيراد الاستعلام من المثال إلى القاعدة وستحل المشكلة تماماً....

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

بسم الله الرحمن الرحمن

بارك الله فيكم اخواني

بارك الله فيك اخي اكسير وحفظك واكرم مسعاك ورزقك من حيث لا تحتسب -لقد اخجلتني والله اخي الكريم بحسن ادبك وذوقك واحساسك الرفيع وحبك لاخوانك وشعورك انهم وانت واحد . حفظك الله اخي الكريم

وطبعا لن اخي هاني عوض وباقي الاخوة الذين اكملوا معنا لتصل المشاركة الى ما هي علي

اعذروني اخواني على ما جاء مني من تقصير

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

جزاك الله كل خير يا اخي هاني وانت معك حق لاني نسيت الاستعلام من الحسبة

ارجو من الله عز وجل ان يجعلك في المراتب العليا من الجنة يا رب انت ومن شارك في هذه المشاركة المفيدة فعلا

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

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

الاخ الكريم هاني عوض الاخوان الذين عملوا على هذا المثال...

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

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

بعد التدقيق تبين معي التالي :

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

هذا منطقي ؟

ومن هنا اتى الحل وهذا طبعا اقتراح ولكم التجربة والخيار ......نقوم بتعديل الاستعلام المسمى Qmaster بتعديل الخاصية القيم العليا الى الرقم (1) والفرز للقيمة Df الى تنازلي وبذلك نحدد النسخة الاقدم بين النسخ وايضا يتم تحديد عدد (1) من النسخ الاحتياطية للالغاء ونضمن عدم الغاء اكثر من نسخة ونحافظ على بقية النسخ.

ارجو ان اكون وفقت بتوصيل الفكرة لكم وتقبلوا احترامي وتقديري .....

اخوكم ابو عدنان......

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

ماشاء الله

جزاكم الله خيرا

44782353.gif

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

من فضلك سجل دخول لتتمكن من التعليق

ستتمكن من اضافه تعليقات بعد التسجيل



سجل دخولك الان

  • يستعرض القسم حالياً   0 members

    لا يوجد أعضاء مسجلين يشاهدون هذه الصفحة .