[تمرين] فلترة بيانات جدول حسب الشهر في سنة معينة
#1
بسم الله الرحمن الرحيم

هذا تمرين بسيط في التعامل مع التاريخ في قواعد البيانات
لنفرض لدينا جدول Table1 به بيانات ما من بينها حقل اسمه DATE به التاريخ من الشكل 20/12/2008
ولدينا مكون ComboBox1 به الاشهر

التمرين:
ماذا تكتب لكي نفلتر البيانات للسنة الحالية 2008 حسب الشهر المختار في ComboBox1
مثلا لو اخترنا الشهر الاول تظهر البيانات فقط التي بها التاريخ من 01/01/2008 الى 31/01/2008

مدة التمرين اسبوع وسيتم عرض الحل بعدها، الان اين محاولاتكم ؟

ملاحظة: المشاركة تكون بكتابة الكود مباشرة بالرد وليس بارفاق ملف

والسلام عليكم
#2
السلام عليكم Smile

PHP كود :
procedure TForm1.ComboBox1Change(Sender: TObject);
var
Date1,Filr,DayMod:String;
I,Y:Integer;
begin
 Y
:=Length(DateToStr(Date));
 
I:=(Combobox1.ItemIndex+1);
 
Date1:=Copy(DateToStr(Date),7,Y-6);
 
//---------------------------------//
 
if ((i)<=(7)) And (i<>2) then
 
if (i) mod 2 = 0 then DayMod:='30' else DayMod:='31';
 if (
i)>=(8) then
 
if (i) mod 2 = 0 then DayMod:='31' else DayMod:='30';
 
//---------------------------------//
 
if I=2 then
  begin
   DayMod
:='29';
   
Filr:='Date >='+'01'+'-'+inttostr(i)+'-'+Date1+' '+
   
'And'+' '+ 'Date <='+DayMod+'-'+inttostr(i)+'-'+Date1;
  
end
 
else
  
Filr:='Date >='+'01'+'-'+inttostr(i)+'-'+Date1+' '+
  
'And'+' '+ 'Date <='+DayMod+'-'+inttostr(i)+'-'+Date1;

 
Table1.Filtered:=true;
 
Table1.Filter:=Filr;
 
Caption:=Filr+' , '+'Day= '+DayMod;
end; 
#3

انتبه:
التاريخ من الشكل 20/12/2008 وليس من الشكل 20-12-2008
السنة 2008
#4
PHP كود :
procedure TForm1.Button1Click(Sender: TObject);
const
IdMonth: array[0..11]of string =('01','02','03','04','05','06','07','08','09','10','11','12');
lastDay:array[0..11]of string =('31','29','31','30','31','30','31','31','30','31','30','31');
Var
StartDate,EndDate,FLT:String;
IdCombo:Integer;
begin
IdCombo
:=Combobox1.ItemIndex;
StartDate:='2008' + '/' + IdMonth[IdCombo] + '/' + '01';
EndDate:= '2008' + '/' + IdMonth[IdCombo] + '/' + lastDay[IdCombo];
FLT:= 'Date >=' + StartDate + ' And  Date <=' + EndDate;

Table1.Filtered:=true;
Table1.Filter:=FLT;
end; 
#5
السلام عليكم
تم اختصار نوعا ما الكود (على طريقة اخى Rover)
فيما يخص '/' و '-' سببت لى مشاكل . جربت طريقة Rover لاكن نفس الشىء .
PHP كود :
uses ,DateUtils; 


PHP كود :
procedure TForm1.ComboBox1Change(Sender: TObject);
var
Filr,DayMod:String;
I:Integer;
StartDate,EndDate:TDate;
begin
 I
:=(Combobox1.ItemIndex+1);
 
//______________________//
 
if ((i)<=(7)) And (i<>2) then
 
if (i) mod 2 = 0 then DayMod:='30' else DayMod:='31';
 if (
i)= (2) then DayMod:='29';
 if (
i)>=(8) then
 
if (i)mod(2) = 0 then DayMod:='31' else DayMod:='30';
 
//______________________//
StartDate:=StrToDate('01-'+IntTostr(i)+'-2008');
EndDate:=IncDay(StartDate,StrToInt(DayMod)-1);

Filr:='Date >= '+DateToStr(StartDate)+' And '+'Date <= '+DateToStr(EndDate);
Table1.Filtered:=True;
Table1.Filter:=Filr;
end; 
#6
اخى Rover ربما من الاحسن لو اعلنت عن الثوابت بهدا الشكل
PHP كود :
const 
IdMonth: array[0..11]of string[2] =('01','02','03','04','05','06','07','08','09','10','11','12');
lastDay: array[0..11]of string[2] =('31','29','31','30','31','30','31','31','30','31','30','31'); 
و نفس الشىء بالنسبة لى
PHP كود :
DayMod:String[2]; 
Smile
#7
أخي Hanipino :
جربت الكود ..
الكود الذي كتبته أنا سليم و يعمل 100 %
يجب الأنتباه ان الأستعلامات في قواعد البيانات تتعامل مع التنسيق YYYY/MM/DD فيما يتعلق بالتاريخ ..
بالتوفيق أن شاء الله ..
#8
hanipino و Rover
من حيث الفكرة الحلين جميلين
من حيث التطبيق (الكود) الحلين خطأ
انتبهو جيدا لنص التمرين والملاحظة السابقة
والسلام عليكم
#9
هل تقصد أن السنة الحالية متغير يجب أخذه حسب السنة الحالية ؟؟
أم هو ثابت 2008 ?
بالنسبة للحل الذي أرفقته ... جربته على جدول أدخلت به بيانات للشهور و كان يعمل بنجاح !!
نرجو التوضيح قليلاً أذا كان هناك طلب أضافي ؟
#10

انظر لتنسيق التاريخ
لقد اوضحته بالتمرين
ونبهت بالرد السابق


التنقل السريع :


يقوم بقرائة الموضوع: بالاضافة الى ( 1 ) ضيف كريم