PDA

View Full Version : نمایش و عدم نمایش یک مجموعه



tadeh2010
پنج شنبه 19 آبان 1390, 08:59 صبح
سلام دوستان من یک برنامه ای نوشته بودم و حالا نیاز به یک تغییر درآن دارم
یک چک لیست باکس برای این کار طراحی کرده ام
که داخلش نام های مختلفی می باشد مثلا ali , reza , mohammad,...
کاربر هر کدام از این نامها راکه بخواهد در گزارشش دیده شوند انتخاب می کند
به نظر من هم ساده بود و با یک دستور select ساده قابل پیاده سازی بود
اما الزاما نامهایی که در دیتابیس هستند تنها محمد یا رضا یا علی نیستند
بلکه می توانند ترکیبی از این نامها باشند
حالا باید چه کار کرد
یک چیزی مانند دستور like %
یا
exist (like %Ali%)
لطفا راهنماییم بکنید
ممنونم

Felony
پنج شنبه 19 آبان 1390, 12:15 عصر
این مورد رو باید در زبان برنامه نویسی مورد استفاده پیاده کنید ، پس جای سوالتون اینجا نیست ( تا جایی که یادمه با دلفی کار میکنید ) ؛ در رویداد OnClickCheck مربوط به شئ CheckListBox تون کد زیر رو بنویسید :

if CheckListBox1.Checked[CheckListBox1.ItemIndex] then
begin
if Pos('Name', TSQL) = 0 then
TSQL := TSQL + ' Name LIKE ' + QuotedStr(CheckListBox1.Items.Strings[CheckListBox1.ItemIndex])
else
TSQL := TSQL + ' OR Name LIKE ' + QuotedStr(CheckListBox1.Items.Strings[CheckListBox1.ItemIndex])
end
else
Delete(TSQL, Pos(' OR Name LIKE ' + QuotedStr(CheckListBox1.Items.Strings[CheckListBox1.ItemIndex]), TSQL), Length(' OR Name LIKE ' + QuotedStr(CheckListBox1.Items.Strings[CheckListBox1.ItemIndex])));

متغییر TSQL یک متغییر رشته ای هست که در قسمت Private فرم تعریف شده ، در رویداد Create فرمتون یا ... قسمت اولیه Query تون رو بنویسید ، مثلا :

TSQL:= 'SELECT * FROM Table_Name WHERE ';

tadeh2010
پنج شنبه 19 آبان 1390, 12:42 عصر
متشکرم دوست عزیز
من دلفی کار هستم
ولی قبلا یک همچین کدی درست کرده ام و ازش جواب هم گرفته ام ولی اصلا به صرفه نیست
چون باید یک کد داینامیک باشد
چون لیست باکس برنامه ام تغییر می کند
و مهمتر اینکه یک گزینه دارم که شامل متمم لیست باکسهای دیگر می شود و این یکی خیلی خیلی کد if then else برنامه را طولانی می کند
برای همین آمدم در اسکریپتهای اس کیو ال دنبال چیزی مثل مجموعه گشتم
مثل IN و Exist
ولی نتوانستم پیاده سازی اش بکنم
با این حال از شما دوست عزیز کمال تشکر را دارم که با من هم فکر شدید

tadeh2010
پنج شنبه 19 آبان 1390, 16:41 عصر
سلام فهمیدم باید مسئله را چطوری بیان بکنم
:-)
ما یک چک لیست باکس داریم از استانها ایران
که کاربر می تواند چندین استان را به عنوان گزارش انتخاب بکند و یا هیچ کدام را چون در بانک بعضی از اسامی بدون نام استان قید شده اند
مثلا:
tehran - azadi
semnan - garmsar
tehran gharb- karaj
azzr.gh - oromiye
Lar
Ghesm
همونطور که می بینید اسم استانها آمده است و برای بعضیها نیامده مانند لار و قشم
البته وقتی کاربر استان فارس را انتخاب می کند نباید لار جزئ گزارش باشد
بلکه وقتی گزینه اول یعنی غیره را انتخاب می کند باید قشم و لار در گزارش بیایند
خوب با این تفاسیر حالا راهنماییم بکنید که چطوری کدی بنویسم که گزارش مربوطه را بگیرد
توضیحاتم کافی بود؟

