PDA

View Full Version : ماکرو جهت فشرده سازی و ساماندهی دیتا بیس



barname_m708
شنبه 23 آذر 1387, 10:18 صبح
با سلام خدمت دوستان

من دنبال ماکرویی میگردم که دیتا بیس رو فشرده سازی کنه.لطفا اگه کسی نمونه ای داره برای من قرار بده

nabeel
شنبه 23 آذر 1387, 22:54 عصر
سلام barname_m708
شما چرا گزینه Compact On Close موجود در بخش Options رو فعال نمی کنید ؟




موفق باشید

nabeel
یک شنبه 24 آذر 1387, 00:21 صبح
سلام مجدد
یه ماکرو بنویسید و در داخل اون سه تا اکشن زیر رو به ترتیب عنوان شده اضافه کنید

SetWarnings Off
SendKeys %T D C
SetWarnings On
در نهایت ماکرو رو اجرا کنید

barname_m708
یک شنبه 24 آذر 1387, 09:04 صبح
سلام مجدد
یه ماکرو بنویسید و در داخل اون سه تا اکشن زیر رو به ترتیب عنوان شده اضافه کنید

SetWarnings Off
SendKeys %T D C
SetWarnings On
در نهایت ماکرو رو اجرا کنید


سلام دوست عزیز
من نتونستم این ماکرویی که شما گفتین رو بسازم.اگه امکان داره خودتون توی یک نمونه برنامه این ماکرو رو بسازین .

با تشکر

nabeel
یک شنبه 24 آذر 1387, 11:32 صبح
سلام
نمونه فایل زیر رو دانلود کنید
در صورتی که مشکلی وجود داشت اطلاع بدید

barname_m708
یک شنبه 24 آذر 1387, 13:37 عصر
سلام
نمونه فایل زیر رو دانلود کنید
در صورتی که مشکلی وجود داشت اطلاع بدید


سلام دوست عزیز
با تشکر از نمونه برنامه شما.ولی باید بگم که وقتی ماکرو و فرم شما رو به برنامه خودم اضافه کردم برنامه با مشکل مواجه شد.به هر حال من برنامه خودم رو ضمیمه کردم اگه امکان داره برنامه من رو رفع اشکال کنید .ممنون میشم

ضمنا همون طور که در برنامه مشاهده میکنید من میخوام از تو امکانات سیستم که گزینه فشرده سازی انتخاب شد ماژول فشرده سازی اجرا بشه.

با تشکر

nabeel
یک شنبه 24 آذر 1387, 14:07 عصر
سلام دوست من
ای کاش جواب این سئوال من رو میدادید که :
شما چرا گزینه Compact On Close موجود در بخش Options رو فعال نمی کنید ؟
............................
خوب , ببینید ماکرویی که من براتون نوشتن عملاً از دستور SendKeys استفاده میکنه
این دستور به نوعی جهت شبیه سازی فشار دادن دکمه ها به کار میاد
به پارامترهای اون دقت کنید %T D C اینها اول نام منوهایی هستش که شما برای فشرده سازی فایل در حالت عادی طی میکنید یعنی
Tools >> Database Utilities >> Compact And Repair Database
خب فکر میکنم که مشخص شد .
این ماکرو وابسته به وجود خود منو هستش
شما در پروژتون عملاً این منو رو مخفی کردید پس امکان استفاده از این ماکرو به اینصورت برای شما وجود نداره .
توصیه : سعی کنید سئوالها رو تلگرافی مطرح نکنید و حتماً سئوالی که از شما میشه رو جواب بدید چرا که مطمئناً جوابگویی به اون سئوال میتونه زمان حل مشکل رو کوتاهتر کنه .
با تمام این اوصاف این مشکلی نیست ک حل نشه . لطفاً میزن آشنایی خودن رو با VBA هم عنوان کنید



با تشکر از شما دوست عزیز

مهدی قربانی
یک شنبه 24 آذر 1387, 15:18 عصر
سلام
من با یک ترفند روش پیشنهادی دوستمون nabeel رو در نمونه شما پیاده کردم از اونجائیکه در نمونه شما منوها سفارشی هستن و Sendkey استاندارد یعنی T D C% بلحاظ نبود منوی استاندارد در برنامه اجرا نمیشه من در منوی امکانات سیستم یک _ قرار دادم که با پسوند & میشه شبیه این

امکانات سیستم&_بنابراین شما می تونید SendKeys رو به شکل زیر در اصل با ترکیب منوهای خودتون اجرا کنید

%_ Cنهایتاً بنظرم بجای این کار شما می تونید با استفاده از همون منوی خودتون این ابزار رو در اختیار کاربرتون بذارید و نیازی هم به ماکرو نیست ، الان در نمونه خودتون در منوی امکانات سیستم این آیتم قرار گرفته و در اصل ماکرو هم داره این منو رو اجرا میکنه.

