ورود

View Full Version : باز شدن طولاني فرمها به خاطر پردازش زياد



rezamahdizadeh
یک شنبه 10 مرداد 1389, 05:21 صبح
هنگام باز شدن يک فرم جديد به خاطر لود شدن اطلاعات زياد در يک Query زمان نسبتا زيادي طول مي کشد به اين خاطر مي خواهم در هنگام باز شدن فرم مثل بعضي باز شدن صفحات وب که يک ProgressBar همراه با متني مثل "صفحه در حال باز شدن است، لطفا صبر کنيد" چنين کاري کنم که تاخير حاصل از باز شدن فرم کمتر حوصله کاربر را ببرد. بهترين کار چيست؟

vcldeveloper
یک شنبه 10 مرداد 1389, 15:31 عصر
به تالار کامپوننت ها ارتباط خاصی نداشت.

می تونید کوئری مربوطه رو در یک Thread مستقل باز کنید، و تا زمانی که لود به طور کامل انجام نشده، یک فرم را به کاربر نمایش بدید.

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

bootshow
دوشنبه 11 مرداد 1389, 20:29 عصر
بجای Progressbar معمولی اگر از TAdvCircularProgress استفاده کنید قشنگتره.چون خودش میچرخه.ولی برای استفاده از Progressbar یک بار اضافی به لود جدول تحمیل میشه.
بهتر هنگام اولین اجرا یک صفحه خالی نشان داده بشه.یا اینکه بااستفاده از top 10 در دستور sql چند رکورد اول را نمایش بدی.

rezamahdizadeh
دوشنبه 11 مرداد 1389, 20:51 عصر
البته بهتر هست که به جای باز کردن یک کوئری با حجم داده برگشتی بالا در زمان باز کردن فرم، فقط داده های مورد نیاز کاربر را نمایش بدید، و اگر کاربر به داده های بیشتری نیاز داشت، داده های مربوطه را از بانک درخواست کنید، نه اینکه همه داده هایی را که ممکن هست کاربر با آنها کاری داشته باشه را یک دفعه لود کنید.
متاسفانه در SQLServer امکان اينکه بگوييد مثلا از رکورد 10 تا 19 با يک SELECT بياورد وجود ندارد

rezamahdizadeh
دوشنبه 11 مرداد 1389, 20:53 عصر
می تونید کوئری مربوطه رو در یک Thread مستقل باز کنید، و تا زمانی که لود به طور کامل انجام نشده، یک فرم را به کاربر نمایش بدید.

اگر امکان دارد يک منبع خوب فارسي جهت کار کردن با Thread ها معرفي کنيد

Felony
دوشنبه 11 مرداد 1389, 21:19 عصر
متاسفانه در SQLServer امکان اينکه بگوييد مثلا از رکورد 10 تا 19 با يک SELECT بياورد وجود ندارد
عجب ! یعنی SQL Server با اون عظمتش نمتونه این کار به این سادگی رو انجام بده ؟!

به این لینک (http://www.sqlservercurry.com/2010/01/retrieve-records-from-row-x-to-row-y.html) مراجعه کنید .


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

rezamahdizadeh
دوشنبه 11 مرداد 1389, 22:55 عصر
در توضيحات لينک دقيقا CTE چيست؟ آيا يک جدول موقت است؟

vcldeveloper
دوشنبه 11 مرداد 1389, 23:41 عصر
متاسفانه در SQLServer امکان اينکه بگوييد مثلا از رکورد 10 تا 19 با يک SELECT بياورد وجود ندارد
یک SELECT TOP ساده با یک WHERE روی فیلد ID جدول مربوطه، نتیجه لازم رو بهتون می داد.


اگر امکان دارد يک منبع خوب فارسي جهت کار کردن با Thread ها معرفي کنيد
متاسفم منبع فارسی درست و حسابی نمی شناسم.

rezamahdizadeh
سه شنبه 12 مرداد 1389, 10:29 صبح
یک SELECT TOP ساده با یک WHERE روی فیلد ID جدول مربوطه، نتیجه لازم رو بهتون می داد.

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

rezamahdizadeh
سه شنبه 12 مرداد 1389, 10:36 صبح
آیا خود جداول در SQLServer دارای یک فیلد سیستمی شبیه به RecNo ندارند؟

vcldeveloper
سه شنبه 12 مرداد 1389, 12:40 عصر
اگر جدولی فیلد AutoNumber هم داشته باشد به علت حذف بعضی از رکوردها توسط کاربر مقادیر آن فیلد دارای Gap می شوند و به خاطر همین Gap ها نمی شود WHERE روی آن فیلد زد. ارتباطی به وجود Gap نداره؛ شما کافیه در WHERE شرطی قرار بدید که مقدار فیلد ID از آخرین رکوردی که در کوئری قبلی از بانک گرفتید، بزرگتر باشه. مقدار فیلدهای Auto Inc همیشه افزایش پیدا میکنه، پس وجود Gap تاثیری در این فرآیند نداره. مثال ساده اش میشه این:


SELECT TOP 20 * FROM MyTable WHERE Id > :paramIDحالا مقدار پارامتر paramID را برای اولین کوئری می تونید صفر بدید، و برای سایر کوئری ها، مقدار فیلد ID آخرین رکورد دریافت شده در کوئری قبلی.

البته لزومی نداره که حتما فیلد شما Auto Inc باشه، این روش رو می تونید روی هر فیلدی که بشه روش مقایسه انجام داد، اعمال کنید؛ البته اگر اون فیلد Primary Key نباشه، باید از ORDER BY استفاده کنید، تا نتایج بر اساس مقادیر همون فیلد Sort بشند، وگرنه نتیجه به دست آمده درست نخواهد بود.