View Full Version : مکث در اجرای QUERY ها
naderigh
دوشنبه 11 تیر 1386, 08:27 صبح
من یک مشکل دارم به این شکل که در یک فرم یک کامبوباکس و یک لیست باکس دارم
اطلاعات کامبو باکس با یک QUERY است که اطلاعات نامهای مشتریان میباشد
در لیست باکس اطلاعات کالاهای مشتری انتخاب شده در کامبوباکس را با QUERY می اورد که تعداد رکورد کل اطلاعات نسبتا زیاد میباشد و در شبکه برای REQUERY مکس دارد(لیست باکس)
راهنمائی فرمائید که چگونه من این کار را انجام دهم که مکث نداشته باشد
farhad_shiri_ex
دوشنبه 11 تیر 1386, 09:36 صبح
من یک مشکل دارم به این شکل که در یک فرم یک کامبوباکس و یک لیست باکس دارم
اطلاعات کامبو باکس با یک QUERY است که اطلاعات نامهای مشتریان میباشد
در لیست باکس اطلاعات کالاهای مشتری انتخاب شده در کامبوباکس را با QUERY می اورد که تعداد رکورد کل اطلاعات نسبتا زیاد میباشد و در شبکه برای REQUERY مکس دارد(لیست باکس)
راهنمائی فرمائید که چگونه من این کار را انجام دهم که مکث نداشته باشد
دوست عزیز!
اینطورکه من متوجه شده ام شما از QUERY دستی استفاده میکنید یعنی به محض انتخاب یک ITEM از COMBO یک مقدار به QUERY لیست باکس ارسال میکنید و آن را اجر می نمایید! و نمایش می دهید درست است....
اگر اینطور است باید بگوییم که شما می توانید از LOCAL VIEW در DATABASE خود استفاده کنید به این نحو که شما QUERY خود را داخل DBC خود می سازید و ان را در ENVIRONMENT صدا بزنید حال اگر دوتا CURSOR ADAPTER داشته باشید می توانید با دستور RELATION بین این دو CURSOR ارتباط بر قرار نمایید و بجای ارسال مقدار انتخاب شده در COMBO و ارسال به QUERY فقط کافی است که فیلد انتخابی خود را Master Key نمایید تا همه چیز درست شود!
البته دوست عزیز توضیحات فوق صرفا براساس فهم اینجانب از نوشته شما بوده است در صورت درک نکردن مطالب فوق اطلاع دهید!.
mehran_337
دوشنبه 11 تیر 1386, 09:49 صبح
فرهاد جان سلام!
از توضیحات قشنگت ممنونم . بحث خوبی را مطرح کردی . من بعد از مدتها سبک نوشتن برنامه بصورت use کردن و کدنویسی مدتی کوتاه به enviroment و کدنویسی در دیتابیسو استفاده از کرسر و بافرینگ کردن رکورد دست پیدا کردم که در تاپیکی بطور کامل هرآنچه در این موضوع بدست آورده ام را اعمال کردم . اما نکاتی ست که زیاد شنیده ام ولی نتوانستم کاربردی از آنها استفاده کنم اگر میشه آموزشی کوتاه در نحوه استفاده از این موارد ارائه دهید:
LOCAL VIEW - CURSOR ADAPTER -
این جمله شما هم برای من جدید بوده :
حال اگر دوتا CURSOR ADAPTER داشته باشید می توانید با دستور RELATION بین این دو CURSOR ارتباط بر قرار نمایید و بجای ارسال مقدار انتخاب شده در COMBO و ارسال به QUERY فقط کافی است که فیلد انتخابی خود را Master Key نمایید تا همه چیز درست شود!
با تشکر (یادت نره ما مبتدی هستیم زبان ساده لطفا)
farhad_shiri_ex
دوشنبه 11 تیر 1386, 10:32 صبح
بردار مهران!
ببنید در محیط ویژوال فاکس پرو شما می توانید در یک DBC از یک Free Table و یا Remote View ویا از Local View استفاده نمایید.
خوب صد در صد Free Table را که می شناسید!
اما Remote View : خوب با استفاده از این امکان بسیار قدرتمند شما می توانید با استفاده از یک Conection و Conection String هایی به یک بانک خارج از محیط ویژوال فاکس ارتباط برقرار نمایید به این روش که شما می توانید از ODBC و یا ADO ویا XML استفاده نمایید بر فرض مثال با بانک های SQL Server ارتباط برقرار نمایید Remote View این امکان را به شما می دهد که شما یک Cursor توجه داشته باش Cursor نه یک TABLE داشته باشید یعنی شما یک بانک در SQL Server 2000 ایجاد کرد ه اید حال با این روش می توانید این بانک را به یک CURSOR که با Remote View ساخته اید تبدیل نمایید و خیلی راحت در فرم هیتان استفاده نمایید البته مهران عزیز بحث BUFFERING کردن اینگونه CURSOR ها مبحث طولانی است ولی کم کم خواهم گفت و نکته بسیار مهم در این گونه کارها مباحث بسیار مهم Insert-Update-Delete می باشد که این هم سر فرصت !
حال Local View همانطور که از نامش مشخص است یعنی در همین محیط یعنی اینکه شما می توانید در DBC خود یک Query را ایجاد نمایید و این Query را در فرمهیتان صدا بزنید و خیلی را حت گزارشات خود را اجرا نمایید!
حالا تصور کن دو تا Query در DBC خود ساخته اید یکی لیست مشتریها که شامل کد و نام مشتری است و یک Query دیگر هم داری که لیست خرید هر مشتری را دارد که شامل کد مشتری و تاریخ خرید و ... می باشد .
خوب حالا این دو Cursor را در Data Environment فرمتان صدا بزنید.
حالا فرض کنید در فرمتان یک Combo دارید که باید لیست مشتریها را نمایش دهد و کاربر با انتخاب یک مشتری بتواند در لیست مقابلش لیست خریدها را مشاهد نمایید .
برای این کار کافی است شما فیلد کد Query1 را Reltion Exp قرار دهید و به فیلد Child key Query2 وصل نمایید البته روش دیگری هم برای این کار می باشد ان هم این است که از Inner Join استفاده نمایید یعنی با استفاده از چند Sub -Query و Join کردن چند table با هم .
مهران عزیز قبول دارم که سنگین است اگر فرصت کنم حتما برای مثالهای بالا یک Sample برایت می گذارم!
naderigh
دوشنبه 11 تیر 1386, 10:50 صبح
دوست عزیز متشکرم از لطف شما احتمالا من نتوانستم مطلب را برسانم
البته برداشت شما تا حدودی درست است ولی من توضیح بیشتر میدهم
ببینید دو جدول داریم یکی اسامی مشتریان با کد هر مشتری و .... و یک جدول دیگر نیز فقط کالاهائی است که مشتری میتواند ببرد که این جدول تعداد زیادی رکورد دارد یعنی به ازاء هر مشتری ممکن است نزدیک به ششصد هفتصد ردیف باشد یعنی چیزی نزدیک به سی چهل هزار رکورد و حتما بایستی به همین شکل باشد
حال برای انتخاب نام مشتری یک کامبو دارم و ان نیز ازQUERY برای انتخاب استفاده بردم که مشکلی ندارم ولی به محض انتخاب نام مشتری لیست باکس باید REQUERY شود که اطلاعات خاص ان مشتری انتخابی در لیست نمایش داده شود و سپس از لیست مربوطه انهائی که نیاز است انتخاب گردد و سپس مراحل بعدی کار
وجهت اطلاع از VIEW نیز استفاده بردم چون بایستی فیلتر نمود مکث بیشتر از QUERY است
farhad_shiri_ex
دوشنبه 11 تیر 1386, 15:17 عصر
دوست عزیز متشکرم از لطف شما احتمالا من نتوانستم مطلب را برسانم
البته برداشت شما تا حدودی درست است ولی من توضیح بیشتر میدهم
ببینید دو جدول داریم یکی اسامی مشتریان با کد هر مشتری و .... و یک جدول دیگر نیز فقط کالاهائی است که مشتری میتواند ببرد که این جدول تعداد زیادی رکورد دارد یعنی به ازاء هر مشتری ممکن است نزدیک به ششصد هفتصد ردیف باشد یعنی چیزی نزدیک به سی چهل هزار رکورد و حتما بایستی به همین شکل باشد
حال برای انتخاب نام مشتری یک کامبو دارم و ان نیز ازQUERY برای انتخاب استفاده بردم که مشکلی ندارم ولی به محض انتخاب نام مشتری لیست باکس باید REQUERY شود که اطلاعات خاص ان مشتری انتخابی در لیست نمایش داده شود و سپس از لیست مربوطه انهائی که نیاز است انتخاب گردد و سپس مراحل بعدی کار
وجهت اطلاع از VIEW نیز استفاده بردم چون بایستی فیلتر نمود مکث بیشتر از QUERY است
دوست عزیز !
خوب در روش استفاده شده شما بدون شک با کندی سرعت روبه رو هستید ولی مثلا می توانید برای اجرای سریع Query از شرطهای کمتر و همچنین سعی کنید فیلدهای کمتری را Select نمایید یعنی فیلدهای غیر ضروری را حذف نمایید و همچنین حتما سعی کنید از GROUPING استفاده نمایید.
البته جسارتا SET ENGINEBEHAVIOR 70 فراموش نشود!
و دیگر اینکه منهم این مشکل را داشته ام اما به این روش کار کرده ام.
فکر کنید من دوبانک دارم Paitent,Paitentrecords حال در بانک Paitent لیست مشتر یها هستند این بانک هم 170 فیلد دارد و در بانک دیگر هم به ازای هر مشتری 100 رکورد وجود دارد حال در شرایطی بانک Paitent من 20000 رکورد داشت که بانک Paitentrecords من می شود 2000000 رکورد حال من کد 12500 را در بانک Paitent انتخاب میکنم حال با توجه به View نوشته شده و اجرای ان در فرم وقتی که این Cursor و بانک Paitent را با هم Join میکنم از طریق RELATION تقریبا بعد از 1-2 ثانیه یکصد رکورد مشتری انتخاب شده اورده می شود.
خوب اینهم روش ماست دیگر ...
farhad_shiri_ex
دوشنبه 11 تیر 1386, 15:18 عصر
دوست عزیز متشکرم از لطف شما احتمالا من نتوانستم مطلب را برسانم
البته برداشت شما تا حدودی درست است ولی من توضیح بیشتر میدهم
ببینید دو جدول داریم یکی اسامی مشتریان با کد هر مشتری و .... و یک جدول دیگر نیز فقط کالاهائی است که مشتری میتواند ببرد که این جدول تعداد زیادی رکورد دارد یعنی به ازاء هر مشتری ممکن است نزدیک به ششصد هفتصد ردیف باشد یعنی چیزی نزدیک به سی چهل هزار رکورد و حتما بایستی به همین شکل باشد
حال برای انتخاب نام مشتری یک کامبو دارم و ان نیز ازQUERY برای انتخاب استفاده بردم که مشکلی ندارم ولی به محض انتخاب نام مشتری لیست باکس باید REQUERY شود که اطلاعات خاص ان مشتری انتخابی در لیست نمایش داده شود و سپس از لیست مربوطه انهائی که نیاز است انتخاب گردد و سپس مراحل بعدی کار
وجهت اطلاع از VIEW نیز استفاده بردم چون بایستی فیلتر نمود مکث بیشتر از QUERY است
دوست عزیز !
خوب در روش استفاده شده شما بدون شک با کندی سرعت روبه رو هستید ولی مثلا می توانید برای اجرای سریع Query از شرطهای کمتر و همچنین سعی کنید فیلدهای کمتری را Select نمایید یعنی فیلدهای غیر ضروری را حذف نمایید و همچنین حتما سعی کنید از GROUPING استفاده نمایید.
البته جسارتا SET ENGINEBEHAVIOR 70 فراموش نشود!
و دیگر اینکه منهم این مشکل را داشته ام اما به این روش کار کرده ام.
فکر کنید من دوبانک دارم Paitent,Paitentrecords حال در بانک Paitent لیست مشتر یها هستند این بانک هم 170 فیلد دارد و در بانک دیگر هم به ازای هر مشتری 100 رکورد وجود دارد حال در شرایطی بانک Paitent من 20000 رکورد داشت که بانک Paitentrecords من می شود 2000000 رکورد حال من کد 12500 را در بانک Paitent انتخاب میکنم حال با توجه به View نوشته شده و اجرای ان در فرم وقتی که این Cursor و بانک Paitent را با هم Join میکنم از طریق RELATION تقریبا بعد از 1-2 ثانیه یکصد رکورد مشتری انتخاب شده اورده می شود.
خوب اینهم روش ماست دیگر ...
farhad_shiri_ex
دوشنبه 11 تیر 1386, 15:25 عصر
آقا مهران !
مطالب فوق نظر جنابعالی را تامین نموده است و یا دست به کد بشم بردار مهران !
البته چون این مبحث کمی پیچیده است به همین علت نمی توانستم خیلی سریع یک مثال برای شما آماده کنم اما حتما در روزهای آتی این مثال را برای دوستان خواهم گذاشت یک مثال کامل!
OK
mehran_337
سه شنبه 12 تیر 1386, 07:48 صبح
فرهاد جان خیلی جالب بود .
مسلما تا در عمل پیش نیاد کاربردی نخواهد بود . اما اساس خوبی است برای رفتن به سمت ویوها. با تشکر از شما دوست گرامی
naderigh
سه شنبه 12 تیر 1386, 08:45 صبح
دوست عزیز فرهاد جان
متشکرم از لطف شما
من از فاکس 7 استفاده میکنم و همچنین فیلدهائی را میاورم که نیاز دارم و طبق فرمایش شما پس مکث طبیعی است
حال من میخواهم بدانم که بهترین راه برای همچنین کاری چیست(استفاده از QUERY یا خود جدول ها) لطفا همکاری نمائید
farhad_shiri_ex
سه شنبه 12 تیر 1386, 13:07 عصر
دوست عزیز فرهاد جان
متشکرم از لطف شما
من از فاکس 7 استفاده میکنم و همچنین فیلدهائی را میاورم که نیاز دارم و طبق فرمایش شما پس مکث طبیعی است
حال من میخواهم بدانم که بهترین راه برای همچنین کاری چیست(استفاده از QUERY یا خود جدول ها) لطفا همکاری نمائید
البته روش کار شما هم درست است .
ولی من هم همانطور که توضیح دادم همچنین مشکلاتی دارم و داشتم و تقریبا از همین روش رفته ام .
من سعی کردم لیست مشتریها را با Query نمایش دهم و لیست خدمات هر مشتری را نیز در خود بانک Filter می کنم یعنی Cursor ساخت شده توسط Query را به بانک خدمات مشتری وصل میکنم با این کار هر وقت کاربر یک ایتم از لیست نام مشتریها انتخاب می نمایید لیست خدمات آن نیز در لیست نمایش داده می شود البته این روش خود برنامه نویس های V-fox شرکت Microsoft می باشد. خوب روشهای دیگری هم هست ولی چون V-fox در فیلتر کردن اطلاعات سرعت خوبی دارد این روش در شبکه هم خوب جواب می دهد!
naderigh
چهارشنبه 13 تیر 1386, 06:58 صبح
اقا اصلا یک کار دیگه
اطلاعات کامبوباکس مستقیم از جدول( نه Query) اطلاعات لیست باکس هم فقط خود جدول البته جداول با ریلیشن ارتباط دارند چکار کنم که به محض انتخاب نام مشتیری اطلاعات لیست باکس ابتدا خالی شود و اطلاعات نمایش داده شده همانهائی باشد که مال همان مشتری انتخاب شده باشد و البته بدون Query
naderigh
دوشنبه 18 تیر 1386, 12:32 عصر
اساتید عزیز و محترم لطفا همکاری نمائید
rahro
دوشنبه 18 تیر 1386, 13:42 عصر
اساتید عزیز و محترم لطفا همکاری نمائید
میشه جداول و فرم مربوطه رو آپلود کنی تا شاید بتونیم مشکل رو حل کنیم ؟
binyaz2003
دوشنبه 18 تیر 1386, 14:17 عصر
اگر هر دو با یک فیلد اصلی به هم مرتبط باشند بصورت پدر-فرزندی (مشتری-کالا) این کار بصورت خودکار انجام میشه.
naderigh
چهارشنبه 20 تیر 1386, 15:46 عصر
لطفا همکاری نمائید (اطلاعات خیلی خیلی بیشتر از اینها میباشد)
hamed_m
پنج شنبه 21 تیر 1386, 00:26 صبح
متاسفانه فرصت نگاه کردن فرم و کد رو ندارم.
پیشنهادم اینه که:
برای سرعت بیشتر دیتا رو هر سری، در کرسر بخونید. با اینکه فیلتر یا ایجاد ریلیشن در مقادیر کم دیتا ممکنه و سرعت خوبی هم داره، گاهی خواندن دیتا به اندازه (مثلا محدودیت در اینجا مشتری مورد انتخابه که فقط لیست کالاهای اون رو بخونیم) سرعت رو خیلی بالا میبره.
از استفاده از SQL سرور در شبکه غافل نشید. کار رو باید به متخصص (اینجا دیتابیس انجین) سپرد.
بنظرم راهنمایی جناب شیری عالی و راهگشا بود.
naderigh
دوشنبه 25 تیر 1386, 09:51 صبح
اقایان لطفا .......
naderigh
چهارشنبه 27 تیر 1386, 12:50 عصر
اقایان لطفا همکاری نمائید
naderigh
یک شنبه 04 شهریور 1386, 12:38 عصر
آقایان من هنوز نتوانستم این مشکل را حل کنم لطفا کمک کنید
farhad_shiri_ex
یک شنبه 04 شهریور 1386, 14:03 عصر
آقایان من هنوز نتوانستم این مشکل را حل کنم لطفا کمک کنید
دوست عزیز!
لطفا به روش کاری من در این مثال توجه نمایید!
این روش بسیار مزیت دارد 1- کنترل تمامی اشیاء در دست شماست 2- سرعت اجرای آن در شبکه تا 200000 رکورد سرعت متعادل و خوبی دارد 3- کاربری آسانتر و با نمایی جذابتر از Listboxها.
لطفا اگر نظری دارید بیان نمایید!
rezaTavak
یک شنبه 04 شهریور 1386, 19:57 عصر
چرا Rushmore را استفاده نمیکنید؟
باید در ایندکس کردن اطلاعات فاکس را کمک کنید. اگر شما از set filter to استفاده کنید و ایندکس مرتبط درستی داشته باشید فاکس سریع خواهد بود.
naderigh
سه شنبه 06 شهریور 1386, 08:36 صبح
آقا بسیار از لطف شما سپاسگزارم ولی مثال شما خطا داشت برای گرید
و اقای توکل اگر حوصله دارید یک مقداری در باره Rushmore توضیح بفرمائید یا مثالی یا ....
من سعی میکنم از ایندکس کمتر استفاده کنم
rezaTavak
چهارشنبه 07 شهریور 1386, 14:40 عصر
فقط همین نکته:
یک ایندکس مرتبط با کاری که می خواهید ایجاد کنید و آنرا فعال نکنید. فکس خودش آنرا پیدا میکند.
naderigh
پنج شنبه 22 شهریور 1386, 09:43 صبح
جناب اقای توکل
با سلام
من اینطوری از Rushmore استفاده میکنم
ابتدا دستور SET OPTIMIZE ON
سپس در فرمهایی که لازم دارم فرمان =SYS(3054,11,"cmemvar")
را اجرا میکنم حال نمیدانم که درست است یا نه البته چند خطی روی فرم نمایش میدهد از اجرای این کار برای عدم نمایش این چند خط چکار کنم
لطفا راهنمای نمائید
rezaTavak
پنج شنبه 22 شهریور 1386, 11:54 صبح
set talk off
برای عدم نمایش است.
اما آیا ایندکس مربوطه ساخته شده است؟ اگر شده که هیچ اما اگر نشده در بانکهای بزرگ کمی سرعت را خواهید داشت.
naderigh
پنج شنبه 22 شهریور 1386, 12:15 عصر
set talk off میباشد ولی موقع Requery ها پیامها روی فرم نمایش داده میشود
و اگر امکان دارد در مورد ایندکسهایی که میفرمائید توضیح دهید چون من فقط از query استفاده میکنم
rezaTavak
جمعه 23 شهریور 1386, 19:19 عصر
ببینید در دستورهای شرطی شرط باید متناسب با ایندکس باشد. مثلا شما می خواهید شماره حسابهای بیشتر از ۱۰۰ نمایش داده شوند بنابراین ایندکس شماره حساب باید وجود داشته باشد.
ایندکس باید مثبت باشد نه منفی یعنی اینکه از عبارت دارای not استفاده نشده باشد. در غیر اینصورت ایندکس بدرد نمی خورد.
naderigh
شنبه 24 شهریور 1386, 09:28 صبح
با تشکر از لطف شما اقای توکل عزیز
ببینید در این مورد خاص اگر عنایت فرموده باشید همانند مثالی را که فرستادم فکر میکنم ایندکس کاربردی نداشته باشد
توضیح بیشتر میدهم
ببیند من دو جدول دارم فرض کنید یکی گروه کالاها و دیگری جزء کالاها که هرگروه کالا ممکن است از یک تا هزاران جزء کالا داشته باشد و با این کار انتخاب از گروه کالاها در کامبو یا لیست باکس بایستی زیرگروه همان گروه انتخاب شده در کامبو یا لیست باکس بعدی نمایش داده شود ومن برای هم گروه و هم جزء از query در لیست و کامبوباکس استفاده کردم وچون حجم اطلاعات زیاد میباشد پس از انتخاب گروه نمایش جزء مکث دارد حال اگر راهی هست که به جای query از خود جدوال بشود در لیست یا کامبوباکس استفاده برد راهنمائی فرمائید و جهت مزید اطلاع در هر دو جدول سرچ نمودن نام کالاها شرط میباشد
مجددا از عنایت شما سپاسگزارم
rezaTavak
یک شنبه 25 شهریور 1386, 11:35 صبح
من فرم شما را نگاه کردم.
اول باید اون relation توی Data environment حذف بشه چون نیازی نیست.
بعدش هم همه مشکل از query نیست به Combo or list بر میگردد. چونکه برای اینکه این عناصر بروز شوند لازم است تک تک رکوردها به حافظه آرایه واسط لیست کپی شد ه و ... بنابراین توصیه میشود تعداد این عناصر یا بهتر بگوییم در اینجا تعداد فیلدهایی که توسط query برگردانیده میشود محدود گردد.
naderigh
دوشنبه 26 شهریور 1386, 08:01 صبح
اقا بسیار متشکرم
درست میفرمائید نیازی relation نیست چون از query استفاده کردم و تعداد فیلدها را در حد دو سه فیلد مورد نیازم استفاده نمودم فقط مشکلم مکث requery میباشد راهی برای افزایش سرعتrequery بفرمائید
rezaTavak
دوشنبه 26 شهریور 1386, 08:38 صبح
راهی نیست چون بیشتر مربوط به Combo یا list است. که اون هم به عناصر گرافیکی و مراحل سطح پایین بر میگردد.
naderigh
دوشنبه 26 شهریور 1386, 12:31 عصر
اقا ممنون از الطاف شما انشاءالله که موفق باشید
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.