Mahsa Hatefi
شنبه 17 اسفند 1387, 22:18 عصر
با سلام

برنامه اي كه بصورت Front و بانك بصورت BackEnd باشد با تيك زدن Compact on close در Front آيا بانك كه BackEnd است كامپكت مي شود يا نه ؟

سوال ديگر اينكه اگر Compact on close در فايل BackEnd تيك بخورد در صورت Unbound بودن تمامي فرمها ، هر بار كه برنامه FrontEnd باز و بسته شود آيا فايل BackEnd كامپكت مي شود يا نه ؟


در ضمن ايراد اين تكه كد كه از MSDN گرفتم چيست ؟


متشكرم

Mahsa Hatefi
دوشنبه 19 اسفند 1387, 07:57 صبح
با سلام مجدد

يه استاد بزرگواري بفرمايند علاوه بر سوالات بالا چرا DoCmd.RunCommand acCmdCompactDatabase اجرا نمي شود ؟

ممنون

e601
سه شنبه 20 اسفند 1387, 00:25 صبح
با سلام
برنامه اي كه بصورت Front و بانك بصورت BackEnd باشد با تيك زدن Compact on close در Front آيا بانك كه BackEnd است كامپكت مي شود يا نه ؟
سوال ديگر اينكه اگر Compact on close در فايل BackEnd تيك بخورد در صورت Unbound بودن تمامي فرمها ، هر بار كه برنامه FrontEnd باز و بسته شود آيا فايل BackEnd كامپكت مي شود يا نه ؟

سلام

Compact on close طبق قاعده روی دیتابیس جاری انجام میشه و به نظر نمیرسه که Link بودن جداول دلیلی بر این باشه که با Compact شدن دیتابیس ّFront دیتابیس BackEnd هم متاثر از اون Compact بشه


در ضمن ايراد اين تكه كد كه از MSDN گرفتم چيست ؟
اولا که فکر میکنم شما در فانکشن اصلی دستورات strSource=Currentdb و strDestination=Currentdb رو خودتون به بدنه کد اضافه کردید که نباید در اون بخش قرار بگیره
ثانیا شما در فراخوانی فانکشن درست عمل نکردید. فایل ضمیمه رو نگاه کنید مطمئنا متوجه این اشتباه میشید. فانکشن مذکور 2 تا آرگومان بصورت رشته میگیره. اولی مسیر فایلی که میخواید Compact بشه و دومی مسیر و نام فایل جدید هست.

در برنامه ضمیمه ابتدا به سایز فایل BackEnd توجه کنید. این فایل خالیه و هیچ چیزی درونش وجود نداره. حالا بعد از فشار دادن دکمه به سایز فایل جدید ایجاد شده (در حقیقت Compact شده) دقت کنید ، میبینید که فشرده تر شده.


با سلام مجدد
يه استاد بزرگواري بفرمايند علاوه بر سوالات بالا چرا DoCmd.RunCommand acCmdCompactDatabase اجرا نمي شود ؟
ممنون
این که دارم جواب میدم رو حمل بر استادی من نذاریدا !!! من کوچکترین عضو این سایتم.
در مورد سوالتون باید عرض کنم اجرای دستی متد acCmdCompactDatabase روی دیتابیس باز قابل انجام نیست...

موفق باشید...

Mahsa Hatefi
چهارشنبه 21 اسفند 1387, 11:24 صبح
ضمن تشكر فراوان از بذل محبت حضرتعالي

اين ساب بانك را فشرده وبا نام ديگري ذخيره مي كند در صورتي كه من مي خواهم مثل Compact on close عمل شود و بانك BackEnd با بسته شدن FrontEnd كامپكت شود و يا حتي وقتي مي خواهم از Backend ذخيره پشتيبان بگيرم مايلم كه قبل از آن ، آن را كامپكت و سپس ذخيره بگيرم . لذا نياز به كدي براي اين كار دارم.
از لطف شما سپاسگزارم

e601
چهارشنبه 21 اسفند 1387, 23:48 عصر
سلام
نمونه زیر به شما کمک میکنه

موفق باشید...

Mahsa Hatefi
پنج شنبه 22 اسفند 1387, 00:44 صبح
ضمن عرض تشكر از استاد بزرگوار

آقاي مسعودي به نظرتان استفاده از اين روش بهترين روش ممكن است ؟ خيلي مايلم كه به طريق خود سيستم يعني همان compact on close عمل كنم تا مجبور نباشم بانك اصلي را حذف كنم . اگر احيانا كپي دچار اشكال شود و در خط بعدي هم ما اصلي را حذف كنيم اون وقت چي ؟
در صورتي كه روش ايده آل تري به نظرتان رسيد ممنون مي شوم اطلاع دهيد .

