PDA

View Full Version : فیلتر کردن بانک



matinebi
جمعه 22 آذر 1387, 12:07 عصر
دو تا جدول دارم برای ثبت اطلاعات فاکتور جدول اول که اطلاعات کلی رو ثبت میکنه جدول دوم اطلاعات ریز اقلام رو در دو تا فیلد مشترکند یکی شماره فاکتور یکی شماره مشتری
که شماره فاکتور مد نظر است(چون شاید برای یک مشتری چند تا فاکتور صادر بشه)
اطلاعات این دو تا جدول در دو تا dbgrid میریزم و میخوام با کلیک کاربر روی گرید اول و گرفتن شماره فاکتور هم جدول اول فیلتر بشه هم جدول دوم
من به این روش این دو تا جدول رو فیلتر میکنم

Label1.Caption:=DBGrid1.Fields[0].AsString;
DataModule5.ADOQuery6.SQL.Clear;
DataModule5.ADOQuery6.SQL.Add('Select * from sabt_forosh');
DataModule5.ADOQuery6.SQL.Add('where id =:ID');
DataModule5.ADOQuery6.parameters.parambyname('id') .value:=Label1.Caption;
DataModule5.ADOQuery6.open;

DataModule5.ADOQuery8.SQL.Clear;
DataModule5.ADOQuery8.SQL.Add('Select * from form_moshtari');
DataModule5.ADOQuery8.SQL.Add('where(id ='''+Label1.Caption+''')');
DataModule5.ADOQuery8.open;

حالا میخوام ببینم راهه بهتری نیز هست مثلا join کردن یا ارتباط بر قرار کردن دو تا جدول

vcldeveloper
شنبه 23 آذر 1387, 02:44 صبح
حالا میخوام ببینم راهه بهتری نیز هست مثلا join کردن یا ارتباط بر قرار کردن دو تا جدول
راه بهتر برای چی؟ اینکه چطور کوئری را بنویسید، بستگی به این داره که میخواید این داده را چطور در اختیار کاربر قرار بدید. ممکن هست اینها کاملا جدا از هم به کاربر نشان داده بشند، و با همین کد بالا هم برنامه بخوبی کار کنه.

البته کدی که در بالا نوشتید از نظر کارایی مشکل داره، چون وقتی در یک کوئری همه چیز بجز مقدار پارامترها ثابت هست، نیازی نیست هر بار کوئری را از نوع بسازید. این کار باعث کاهش کارایی میشه. باید مثلا یه کدی شبیه به این می نوشتید:


if not AdoQuery6.Prepared then
begin
ADOQuery6.SQL.Text := 'Select * from sabt_forosh where id =:ID';
AdoQuery6.Prepare;
end
else
ADOQuery6.parameters.parambyname('id').value:=Labe l1.Caption;

AdoQyery6.Open;

matinebi
جمعه 29 آذر 1387, 16:13 عصر
با کدی که شما نوشتید هیچ چیزی برنمیگرده و dbgrid متصل به آن بعد از فیلتر هیچ چی نشون نمیده

vcldeveloper
جمعه 29 آذر 1387, 16:33 عصر
با کدی که شما نوشتید هیچ چیزی برنمیگرده و dbgrid متصل به آن بعد از فیلتر هیچ چی نشون نمیده
شاید نیاز داره قبل از Open، یک بار Close هم فراخوانی بشه.

در ضمن، روی کد Breakpoint بزارید و با F7 مراحل اجرای کد را پیگیری کنید، و ببینید در هر بار اجرای فیلتر کدام خطوط اجرا میشند.