ورود

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



hentjanson
شنبه 22 تیر 1387, 17:08 عصر
سلام من يك مدت بود به دنبال شمارنده مطالب بعد از فيلتر بودم يعني بعد سرچ نمايش بدم تعداد مطالب يافت شده رو .
بعد با اين مواجه شدم


procedure TForm1.MaskEdit1Change(Sender: TObject);
Var
FieldName : String;
begin
FieldName := DBGrid1.Columns[ComboBox1.ItemIndex].FieldName;
ADOTable1.Filtered := False;
ADOTable1.Filter := FieldName+' Like '+QuotedStr('%'+MaskEdit1.Text+'%');
IF MaskEdit1.Text <> '' Then
ADOTable1.Filtered := True;
Label3.Caption := IntToStr(ADOTable1.RecordCount);
end;

بهمراه اين كد


procedure TForm1.FormCreate(Sender: TObject);
begin
MaskEdit1Change(Owner);
end;
end.

ميشه دوستان روند كار اين كد رو براي من توضيح بدهند اينكه چطور خودشو با فيلد هاي بانك هماهنگ ميكنه .
خود برنامه رو هم ميزارم براي مشاهده

Hsimple11
شنبه 22 تیر 1387, 17:43 عصر
روند خاصی ندارد. یک فیلتر ساده انجام می دهد و تعداد رکوردها را بعد از فیلتر نمایش میدهد. در FormCreate هم رویداد بالا یعنی MaskEditChange فراخوانده شده است یعنی در FormCreate هم پروسیجر بالا اجرا میشود.
نیازی هم به متغیر FieldName ندارید:


ََADoTable1.Filter := AdoTable1.FieldByname (Combobox1.Text).AsString
+'Like'+QuotedStr (MaskEdit1.Text);
و بجای اینکه در ComboBox شماره فیلدی که میخواهید آنرا فیلتر کنید انتخاب کنید، لیست فیلدهایتان را قرار دهید.

hentjanson
شنبه 22 تیر 1387, 18:47 عصر
همينو متوجه نميشم ببين وقتي من يك index ديگه اضافه ميكنم كار نميكنه .
مثلا اينطوري
نام كتاب
عنوان كتاب
من مي خوام بر اساس فيلد هاي (namketab.moalef.nevisandeh) جستجو كنم اينو بايد چطور تعريف كنم اينو متجو نشدم

mojiparadox
شنبه 22 تیر 1387, 19:50 عصر
چرا از فيلتر استفاده نمي‌كني؟ يا از دستورات SQL؟

Hsimple11
شنبه 22 تیر 1387, 21:39 عصر
همينو متوجه نميشم ببين وقتي من يك index ديگه اضافه ميكنم كار نميكنه .
مثلا اينطوري
نام كتاب
عنوان كتاب
من مي خوام بر اساس فيلد هاي (namketab.moalef.nevisandeh) جستجو كنم اينو بايد چطور تعريف كنم اينو متجو نشدم

میتونید چند تا RadioButton بذارید با نامهای نام کتاب، عنوان کتاب و ... و یک Edit و دکمه. بر اساس اینکه کدوم RadioButton انتخاب باشد فیلتر بر اساس همان فیلد انجام شود. فقط نام Fieldname را در انتخاب Radiobutton ها تغییر دهید.


چرا از فيلتر استفاده نمي‌كني؟ يا از دستورات SQL؟

ایشون که از فیلتر استفاده کردن!

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

hentjanson
شنبه 22 تیر 1387, 22:41 عصر
من با اين كد مشكلم حل شد اينو ببين :


procedure TForm1.ADOTable1FilterRecord(DataSet: TDataSet;
var Accept: Boolean);
begin

if Form1.ComboBox2.ItemIndex=0 then
Accept:=(AnsiPos(Trim(Form1.MaskEdit11.Text),Trim( DataSet['namketab']))>0)
else if Form1.ComboBox2.ItemIndex=1 then
Accept:=(AnsiPos(Trim(Form1.MaskEdit11.Text),Trim( DataSet['nammoalef']))>0)
else if Form1.ComboBox2.ItemIndex=2 then
Accept:=(AnsiPos(Trim(Form1.MaskEdit11.Text),Trim( DataSet['nammotrajem']))>0)
end;