نهايت تشكر وقدرداني را از بذل توجه حضرتعالي دارم .

e601
پنج شنبه 22 اسفند 1387, 18:31 عصر
مجددا سلام

نمیشه گفت بهترین روشه ممکنه. شاید عبارت یکی از راههای پیش رو منطقی تر باشه
روش دیگه ای که به ذهنم رسید استفاده از سیستم Automation اکسس هست. فایل ضمیمه گویاست و نیازی به توضیح بیشتر در اینجا نداره ولی 2 تا نکته هست که شاید بد نباشه عنوان کنیم:

نکته 1: ما چون همگی قطع به یقین داریم از نرم افزارهای قفل شکسته استفاده میکنیم ، پس اگه انتظار رفتار عجیب و غریب از ویندوز و یا اکسس یا هر نرم افزار دیگه ای داشته باشیم اصلا غیر منطقی نیست.
همونقدر که امکان داره موقع کپی کردن فایل یکی از همین دست مشکلات پیش بیاد موقع Compact کردن هم امکان پیش اومدنش هست. (واسه من پیش اومده !!!)

نکته 2 : من تا حالا با اکسس 2007 کار نکردم ولی شنیدم دستور Compact در برنامه ای که با اکسس 2003 نوشته شده باشه و در ورژن 2007 اجرا بشه کار نمیکنه ! (چون مطمئن نیستم زیاد مانور نمیدم)

موفق باشید...

Mahsa Hatefi
یک شنبه 09 فروردین 1388, 12:50 عصر
جناب آقاي مسعودي

