ورود

View Full Version : تبدیل زمان و تاریخ در FastReport



Elnaz.Etedali
سه شنبه 28 دی 1389, 19:22 عصر
در محیط Design فست ریپورت دارم کد نویسی میکنم
ساعت را به شکل am و pm نشون میده ، اما من نمیخوام اینجوری باشه مثلا 07:00 ق.ظ را باید به 19:00 تبدیل کنم ، همینطور باید تاریخ میلادی را به شمسی تبدیل کنم چکار کنم ؟

vcldeveloper
سه شنبه 28 دی 1389, 21:15 عصر
ساعت را به شکل am و pm نشون میده ، اما من نمیخوام اینجوری باشه مثلا 07:00 ق.ظ را باید به 19:00 تبدیل کنم
روی کنترل نمایش دهنده متن دابل کلیک کنید، در پنجره باز شده، به تب Format برید، گروه Date\Time را انتخاب کنید، و Format string را روی hh:mm تنظیم کنید.



همینطور باید تاریخ میلادی را به شمسی تبدیل کنم چکار کنم ؟
باید یه تابع تبدیل تاریخ میلادی به شمسی بنویسید. دلفی یا فست ریپورت به خودی خود تاریخ میلادی شما را تبدیل به شمسی نمی کنند.

Elnaz.Etedali
سه شنبه 28 دی 1389, 21:26 عصر
مرسی توی دلفی از کامپوننت برای تبدیل تاریخ استفاده میکردم اینجا چی ؟! خوب حتما یکی قبلا این تابع را نوشته دیگه

vcldeveloper
چهارشنبه 29 دی 1389, 01:04 صبح
توی دلفی از کامپوننت برای تبدیل تاریخ استفاده میکردم اینجا چی ؟! خوب حتما یکی قبلا این تابع را نوشته دیگه
راه های مختلفی برای تبدیل وجود دارند، شامل:

1- ایجاد یک فیلد Calculated در دیتاست، و تبدیل مقدار فیلد تاریخ میلادی به شمسی توسط یک تابع یا کامپوننت یا هر چیز دیگه، و قرار دادن نتیجه در داخل این فیلد. اینطوری اون فیلد محاسباتی در فست ریپورت هم در دسترس خواهد بود.
2- استفاده از رویدادهای OnSetText و OnGetText فیلد تاریخ مربوطه، برای تبدیل تاریخ میلادی به شمسی و بالعکس.
3- رجیستر کردن یک تابع آماده تبدیل تاریخ میلادی به شمسی دلفی در موتور اسکریپت فست ریپورت، و فراخوانی آن تابع در داخل فست ریپورت.
4- نوشتن یک تابع تبدیل میلادی به شمسی با استفاده از PascalScript در داخل فست ریپورت.
5- در صورتی که از بانک اطلاعاتی استفاده می کنید که امکان تعریف توابع کاربر را داره (مثل MS SQL Server)؛ تعریف یک تابع کاربر در بانک اطلاعاتی، برای تبدیل تاریخ میلادی به شمسی. البته این حالت بیشتر به درد زمانی میخوره که مقدار اون فیلد که توسط کوئری برگشت داده میشه، فقط-خواندنی باشه، و قصد نداشته باشید که مقدارش را در برنامه تغییر بدید.

برای هر کدوم از حالت های فوق (به غیر از حالت 4) در این سایت تاپیک هایی وجود داره.

Elnaz.Etedali
چهارشنبه 29 دی 1389, 08:45 صبح
مرسی مشکل اینجاست که برنامه مال من نیست و فقط یک فایل اجرایی دارم توی برنامه میشه گزارش خصوصی درست کرد که با محیط فست ریپورت هست پس باید از همون گزینه 4 استفاده کنم ! بانک هم اکسس

Elnaz.Etedali
چهارشنبه 29 دی 1389, 20:09 عصر
کسی تابع تبدیل تاریخ میلادی به شمسی را نداره ؟

