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

مشكله في ضغط واصلاح قاعدة البيانات

بدأه MUSCAT_LOVER في 23 أغسطس 2009 · 13 رد · 1,516 مشاهدة · في قواعد بيانات Microsoft Access
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

اخواني الاعزاء في الفريق العربي للبرمجه

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

تم تعديل هذه المشاركة بواسطة همام ابوعرقوب في 23 أغسطس 2009 في 20:22

#2

تفضل اخي هذا المثال اتمنا ان يوفي بالغرض

________________________.rar

#3

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

Private Sub Form_Timer()

'==================================================================

'The Timer event runs this code every minute. It compares your

'system time with the StartTime variable. When they match, it

'begins compacting all databases in the DBNames table.

'==================================================================

Dim StartTime As String

' Set this variable for the time you want compacting to begin.

StartTime = "12:00 AM"

' If StartTime is now, open the DBNames table and start compacting

If Format(Now(), "medium time") = Format(StartTime, _

"medium time") Then

Dim RS As DAO.Recordset, DB As DAO.Database

Dim NewDBName As String, DBName As String

Set DB = CurrentDb()

Set RS = DB.OpenRecordset("DBNames")

On Error Resume Next

RS.MoveFirst

Do Until RS.EOF

DBName = RS("DBFolder") & "\" & RS("DBName")

' Create a new name for the compacted database.

' This example uses the old name plus the current date.

NewDbName = Left(DbName, Len(DbName) - 4)

NewDbName = NewDbName & " " & Format(Date, "MMDDYY") & ".mdb"

DBEngine.CompactDatabase DBName, NewDBName

RS.MoveNext

Loop

' Close the form, and then close Microsoft Access

DoCmd.Close acForm, "CompactDB", acSaveYes

RS.Close

DoCmd.Quit acSaveYes

End If

End Sub

#4

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

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

compact.zip

#5

أخي الكريم... لدي بعض الاستفسارات. مثلاً، هل أنت على علم بمتطلبات استخدام الأمر CompactDatabase؟

نسخت هاتين الفقرتين من ملفات مساعدة أكسس:

اقتباس

You must close olddb before you compact it. In a multiuser environment, other users can't have olddb open while you're compacting it. If olddb isn't closed or isn't available for exclusive use, an error occurs.

Because CompactDatabase creates a copy of the database, you must have enough disk space for both the original and the duplicate databases. The compact operation fails if there isn't enough disk space available. The newdb duplicate database doesn't have to be on the same disk as olddb. After successfully compacting a database, you can delete the olddb file and rename the compacted newdb file to the original file name

.

الفقرة الثانية تقترح حل حذف قاعدة البيانات القديمة وتسمية قاعدة البيانات الجديدة بنفس الاسم القديم، هذا لأن هذا الأمر يعني:

اقتباس
Copies and compacts a closed database

فلا بد من قاعدة بيانات أخرى...

هناك حلول أخرى، مثل اختيار الضغط التلقائي عند غلق قاعدة البيانات من قائمة أدوات تبويب عام... وغيرها من الحلول التي تعتمد على المكان الذي ستنفذ منه الكود (نفس قاعدة البيانات أو من قاعدة بيانات أخرى)، وهل ستكون مفتوحة أم مغلقة...

والله أعلم...

ملحوظة: في حالة ناسبك حل حذف القديم وإعادة تسمية الجديدـ من الممكن أن أزودك بكود مناسب...

أخوك أحمد.

تم تعديل هذه المشاركة بواسطة أحمد مبارك الحيقي في 23 أغسطس 2009 في 12:38

#6

اشكرك اخي على طيب الاهتمام بالنسبة لمتطلبات

CompactDatabase

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

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

#7

هل أفهم من كلامك أن قاعدة البيانات في السيرفر يتم إغلاقها في وقت ما؟ إن كان الأمر كذلك فالحل الأسهل أن تختار (أدوات>خيارات>عام>الضغط عند الإغلاق) أو نحوها من الكلمات (نسختي إنجليزية)... وهذا الخيار يقوم بضغط قاعدة البيانات عند إغلاقها تلقائياً...

لاحظ أنه يجب إغلاق قاعدة البيانات وفتحها حصرياً من أجل تطبيق CompactDatabase...

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

الأمر الذي يمكن أن تستخدمه في النموذج هو

SendKeys {% (TDC)}

وهو يحاكي اختيار الضغط والإصلاح من قائمة أدوات>أدوات مساعدة لقواعد البيانات>الضغط... والنموذج سيستخدم نفس الكود الذي أرفقته من أجل التوقيت... لكن بهذا الأمر أعلاه بدلاً من CompactDatabase...