ضمن عرض سلام و تبريك سال نو بايد عرض كنم بالاخره از همون روش (http://barnamenevis.org/forum/attachment.php?attachmentid=29138&d=1236630252) استفاده كردم اما يه مشكل دارم و اون اينه كه اگه روي BackEnd پاسورد گذاشته باشي عمليات با خطا مواجه مي شه . به نظرتون چيكار كنم .

بازم ممنون سلامتي و توفيق روزافزون شما را آرزومندم

mehdi_fiz
یک شنبه 09 فروردین 1388, 22:28 عصر
سلام دوست عزيز Mahsa Hatefi (http://www.barnamenevis.org/forum/member.php?u=19795) با عرض تبريک سال نو
از شما مي خواستم اگر امکان دارد نمونه اي را که خودتان آماده کرده ايد و از آن استفاده مي کنيد براي بنده نيز آپلود کنيد چون من هم با اين مشکل روبرو هستم
قبلاً از مساعدتي که مي نماييد کمال تشکر را دارم
موفق باشيد

e601
سه شنبه 18 فروردین 1388, 00:41 صبح
جناب آقاي مسعودي

ضمن عرض سلام و تبريك سال نو بايد عرض كنم بالاخره از همون روش (http://barnamenevis.org/forum/attachment.php?attachmentid=29138&d=1236630252) استفاده كردم اما يه مشكل دارم و اون اينه كه اگه روي BackEnd پاسورد گذاشته باشي عمليات با خطا مواجه مي شه . به نظرتون چيكار كنم .

بازم ممنون سلامتي و توفيق روزافزون شما را آرزومندم

سلام
منم سال جدید رو به شما تبریک میگم ، امیدوارم که سال پر برکتی داشته باشید

برای رفع این مشکل هم راه حل دیگه ای وجود داره :چشمک:
به فایل ضمیمه مراجعه کنید

موفق باشید...

Mahsa Hatefi
سه شنبه 18 فروردین 1388, 10:32 صبح
خيلي بزرگواريد آقا

از شما سپاسگزارم

Mahsa Hatefi
چهارشنبه 19 فروردین 1388, 19:19 عصر
سلام بر جناب مسعودي

آقا با عرض معذرت يه سوال در اين مورد دارم .
آيا وقتي در FrontEnd فرمها unbound باشند و جداول اون بصورت لينك به BackEnd متصلند ، BackEnd باز است يا خير ؟

اين سوالم به اين خاطر است : موقع استفاده از اين دستور جهت فشرده سازي ، در Help اكسس نوشته كه بانكي كه قصد فشرده سازي داريد بايد بسته باشد

سوال ديگر :
اگر بخواهم از دستور

Dim Mydb As Database
Dim MYdbPath As String

MYdbPath = CurrentProject.Path & "\BackEnd.mdb"

Set Mydb = DBEngine.OpenDatabase(MYdbPath, , , "database;pwd=123456")

براي باز كردن فايل BackEnd استفاده كنيم
اولاً پيام غلط بودن پاسورد مي دهد
ثانياً اگر پاسورد را از BackEnd حذف كنيم ، اتفاقي نمي افتد و خطاي 0 دريافت مي كنم يعني بانك مربوطه باز نمي شود .

منظورم از بازو بسته كردن BackEnd ، استفاده از گزينه Compact On Close است . آيا اينكار منطقي است يا نه ؟

از توجه تان ممنونم

e601
پنج شنبه 20 فروردین 1388, 00:09 صبح
سلام بر جناب مسعودي
آقا با عرض معذرت يه سوال در اين مورد دارم .
آيا وقتي در FrontEnd فرمها unbound باشند و جداول اون بصورت لينك به BackEnd متصلند ، BackEnd باز است يا خير ؟

اين سوالم به اين خاطر است : موقع استفاده از اين دستور جهت فشرده سازي ، در Help اكسس نوشته كه بانكي كه قصد فشرده سازي داريد بايد بسته باشد

با سلام

در مورد قسمت اول سوالتون باید عرض کنم ، فایل BackEnd بسته هستش. فقط در مواقع نیازه که خود اکسس ارتباط رو برقرار و اطلاعات رو قابل دسترس میکنه.

در مورد توضیحات Help اکسس که فرمودین باید بگم ، حرف شما کاملا درسته. در پستهای قبلی هم گفته بودم دستورات مربوط به Compact کردن ، برای دیتابیس باز قابل اجرا نیست.

برای اینکه مطمئن بشید فایل ضمیمه رو دانلود کنید و یه تست ساده انجام بدید ، به اینصورت:
اول یه جدول با تعدادی رکورد در فایل BackEnd ایجاد کنید.
بعد به فایل CompactTest که در حقیقت همون FrontEnd هستش برید و عملیات رو اجرا کنید.
میبینید که بدون مشکل اجرا میشه. پس این خودش یه دلیلی هست مبنی بر اینکه با لینک شدن جداول فایل FrontEnd به BackEnd فایل BackEnd باز نیست. چون اگه باز بود اکسس اجازه اجرای متد Compact رو به ما نمیداد


سوال ديگر :
اگر بخواهم از دستور


Dim Mydb As Database
Dim MYdbPath As String

MYdbPath = CurrentProject.Path & "\BackEnd.mdb"

Set Mydb = DBEngine.OpenDatabase(MYdbPath, , , "database;pwd=123456")

براي باز كردن فايل BackEnd استفاده كنيم
اولاً پيام غلط بودن پاسورد مي دهد
ثانياً اگر پاسورد را از BackEnd حذف كنيم ، اتفاقي نمي افتد و خطاي 0 دريافت مي كنم يعني بانك مربوطه باز نمي شود .
منظورم از بازو بسته كردن BackEnd ، استفاده از گزينه Compact On Close است . آيا اينكار منطقي است يا نه ؟


دوست عزیز برای استفاده از گزینه Compact On Close باید طبق نمونه ای که در ضمیمه ارائه کردم عمل کنید(نمونه ضمیمه شده در پست شماره 15 هم تقریبا شبیه همینه)

با استفاده از متد OpenDatabase صرفا یک اتصال به فایل مورد نظر ایجاد میشه در صورتیکه برای استفاده از گزینه Compact On Close فایل باید بصورت فیزیکی باز بشه (میتونیم فرض رو بر این بگیریم که این گزینه با Unload شدن برنامه اکسس عمل میکنه که در اینصورت با استفاده از متد OpenDatabase برنامه اکسس باز نمیشه که با بسته شدن و Unload شدنش Compact On Close هم اعمال بشه)

-------------------------------------------------------
در مورد خطای شماره 0 هم بد نیست یه نکته ای رو عنوان کنم:

خطای شماره صفر در حقیقت هیچ خطایی نیست ! یعنی وقتی روال رویداد شما دارای سیستم مدیریت خطا باشه (...On Error Goto) و هیچ خطایی رخ نده شماره خطا یا همون Err.Number برابر صفر هست.

البته اگه روال رویداد ، سیستم مدیریت خطا نداشته باشه پیغام صفر به نمایش در نمیاد

در کد شما هم اگه با اجرای دستور خطای صفر دریافت میکنید ، معنیش اینه که دستور OpenDatabase درست اجرا شده و اتصال برقراره !

موفق باشید...

hamedMohammad
سه شنبه 25 فروردین 1388, 01:55 صبح
سلام بر جناب مسعودي
روش خوبی ارائه کردید ولی اگر بانک ما از نوع Back End باشد و workgroup داشته باشد پنجره Login باز شده و یوزر و پسورد طلب می کند!
با این مسئله بایستی کد برنامه اصلاح شود..

موفق باشید