PDA

View Full Version : روش بهتر برای گزارش گیری در این برنامه



کامروا
سه شنبه 17 آبان 1390, 14:22 عصر
سلام خدمت اساتید محترم

لطفا بهتر روش برای این کار رو بگید.
می خواهم کاربر هر کدام از مراجع تقلید را که انتخاب میکند، به Where دستور Select من اضافه شود.
زمانی که تیک مراجع را میزند در DbGrid فقط همین را نشان دهد.
77579

تشکر دوستان محترم

کامروا
سه شنبه 17 آبان 1390, 16:05 عصر
دوستان ببینید میخوام هر کدام از تیک ها که زدند، شرط آن به این کد زیر اضافه شود و اگر تیک آن را برداشتند از کد زیر برداشته شود.
لطفا راهنمایی کنید. اصلا اگر روشی بهتر از این سراغ دارید، کمک کنید. تشکر


Select * From Table_Name Where Marja_Name = 'آیت الله مکارم' Or 'آیت الله خمینی' Or....

soft-c
سه شنبه 17 آبان 1390, 18:31 عصر
یک راه استفاده از دستور if then ساده است که اگر فلان چک باکس تیک داشت دستور select مرتبط با اون اجرا بشه .(همینطور با else جلو برو).
از case هم میتونی استفاده کنی .
البته راه کوتاه تر هم داره که اگر یک جستجو در تالار بکنی پیدا می کنی .

کامروا
سه شنبه 17 آبان 1390, 18:57 عصر
یک راه استفاده از دستور if then ساده است که اگر فلان چک باکس تیک داشت دستور select مرتبط با اون اجرا بشه .(همینطور با else جلو برو).
از case هم میتونی استفاده کنی .
البته راه کوتاه تر هم داره که اگر یک جستجو در تالار بکنی پیدا می کنی .
ممنون دوست عزیز ولی این روش رو بلدم که به نظرم خوب نمیاد!
سرچ کردم ولی چیزی دستگیرم نشد!
لطفا راهنمایی کنید...

تشکر

Felony
سه شنبه 17 آبان 1390, 19:37 عصر
یک متغییر ( مثلا Str ) در بخش Private فرمتون تعریف کنید و در رویداد Create فرمتون به صوررت زیر بهش مقدار بدید :

Str:= 'Select * From Table_Name Where Marja_Name =';

و در رویداد Click یکی از CheckBox هاتون کد زیر رو بنویسید :

if TCheckBox(Sender).Checked then
begin
if Length(Str) = 43 then
Str := Str + QuotedStr(TCheckBox(Sender).Caption)
else
Str := Str + ' OR ' + QuotedStr(TCheckBox(Sender).Caption);
end else
Delete(Str, Pos(' OR ' + QuotedStr(TCheckBox(Sender).Caption), Str), Length(' OR ' + QuotedStr(TCheckBox(Sender).Caption)));

رویداد Click باقی CheckBox ها رو هم مساوی همین رویداد کنید ( همشون یک رویداد مشترک داشته باشن ) .

کامروا
سه شنبه 17 آبان 1390, 20:02 عصر
ممنون دوست عزیز واسه ماوی قرار دادن مساوی از این کد خطا میگیره!

procedure TForm3.sCheckBox2Click(Sender: TObject);
begin
sCheckBox2.OnClick := sCheckBox1.OnClick(Self);
end;

کامروا
سه شنبه 17 آبان 1390, 20:05 عصر
آهان فهمیدم باید اینو بنویسم

sCheckBox1.OnClick(Self);

کامروا
سه شنبه 17 آبان 1390, 20:10 عصر
وقتی تیکش رو بر میدارم بازم به رشته اضافه میکنه جای اینکه کم کنه!!!!
لطفا راهنمایی کنید....
فقط روی چکباکس آیت الله مکارم درست عمل میکنه. بقیه وقتی تیک رو بر میدارم اضافه میکنه در ضمن اسم 'گزارشات' هم میزاره بجای نام مرجع!!

Felony
چهارشنبه 18 آبان 1390, 07:08 صبح
برای یکی کردن رویدادها نیازی به کد نیست و از طریق پنجره Object Inspector هم قابل انجام هست .

نمونه ضمیمه رو ببینید .

