ورود

View Full Version : فرمول نویسی در کریستال ریپورت



hasan_esfahan
شنبه 03 اسفند 1387, 17:19 عصر
با عرض سلام خدمت دوستان:

نکته: در این قسمت فقط اسکریپت های کریستال ریپورت ( فرمولها) به همراه توضیح قرار گرفته است.

اخطار : از مطرح کردن سوال جدا خوداری کنید!


مطالب :

. اما چرا ما فرمول نویسی یا اسکریپت نویسی می کنیم (http://barnamenevis.org/forum/showpost.php?p=694455&postcount=28)

.نحوه تعریف متغیر عددی و رشته ای (http://barnamenevis.org/forum/showpost.php?p=684709&postcount=9)

. اعمال ریاضی (http://barnamenevis.org/forum/showpost.php?p=684717&postcount=10)

. تبدیل فیلد عددی به فیلد رشته ای متناظر با ان با مثال (http://barnamenevis.org/forum/showpost.php?p=683229&postcount=7)

. عملگر های مقایسه (http://barnamenevis.org/forum/showpost.php?p=684724&postcount=11)

. تعریف ارایه و دسترسی به عناصر آن (http://barnamenevis.org/forum/showpost.php?p=683225&postcount=6)

. برخی از توابع ریاضی مورد استفاده (http://barnamenevis.org/forum/showpost.php?p=686288&postcount=25)

. برخی از توابع موجود در کریستال کار روی رشته (http://barnamenevis.org/forum/showpost.php?p=685571&postcount=17)

. ادامه برخی از توابع موجود در کریستال کار روی رشته (http://barnamenevis.org/forum/showpost.php?p=685575&postcount=18)

. ادامه برخی از توابع موجود در کریستال کار روی رشته و اعداد (http://barnamenevis.org/forum/showpost.php?p=685577&postcount=19)

. کد های اسکریپت نویسی سریع و کوتاه در کریستال (http://barnamenevis.org/forum/showpost.php?p=685246&postcount=16)

. بدست اوردن روز ماه و سال تاریخ فعلی سیستم (http://barnamenevis.org/forum/showpost.php?p=683223&postcount=5)

. بدست اوردن ساعت دقیقه و ثانیه فعلی سیستم (http://barnamenevis.org/forum/showpost.php?p=686272&postcount=24)

. اختلاف بین دو تاریخ (http://barnamenevis.org/forum/showpost.php?p=683190&postcount=2)

. تبدیل تاریخ میلادی را به شمسی در کریستال ریپورت (http://barnamenevis.org/forum/showpost.php?p=686262&postcount=23)

. به جای عدد هر سطر حروف معادل آن (http://barnamenevis.org/forum/به جای عدد هر سطر حروف معادل آن)

. گروه بندی بر اساس حرف اول (http://barnamenevis.org/forum/showpost.php?p=683204&postcount=4)

. حلقه for و نکات مربوط به آن (http://barnamenevis.org/forum/showpost.php?p=686216&postcount=21)

. شکستن حلقه for یا خارج شدن بر اساس شرطی (http://barnamenevis.org/forum/showpost.php?p=686222&postcount=22)

. دستور شرطی if و else (http://barnamenevis.org/forum/showpost.php?p=684732&postcount=12)

. دستور select همراه با این که عدد روز هفته را گرفته و مشخص می کند چه روزی از هفته است (http://barnamenevis.org/forum/showpost.php?p=684744&postcount=13)

. برخی از دستورات sql و معادل آن در کریستال ریپورت (http://barnamenevis.org/forum/showpost.php?p=685214&postcount=14)

. ترفند دستور like روی مقادیر عددی (http://barnamenevis.org/forum/showpost.php?p=685229&postcount=15)

. جمع مبلغ یک فیلد از رکورد های یک صفحه و چاپ در انتهای صفحه (http://barnamenevis.org/forum/showpost.php?p=690820&postcount=26)

. دستور like و دستور startswith تفاوت و شباهت ها
(http://barnamenevis.org/forum/showpost.php?p=685684&postcount=20)
. عدم نمایش نام ستون در صورت نداشتن مقادیر (http://barnamenevis.org/forum/showpost.php?p=683882&postcount=8)

. رنگ کردن یکی در میان رکورد ها (http://barnamenevis.org/forum/showpost.php?p=694423&postcount=27)

. syntax ها در کریستال برای دستورات با بیش از یک خط کد (http://barnamenevis.org/forum/showpost.php?p=695363&postcount=34)

توابع در کریستال function in crystal

. نحوه ایجاد تابع (http://barnamenevis.org/forum/showpost.php?p=695296&postcount=29)

. نحوه نوشتن توابع یک خطی (http://barnamenevis.org/forum/showpost.php?p=695297&postcount=30)

. نحوه نوشتن توابع چند خطی (http://barnamenevis.org/forum/showpost.php?p=695298&postcount=31)

. ارگومان یا ورودی تابع (http://barnamenevis.org/forum/showpost.php?p=695302&postcount=32)

. نحوه صدازدن تابع و خروجی ان (http://barnamenevis.org/forum/showpost.php?p=695304&postcount=33)

. دستیابی به رکورد قبلی و بعدی (http://barnamenevis.org/forum/showpost.php?p=699479&postcount=35)

hasan_esfahan
شنبه 03 اسفند 1387, 17:20 عصر
اختلاف بین دو تاریخ


ابتدا یک فرمول فیلد ایجاد کنید و ان را در قسمت دیتیل قرار بدهید سپس کد زیر را داخل ان درج کنید


dateVar st1 :=Date ({tb1.datebrith} ) ;
dateVar st2 :=CurrentDate;
numberVar h1;
h1:=(st2-st1);

hasan_esfahan
شنبه 03 اسفند 1387, 17:24 عصر
به جای عدد هر سطر حروف معادل آن

http://barnamenevis.org/forum/showthread.php?t=148819

hasan_esfahan
شنبه 03 اسفند 1387, 17:41 عصر
گروه بندی بر اساس حرف اول

مثلا
سطر های
اصغر اکبر امید ارسلان
و سطر های
محمد محمود میلاد

که شما دو فرمول فیلد ایجاد کرده و اولی را در ریپورت هدر قرار می دهید و کد زیر را داخل آن بنویسید


Global stringVar str1;
str1:=left({table11.field1},1)+": گروه";


و سپس دومی را در دیتیل قرار دهیدو کد زیر را در ان درج کنید



Global stringVar str1;
whileprintingrecords;
if left({table11.field1},1)+": گروه"<>str1 then
str1:=left({table11.field1},1)+": گروه";

hasan_esfahan
شنبه 03 اسفند 1387, 18:16 عصر
بدست اوردن روز ماه و سال تاریخ فعلی





numbervar iMiladiDay:= Day (CurrentDate);
numbervar iMiladiMonth:=Month (CurrentDate);
numbervar iMiladiYear:=Year (CurrentDate);

hasan_esfahan
شنبه 03 اسفند 1387, 18:19 عصر
تعریف ارایه و دسترسی به عناصر آن



numbervar array array1:=[0,31,60,91,121,152,182,213,244,274,305,335];
numbervar num1 := array1[3] ;

hasan_esfahan
شنبه 03 اسفند 1387, 18:26 عصر
تبدیل فیلد عددی به فیلد رشته ای متناظر با ان با مثال


stringvar str1:=totext({tb1.filde1})+" :عدد ";


تبدیل فیلد رشته ای(ازنوع عدد) به فیلد عددی مثلا برای جمع مقادیر



numbervar num1:=ToNumber ({tb1.filed1})+ToNumber ({tb1.filed1});

hasan_esfahan
یک شنبه 04 اسفند 1387, 23:37 عصر
اگه یه ستون خاص دیتا نداشت اسمش رو هم نشون نده؟


ابتدا در پنجره field explorer در قسمت frmoul filds راست کلیک کنید سپس new و نامی برای فرمول خود انتخاب کنید سپس use editor کلیک کنید و کد زیر را درج کنید


stringvar ch1="";
if {tb1.field1} like "*" then
ch1:="نام مورد نظر";

که tb1 نام جدول است و فیلد 1 نام فیلد مورد نظر و در اخر فرمول را به جای فیلد ستون قرار بده

hasan_esfahan
سه شنبه 06 اسفند 1387, 16:09 عصر
نحوه تعریف برخی از متغیر ها

عددی


Numbervar one;
one:=12;
Numbervar one:=12;


رشته ای



stringVar one ;
one:="salam";
stringVar one :="salam";


منطقی



booleanVar bool :=true ;
booleanVar bool;
bool :=true ;

hasan_esfahan
سه شنبه 06 اسفند 1387, 16:36 عصر
اعمال ریاضی

متغیر های مورد استفاده


Numbervar x:=16;
Numbervar y:=7;

جمع


Numbervar my_sum:=x+y;
//my_sum=23

تقسیم اعشاری


Numbervar my_div:=x/y;
//my_div=2.29

توان


Numbervar my_exp:=x^y;
//my_exp=268435456

تقسیم صحیح


Numbervar my_divint:=x\y;
//my_divint=2

باقیمانده تقسیم x بر y


Numbervar my_mod:= x mod y;
//my_mod= 2

ضرب


Numbervar my_mul:=x* y;
//my_mul=112

مکمل


Numbervar my_negate:=-x;
//my_mul=-16

تفریق



Numbervar my_sub:=x-y;
//my_sub=9

درصد



Numbervar my_persent:=y%x;
//my_persent=43.75

hasan_esfahan
سه شنبه 06 اسفند 1387, 16:46 عصر
مقایسه

مقادیر


Numbervar x:=16;
Numbervar y:=7;


مساوی



Booleanvar bool:=x=y;
//false


بزگتر مساوی


Booleanvar bool:=x>=y;
//true


بزرگتر


Booleanvar bool:=x>y;
//true


کوچکتر مساوی


Booleanvar bool:=x<=y;
//false

کوچکتر



Booleanvar bool:=x<y;
//false


مخالف


Booleanvar bool:=x<>y;
//true

hasan_esfahan
سه شنبه 06 اسفند 1387, 17:02 عصر
دستور شرطی if و else
یک خطی


if x>=y then
x:=false
else
y:=true;

و چند سطری



if x<>y then (
x:=false;
y:=true
)
else
(
x:=true;
y:=false;
)


نکته :
در صورتی که بعد از if شما else داشتید در سطر قبل از else نیازی به سمی کالن(;) نیست

hasan_esfahan
سه شنبه 06 اسفند 1387, 17:15 عصر
دستور select همراه با:
این که عدد روز هفته را گرفته و مشخص می کند چه روزی از هفته است


numbervar x:=DayOfWeek (CurrentDate);
select x
case 1:
"یک شنبه"
case 2:
"دو شنبه"
case 3:
"سه شنبه"
case 4:
"چهار شنبه"
case 5:
"پنج شنبه"
case 6:
"جمعه"
case 7:
"شنبه"
default:
"اشتباه ورودی";

hasan_esfahan
چهارشنبه 07 اسفند 1387, 12:45 عصر
برخی از دستورات sql و معادل آن در کریستال ریپورت



select * from tb1 where filed1<10
{tb1.filed1}<10




select * from tb1 where filed1 like '% کلید جستجو%'
{tb1.filed1} like '* کلید جستجو*'




select * from tb1 where filed1>=10 and filed1<=20
{tb1.filed1}>=10 and {tb1.filed1}=20




select * from tb1 where filed1>=10 or filed1<=20
{tb1.filed1}>=10 or {tb1.filed1}=20

hasan_esfahan
چهارشنبه 07 اسفند 1387, 13:14 عصر
نمایش افرادی که مثلا دو رقم اخر کد انها 95 است و کد آنها بین 1000 تا 2000 است فیلد هم از نوع عددی است این روش برای این است که دستور like روی مقادیر عددی انجام نمی شود


totext({tb1.code}) like '*95*' and {tb1.code}>1000 and {tb1.code}<2000

hasan_esfahan
چهارشنبه 07 اسفند 1387, 13:54 عصر
کد های اسکریپت نویسی سریع و کوتاه در کریستال



IIF (شرط,true ,false );
IIf(x>y,'سلام','خداحافظ');




Choose (عدد,'اگر یک باشد این قسمت ','اگر دو باشد این قسمت','اگر سه باشد این قسمت',... )
Choose (DayOfWeek (CurrentDate),'یک شنبه','دو شنبه','سه شنبه','چهارشنبه','پنج شنبه','جمعه','شنبه');

hasan_esfahan
پنج شنبه 08 اسفند 1387, 00:20 صبح
برخی از توابع موجود در کریستال

حذف فضا های خالی ابتدای فیلد


TrimLeft ({tb1.firstname});

حذف فضا های خالی انتهای فیلد


TrimRight ({tb1.firstname});

حذف فضا های خالی ابتدای و انتهای فیلد


Trim ({tb1.firstname});

انتخاب قسمتی از اخر فیلد مثلا ali را li


Right ({tb1.firstname},2 );

انتخاب قسمتی از اول فیلد مثلا ali را al


Left ({tb1.firstname},2 );

انتخاب قسمتی از فیلد که سه پارامتر دارد اولی فیلد دومی مکان شروع از سمت چپ و سومی تعداد برگشتی


Mid ({tb1.firstname},2 ,4 );

بدست اوردن طول یک فیلد که خروجی آن مقدارعددی است


Length ({tb1.firstname});

hasan_esfahan
پنج شنبه 08 اسفند 1387, 00:21 صبح
ادامه:
فقط اولین کاراکتر فیلد حروف بزرگ و مابقی با حروف کوچک


ProperCase ({tb1.firstname});


کلیه کاراکتر های فیلد حروف بزرگ


UpperCase ({tb1.firstname});

کلیه کاراکتر های فیلد حروف کوچک



LowerCase ({tb1.firstname});


تبدیل فیلد رشته ای که عدد درون ان ذخیره شده به فیلد عددی


ToNumber ({tb1.code});

تبدیل فیلد عددی به رشته معادل ان


ToText ({tb1.num});


مقایسه دو فیلد



StrCmp ({tb1.nummeli},{tb1.numshenasname} );

hasan_esfahan
پنج شنبه 08 اسفند 1387, 00:23 صبح
ادامه:
معدل گیری از یک فیلد


Average ({tb1.num});

پیدا کردن فبلدی که بیشتر تکرار شده


Mode ({tb1.code});


تعداد فیلد موجود در بانک


Count ({tb1.firstname});


جمع فیلد مورد نظر


Sum ({tb1.code});

hasan_esfahan
پنج شنبه 08 اسفند 1387, 10:26 صبح
دستور like و دستور startswith تفاوت و شباهت ها

startswith در این دستور افرادی را نمایش می دهد که اول نام انها با a شروع شود


if {tb1.firstname} startswith 'a' then
{tb1.firstname};


در این دستور افرادی را نمایش می دهد که اول نام انها با a پایان پذیرد


if {tb1.firstname} like '*a' then
{tb1.firstname};


در این دستور افرادی را نمایش می دهد که اول نام انها با a شروع شود که اینجا like همانند startswith عمل می کند



if {tb1.firstname} like 'a*' then
{tb1.firstname};


در این دستور افرادی را نمایش می دهد که در نام انها حرف a وجود داشته باشد اول اخر یا حتی وسط



if {tb1.firstname} like '*a*' then
{tb1.firstname};


اما like دارای دو پارامتر * و ؟ که ستاره به معنی این است که خواه به جای ان کاراکتری نباشد خواه 1 یا .... ولی ؟ به معنی ان است که به جای آن حتما یک کاراکتر باشد مثلا



if {tb1.firstname} like 'a??' then
{tb1.firstname};


افرادی را نمایش می دهد که نام انها با a شروع می شود و نام انها دارای 3 کاراکتر است مثل ali , asd , amd, ask,......

hasan_esfahan
جمعه 09 اسفند 1387, 11:02 صبح
نحوه استفاده از حلقه for

i این متغیر فقط نیاز به تعریف کردن دارد.
a مقدار اولیه حلقه را مشخص می کند.
b مقدار نهایی حلقه را مشخص می کند .
step عددی یا متغیر عددی که جلوی ان قرار می گیرد گام افزایشی حلقه را مشخص می کند.
کد زیر نحوه استفاده از حلقه یک خطی را مشخص می کند .


numbervar i;
numbervar a:=5;
numbervar b:=10;
numbervar q:=0;

for i:=a to b step 1 do
q:=q+{tb1.code};


چند نکته
1- به جای i فقط متغیر عددی می تواند بنشیند و نمی توان محاسبات انجام داد.
2- به جای a می توان محاسبات نیز انجام داد.
3- به جای b می توان محاسبات نیز انجام داد.
4-گام حلقه می تواند محاسبات مثلا a+2 باشد.
5- برای حلقه چند خطی باید از پرانتز استفاده کرد.

نحوه استفاده از حلقه چند خطی



numbervar i;
numbervar a:=5;
numbervar b:=10;
numbervar q:=0;
for i:=a to b step 1 do(
q:=q+{tb1.code};
q:=q \10;
);


نکته : در اخر پرانتز نیاز به سمی کالن است .

hasan_esfahan
جمعه 09 اسفند 1387, 11:19 صبح
exit for: شکستن حلقه for یا خارج شدن بر اساس مثلا شرطی




for i:=a to b step 1 do(
q:=q+{tb1.code};
if q>400636 then
exit for;
);

hasan_esfahan
جمعه 09 اسفند 1387, 12:42 عصر
این تابع تاریخ میلادی را به شمسی تبدیل می کنه در کریستال


numbervar iMiladiMonth:=month(CurrentDate);
numbervar iMiladiDay:=day(CurrentDate);
numbervar iMiladiYear:=year(CurrentDate);
numbervar shamsiDay;
numbervar shamsiMonth;
numbervar shamsiYear;
numbervar dayCount;
numbervar farvardinDayDiff;
numbervar deyDayDiff;
numberVar array sumDayMiladiMonth :=[0,31,59,90,120,151,181,212,243,273,304,334];
numberVar array sumDayMiladiMonthLeap := [0,31,60,91,121,152,182,213,244,274,305,335];
numberVar farvardinDayDiff:=79;
numbervar miladiYear1:=int(imiladiYear mod 100);
numbervar miladiYear2:=int(imiladiYear mod 4);
numbervar miladiYear3:=int(imiladiYear mod 100);
numbervar miladiYear4:=int(imiladiYear mod 400);
if (((miladiYear1 <> 0 )and (miladiYear2 =0))or((miladiYear3=0)and (miladiYear4=0))) then
dayCount := sumDayMiladiMonthLeap[iMiladiMonth] + iMiladiDay
else
dayCount := sumDayMiladiMonth[iMiladiMonth] + iMiladiDay;

miladiYear1:=int((imiladiYear-1) mod 100);
miladiYear2:=int((imiladiYear-1) mod 4);
miladiYear3:=int((imiladiYear-1) mod 100);
miladiYear4:=int((imiladiYear-1) mod 400);
if (((miladiYear1 <> 0 )and (miladiYear2 =0))or((miladiYear3=0)and (miladiYear4=0))) then
deyDayDiff := 11
else
deyDayDiff := 10;
if (dayCount > farvardinDayDiff) then
(
dayCount := dayCount - farvardinDayDiff;
if (dayCount <= 186) then
(
select int(dayCount mod 31)
case 0:(
shamsiMonth :=int( dayCount / 31);
shamsiDay := 31;
)
default:(
shamsiMonth := int(dayCount / 31) + 1;
shamsiDay :=int(dayCount mod 31);
);
shamsiYear := iMiladiYear - 621;
)
else
(
dayCount := dayCount - 186;
select dayCount mod 30
case 0:(
shamsiMonth := int(dayCount / 30) + 6;
shamsiDay := 30;
)
default:(
shamsiMonth := int(dayCount / 30) + 7;
shamsiDay := int(dayCount mod 30);
);
shamsiYear := iMiladiYear - 621;
)
)
else
(
dayCount := dayCount + deyDayDiff;
select int(dayCount mod 30)
case 0 :(
shamsiMonth := int(dayCount / 30) + 9;
shamsiDay := 30;
)
default:(
shamsiMonth := int(dayCount / 30) + 10;
shamsiDay := int(dayCount mod 30);
);
shamsiYear := iMiladiYear - 622;
);
stringvar exitmy:=totext(shamsiYear)+' / '+totext(shamsiMonth)+' / '+totext(shamsiDay);
exitmy;



منبع: این تابع همان تابعی بود که در C# و من ان را به کریستال تبدیل کردم.
و کلیه قسمت های آن در پست های قبلی توضیح داده شده است.

hasan_esfahan
جمعه 09 اسفند 1387, 12:58 عصر
بدست اوردن ساعت دقیقه و ثانیه فعلی سیستم



numbervar iHour:=Hour (CurrentTime);
numbervar iMinute :=Minute (CurrentTime);
numbervar iSecond :=Second (CurrentTime);

hasan_esfahan
جمعه 09 اسفند 1387, 13:37 عصر
برخی از توابع ریاضی مورد استفاده

تابع abs(x) این تابع قدر مطلق عدد را بر می گرداند


numbervar x:=-3.15;
numbervar y:=3.15;
abs(x);
// 3.15
abs(y);
//3.15


تابع int(x) این تابع صحیح عدد را بر می گرداند اما اما در منفی رو به پایین



numbervar x:=-3.15;
numbervar y:=3.15;
int(x);
//-4
int(y);
//3


بازگشت عدد pi


crpi;
//3.14


عدد تصادفی rnd


Rnd;


گرد کردن عدد


numbervar x:=3.15;
numbervar y:=3.55;
Round (x);
//3
Round (y);
//4

hasan_esfahan
دوشنبه 19 اسفند 1387, 17:58 عصر
جمع مبلغ یک فیلد از رکورد های یک صفحه و چاپ در انتهای صفحه
شما برای این کار سه فرمول ایجاد می کنید از پنجره filed explorer

فرمول اولی را در در قسمت page header قرار داده و کد زیر را در ان درج کنید


Shared numberVar sum1;
WhilePrintingRecords;
sum1:=0;

فرمول دومی را در details قرار داده و کد زیر را در آن درج نماید


Shared numberVar sum1;
WhilePrintingRecords;
sum1:={Table11.id}+sum1;


فرمول سومی را در pagefooter قرار داده و کد زیر را در ان درج کنید


Shared numberVar sum1;
WhilePrintingRecords;
sum1;


برای این که فرمول اولی و دومی هنگام اجرا نمایش داده نشوند در پنجره propertis خاصیت Suppress هر کدام را برابر با true کنید

hasan_esfahan
شنبه 01 فروردین 1388, 19:08 عصر
رنگ کردن یکی در میان رکورد ها
بر روی Detail کلیک راست سپس section export کلیک کنید در سمت راست بر روی تب color کلیک کنید و سپس چک باکس را علامت گذاری کرده و در زیر ان بر روی باتون فرمول کلیک کنید و سپس کد زیر را درج کنید


whileprintingrecords;
numbervar i:=RecordNumber;
booleanvar bt:=(i mod 2)=0;
if bt then crGreen else crRed

hasan_esfahan
شنبه 01 فروردین 1388, 20:48 عصر
اما چرا ما فرمول نویسی یا اسکریپت نویسی می کنیم

به نظر بنده بیشتر اسکریپت های نوشته شده برای زیباتر و جالب تر شدن و همچنین اضافه کردن امکانات به کریستال می باشد مثلا رنگی کردن یک در میان رکوردها یا تغیر رنگ فیلد ها و یا ایجاد تاریخ فارسی تبدیل روز میلادی به شمسی یا جمع فیلد ها در انتهای صفحه یا تبدیل حروف کوچک به بزرگی برعکس این یا هزارن چیز دیگر به کار می رود همانطور که در بیشتر قسمت های فرم کریستال با باز شدن هر پنجره شکل یک باتوم خاص را میبینید یعنی این که برای هر قسمت می توان فرمول مربوطه را نوشت از تغیر رنگ گرفته تا بینهایت

hasan_esfahan
سه شنبه 04 فروردین 1388, 10:01 صبح
نحوه ایجاد تابع در کریستال

ابتدا برای ایجاد تابع باید یک فرمول ایجاد کرده یا اصلا وارد محیط اسکریپت نویسی یا فرمول نویسی شوید .برای ایجاد تابع در قسمت کریستال report coustem function کلیک راست کرده و بر روی new کلیک کرده در پنجره ظاهر شده نامی برای تابع انتخاب کرده و وارد اسکریپت نویسی شوید (دکمه دومی) من مثلا رضا انتخاب کردم تصویر زیر که پس از ایجاد به صورت زیر ظاهر می شود






Function ()

hasan_esfahan
سه شنبه 04 فروردین 1388, 10:03 صبح
نحوه نوشتن توابع که دارای یک خط کد می باشند کافی است پس از نام تابع یک خط کد بیشتر نشود



Function ()
numbervar a:=1;

hasan_esfahan
سه شنبه 04 فروردین 1388, 10:04 صبح
نحوه نوشتن توابع چند خطی

همانطور که می دانید در بیشتر زبا نهای برانامه نویسی برای نوشتن چند خط کد که مربوط به یک دستور باشد مثلا در زبان سی { } یا در پاسکال بگین و اند بود در اینجا از پرانتز با سمی کالن اخر استفاده می شود


Function ()
(
numbervar a:=1;
a:=a+1;
);

hasan_esfahan
سه شنبه 04 فروردین 1388, 10:09 صبح
انواع ارگومان (ورودی) تابع

یک ارگومان




Function (numbervar i)
(
numbervar a:=1;
a:=a+1;
);



بیش از یک ارگومان




Function (numbervar i,stringvar j)
(
numbervar a:=1;
a:=a+1;
);

hasan_esfahan
سه شنبه 04 فروردین 1388, 10:17 صبح
خروجی تابع و صدا زدن ان

خروجی تابع بستگی به اخرین خط اجرا شده دارد




Function (numbervar i)
(
if i> 0 then
'mosbat'
else if i=0 then
'zero'
else
'negative'

);



که اگر من عدد 2 را به صورت زیر ارسال کنم




reza(2);



خروجی به صورت زیر است




mosbat



نکته میتوان خروجی را در متغیر هم نوع قرار داد




stringvar d:=reza(2);

hasan_esfahan
سه شنبه 04 فروردین 1388, 13:12 عصر
syntax ها در کریستال برای دستورات با بیش از یک خط کد
نکته 1: همانطور که می دانید در کریستال برای نوشتن چند خط کد که مربوط به یک تابع یا دستور مثلا for, if یا غیره است باید انها راداخل پرانتز نوشت همانطور که در c یا c# از { } استفاده می کنیم اما در این جند خط اگر در اخرین خط کد نیازی به سمی کالن ; ندارد اگر هم با شد مشکلی نیست مثلا هر دو زیر صحیح است.


numbervar i:=2;
numbervar j:=2;
if i>1 then
(
i:=i+1;
i:=i+1 //<==========
);
///////////
numbervar i:=2;
numbervar j:=2;
if i>1 then
(
i:=i+1;
j:=j+1; //<=========
);



نکته دوم در اخر پرانتز برای else و موارد شبیه به ان نیازی به سمی کالن نیست
مثلا دستور زیر صحیح است.


numbervar i:=2;
numbervar j:=4;
if i>1 then
(
i:=i+1;
j:=j+1;
); //<========
for i:=2 to j step 1 do
(
i:=i+1;
j:=j+1;
);

اما دستور زیر چون قبل از else سمی کالن هست خطا دارد.


numbervar i:=2;
numbervar j:=4;
if i>1 then
(
i:=i+1;
j:=j+1;
); //<========
else
(
i:=i+1;
j:=j+1;
);

hasan_esfahan
جمعه 14 فروردین 1388, 20:12 عصر
دستیابی به رکورد قبلی


Previous ({book1.id});

دستیابی به رکورد بعدی


Next ({book1.id});

majidsoft
سه شنبه 24 شهریور 1388, 01:16 صبح
با سلام وخسته نباشید من یک سوال داشتم من یک table در sql دارم که بر اساس یک فیلد جستجو کرده و نتایج را نمایش می دهد حالا می می خواستم بدانم چگونه می شود با یک حلقه از محتویات یک فیلد یک میانگین گرفت به طوریکه اگر عدد صفر بود عدد را در میانگین نیاورد و همینطور در یک فیلد دیگر از محتویات کل فیلد در table میانگین بگیرد امیدورام که منظورم را رسانده باشم یعنی من یکبار می خواهم از محتویات فیلدهای نمایش داده شده در کریستال میانگین بگیرم و یکبار از محتویات کل دیتابیس
با تشکر

mn_zandy63
جمعه 27 شهریور 1388, 08:45 صبح
با سلام وخسته نباشید من یک سوال داشتم من یک table در sql دارم که بر اساس یک فیلد جستجو کرده و نتایج را نمایش می دهد حالا می می خواستم بدانم چگونه می شود با یک حلقه از محتویات یک فیلد یک میانگین گرفت به طوریکه اگر عدد صفر بود عدد را در میانگین نیاورد و همینطور در یک فیلد دیگر از محتویات کل فیلد در table میانگین بگیرد امیدورام که منظورم را رسانده باشم یعنی من یکبار می خواهم از محتویات فیلدهای نمایش داده شده در کریستال میانگین بگیرم و یکبار از محتویات کل دیتابیس
با تشکر

http://barnamenevis.org/forum/showpost.php?p=808424&postcount=4

shocraneh
دوشنبه 13 مهر 1388, 19:32 عصر
رنگ کردن یکی در میان رکورد ها

من که امتحان کردم اکثر رنگ هارو قبول نمی کنه . اونایی که قبول می کنه خیلی بد رنگ هستن
مجموعه رنگاش کدوم ها هستند

mn_zandy63
سه شنبه 14 مهر 1388, 01:46 صبح
من که امتحان کردم اکثر رنگ هارو قبول نمی کنه . اونایی که قبول می کنه خیلی بد رنگ هستن
مجموعه رنگاش کدوم ها هستند

در قسمت Section Expert قسمت detail رو انتخاب کن، در زبانه ی Color، تیک Background color رو بزن.
http://barnamenevis.org/forum/attachment.php?attachmentid=38002&stc=1&d=1254779875
بعد رو این دکمه کلیک کن : http://barnamenevis.org/forum/attachment.php?attachmentid=38003&stc=1&d=1254779589

یک کد توی این مایه ها بنویس برای اینکه یک رکورد در میون رنگ رکورد عوض شه.

if RecordNumber mod 2 = 0 then
crNoColor
else
crSilver

اگه رنگهایی که به صورت پیش فرض داره رو خوشت نیومد میتونی به جای مثلا crSilver بنویسی
Color(50,100,200)، عدد 50 مقدار رنگ قرمز و 100 مقدار رنگ سبز و 200 مقدار رنگ آبی هست.
با این تابع میتونی هر ترکیب رنگی رو بسازی.

موفق باشی.

ali.ghodrati
سه شنبه 20 بهمن 1388, 13:50 عصر
سلام دوست عزیز
کریستال ریپورت برنامه من با دیتا ست پر میشه
چه جوری متونم یه فیلد که قیمت درش هست رو بدون صفر اعشار نشون بدم؟می خوام فیلدهای اعدادم بدون اعشار باشه.
از یک کد استفاده کردم ولی خطا میده.لطفا راهنماییم کنین چه کار باید بکنم.

http://www.mypicx.com/02092010/1/

mn_zandy63
دوشنبه 06 اردیبهشت 1389, 19:23 عصر
سلام دوست عزیز
کریستال ریپورت برنامه من با دیتا ست پر میشه
چه جوری متونم یه فیلد که قیمت درش هست رو بدون صفر اعشار نشون بدم؟می خوام فیلدهای اعدادم بدون اعشار باشه.
از یک کد استفاده کردم ولی خطا میده.لطفا راهنماییم کنین چه کار باید بکنم.

http://www.mypicx.com/02092010/1/

سلام دوست من،
نیازی به کد نویسی نیست، کافیه روی فیلدت کلیک راست کنی، و در قسمت تنظیمات مربوط به فرمت تعیین کنی که تعداد رقم اعشارش صفر نیست.
الآن کریستال دم دستم نیست برات عکس بذارم، اگه جواب نگرفتی بگو تا برات عکس بذارم.
موفق باشی

omidrad63
پنج شنبه 20 خرداد 1389, 18:42 عصر
سلام دوستان
البته با عرض خسته نباشید، اولین پست خودم را راجع به ابزار گزارشگیری Olap Cub آغاز می کنم.
توانایی و قدرت این ابزار جهت ایجاد Table های چند بعدی می باشد. این Cube ها که میتوانند بر اساس صفات جدول یا جداول مختلف موجود در دیتابیس ایجاد شوند . ما از این کیوبها می توانیم گزارشگیریهای بسیار انعطاف پذیر و قدرتمند که به نظر حقیر قدرتمندتر از کریستال ریپورتر هست را در هر برنامه کاربردی نظیر برنامه های تحت وب و ویندوز به کار ببریم.
در پست بعدی با نحوه ایجاد یک olap cube آشنا خواهید شد.

sepide1
شنبه 30 مرداد 1389, 12:42 عصر
جمع مبلغ یک فیلد از رکورد های یک صفحه و چاپ در انتهای صفحه
شما برای این کار سه فرمول ایجاد می کنید از پنجره filed explorer

فرمول اولی را در در قسمت page header قرار داده و کد زیر را در ان درج کنید


Shared numberVar sum1;
WhilePrintingRecords;
sum1:=0;

فرمول دومی را در details قرار داده و کد زیر را در آن درج نماید


Shared numberVar sum1;
WhilePrintingRecords;
sum1:={Table11.id}+sum1;


فرمول سومی را در pagefooter قرار داده و کد زیر را در ان درج کنید


Shared numberVar sum1;
WhilePrintingRecords;
sum1;


برای این که فرمول اولی و دومی هنگام اجرا نمایش داده نشوند در پنجره propertis خاصیت Suppress هر کدام را برابر با true کنید
یک سوال اگر من بخواهم مجموع را با توجه به یک فیلد دیگر حساب کنم چطوری باید اینکار را بکنم فرض کن من دو فیلد دارم یکی فیلد خدمات (محتوای آن شامل پرینت و کپی و فاکس)و دیگری فیلد تعداد، حال می خواهم در پایین صفحه تعداد هرکدام از اینها را جدا بزند برای این کار چکار کنم در صورتی که با فرمول فوق مجموع همه را حساب می کند. لطفا به من سریعتر در این باره کمک کنید

navid_ars88
یک شنبه 07 آذر 1389, 16:13 عصر
سلام
کسی سریال کریستال ریپورت 2008 موقع نصب رو داره ؟؟؟؟؟

vb341
شنبه 13 آذر 1389, 15:41 عصر
یه سرچ تو اینترنت بزنی همه چی هست

hadi30
سه شنبه 16 آذر 1389, 06:11 صبح
سلام به همه
من یه مشکل دارم:گریه: یه کمم ضروریه اگه کسی تونست کمک کنه خیلی ممنون میشم
من میخوام توی VB.NET 2005 از فیلد های مستقل تو گزارشم استفاده کنم ( فیلد هایی که به هیچ بانک اطلاعاتی مرتبط نیستن )
مثل یه String ساده یا متن یه texbox
نمی دونم تویی فرم vb چطور باید رشته یا متن رو به فیلد داخل گزارش ربظ بدم و مقدار دهیش کنم
خیلی امتحان کردم یا جواب نمی داد یا بدردم نمی خورد
مثلا با استفاده از فیلد Report Title تونستم متن رو انتقال بدم ولی این بدردم نخورد
میخوام داخل گزارش از فیلد های UnboundString@ یا Text Object استفاده کنم ولی نمی دونم چه فرمول یا کدی باید بنویسم
اگه کسی تونیت کمک کنه

matrixrayaneh
چهارشنبه 29 دی 1389, 14:33 عصر
من مشکلی که دارم اینه که تعداد رقم اعشار رو کاربر تعیین میکنه
چطوری میتونم عددی با رقم اعشار متغیر در جدولی که در کریستال ریپورت نمایش داده میشه تولید کنم؟
البته یه راه حلی به ذهنم رسیده و اون اینکه تعداد رقم اعشار رو به صورت پارامتر به کریستال ارسال کنم و بر اساس اون تعداد رقم اعشار رو تعیین کنم اما نمیدونم چطوری باید براش تو کریستال فرمول بنویسم

mrb1748
شنبه 29 مرداد 1390, 10:31 صبح
:لبخندساده: این هم پاسخ به سوال اگه عدد اعشار نداشته باشد بصورت صحیح نمایش بدهد و هم این سوال که کاربر تعیین کننده تعداد اعشار هست


if Int ({MFactor.Tedad ({@xTe)})= {MFactor.Tedad ({@xTe)} then
CStr (Round ({MFactor.Tedad},0),0 ({@xTe},0),0) )
else
CStr (Round ({MFactor.Tedad},{?DecNum}),{?DecNum ({@xTe},{?DecNum}),{?DecNum)} ) e

parsester
سه شنبه 29 شهریور 1390, 13:53 عصر
سلام دوستان من میخواستم داده های مربوط به واریز و پرداخت وجه برای یک مشتری رو در یک نرم افزار مدیریت فروش در یک جدول تک به نام تراکنش ها ذخیره نمایم و در هنگام گزارش گیری ردیف های مربوط به هر مشتری رو با استفاده از یک کد سلکت و بایند کردن دیتاست به کریستال ریپورت بفرستم
کاری که میخوام بکنم و نمیتونم اینه ردیف های این گزارش عبارت میشن از شماره ردیف،تاریخ،شرح،بدهکار،بست انکار که از بانک استخراج میشن و یک ردیف که خودم اضافه میکنم و میشه مانده میخوام برای هر ردیف مانده ردیف قبل با مبلغ بستانکار و بدهکار اون ردیف جمع و کسر بشه و درج بشه اما نمیتونم در کریستال ریپورت این چطوری میشه؟
میتونم جمع همه واریزی ها و برداشتی ها رو بگیرم و در آخر مانده فعلی رو بدست بیارم ولی میخوام برای هر ردیف یک مانده باشه...
در واقع نمیخوام برای هر مشتری در بانک اطلاعاتم جدول جداگانه داشته باشم که در هنگام ثبت هر واریز و برداشت آخرین مانده رو در جدول بگیره و بعد از انجام جمع و تفریق اون رو در بانک ذخیره کنه بلکه همه تراکنش ها در یک جدول ذخیره و مانده در هنگام گزارش گیری محاسبه بشه؟

bozhmehrani
پنج شنبه 07 مهر 1390, 23:13 عصر
ادامه:
معدل گیری از یک فیلد


Average ({tb1.num});

پیدا کردن فبلدی که بیشتر تکرار شده


Mode ({tb1.code});


تعداد فیلد موجود در بانک


Count ({tb1.firstname});


جمع فیلد مورد نظر


Sum ({tb1.code});



من برای محاسبه جمع از تابع سام استفاده کردم دقیقا مثل چیزی که نوشتی اما خطا میده . نوع فیلد من اعشاریه . باید چه کنم

hosseines
شنبه 30 مهر 1390, 00:21 صبح
سلام به همه
چطوری میشه جمع به حروف هر صفحه ازگزارش رو بر اساس فیلدی بنویسم.مثلا من یه ففاکتور طراحی کردم که شامل 3 صفحه است که می خوام جمع صفحه اول را در اخر همین صفحه بصورت حروف و جمع صفحه دوم رو بهمین ترتیب در همین صفحه به صورت حروف بنویسه و جمع صفحات بعدی رو به همین صورت.
همچنین رکودی در صفحه دوم ساخته بشه که جمع صفحه اول را در ابتدای صفحه نقل بده و صفحات بعدی را.

Developer Programmer
چهارشنبه 10 اسفند 1390, 10:31 صبح
همچنین رکودی در صفحه دوم ساخته بشه که جمع صفحه اول را در ابتدای صفحه نقل بده و صفحات بعدی را.
دوستانی که چنین مشکلی دارن، لطفا این تاپیک رو مشاهده کنن:
http://barnamenevis.org/showthread.php?330228-%D9%81%D8%B1%D9%85%D9%88%D9%84-%D8%AC%D9%85%D8%B9-%D8%A7%D8%B2-%D8%B5%D9%81%D8%AD%D9%87-%D9%82%D8%A8%D9%84-%D9%88-%D9%86%D8%AD%D9%88%D9%87-%D8%A7%DB%8C%D8%AC%D8%A7%D8%AF-%D9%81%D8%A7%D8%B5%D9%84%D9%87-%D8%AF%D8%B1-Detail

svhasvha
سه شنبه 07 خرداد 1392, 15:45 عصر
سلام و به تشکر توپ بابت همشون خیلی خیلی خیلی عالی بودن من اولین باریه که از کسی تو سایت تشکر میکنم ولی این مطلب واقعا لیاقت تشکر رو داشت
1 مشکل خیلی کوچیک
تو خروجی تاریخ شمسی رو به صورت اعشار میزنه !!!!
13,92.00/3,00/3.,00 تو فرمول خط آخر
به اینصورتم تغییر دادم ولی باز نشد


stringvar exitmy:=totext(int(shamsiYear))+' / '+totext(int(shamsiMonth))+' / '+totext(int(shamsiDay));
exitmy;

با کلیک راستم نشد چون رشتس عدد نیست !!!
زحمت جوابشو بکشد

mohammaduir
جمعه 19 مهر 1392, 23:24 عصر
سلام و به تشکر توپ بابت همشون خیلی خیلی خیلی عالی بودن من اولین باریه که از کسی تو سایت تشکر میکنم ولی این مطلب واقعا لیاقت تشکر رو داشت
1 مشکل خیلی کوچیک
تو خروجی تاریخ شمسی رو به صورت اعشار میزنه !!!!
13,92.00/3,00/3.,00 تو فرمول خط آخر
به اینصورتم تغییر دادم ولی باز نشد


stringvar exitmy:=totext(int(shamsiYear))+' / '+totext(int(shamsiMonth))+' / '+totext(int(shamsiDay));
exitmy;

با کلیک راستم نشد چون رشتس عدد نیست !!!
زحمت جوابشو بکشد

سلام منم این مشکل رو دارم کمک کنید

mohammaduir
شنبه 20 مهر 1392, 16:14 عصر
stringvar exitmy:=CSTR(shamsiYear,0,'')+' / '+CSTR(shamsiMonth,0)+' / '+CSTR(shamsiDay,0);

به جاش این کد رو بزار خوب میشه

mina1991
دوشنبه 08 اردیبهشت 1393, 08:15 صبح
سلام آقا یکی به دادم برسه من تازه شروع کردم به کریستال ریپورت و میخوام بدونم این همه کدی که تو همه سایت و همه انجمن ها میگن کجا مینویسیم
من نمیدونم کد ها رو کجا بنویسم؟؟؟؟؟؟؟؟؟؟؟
دو روزه خواب و خوراک ندارم مسئله هیسیتی کلافه شدم دیگه کد کد کد بابا اگه جاشو پیدا کنم مینویسم دیگه!!!!!!!:گریه::عصبانی++::عصبا نی++::عصبانی++::عصبانی++::گریه: