PDA

View Full Version : سوال: تابع compact and repair بانک اکسس 2007



M.T.P
پنج شنبه 01 دی 1390, 18:59 عصر
دوستان

اگه تابعی به این منظور به هر زبانی در اختیار دارید ، عنایت کنید ممنون میشم.

Abbas Amiri
جمعه 02 دی 1390, 16:38 عصر
از من به شما نصیحت دنبالش نگردید . من چند مثال گیر آوردم ولی درزمان اجرای برنامه به هیچ عنوان Temporary ها را ازبین نمیبرد و حجم فایل بعد از حذف جداول وفرمها کمتر نمی شود یک مثالش کد زیر است
SendKeys "%FMC", False
بهترین کار فعال کردن گزینه Compact on close در Access Options است.

Abbas Amiri
جمعه 02 دی 1390, 20:37 عصر
بسیار خوب شما از چند جدول حجیم کپی بگیرید برنامه را ببندید ببینید حجم آن چقدر است . حالا برنامه را بازکنید و جدول(های)کپی شده را حذف کنید . برنامه رااجرا کرده و حالا ببینید حجم فایل چقدر شده است. ضمنا هیچکدام Repair نمی کنند

Abbas Amiri
جمعه 02 دی 1390, 20:47 عصر
به این ترتیب معنی واژه Compact عوض می شود و به بی تاثیر تبدیل میشود.

M.T.P
شنبه 03 دی 1390, 14:30 عصر
مشکل حل شد.

تابع نهایی:


Public Function CompactAccess2007(sDatabase As String) As Boolean
On Error GoTo EndLine
Dim blnRet As Boolean
Dim ObAccess As Object
Dim StrTmp As String
Dim StrSrc As String

blnRet = False

Set ObAccess = CreateObject("DAO.DBEngine.120")

StrSrc = sDatabase
StrTmp = sDatabase & "x"

Call SetAttr(StrSrc, vbNormal)

Call ObAccess.CompactDatabase(StrSrc, StrTmp, , , ";pwd=123456;")

Call Kill(StrSrc)
Name StrTmp As StrSrc

Set ObAccess = Nothing
blnRet = True

EndLine:
CompactAccess2007 = blnRet
If Err.Number Then Call MsgBox(Err.Description, vbExclamation)
End Function

Abbas Amiri
شنبه 03 دی 1390, 19:26 عصر
شما با این تابع از داخل یک فایل اکسس توانسته اید همان فایل را کامپکت کنید

M.T.P
شنبه 03 دی 1390, 21:06 عصر
شما با این تابع از داخل یک فایل اکسس توانسته اید همان فایل را کامپکت کنید

با زبان برنامه نویسی vb6

مهدی د
شنبه 03 دی 1390, 21:22 عصر
سلام آیا با استفاده از الگوی مورد نظر در تابع پست شماره 5 می توان دستورات دیگری را نیز اجرا کرد مثلا دستور Back Up Database (در اکسس 2007)

mojiparadox
جمعه 14 بهمن 1390, 13:47 عصر
برای این‌کار میتونید از این تابع استفاده کنید، فقط باید این نکته رو مد نظر داشته باشید فقط یک کاربر در حال استفاده از برنامه باشه.



توجه: برای اجرای این تابع به یونیت استانداری ComOBJ خود دلفی نیاز دارید!محتوای تابع:

function TfrmCompactDB.CompactAndRepair(DB: string) : boolean;
var
v: OLEvariant;
begin { CompactAndRepair }
Result := True;
try
v := CreateOLEObject('JRO.JetEngine');
try
v.CompactDatabase('Provider=Microsoft.Jet.OLEDB.4. 0;Data Source=' + DB,
'Provider=Microsoft.Jet.OLEDB.4.0;Data Source=' + DB +
'x;Jet OLEDB:Engine type=5');
DeleteFile(DB);
RenameFile(DB + 'x', DB)
finally
v := Unassigned
end; { try }

except
Result := False
end; { try }
end; { CompactAndRepair }

