PDA

View Full Version : مشكل در دستور SQL



mehdi5106
پنج شنبه 17 بهمن 1387, 13:01 عصر
من در گزارش كه با توجه به چندين مقدار بايد توليد شود دستور زير را نوشته ام ،اما مي خواهم اگر يكي از مقادير فوق را خالي گذاشتم نيز جواب درستي به من بدهداما چنين گزارشي انجام نمي شود و پيغام خطا مي دهد.در حالي كه اگر همه مقادير فوق را تكميل نمايم گزارش به درستي انجام مي شود.حال به نظر شما چه تغييراتي را بايد در آن انجام دهم.


ADOtozin.Active:=False;
ADOtozin.SQL.Text:='select * from tozin where kalaname='+QuotedStr(ComboBox3.Text)+
'and driver='+QuotedStr(ComboBox4.Text)+
'and nocar='+QuotedStr(ComboBox5.Text)+
'and customer='+QuotedStr(ComboBox6.Text)+
'and nocontruct='+QuotedStr(ComboBox9.Text)+
'and datetozin between'+QuotedStr(SolarDatePicker1.Text)+'and'+Qu otedStr(SolarDatePicker2.Text)+
'and notozin between'+QuotedStr(Edit5.Text)+'and'+QuotedStr(Edi t6.Text);
ADOtozin.Active:=True;

Itist82
پنج شنبه 17 بهمن 1387, 14:27 عصر
سلام
چند تا if جدا از هم (تو در تو نه) بذارید که هر کدوم چک کنه اگه مثلا اولین کومبو باکس خالی نبود رشته ی کوئری شما رو کانکت کنه با قسمتی از شرط کوئری که از اون کومبو استفاده می کنه. یعنی مثلا این:



tozin.SQL.Text:='select * from tozin where kalaname='+QuotedStr(ComboBox3.Text)
if (ComboBox4.Text!= '')
tozin.SQL.Text:=tozin.SQL.Text+ 'and driver='+QuotedStr(ComboBox4.Text)
و همین جوری تا آخر. ببخشید من دلفی کار نیستم، سینتکسشو همین جوری نوشتم! خودتون درستش کنید. همیشه توی این جور کوئری ها کاری مشابه این باید کرد.

mehdi5106
پنج شنبه 17 بهمن 1387, 16:16 عصر
جواب شما خوب بود اما من اگر مي خواستم به روش شما پيش برم بايد ده بيست تا if مي نوشتم براي همين خواستم كه دوستان كد كوتاهتري رو ارائه بدن.چون جدول من بايد بر اساس ده بيست نوع مقدار مختلف توليد بشه . اونوقت خودتون حدس بزنيد كه چقدر كد براي اون بايد بنويسم.

Itist82
پنج شنبه 17 بهمن 1387, 18:03 عصر
درسته ولی من بعید می دونم راه دیگه ای وجود داشته باشه. حتی اگه حلقه هم بتونید بذارید (حلقه ای که بتونه خالی بودن یا نبودن فیلد های فرم رو چک کنه و بعد چیزایی به کوئری اضافه کنه) که ساختنش فکر نکنم به این راحتی باشه، بازم خیلی کارتون راحت تر نمی شه. منم با این مسئله برخورد داشتم و کسای دیگه هم کدمو دیدن اما نگفتن می تونستی بهترش کنی. دیگه نمی دونم! راه بهتر پیدا کردید ما هم ممنون می شیم اینجا بذارید!

bmanfy
جمعه 18 بهمن 1387, 09:33 صبح
با توجه به دوستوراتی که نوشتی تمام مقادیر فیلدهای شما رشته هستند و شما هم از = برای بررسی استفاده کرده اید که خیلی بعید به نظر میرسه که کاربر بتونه مقادیر دقیق رو وارد کنه . و این در کل میشه گفت که در حالت آزمایشگاه جوابگو هست .
÷س بهتره از Like و % استفاده کنی که وقتی هم از % استفاده کنی راحت می تونی دستورات بالا رو استفاده کنی . و اگر کاربر مقداری رو وارد نکنه به این مفهموه که مقدار اون فیلد براش مهم نبوده و هر چی میخواد باشه که دقیقا با این چیزی که من گفتم جور درمیاد .


روش بعدی اینه که (برای کامبوباکسها) میتونی طوری طراحی کنی که نتونه مقدار خالی برگردونه .
یعنی برای هر چیز یک مقدار پیش قرض قرار بدی .

یه چیز هم که هست شما دوست داری دستوراتت جوا بده اما در عین کوتاهی .
شماید برای ا ینکه یه چیز کامل بشه ممکمنه خیلی کد لازمه بنویسی . همیشه به جواب مطلوب بیندیش . (البته منکر نمیشم که برنامه نویس خوب کسیه که بتونه در غین کوتاهی دستورات بهتری کار رو انجام بده )

عمومی ترین روش اینه که این شرط رو در خارج بسازی و سپس به اون نسبت بدی
برای اینکه مشکل چک کردن And و .... رو نداشته باشی و در عین حال کدت کوتاهتر بشه میتونی اینطور عمل کنی : من فقط برای یک Edit مینویسم . (اما با در نظر گرفتن اینکه شما حتما میخوای از = استفاده کنی و اگر کاربر مقدار یک Edit رو وارد نکرد یعنی اون براش مهم نیست هر چی باشه )



.
.
.
if edit1.text = '' then
Str:= str + ' and (fileldName Like ' + QueterdStr('%') + ')'
else
Str := Str + 'and (FieldName=' + QuetedStr(Edit1.text) + ')' ;

حتی چون برای باقی هم به همین شکله میتونی یه تابع هم براش بنویسی .
موفق باشی .