السلام عليكم و رحمة الله و بركاته
في الصورة المرفقة عملية فلترة بعدة حقول
لدينا تاريخين و لدينا كمبوبوكس به اسماء المستخدمين و كمبوبوكس به اسماء الحركات اريد عند اختيار التاريخين دون اختيار اسما للمستخذم او نوع حركة و الضغط على زر عرض التقرير يعطيني تقرير حركة المستخدمين .... ثم عند اختيار اسما للمستخدم و الضغط على نفس الزر يعطيني تقرير الحركة للمستخدم ما بين التاريخين المذكورين و في الاخير عند اضافة اسم الحركة و اسم المستخدم و تاريخين يعطيني النتيجة ممكن حل بارك الله فيكم حول هذه الفلترة اما باستعمال الكويري او اي اجراء اخر
و عليكم السلام ورحمة الله وبركاته،
لدينا الاحتمالات التالية:
1- بحث بالتاريخ فقط.
2- بحث بالتاريخ و المستخدمين فقط.
3- بحث بالتاريخ و الحركة فقط.
4- بحث بالتاريخ و المستخدمين و الحركة.
PHP كود :
if (Check_Boxdate.Checked = true) then
if (Checkbox_User.checked= False) then
if (Checkbox_Mouvement.checked= False) then
begin // only Date
Query1.Close;
Query1.SQL.Clear;
Query1.SQL.Add('SELECT *');
Query1.SQL.Add('FROM MyTable1');
Query1.SQL.Add('where MyDate BETWEEN :Dt1 and :Dt1');
Query1.ParamByName('Dt1').AsDate := picker1.Date;
Query1.ParamByName('Dt2').AsDate := picker2.Date;
Query1.Open;
end
else //filter with Date and comboboxMouvement only
begin
Query1.Close;
Query1.SQL.Clear;
Query1.SQL.Add('SELECT *');
Query1.SQL.Add('FROM MyTable1');
Query1.SQL.Add('where (MyDate BETWEEN :Dt1 and :Dt1) and (Mouvement = :Mv)');
Query1.ParamByName('Dt1').AsDate := picker1.Date;
Query1.ParamByName('Dt2').AsDate := picker2.Date;
Query1.ParamByName('Mv').AsString := comboboxMouvement.Text;
Query1.Open;
end
else
if (Checkbox_Mouvement.checked= False) then
begin // Date and user Only
Query1.Close;
Query1.SQL.Clear;
Query1.SQL.Add('SELECT *');
Query1.SQL.Add('FROM MyTable1');
Query1.SQL.Add('where (MyDate BETWEEN :Dt1 and :Dt1) and (MyUser = :Usr)');
Query1.ParamByName('Dt1').AsDate := picker1.Date;
Query1.ParamByName('Dt2').AsDate := picker2.Date;
Query1.ParamByName('Usr').AsString := comboboxUser.Text;
Query1.Open;
end
else //filter with Date and user and comboboxMouvement
begin
Query1.Close;
Query1.SQL.Clear;
Query1.SQL.Add('SELECT *');
Query1.SQL.Add('FROM MyTable1');
Query1.SQL.Add('where (MyDate BETWEEN :Dt1 and :Dt1) and (MyUser = :Usr) and (Mouvement = :Mv)');
Query1.ParamByName('Dt1').AsDate := picker1.Date;
Query1.ParamByName('Dt2').AsDate := picker2.Date;
Query1.ParamByName('Usr').AsString := comboboxUser.Text;
Query1.ParamByName('Mv').AsString := comboboxMouvement.Text;
Query1.Open;
end
Query1 هو اسم المكون الذي تتصل به لتجلب المعلومات مثل ADO Query1 .
و الله أعلم.
افض حل باستخدام هي التحقق من كل شرط وفي حال تحققه يضاف الكود الخاص به لانك لو عملت لكل الاحتمالات فسينتهي الامر بمئات الاسطر والتي لافائدة منها
مثلا لديك اسم المستخدم والتاريخ والحركة
قمت بالبحث عن طريق اسم المستخدم والحركة
تقوم اولاً باخذ اسم المستخدم وتقوم باضافة الشرط الى الاستعلام
كود :
var qu:string='select * from transaction where (1=1)';
if username.text<>''
qu:=qu+' and username='+quotedtostr( username.text );
if transdatechk.checked then//
qu:=qu+' and date between :a and :b';
if transtype.text<>'' then
qu:=qu+' and transtype ='+quotedtostr( transtype.text );
هذا كمثال بسيط لاحظ اني كل مااتحقق من شرط ويكون موجود يقوم باضافة نص الى متغير من نوع string في الاخير اقوم باسناد المتغير هذا الى مكون query واقوم بتنفيذه
ملاحظه: لتجنب injection استخدم البارامترات بدل الاسناد المباشر
بالتوفيق