المساعد الشخصي الرقمي

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


B.M.AbdelAziZ
20-12-2008, 11:33 AM
بسم الله الرحمن الرحيم

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

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

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

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

والسلام عليكم

hanipino
20-12-2008, 05:04 PM
السلام عليكم :)


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;

B.M.AbdelAziZ
20-12-2008, 05:18 PM
انتبه:
التاريخ من الشكل 20/12/2008 وليس من الشكل 20-12-2008
السنة 2008

Rover
21-12-2008, 04:23 AM
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;

hanipino
21-12-2008, 12:44 PM
السلام عليكم
تم اختصار نوعا ما الكود (على طريقة اخى Rover)
فيما يخص '/' و '-' سببت لى مشاكل . جربت طريقة Rover لاكن نفس الشىء .

uses ,DateUtils;




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;

hanipino
21-12-2008, 01:37 PM
اخى Rover ربما من الاحسن لو اعلنت عن الثوابت بهدا الشكل

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');

و نفس الشىء بالنسبة لى

DayMod:String[2];

:)

Rover
21-12-2008, 11:20 PM
أخي Hanipino :
جربت الكود ..
الكود الذي كتبته أنا سليم و يعمل 100 %
يجب الأنتباه ان الأستعلامات في قواعد البيانات تتعامل مع التنسيق YYYY/MM/DD فيما يتعلق بالتاريخ ..
بالتوفيق أن شاء الله ..

B.M.AbdelAziZ
24-12-2008, 12:11 AM
hanipino و Rover
من حيث الفكرة الحلين جميلين
من حيث التطبيق (الكود) الحلين خطأ
انتبهو جيدا لنص التمرين والملاحظة السابقة
والسلام عليكم

Rover
24-12-2008, 01:38 AM
هل تقصد أن السنة الحالية متغير يجب أخذه حسب السنة الحالية ؟؟
أم هو ثابت 2008 ?
بالنسبة للحل الذي أرفقته ... جربته على جدول أدخلت به بيانات للشهور و كان يعمل بنجاح !!
**** التوضيح قليلاً أذا كان هناك طلب أضافي ؟

B.M.AbdelAziZ
24-12-2008, 02:01 AM
انظر لتنسيق التاريخ
لقد اوضحته بالتمرين
ونبهت بالرد السابق

Rover
24-12-2008, 02:14 AM
هذا التنسيق من الكود الذي وضعته و هو كما طلبته تماماً :confused:

http://img126.imageshack.us/img126/184/12yy7.gif

B.M.AbdelAziZ
24-12-2008, 02:30 AM
لا، التاريخ بالتمرين من الشكل dd/mm/yyyy

taha_gh
25-12-2008, 11:50 AM
السلام عليكم و رحمة الله و بركاته

الحل - أن أوفق

procedure TForm1.ComboBox1Change(Sender: TObject);
var
Fil:String;
M,J,A:Integer;
begin
Fil :='';
M:=(Combobox1.ItemIndex+1);
A := 2008;
case M of
1,3,5,7,8,10,12 : j := 31;
4,6,9,11 : j := 30;
2 : if (A mod 4)=0 then j:= 29 else j := 28;
end;
fil := 'Date>=''01/'+formatfloat('00',M)+'/'+Formatfloat('0000',A)+''' and date<='''+Formatfloat('00',j)+'/'+formatfloat('00',M)+'/'+Formatfloat('0000',A)+'''';
Table1.Filtered:=true;
Table1.Filter:=Fil;
end;

B.M.AbdelAziZ
25-12-2008, 12:38 PM
taha_gh فكرة تشبه قليلا فكرة hanipino
وهو اول كود صحيح
والسلام عليكم

B.M.AbdelAziZ
26-12-2008, 12:28 PM
اليوم اخر يوم للتمرين
وهذا حلي

var
m,y: word;
d1,d2 : TDateTime;
begin
DateSeparator:='/';
ShortDateFormat:='DD/MM/YYYY';

m:= ComboBox1.ItemIndex + 1; if m=0 then Exit;
y := 2008;

d1:=EncodeDate(y,m,1);
if m=12 then d2:=EncodeDate(Y+1,1,1) else
d2:=EncodeDate(Y,M+1,1);
d2 := d2 -1 ;

Table1.Filter := '(Date>='+QuotedStr(DateToStr(d1))+') and (Date<='+QuotedStr(DateToStr(d2))+')';
Table1.Filtered := True;
end;


ملاحظة أول تعليمتين من المفترض وضعهما في الحدث OnCreate للForm الرئيسية لاننا نحتاج تنفيذهما مرة فقط
والسلام عليكم

hanipino
26-12-2008, 01:18 PM
اووووووووو DaltaAziz واش نحكيلك سيلييييييما ...
هذا هو لب التمرين . مشكور .

DateSeparator:='/';
ShortDateFormat:='DD/MM/YYYY';
EncodeDate

B.M.AbdelAziZ
26-12-2008, 02:36 PM
hanipino هي مجرد طريقة ويوجد الكثير غيرها

لكي تعم الفائدة
الطرق الاربع بتعديل بسيط لكي تكون صحيحة حسب التمرين بالمرفق
كل طريقة بزر Button

والسلام عليكم

Anter2010
22-01-2009, 04:37 PM
والله يا عزيز يعطيك الصحة

Anter2010
25-01-2009, 05:30 PM
السلام عليكم يا اخي عزيز سؤال من فضلك حول هذا التمرين ؟
هل يجب تغير السنة كل سنة او كبف الحل

B.M.AbdelAziZ
25-01-2009, 09:26 PM
السنة هي المتغير y يمكنك تغييره بما تشاء
ان كنت تقصد شيئ اخر اوضح اكثر في موضوع جديد في قسم الاسئلة (http://www.delphi4arab.com/forum/forumdisplay.php?f=8)
والسلام عليكم