الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

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

بدأه هانى عوض في 3 مايو 2008 · 33 رد · 5,571 مشاهدة · في قواعد بيانات Microsoft Access
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

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

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

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

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

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

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

المطلوب:

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

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

#2

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

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

مثلا ...

For X = 1 To 5

سطر الالغاء

Next X

طبتم واهتديتم :)

===================================

إقرأ معي

رابط متجدد لكتاب أقرؤه فشاركني فيه

======

فضائح الرافضة ومخازيهم حين يكتب عنها أحد خصومهم فهذا شيء متوقع ،فإن كتب عنها أحدهم فهو شيء غير مألوف ، وإن كان الكاتب أحد مراجعهم وأخص خواصهم فهذا شيء متناهي الغرابة ، وإن علمت أن الكاتب قد قتل بعد نشر الكتاب فقد حان وقت قراءة الكتاب

الكتاب :

حسين الموسوي - لله تم للتاريخ ، كشف الأسرار وتبرئة الأئمة الأطهار

اضغط على الصورة لتحميل الكتاب

%E1%E1%E5%20%CB%E3%20%E1%E1%CA%C7%D1%ED%CE.jpg

-----------

كتب سابقة

سعد الدين الشاذلي - مذكرات حرب أكنتوبر

#3

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

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

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

#4

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

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

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

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

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

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

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

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

#5

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

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
#6

السلام عليكم

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

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

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

عملت جدول 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 في 5 مايو 2008 في 16:41

#7

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

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

جاري التجربة

#8

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

ولكن من طريقة حلكم "أخى 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...

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

أخوك هانى

تم تعديل هذه المشاركة بواسطة هانى عوض في 5 مايو 2008 في 15:38

#9
sx1 كتب:
بسم الله الرحمن الرحيم

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

جاري التجربة

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

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

تبدل إلى

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

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

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

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

أخوك هانى

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

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

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

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

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

تم تعديل هذه المشاركة بواسطة ekseer في 5 مايو 2008 في 17:14

#10

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

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

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

#11
اقتباس
بارك الله فيك اخي همام

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

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

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

همام

وَمِنَ النَّاسِ مَن يُعْجِبُكَ قَوْلُهُ فِي الْحَيَاةِ الدُّنْيَا وَيُشْهِدُ الله عَلَى مَا فِي قَلْبِهِ وَهُوَ أَلَدُّ الْخِصَامِ

مواضيعي ومشاركاتي

#12

أخى الكريم 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

وشكراً

تم تعديل هذه المشاركة بواسطة هانى عوض في 5 مايو 2008 في 18:36

#13

السلام عليكم

أخى الكريم Ekseer

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

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

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

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

27169617.gif
#14

أخى moh samer ali

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

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

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

#15

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

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

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

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

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

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

اكسيرالحياة

#16

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

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

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

27169617.gif
#17

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

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

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

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

سلام

Ek_Final_Backup.rar

#18

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

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

أخي moh samer ali

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

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

ekseer

تم تعديل هذه المشاركة بواسطة ekseer في 5 مايو 2008 في 23:21

#19

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

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

27169617.gif
#20

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

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

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

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

post-139265-1210056802_thumb.gif

27169617.gif
#21

أخي moh samer ali

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

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

#22

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

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

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

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

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

#23

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

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

27169617.gif
#24

بارك الله فيكم جميعا على هذة الافادة الكبيرة

#25

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

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

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

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

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

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

هذا منطقي ؟

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

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

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

27169617.gif

مواضيع مشابهة

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…