والله أعلم...

تم تعديل هذه المشاركة بواسطة أحمد مبارك الحيقي في 23 أغسطس 2009 في 21:10

#8

اشكرك اخي احمد على الاهتمام بعد ان يأست من ان يرد علي احد

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

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

Private Sub Form_Timer()
'==================================================================
'The Timer event runs this code every minute. It compares your
'system time with the StartTime variable. When they match, it
'begins compacting all databases in the DBNames table.
'==================================================================
Dim StartTime As String
' Set this variable for the time you want compacting to begin.
StartTime = "01:30 PM"
' If StartTime is now, open the DBNames table and start compacting
If Format(Now(), "medium time") = Format(StartTime, _
		"medium time") Then
   Dim RS As DAO.Recordset, DB As DAO.Database
   Dim NewDBName As String, DBName As String
   Set DB = CurrentDb()
   Set RS = DB.OpenRecordset("DBNames")
   On Error Resume Next
   RS.MoveFirst
   Do Until RS.EOF
	  DBName = RS("DBFolder") & "\" & RS("DBName")
	  ' Create a new name for the compacted database.
	  ' This example uses the old name plus the current date.
	  NewDBName = Left(DBName, Len(DBName) - 4)
	  NewDBName = NewDBName & " " & Format(Date, "DDMMYY") & ".mdb"
	  DBEngine.CompactDatabase DBName, NewDBName
	  RS.MoveNext
   Loop
' Close the form, and then close Microsoft Access
DoCmd.Close acForm, "CompactDB", acSaveYes
RS.Close
DoCmd.Quit acSaveYes
End If
End Sub

compact.zip

#9

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

لكن، إذا كانت قاعدة البيانات ستبقى مفتوحة، ما رأيك أن تستخدم نفس النموذج والماكرو في قاعدة بياناتك التي أرفقتها، لكن مع اختلافين:

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

استخدم الكود التالي عوضاً عن الكود الذي أرفقته:

Private Sub Form_Timer()
	Dim StartTime As String
	StartTime = "1:02 PM"
	If Format(Now(), "medium time") = Format(StartTime, "medium time") Then
		SendKeys "%(TDC)"
	End If
End Sub

هذا الكود البسيط يستخدم طريقة شائعة في تقليد الضغط يدوياً على مفاتيح Alt ثم T وD وC، وهو ما يفتح قائمة Tools ثم Database Utilities ثم Compact and Repair Database في النسخة الإنجليزية. لن تحتاج طبعاً إلى الجدول الذي يحتفظ بأسماء قواعد البيانات في ملفك المرفق، لأن هذا الكود يعمل في الوقت المحدد من قاعدة بيانات السيرفر نفسها...

#10

اخي احمد جزاك الله خيرا كثيرا

لدي طلبين ان امكن

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

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

وجزاك الله الف خير

#11

اخي احمد

هل لديك كود يعمل ضغط واصلاح في توقيت معين احدده بنفسي

هذا ما اريده بالتحديد .................. رجاءا ساعدوني

#12

السلام عليكم

جرب اخى الكريم

هذه الوصلات إن شاء الله تفيدك .. اكتبها على السريع

http://groups.google.com.eg/group/microsof...5383dcd3f4e597a

http://groups.google.com.eg/group/microsof...2654ce083986bc0

http://groups.google.com.eg/group/comp.dat...54d230c406a532d

http://support.microsoft.com/kb/158937

http://www.databasejournal.com/features/ms...-VBS-Script.htm

بالتوفيق

الأصيل

تم تعديل هذه المشاركة بواسطة الاصيل في 24 أغسطس 2009 في 14:45

قال أبن القيم : أكثروا من الخير فينتشر .. و أقلوا من الشر فيندثر ..

#13

أخي الكريم... بالإضافة إلى وصلات أخينا الأصيل جزاه الله خيراً، الملف المرفق يحوي نموذجاً، وماكرو... انسخهما إلى قاعدة بيانات السيرفر عندك، لكن كن على حذر: النموذج يحوي مؤقتاً يعمل على الدوام من أجل فحص الوقت، وعند مطابقة وقت الجهاز للوقت المحدد في الكود، يقوم بإرسال أمر الضغط...

الكود هو نفسه الذي أرفقته من قبل:

Private Sub Form_Timer()
	Dim StartTime As String
	StartTime = "1:02 PM"
	If Format(Now(), "medium time") = Format(StartTime, "medium time") Then
		SendKeys "%(TDC)"
	End If
End Sub

أرجو لك التوفيق...

compact.zip

#14

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

لاعدمناكم

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

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