چطور حالا به شمارش بپردازم در اين روش هر ايندكس رو برابر با فيلد مربوطه قرار دادم .
ولي نميدونم چطور وقتي محتويات سرچ در dbgrid نشون داده ميشن بگم چند تا پيدا كرده ؟

Hsimple11
یک شنبه 23 تیر 1387, 01:27 صبح
دوست عزیز به هر شکلی که فیلتر خود را انجام دادید با RecordCount تعداد را بدست بیاورید. الان مشکلتان کجاست؟؟

hentjanson
یک شنبه 23 تیر 1387, 07:09 صبح
منظور شما اين كد هستش من اينو هر طور نوشتم جواب نداد به نظرت اينو بايد كجاي اين كدم بنويسم جواب بده ؟


Label1.Caption:=IntToStr(ADOTable1.RecordCount);

Hsimple11
یک شنبه 23 تیر 1387, 12:10 عصر
بعد از فیلتر کردن.

hentjanson
یک شنبه 23 تیر 1387, 16:24 عصر
procedure TForm1.ADOTable1FilterRecord(DataSet: TDataSet;
var Accept: Boolean);
begin

if Form1.ComboBox2.ItemIndex=0 then
Accept:=(AnsiPos(Trim(Form1.MaskEdit11.Text),Trim( DataSet['namketab']))>0)
else if Form1.ComboBox2.ItemIndex=1 then
Accept:=(AnsiPos(Trim(Form1.MaskEdit11.Text),Trim( DataSet['nammoalef']))>0)
else if Form1.ComboBox2.ItemIndex=2 then
Accept:=(AnsiPos(Trim(Form1.MaskEdit11.Text),Trim( DataSet['nammotrajem']))>0)
end;
يعني اينجا اينو وارد كنم ؟‌ Label1.Caption:=IntToStr(ADOTable1.RecordCount);

Hsimple11
یک شنبه 23 تیر 1387, 17:18 عصر
RecordCount در هرجایی که استفاده شود تعداد رکوردهای فعلی را برمیگرداند.
بهرین راه وارد کردن این کد در زمانی است که پس از تایپ رشته مورد نظر در Edit کلید Enter زده میشود.

hentjanson
یک شنبه 23 تیر 1387, 18:08 عصر
من هر جا نوشتم اينو خطو جواب نداد نميدونم چرا ميشه يك نگاهي به كد من بكنيد يك راهنمايي بكنيد كجا بنويسم بهتره الان با اين شرايط

Hsimple11
یک شنبه 23 تیر 1387, 21:39 عصر
رویداد OnFilterRecord زمانی فراخوانده میشود که رکوردی Active بانک تغییر کند. بنابراین این کد را در زمانی که فیلتر شما صورت میگیرد وارد کنید. مثلا در رویداد ComboBoxChange .

میتوانید در همین کد نیز آن را بعد از هر IF استفاده کنید.

hentjanson
یک شنبه 23 تیر 1387, 22:07 عصر
سلام شب بخير دوست من
ببين من اينو هم در روند ComboBoxChange و هم در روند maskeditchange نوشتم ولي در هر دو مجموع كل بانم رو ميده نميدونم به نظرم يك جايه كار من اشكال داره ميشه كمكم كنيد ؟

SYNDROME
یک شنبه 23 تیر 1387, 22:12 عصر
سلام شب بخير دوست من
ببين من اينو هم در روند ComboBoxChange و هم در روند maskeditchange نوشتم ولي در هر دو مجموع كل بانم رو ميده نميدونم به نظرم يك جايه كار من اشكال داره ميشه كمكم كنيد ؟
فکر کنم اگر تکه برنامه خود را اینجا قرار دهید زودتر به جواب می رسید.
موفق باشید

