ورود

View Full Version : نمايش پيشرفت (progress bar) براي يك دستور sql در دلفي



saeed6162
دوشنبه 25 دی 1391, 13:48 عصر
فرض كنيد با استفاده از دستور bulk insert قصد داريم اطلاعات موجود در يك فايل متني رو داخل يك جدول لود كنيم. از اونجايي كه اين اطلاعات ممكنه زياد باشن و زماني براي انجام اون گرفته بشه چطور مي تونيم يك progress bar رو به اين عمل نسبت بديم كه پيشرفت دستور رو نمايش بده.

Mask
دوشنبه 25 دی 1391, 14:26 عصر
تعداد کل خطوط رو به عنوان Max و بعد از هر اینسرت position رو تنظیم کنید.

BORHAN TEC
دوشنبه 25 دی 1391, 14:35 عصر
البته بهتره که بعد از ست کردن Progressbar.Position شما Application.ProcessMessage را فراخوانی کنید. البته این روش هم زیاد جالب نیست. مثلاً اگر در این حالت کاربر پشیمان شود و بخواهد برنامه را ببندد قادر به انجام این کار نیست و ... . به نظر من در این مواقع بهترین راه استفاده از Thread است.

saeed6162
دوشنبه 25 دی 1391, 14:44 عصر
تعداد کل خطوط رو به عنوان Max و بعد از هر اینسرت position رو تنظیم کنید.
تعداد كل خطوط رو چطوري ميشه محاسبه كرد؟ آخه از يه فايل متني مي خونه و معلوم نيست تو اين فايل چند ركورد وجود داره كه قرار لود بشه ، انتهاي هر ركورد با يك rowterminator مشخص ميشه
دستور bulk insert فقط يك مرتبه اجرا ميشه چطور مي تونم به تك تك insert هايي كه انجام ميشه دسترسي داشته باشم؟

zarifcomputer
دوشنبه 25 دی 1391, 14:58 عصر
سلام
حق با شماست . دستور مورد نظر شما فقط یک بار انجام میشه. برای هدفی که مد نظر دارید باید کمی در روش کار تغییر ایجاد کنید.
1- ابتدا فایل مورد نظر را با دلفی باز کنید (با فرمت TextFile)
2- به جای progressbar از guage استفاده کنید
3- با یک پیمایش سریع تعداد سطر ها را بدست آورید و در gauge1.maxvalue ثبت کنید
4-مقدار gauge1.minvalue و gauge1.progress را برابر با صفر قرار دهید
5- تعداد بدست آمده در مرحله 3 را بر 10 تقسیم کرده و در یک حلقه 10 مرحله ای ، هر بار که از دستور بالک استفاده میکنید یک دهم فایل باز شده در مرحله 1 را در یک فایل temp.txt ذخیره کرده و مورد استفاده قرار دهید و با هر بار پیمایش حلقه مورد نطر مقدار gauge1.progress را یکی اضافه کنید

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

saeed6162
سه شنبه 26 دی 1391, 08:07 صبح
1- ابتدا فایل مورد نظر را با دلفی باز کنید (با فرمت TextFile)
2- به جای progressbar از guage استفاده کنید
3- با یک پیمایش سریع تعداد سطر ها را بدست آورید و در gauge1.maxvalue ثبت کنید
4-مقدار gauge1.minvalue و gauge1.progress را برابر با صفر قرار دهید
5- تعداد بدست آمده در مرحله 3 را بر 10 تقسیم کرده و در یک حلقه 10 مرحله ای ، هر بار که از دستور بالک استفاده میکنید یک دهم فایل باز شده در مرحله 1 را در یک فایل temp.txt ذخیره کرده و مورد استفاده قرار دهید و با هر بار پیمایش حلقه مورد نطر مقدار gauge1.progress را یکی اضافه کنید
ممنون بابت پاسختون
اما عالي تر و بهينه تر اينه كهما يكبار از bulk insert استفاده كنيم.
كسي هست كه بتونه با استفاده از Trigger هاي sql اين مساله رو حل كنه؟

zarifcomputer
سه شنبه 26 دی 1391, 10:00 صبح
ممنون بابت پاسختون
اما عالي تر و بهينه تر اينه كهما يكبار از bulk insert استفاده كنيم.
كسي هست كه بتونه با استفاده از Trigger هاي sql اين مساله رو حل كنه؟

راستش یک کمی سوالتون بغرنج به نظر میرسه !
در عنوان تاپیک از کلمات progressbar و دلفی و یک دستور sql استفاده کردید

ترکیب مورد نظر شما با دخالت عبارت bulk insert از سطح سواد بنده فقط همین راه حل را ممکن میداند
با پیشنهاد بنده شما میتوانید مثلا 10 بار از دستور bulk insert استفاده کنید و به کاربر هم روند پیشرفت عملیات Insert را نشان بدهید .
درضمن متوجه ارتباط bulk insert با trigger نشدم
میشه لطفا در موردش کمی توضیح بدید؟

saeed6162
چهارشنبه 27 دی 1391, 08:27 صبح
درضمن متوجه ارتباط bulk insert با trigger نشدم
میشه لطفا در موردش کمی توضیح بدید؟

فقط مي دونم كه تريگر ها ، رويدادهايي هستند كه در زمان اجراي دستورات sql فعال مي شوند. و چون دستور bulk insert هم يكي از دستورات sql هست و در اين problem مي خواهيم فقط يكبار از اين دستور استفاده بشه :
مثلا آيا شدني هست كه تريگري ايجاد شود كه count ركوردهاي درج شده در جدول توسط دستور bulk insert رو در زمان اجراي اون دستور لحظه به لحظه به دست بياره و ما از مقدار اون count براي نمايش پيشرفت progress bar استفاده كنيم؟

zarifcomputer
چهارشنبه 27 دی 1391, 10:05 صبح
فقط مي دونم كه تريگر ها ، رويدادهايي هستند كه در زمان اجراي دستورات sql فعال مي شوند. و چون دستور bulk insert هم يكي از دستورات sql هست و در اين problem مي خواهيم فقط يكبار از اين دستور استفاده بشه :
مثلا آيا شدني هست كه تريگري ايجاد شود كه count ركوردهاي درج شده در جدول توسط دستور bulk insert رو در زمان اجراي اون دستور لحظه به لحظه به دست بياره و ما از مقدار اون count براي نمايش پيشرفت progress bar استفاده كنيم؟

سلام
http://stackoverflow.com/questions/2742745/firing-trigger-for-bulk-insert

http://msdn.microsoft.com/en-us/library/ms187640%28v=sql.105%29.aspx

saeed6162
چهارشنبه 27 دی 1391, 10:24 صبح
ممنون بابت لينك هايي كه معرفي كرديد
يه چيزهاي كمي دستگيرم شد
اما خب قادر به نوشتن كدش نيستم.
اگه موفق شديد اين كار رو انجام بديد ممنون ميشم كدش رو در اختيار من هم بذاريد