یوسف زالی
پنج شنبه 19 آبان 1390, 18:53 عصر
سلام دوست من.
اگر تعداد چک باکس ها و رادیو آیتم های شما ثابت هست می تونید کاری مثل این کنید:
select * from TBL where (F1 = @F1 or @F1 = 0) and (F2 = @F2 or @F2 = 0) -- and same

در تعداد های نامشخص هم می تونید یک مجموعه ساخته و از اون استفاده کنید.
در حالت کلی معمولا برای چک باکس راه حل سلکتی وجود داره.
اگر منظورتون رو کامل متوجه نشدم توضیحات بیشتری بدید یا یک عکس از فرم برنامتون بگذارید.
موفق باشید.

tadeh2010
پنج شنبه 19 آبان 1390, 19:06 عصر
سلام ممنونم
1 - ولی می توانید کد فوق را توضیح بدهید
2- من اصلا با @ بلد نبودم کاربکنم ، حتما کارش مثل % است ، نه؟
3- و اصلا می شود منظورتان را با مثال بیان بکنید
4- چرا F1=@F1
5-اصلا F1 چیست ؟
6- F1 رشته است؟
7- F1متغییر است؟
8- F1 مقدار پیشفرض چک باکس اولی است؟
9- اونوقت 0 چه می کند ؟
10- lمقدار 0 در اینجا یعنی Null یا Not مثلا وقتی که چک باکس اولی انتخاب نمی شود؟ مقدار صفر را با F1مقایسه بکند؟
متشکرم
تعداد سوالاتم را نبینید بعضی ها را خودم احتمالا جواب داده ام و بعضی ها جواب بلی یا نه می خواهد یا یک جواب کوتاه
ولی ممنون می شوم مثال بزنید؟مثل مثال اتانهای فوق خودم
خیلی ممنونم.

یوسف زالی
پنج شنبه 19 آبان 1390, 20:24 عصر
اون یک فرم کلی بود.
ببینید:
چک باکس من مثلا هست checkbox1
براش یک پارامتر در نظر می گیرم به نام F1@ که اگر تیک خورد یک بشه و اگر نخورد صفر.
این قراره مثلا بگه مهدی رو بیار یا نه. نام ها مثلا در جدول TBL در فیلد F1 هست.
در این صورت :

select * from TBL
where (F1 = 'mehdi' or @F1 = 0) -- test

این به این معنیه که اگر تیک خورده بود مهدی رو بیار وگرنه کاری به این فیلتر نداشته باش.
می تونی چند تا از این مدل رو با هم and کنی.

tadeh2010
جمعه 20 آبان 1390, 11:08 صبح
سلام دوست عزیز
مطلبی که شما گفته اید درست است
و مشکل متمم کردن مجموعه استانها را می تواند حل بکند
ببینید من درست می گویم
مثلا:

select * from state
where (F1 like '%Tehran%' or @F1 = 0) and (F1 like '%Esfehan%' or @F1 = 0) and ...

خوب مشکلی نیست ولی کد داینامیک نیست که من سعی می کنم با آنچه که جناب تاجیک در پست شماره ی 2 فرموده اند تقربا به صورت داینامیک درش بیاورم
ولی عملکرد @ را نمی فهمم ، در موردش تحقیق کردم فکر بکنم به اس کیو ال می فهماند که F1 از نوع متغییر است ، نه؟
ولی اگر این طور است چرا F1 اولی این @ را ندارد؟
لطفا یکی در این مورد هم کمکم بکند.

یوسف زالی
جمعه 20 آبان 1390, 12:10 عصر
متغیر ها با @ شروع می شوند.
برای چندین متغیر هم می تونید یک رشته بسازید و به اس کیو ال بفرستید و در آنحا با شرط اصلی ترکیب کنید.

tadeh2010
جمعه 20 آبان 1390, 12:39 عصر
متشکرم
ولی چرا F1 اولی @ ندارد مگر آن متغییر نیست که از داخل برنامه به SQL فرستاده شده است؟

یوسف زالی
جمعه 20 آبان 1390, 14:56 عصر
F1 اولی همون طور که گفتم "فیلد" است