Hsimple11
یک شنبه 23 تیر 1387, 22:15 عصر
دوست گرامی دلیل این است که یا فیلتر شما عمل نمیکند یا قبل از اعمال فیلتر RecordCount را استفاده میکنید. یک مثال خیلی ساده :



ADOTable1.Filter := ' nameketab='+QuotedStr(Edit1.Text);
ADOTable1.Filtered:=True;
Label1.Caption := .....

hentjanson
یک شنبه 23 تیر 1387, 22:22 عصر
سلام اين كد منه .


procedure TForm1.ADOTable1FilterRecord(DataSet: TDataSet;
var Accept: Boolean);
if Form1.ComboBox2.ItemIndex=0 then
Accept:=(AnsiPos(Trim(Form1.MaskEdit11.Text),Trim( DataSet['namketab']))>0)
else if Form1.ComboBox2.ItemIndex=1 then
Accept:=(AnsiPos(Trim(Form1.MaskEdit11.Text),Trim( DataSet['nammoalef']))>0)
else if Form1.ComboBox2.ItemIndex=2 then
Accept:=(AnsiPos(Trim(Form1.MaskEdit11.Text),Trim( DataSet['nammotrajem']))>0)
end;

ميشه نسبت به اين راهنمايي كنيد يا روش بهتري ارائه بهم بديد اگه كارم اشتباست

Hsimple11
یک شنبه 23 تیر 1387, 22:34 عصر
از دستورات SQL استفاده کنید. سرعت بالاتری خواهند داشت:


if Combobox1.ItemIndex=0 then
..

Select nameketab,Count(*) From Table1 WHERE nameketab Like QuotedStr(MaskEdit1.Text)

..

hentjanson
یک شنبه 23 تیر 1387, 23:02 عصر
دوست من اينو در onfilterrecord بنويسم يا يك مكان خاص ديگه بايد اينو جاي داد

SYNDROME
دوشنبه 24 تیر 1387, 06:49 صبح
سلام اين كد منه .


procedure TForm1.ADOTable1FilterRecord(DataSet: TDataSet;
var Accept: Boolean);
if Form1.ComboBox2.ItemIndex=0 then
Accept:=(AnsiPos(Trim(Form1.MaskEdit11.Text),Trim( DataSet['namketab']))>0)
else if Form1.ComboBox2.ItemIndex=1 then
Accept:=(AnsiPos(Trim(Form1.MaskEdit11.Text),Trim( DataSet['nammoalef']))>0)
else if Form1.ComboBox2.ItemIndex=2 then
Accept:=(AnsiPos(Trim(Form1.MaskEdit11.Text),Trim( DataSet['nammotrajem']))>0)
end;

ميشه نسبت به اين راهنمايي كنيد يا روش بهتري ارائه بهم بديد اگه كارم اشتباست
دوست عزیز من گفتم برنامه را اینجا قرار دهید.
کدهای شما ظاهراً درست است وهمانجوری که دوستمان گفت شاید یک نکته کوچک وجود داشته باشد که شما به آن توجه نمی کنید.(Source را اینجا قرار دهید.)

دوست من اينو در onfilterrecord بنويسم يا يك مكان خاص ديگه بايد اينو جاي داد
دستور فوق باید در aDO.SQL.Text نوشته شود.
یکی Select شما باید تغییر کند و اگر قرار باشد مدام عمل جستجو انجام شود مدام اطلاعات از SQL واکشی می شود که این خود در حجم بالا مشکل ساز است.
موفق باشید

hentjanson
دوشنبه 24 تیر 1387, 16:33 عصر
سلام دوست من اينم نمونه برنامه من براي رفع اشكال از توجه شما تشكر مي كنم .
من تو روند شمارش يافته ها بعد فيلتر مشكل دارم با مشاهده برنامه به اين مشكل پي مي بريد

hentjanson
دوشنبه 24 تیر 1387, 20:11 عصر
دوست من برنامه رو گزاشتم در پست قبلي