روش اجرا:
این تابع رو در قسمت Public فرم خودتون تعریف کنید و با استفاده از یک کلید (یا هر کامپوننت دیگه‌ای که مد نظرتون هست) به شکل زیر صدا کنید. فقط قبلش دیتابیس خودتون رو که توسط ADOConnection باز کردین حتماً ببندید!! ترجیحاً بعد از انجام این کار از کاربر بخواهید که برنامه رو دوباره اجرا کنه و هم مستقیما برنامه رو Terminate کنید تا تنظیمات دیتابیس و تنظیمات زمان باز کردن دیتابیس و جداولتون به هم نریزه!!

CompactAndRepair(DBName)

من خودم تونستم حجم دیتابیس اکسس 2000 خودم رو با حجم 43مگابایت به 22مگابایت برسونم...


برای تغییر Engine 2000 به 2007 می‌تونید گزینه‌هایی رو که با محتوای "Microsoft.Jet.OLEDB.4.0" هستند رو به "Microsoft.Jet.OLEDB.11.0" و البته تنظیمات ACCESS 2007 تغییر بدید... با یه کم آزمون و خطا می‌تونید این کار رو انجام بدین.

موفق باشید.

hamid-nice
سه شنبه 06 فروردین 1392, 11:10 صبح
مشکل حل شد.

تابع نهایی:


Public Function CompactAccess2007(sDatabase As String) As Boolean
On Error GoTo EndLine
Dim blnRet As Boolean
Dim ObAccess As Object
Dim StrTmp As String
Dim StrSrc As String

blnRet = False

Set ObAccess = CreateObject("DAO.DBEngine.120")

StrSrc = sDatabase
StrTmp = sDatabase & "x"

Call SetAttr(StrSrc, vbNormal)

Call ObAccess.CompactDatabase(StrSrc, StrTmp, , , ";pwd=123456;")

Call Kill(StrSrc)
Name StrTmp As StrSrc

Set ObAccess = Nothing
blnRet = True

EndLine:
CompactAccess2007 = blnRet
If Err.Number Then Call MsgBox(Err.Description, vbExclamation)
End Function

با سلام

من وقتی از این تابع استفاده می کنم پیغام می ده : File Not Find
اشکالم کجاست ؟
آیا این تابع بدون بستن دیتابیس عمل Compact را انجام می ده ؟

hamid-nice
چهارشنبه 07 فروردین 1392, 18:16 عصر
سلام
متوجه شدم باید به جای عبارت داخل پرانتز خط اول آدرس فایلی که می خوام Compact کنم را هنگام فراخوانی تابع قرار بدم مثلا :

در واقع کد ها را عینا در یک ماژول کپی کردم و سپس در رویداد Onclick یک دگمه در یک فرم تابع را به صورت زیر فراخواندم :

Call CompactAccess2007("c:\1.mdb")
با تشکر

Abbas Amiri
چهارشنبه 07 فروردین 1392, 18:24 عصر
سلام
متوجه شدم باید به جای عبارت داخل پرانتز خط اول آدرس فایلی که می خوام Compact کنم را قرار بدم مثلا :

Public Function CompactAccess2007("c:\1.mdb") As Boolean

با تشکر

اینکار رو از داخل خود دیتابیس انجام دادید ؟!!!

hamid-nice
چهارشنبه 07 فروردین 1392, 20:16 عصر
خیر ، از داخل یک دیتابیس برای یک دیتابیس دیگه ( نه برای همون دیتابیسی که کد داخلش هست ) به کار می رود

مثلا برای یک دیتابیس دیگری که به آدرس C:\1.mdb در کامپیوترم موجود هست چنین عمل کردم که :

در واقع کد ها را عینا در یک ماژول در دیتابیس دیگری (به جز C:\1.mdb که قراره کامپکت بشه ) کپی کردم و سپس در رویداد Onclick یک دگمه در یک فرم تابع را به صورت زیر فراخواندم :

Call CompactAccess2007("c:\1.mdb")

میتوان در یک ماکرو با فراخوانی تابع به صورت ("CompactAccess2007("c:\1.mdb نیز این کار را کرد
با تشکر