Mahmood_M
چهارشنبه 18 آبان 1390, 09:59 صبح
کد زیر سورس یک فیلتر گذاری هست که توی برنامم استفاده کردم ، شاید به درد بخوره ، موقعی که مقدار فیلدها مشخص نیست ، باید وضعیت همه ی چک باکس ها و ... رو بررسی کنید
البته در سورس زیر شرایط کمی فرق میکنه ، مثلا در اینجا با کلیک روی یک دکمه مقادیر بررسی می شن و فیلتر گذاری انجام میشه ، نه با کلیک روی هر CheckBox یا ...


procedure TMainFrm.FilterBtnClick(Sender: TObject);
var
FText, AndOr, Field, SS : String;
const
DefaultText = 'SELECT * FROM MaTable';
begin
FText := DefaultText;

if FNameChBox.Checked then
FText := FText + ' WHERE PName LIKE ' + QuotedStr('%'+Trim(FNameEdit.Text)+'%');

if FCompanyChBox.Checked then
begin
if FText = DefaultText then
FText := FText + ' WHERE CName LIKE ' + QuotedStr('%'+Trim(FCompanyEdit.Text)+'%')
else
begin
case F1AndOrCBox.ItemIndex of
0 : AndOr := ' AND ';
1 : AndOr := ' OR ';
end;
FText := FText + AndOr +'CName LIKE ' + QuotedStr('%'+Trim(FCompanyEdit.Text)+'%')
end;
end;

if FDateChBox.Checked then
begin
if FText = DefaultText then
FText := FText + ' WHERE ( FDate BETWEEN ' + FloatToStr(FDateFromDP.Date) + ' AND ' + FloatToStr(FDateToDP.Date) + ' )'
else
begin
case F2AndOrCBox.ItemIndex of
0 : AndOr := ' AND ';
1 : AndOr := ' OR ';
end;
FText := FText + AndOr + '( FDate BETWEEN ' + FloatToStr(FDateFromDP.Date) + ' AND ' + FloatToStr(FDateToDP.Date) + ' )';
end;
end;

if FInsChBox.Checked then
begin
case FInsCBox.ItemIndex of
0 : Field := 'ICount';
1 : Field := 'IPayed';
end;

if FText = DefaultText then
FText := FText + ' WHERE ( ' + Field + ' BETWEEN ' + FInsFromEdit.Text + ' AND ' + FInsToEdit.Text + ' )'
else
begin
case F3AndOrCBox.ItemIndex of
0 : AndOr := ' AND ';
1 : AndOr := ' OR ';
end;
FText := FText + AndOr + '( ' + Field + ' BETWEEN ' + FInsFromEdit.Text + ' AND ' + FInsToEdit.Text + ' )';
end;
end;

if FDebtChBox.Checked then
begin
case FDebtCBox.ItemIndex of
0 : Field := 'DTotal';
1 : Field := 'DPayed';
end;

if FText = DefaultText then
FText := FText + ' WHERE ( ' + Field + ' BETWEEN ' + FDebtFromEdit.Text + ' AND ' + FDebtToEdit.Text + ' )'
else
begin
case F4AndOrCBox.ItemIndex of
0 : AndOr := ' AND ';
1 : AndOr := ' OR ';
end;
FText := FText + AndOr + '( ' + Field + ' BETWEEN ' + FDebtFromEdit.Text + ' AND ' + FDebtToEdit.Text + ' )';
end;
end;

if FStatusChBox.Checked then
begin
case FStatusCBox.ItemIndex of
0 : SS := '1';
1 : SS := '0';
end;

if FText = DefaultText then
FText := FText + ' WHERE SMSStatus = ' + SS
else
begin
case F5AndOrCBox.ItemIndex of
0 : AndOr := ' AND ';
1 : AndOr := ' OR ';
end;
FText := FText + AndOr + 'SMSStatus = ' + SS;
end;
end;

if FText = DefaultText then
MessageBox(Handle, 'فیلدی برای فیلتر گذاری مشخص نشده است', '', MB_OK+MB_ICONEXCLAMATION)
else
begin
DM.MasterTable.Close;
DM.MasterTable.SQL.Text := FText;
DM.MasterTable.Open;
end;
end;


یک تصویر هم از قسمت فیلتر گذاری ضمیمه کردم که درک سورس راحت تر باشه

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