delphi4arab منتديات دلفي للعرب

نسخة كاملة : فيما يخص الفلترة بحقول متعددة
أنت حالياً تتصفح نسخة خفيفة من المنتدى . مشاهدة نسخة كاملة مع جميع الأشكال الجمالية .
السلام عليكم و رحمة الله و بركاته 
في الصورة المرفقة عملية فلترة بعدة حقول 

[صورة: 167794040729061.png]

لدينا تاريخين و لدينا كمبوبوكس به اسماء المستخدمين و كمبوبوكس به اسماء الحركات اريد عند اختيار التاريخين دون اختيار اسما للمستخذم او نوع حركة و الضغط على زر عرض التقرير يعطيني تقرير حركة المستخدمين .... ثم عند اختيار اسما للمستخدم و الضغط على نفس الزر يعطيني تقرير الحركة للمستخدم ما بين التاريخين المذكورين و في الاخير عند اضافة اسم الحركة و اسم المستخدم و تاريخين يعطيني النتيجة ممكن حل بارك الله فيكم حول هذه الفلترة اما باستعمال الكويري او اي اجراء اخر
و عليكم السلام ورحمة الله وبركاته،

لدينا الاحتمالات التالية:

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 استخدم البارامترات بدل الاسناد المباشر

بالتوفيق