hossein_h62
چهارشنبه 29 دی 1389, 22:46 عصر
اینم از تایع تاریخ شمسی :

Function SHDate:String;
Const
D : Array [0..11] of integer=(20, 19, 20, 20, 21, 21, 22, 22, 22, 22, 21, 21);
P : Array [0..11] of integer=(11, 12, 10, 12, 11, 11, 10, 10, 10, 9, 10, 10);
Mon: Array [0..11]of String=('01','02','03','04','05','06','07','08','0 9','10','11','12');
Var DateLocal:_SYSTEMTIME;
Dm,Mm,Ym:Word;
P1,D1,I,U,Rp,Ys,Ms,Ds,X:Integer;
Sal,Mah,Roz:String;
begin
GetLocalTime(DateLocal);
Ym:=DateLocal.wYear;
Mm:=DateLocal.wMonth;
Dm:=DateLocal.wDay;
Dm := Dm;
U := 0;
Rp:= 0;
If (Ym Mod 4) = 0 Then U := 1;
If ((Ym Mod 100 = 0) AND (Ym Mod 400 <> 0)) Then U := 0;
Ys := Ym - 622;
X := Ys - 22;
X := X Mod 33;
If ((X Mod 4 = 0) AND (X <> 32)) Then Rp := 1;
I := Not(Rp-2) + NOT(U - 2) * 2;
X := 0;
If (I = 0) AND (Mm = 3) Then X := 1;
If I = 0 Then I := 3;
Ms := (9 + Mm) Mod 13;
If Ms < 10 Then Ms := Ms + 1;
D1 := D[Mm - 1];
If (I = 1) AND (Mm > 2) Then D1 := D1 - 1;
If (I = 2) AND (Mm < 3) then D1 := D1 - 1;
P1 := P[Mm - 1];
If (I = 1) AND (Mm > 2) Then P1 := P1 + 1;
If (I = 2) AND (Mm < 4) Then P1 := P1 + 1;
If (Dm > 0) AND (Dm <= D1) Then
Begin
Ds := P1 + Dm + X - 1;
X := 1;
End
Else
Begin
Ds := Dm - D1;
Ms := Ms + 1;
If Ms = 13 Then Ms := 1;
X := 2;
End;
If ((Mm = 3) AND (X = 2)) OR (Mm > 3) Then Ys := Ys + 1;
Sal:=IntToStr(Ys);
If Length(Sal)=1 then Insert('0',Sal,1);
Mah:=Mon[Ms-1];
Roz:=IntToStr(Ds);
If Length(Roz)=1 then Insert('0',Roz,1);
Result:=Sal+'/'+Mah+'/'+Roz;
Delete(Result,1,2);
end;

Elnaz.Etedali
چهارشنبه 29 دی 1389, 23:23 عصر
مرسی توی فست ریپورت نوشتم به خط 3 ایراد میگیره

Elnaz.Etedali
جمعه 01 بهمن 1389, 10:50 صبح
باز هم تست کردم اما نمیشه !

bootshow
سه شنبه 05 بهمن 1389, 14:54 عصر
اینو تست کردم.کامپایل میشد.
میتونی از توابع DateTimeToStr و StrToDate و ... خود پاسکال اسکریپت استفاده کنی.

function shamsi(tt:tdatetime):string;
var
str,y,m,d:string;
yi,mi,di:integer;
begin
str:=datetostr(tt);
y:=copy(str,1,4);
m:=copy(str,6,2);
d:=copy(str,9,2);
yi:=strtoint(y);
mi:=strtoint(m);
di:=strtoint(d);
if (yi mod 4=0) then
if mi>2 then
begin
tt:=tt+1;
str:=datetostr(tt);
y:=copy(str,1,4);
m:=copy(str,6,2);
d:=copy(str,9,2);
yi:=strtoint(y);
mi:=strtoint(m);
di:=strtoint(d);
end;
if ((mi<3) or ((mi=3) and (di<21))) then
begin
yi:=yi-622;
end
else
begin
yi:=yi-621;
end;
case mi of
1:

