PDA

View Full Version : سوال: مشکل این دستور چیه؟



acilios
سه شنبه 14 آبان 1387, 18:43 عصر
با سلام.
توی فیلد info ترکیبی از چند مقدار رو به شکل زیر ذخیره کردم.


SQL.Add('select * from moshtary WHERE name='''+edname.Text+''' AND family='''+edfamily.Text+''' AND info='''+(comboname.Text+' '+combotype.Text+' '+combomodel.Text)+'''');حالا وقتی که کد زیر رو اجرا میکنم چیزی رو بر نمیگردونه !!!


SQL.Add('select * from moshtary WHERE name='''+edname.Text+''' AND family='''+edfamily.Text+''' AND info='''+(comboname.Text+' '+combotype.Text+' '+combomodel.Text)+'''');به نظر من فاصله ای که بینشون هست ایراد داره.
نوع فیلد info از نوع nvarchar تعریف شده.

delphiprog3000
سه شنبه 14 آبان 1387, 19:11 عصر
با سلام.
توی فیلد info ترکیبی از چند مقدار رو به شکل زیر ذخیره کردم.


SQL.Add('select * from moshtary WHERE name='''+edname.Text+''' AND family='''+edfamily.Text+''' AND info='''+(comboname.Text+' '+combotype.Text+' '+combomodel.Text)+'''');حالا وقتی که کد زیر رو اجرا میکنم چیزی رو بر نمیگردونه !!!


SQL.Add('select * from moshtary WHERE name='''+edname.Text+''' AND family='''+edfamily.Text+''' AND info='''+(comboname.Text+' '+combotype.Text+' '+combomodel.Text)+'''');به نظر من فاصله ای که بینشون هست ایراد داره.
نوع فیلد info از نوع nvarchar تعریف شده.


با سلام.

آیا نتیجه ای بر میگرداند یا خطا میدهد؟

به نظر منطق کد شما مشکل داره.

برای ساده نویسی از تایع Quotedstr استفاده نماید. به جای '''

delphiprog3000
سه شنبه 14 آبان 1387, 19:20 عصر
دوست گرامی نگاهی به این تاپیک بندازید میتونه به شما در نحوه نوشتن کد کمک کنه.
http://barnamenevis.org/forum/showthread.php?t=88786

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

mafazel
چهارشنبه 15 آبان 1387, 08:01 صبح
سلام دوست عزیز
به نظر من مشکلی نداره فقط تعداد زیادی شرط رو AND کردید که این باعث میشه شرط خیلی سخت گیری کنه و آیتمهای بسیار کمی در این شرط صدق کنند. در ضمن شرطی که روی Info گذاشتید یه مقدار عجیب و مشکوکه! (اینکه سه تا متغیر رو به هم بچسبونید. دقت کنید که آیا در جدول هم به همین صورت درج کردید؟). ضمنا لینکی که دوستمون در بالا گذاشتن رو ببینید. اگر یکی از ادیت های شما خالی باشه به خطا برخورد می کنید.
من کد زیر رو پیشنهاد می کنم:


var
S, s1,s2,s2,ts: string;
begin
if Trim(EdName.Text)<>'' then s1 := ' (Name='+QuotedStr(EdName.Text)+')' else s1 := '';
if Trim(EdFamily.Text)<>'' then s2 := ' (Family='+QuotedStr(EdFamily.Text)+')' else s2:='';
ts := comboname.Text+' '+combotype.Text+' '+combomodel.Text;
if Trim(ts)<>'' then s3 := ' (Info='+QuotedStr(ts)+')' else s3 := '';
S := s1;
if s2<>'' then if S<>'' then S := S + ' AND ' + s2 else S := s2;
if s3<>'' then if S<>'' then S := S + ' AND ' + s3 else S := s3;
if S='' then S := 'Select * From Moshtari' else S := 'Select * From Moshtari where (' + S + ')';
SQL.Text := S; o

البته این کد باعث میشه اگر نام و فامیل خالی باشند از شرط ها حذف شوند و اگر همه ادیت ها خالی باشند همه رکورد ها رو نمایش دهد.
بنظر من هم حتما از QuotedStr استفاده کنید.

acilios
پنج شنبه 16 آبان 1387, 07:04 صبح
ممنون از راهنمایی دوستان.
فیلد info شامل مشخصات کالای خریداری شده توسط مشتری (name,family) است.
برای اینکه این مشخصات (name,type,model) توی فیلد info به هم نچسبند از فاصله استفاده کردم.


FieldByName('info').Value:=comboname.Text+' '+combotype.Text+' '+combomodel.Text+' '+combocolor.Text ;برای نمونه : "جاروبرقی سامسونگ 1800وات سفید" .!!

که اگه این فاصله ها رو نزارم ...؟؟؟؟!!!!

درضمن کامبوباکس ها مشخصات کالا را از جدول انبار لود میکنن و کاربر اونارو انتخاب میکنه که در مجموع در فیلد info ذخیره میشه. توی این برنامه نباید دو رکورد مثل هم باشه پس وقتی میخام دستور select رو استفاده کنم چیزی بر نمیگردونه یعنی Query خالیه !


with dm.adoqmoshtary do
begin
close;
sql.Clear;
SQL.Add('select * from moshtary WHERE name='''+edn.Text+''' AND family='''+edf.Text+''' AND info='''+(comboname.Text+' '+combotype.Text+' '+combomodel.Text)+'''');
open;
if not IsEmpty then
ShowMessage('information is repeated')
else
begin
.
.
.
end;

mafazel
پنج شنبه 16 آبان 1387, 12:38 عصر
که اگه این فاصله ها رو نزارم ...؟؟؟؟!!!!

درضمن کامبوباکس ها مشخصات کالا را از جدول انبار لود میکنن و کاربر اونارو انتخاب میکنه که در مجموع در فیلد info ذخیره میشه. توی این برنامه نباید دو رکورد مثل هم باشه پس وقتی میخام دستور select رو استفاده کنم چیزی بر نمیگردونه یعنی Query خالیه !


with dm.adoqmoshtary do
begin
close;
sql.Clear;
SQL.Add('select * from moshtary WHERE name='''+edn.Text+''' AND family='''+edf.Text+''' AND info='''+(comboname.Text+' '+combotype.Text+' '+combomodel.Text)+'''');
open;
if not IsEmpty then
ShowMessage('information is repeated')
else
begin
.
.
.
end;
سلام دوست عزیز
در مورد اول منظورم چسباندن با فاصله یا بدون فاصله نیست. منظورم اینکه که چسباندن چند فیلد به هم و ساختن یه فیلد بزرگ استاندارد نیست نه اینکه غلطه، اگه برنامه تون نیاز داشته باشه چه اشکالی داره. باید ها رو مشتری نرم افزار شما تعریف میکنه (بشرطی که هزینه شو بده و نظراتش عوض نشه و اگه شد بازم هزینه شو بده).
در مورد دوم لطفا در طرح سوالتون بیشتر زحمت بکشید. یکم نامفهومه یا من متوجه نمیشم.
1- چرا دو رکورد تکراری نباید باشه (مثلا ممکن نیست یک نفر دوبار خرید کنه، اتفاقا هر دوبار هم «جارو برقی سامسونگ 1800 وات سفید » بخره؟ شاید هم نمیخواین اصل موضوع نرم افزار رو بگین که اشکال نداره.
2-آیا شما در هنگام وارد کردن یک خرید میخواهید ببینید آیا این رکوردی که الان میخواهید بگذارید، قبلا عینا در جدول هستش یا نه؟ این کدی که نوشتید بهینه نیست. کد بهتری هم میشه نوشت.
3- اگر جدول خالی نباشد لزوما عبارت Information is Repeated درست نیست چون شاید یکی پیدا شده و هنوز دومی وارد نشده.
4-کدتون رو عینا تست کردم. باز هم میگم کدی که نوشتید ایراد ندارد. برای اطمینان از پرانتز بیشتر استفاده کنید همچنین از QuotedStr. مطمئن باشید که در جدولتون رکوردی که نام مساوی ... و فامیل مساوی ... و مورد خرید (هر سه ویژگی باهم) مساوی ... باشد وجود ندارد. دقت کنید که همه باید عینا مساوی باشند و حتی یک فاصله کم و زیاد نباشد.
5- برنامه تون رو ابتدا با مقادیری که بسادگی قابل تشخیص باشد تست کنید. مثلا بجای «"جارو برقی سامسونگ 1800 وات سفید» با عبارت «"aa bb cc" » تست کنید.
اگه مشکلتون حل نشد بازم مطرح کنید.
موفق باشید.

acilios
شنبه 18 آبان 1387, 07:05 صبح
با تشکر از دوست عزیز mafazel.
در مورد سوال اولتون باید بگم که توی جدول فیلد تعداد هم هست پس اگه یه نفر بخواهد که دوتا "جارو برقی سامسونگ 1800 وات سفید" خرید کنه قیمت ثبت شده برای مشتری ضرب در2 میشه.
کد بالا درست بود! اشکال از بخش ثبت بود که به جای Value از AsString استفاده کردم مشکل حل شد.
موفق باشید.