delphi4arab منتديات دلفي للعرب
فيما يخص الفلترة بحقول متعددة - نسخة قابلة للطباعة

+- delphi4arab منتديات دلفي للعرب (https://delphi4arab.net/forum)
+-- قسم : منتديات دلفي للعرب التعليمية (https://delphi4arab.net/forum/forumdisplay.php?fid=3)
+--- قسم : سؤال و جواب حول دلفي (https://delphi4arab.net/forum/forumdisplay.php?fid=15)
+--- الموضوع : فيما يخص الفلترة بحقول متعددة (/showthread.php?tid=12232)



فيما يخص الفلترة بحقول متعددة - addidou230 - 04-03-2023

السلام عليكم و رحمة الله و بركاته 
في الصورة المرفقة عملية فلترة بعدة حقول 

[صورة: 167794040729061.png]

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


RE: طلب مساعدة فيما يخص الفلترة بحقول متعددة - أبو معاذ - 04-03-2023

و عليكم السلام ورحمة الله وبركاته،

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

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 .

و الله أعلم.


RE: طلب مساعدة فيما يخص الفلترة بحقول متعددة - محمد الدرة - 05-03-2023

افض حل باستخدام  هي التحقق من كل شرط وفي حال تحققه يضاف الكود الخاص به لانك لو عملت لكل الاحتمالات فسينتهي الامر بمئات الاسطر والتي لافائدة منها
مثلا  لديك اسم المستخدم والتاريخ والحركة

قمت بالبحث عن طريق اسم المستخدم والحركة

تقوم اولاً باخذ اسم المستخدم وتقوم باضافة الشرط الى الاستعلام


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

بالتوفيق