if di<21 then
begin
mi:=10;
di:=di+10;
end
else
begin
mi:=11;
di:=di+10;
end;

2:
if di<20 then
begin
mi:=11;
di:=di+11;
end
else
begin
mi:=12;
di:=di-19;
end;
3:
if di<21 then
begin
mi:=12;
di:=di+9;
end
else
begin
mi:=1;
di:=di-20;
end;
4:
if di<21 then
begin
mi:=1;
di:=di+11;
end
else
begin
mi:=2;
di:=di-20;
end;
5:
if di<22 then
begin
mi:=mi-3;
di:=di+10;
end
else
begin
mi:=mi-2;
di:=di-21;
end;
6:
if di<22 then
begin
mi:=mi-3;
di:=di+10;
end
else
begin
mi:=mi-2;
di:=di-21;
end;
7:
if di<23 then
begin
mi:=mi-3;
di:=di+9;
end
else
begin
mi:=mi-2;
di:=di-22;
end;
8:
if di<23 then
begin
mi:=mi-3;
di:=di+9;
end
else
begin
mi:=mi-2;
di:=di-22;
end;
9:
if di<23 then
begin
mi:=mi-3;
di:=di+9;
end
else
begin
mi:=mi-2;
di:=di-22;
end;
10:
if di<23 then
begin
mi:=7;
di:=di+8;
end
else
begin
mi:=8;
di:=di-22;
end;
11:
if di<22 then
begin
mi:=mi-3;
di:=di+9;
end
else
begin
mi:=mi-2;
di:=di-21;
end;
12:
if di<22 then
begin
mi:=mi-3;
di:=di+9;
end
else
begin
mi:=mi-2;
di:=di-21;
end;
end;
y:=inttostr(yi);
m:=inttostr(mi);

if (length(m)=1) then
m:='0'+m;
d:=inttostr(di);
if length(d)=1 then
d:='0'+d;
result:=y+'/'+m+'/'+d
end;

fahimi
جمعه 26 آبان 1391, 23:47 عصر
راه های مختلفی برای تبدیل وجود دارند، شامل:

1- ایجاد یک فیلد Calculated در دیتاست، و تبدیل مقدار فیلد تاریخ میلادی به شمسی توسط یک تابع یا کامپوننت یا هر چیز دیگه، و قرار دادن نتیجه در داخل این فیلد. اینطوری اون فیلد محاسباتی در فست ریپورت هم در دسترس خواهد بود.
2- استفاده از رویدادهای OnSetText و OnGetText فیلد تاریخ مربوطه، برای تبدیل تاریخ میلادی به شمسی و بالعکس.
3- رجیستر کردن یک تابع آماده تبدیل تاریخ میلادی به شمسی دلفی در موتور اسکریپت فست ریپورت، و فراخوانی آن تابع در داخل فست ریپورت.
4- نوشتن یک تابع تبدیل میلادی به شمسی با استفاده از PascalScript در داخل فست ریپورت.
5- در صورتی که از بانک اطلاعاتی استفاده می کنید که امکان تعریف توابع کاربر را داره (مثل MS SQL Server)؛ تعریف یک تابع کاربر در بانک اطلاعاتی، برای تبدیل تاریخ میلادی به شمسی. البته این حالت بیشتر به درد زمانی میخوره که مقدار اون فیلد که توسط کوئری برگشت داده میشه، فقط-خواندنی باشه، و قصد نداشته باشید که مقدارش را در برنامه تغییر بدید.

برای هر کدوم از حالت های فوق (به غیر از حالت 4) در این سایت تاپیک هایی وجود داره.
من از OnGetText استفاده کردم در dbgrid تاریخ به شمسی نمایش می دهد ولی در FastReport اما به میلادی