Crystal Reports - Formula Workshop - crystal-reports

I have created a crystal report which groups products based on order number.
I have created a formula which displays the text 'Partially Completed' or 'Fully Completed' based on whether a field on each product called 'Difference' equals 0 or not. If 'Difference' is 0 then 'Fully Completed' is displayed and vice-versa.
What I need to do is to display the corresponding message for the overall order number (i.e. if any of the products for an order have a difference != 0 then display 'Partially Completed'. If all the products have a difference == 0 for an order then display 'Fully Completed'.
This is the code I have attempted so far:
StringVar ouputText;
if {AD_999_SB_Fulfillment__Summary.FulfillmentPicking.Difference} = 0 then
ouputText := 'Full'
else
ouputText := 'Partial';
ouputText;
I assume I need some kind of for-loop to loop through all of the products for an order and check to see if any of the orders have a difference != 0 and then update the message based on if all the products have a difference == 0 or one of the products breaks the condition by having a difference != 0.

Looping is a lenghty process instead you group your report according to the "Order" then place the product in detail part. This will automatically loop entire products in a Order.
Create formula with name reset and place it in group header. Code is below.
Shared stringVar array y;
y:=" ";
join(y);
Create a formula and place it in detail section. This will take the result and store it in array for future use. Use below code.
StringVar ouputText;
Shared stringVar array y;
if {AD_999_SB_Fulfillment__Summary.FulfillmentPicking.Difference} = 0 then
y:= y+'Full'
else
y:= y+'Partial';
if {AD_999_SB_Fulfillment__Summary.FulfillmentPicking.Difference} = 0 then
ouputText := 'Full'
else
ouputText := 'Partial';
ouputText;
In group footer create another formula to display whether result is full or partial for order.
Shared stringVar array y;
if "Partial" in y
Then "partial"
else "Full";

Related

Crystal Reports - SECTION NAME - Is there a way to conditionally check or store the SECTION NAME in a within formula field

I would like to check in which section the formula is in and then conditionally return a specific value (either a database value or a calculated value) from the associated detail line data. Trying to avoid having to setup a separate formula for each detail section.
I tried setting up a loop counter but the loop counter never changes for same sections (details a, b, c, d, etc) only when the record number changes. I setup a Whileprinting formula (Init & Calc) without success
Header section - Global Numbervar N:=0;
Detail section - WhilePrintingRecords; Numbervar N; Global NumberVar N:=N+1
Again would like to setup a single formula that would return a different value based on which section its is in.
Formula would be something like...
"section Name" = Details a, Details b, Details c, or Page Header a, Page Header b, etc
If "Section Name" = "Details a" then
\\ Return Value 1
{NETSALES_TODAY}
Else if "Section Name" = "Details b" then
\\ Return Value 2
{NETSALES_MTD}
Else if "Section Name" = "Details c" then
\\ Return Value 3
{NETSALES_QTD}
Else {NETSALES_YTD}
EDIT: IT SEEMS IT DID NOT WORK - It is kept here for historical reasons (and because knowing it does not work is still valuable).
I think you were very close. I can't test it right now, but give it a try:
Create a formula like you did. Let's call it {#Declaration}.
global numbervar N := 0;
Create another formula like you did. Let's call it {#Increment}.
global numbervar N;
N := N + 1;
Put {#Declaration} in the report header.
Put the {#Increment} in the three detail sections.
Modify your formula to check the value of N mod 4 to be 0, 1, 2 or 3. Maybe you don't need the mod (just in case of many details rows).
global numbervar N;
if N mod 3 = 0 then {NETSALES_TODAY}
else if N mod 3 = 1 then {NETSALES_MTD}
else if N mod 3 = 2 then {NETSALES_QTD}
else {NETSALES_YTD}
The purposed differences are (1) put the formula 3 times and (2) a small correction in the formula itself.

Crystal Report Duplicating fields

hello im freasher in Crystal Report, Im facing one problem that , I have two tables with data in ms access
1.employee 2.Purachse order
two employees are there
purchase order comes in three types A,B and C
so i need to see the count of A,B,and c for each employees.
lets say
EMP POcount type
Abi 2 A
1 B
0 C
Bibi 5 A
0 B
1 C
Like this how could i do this
{#Count} // Place the formula the group header and hide it
global numbervar code = 0;
{#IncrementBarCount} // Place it in group body and hide it
global numbervar code;
if <DATABASE_COLUMN> = "A" then code := code + 1
{#BarCount} // Place it where you want to see your result
global numbervar code;

Crystal Reports 13 Standard Deviation with formula fields

I've been working on a report made by someone else which uses the StDev function. I thought it would be simple enough, but the data can contain multiple values for each record, so there are if statements used to determine which value to take from each record. I've exported a table to Excel which contains one value per record (the one that should be used in the StDev), and then calculated the SD there to provide a check.
The report and Excel are giving me very different values :(
So, I'm going back to the report and using some additional formula fields to calculate the SD longhand to act as a kind of deciding vote (fingers crossed it doesn't produce a third set of values...).
I've worked out the syntax errors, but am still getting a run-time error - "Division by zero" which then highlights the section of code indicated below...
My formula fields are:
{#StDevArrayPopulate} - in the details section
NumberVar Array varStDevArray;
NumberVar varStDevArrayCount;
varStDevArray [varStDevArrayCount] := {ValueToSummarise};
varStDevArrayCount := varStDevArrayCount + 1;
{#StDevArrayCalculate} - in the group footer
NumberVar Array varStDevArray;
NumberVar varCounter :=1;
NumberVar varMean := 0;
NumberVar varStDev := 0;
NumberVar varStDevArrayCount;
// START OF MEAN
// Sum of all of the values in the array
for varCounter:= 1 to varStDevArrayCount step 1 do
(
varMean := varMean + varStDevArray [varStDevArrayCount];
);
// Divide by the total number of values in the array
varMean := varMean / varStDevArrayCount; // !! This is the line that highlights after the error message !!
// END OF MEAN
// START OF STANDARD DEVIATION
// Subtract the mean from each value in the array and square the result
for varCounter := 1 to varStDevArrayCount step 1 do
(
varStDevArray[varStDevArrayCount] := (varStDevArray [varStDevArrayCount] - varMean) * (varStDevArray [varStDevArrayCount] - varMean);
);
// Sum of all of the values in the array
for varCounter:= 1 to varStDevArrayCount step 1 do
(
varStDev := varStDev + varStDevArray [varStDevArrayCount];
);
// Divide by the total number of values in the array
varStDev := varStDev / varStDevArrayCount;
// Square root of mean of differences
varStDev := Sqr(varStDev)
// END OF STANDARD DEVIATION
{#StDevArrayCalculate} - in the group footer
NumberVar varMean;
NumberVar varStDev;
"The mean is " & varMean & ", and the standard deviation is " & varStDev & "."
I've tried using a Running Total field but that was giving errors as it need to be count the first record before the Populate formula field ran. I've also tried adding a fourth field to the header, which initialises the varStDevArrayCount as 1.
Does anyone have any suggestions?
Looks like there are no detail records hence you are getting zero in array... I don't think initializing with 1 will make any difference instead make a small change like below and check.
if varStDevArrayCount=0
then
varMean :=varMean
else
varMean := varMean / varStDevArrayCount;
I would advice you to just check records in detail and then debug

Maximum value of multiple summarized value

I have difficulty in getting a maxiumu value from a multiple summarized values in group section. For example, I summarized budget, commitment, cost and forecast total in a report group section, and now in group footer I need pick a maximum value of the four totals. How should I do it?
Edit............................................................
1) Sum ({#Total Contracted Value}, {JCM_MASTER__COST_CODE.Cost_Code}),
2) Sum ({#Current Budget}, {JCM_MASTER__COST_CODE.Cost_Code})
3) Sum ({#Costs to Date}, {JCM_MASTER__COST_CODE.Cost_Code})
4) Sum ({#Projected Final PM Input}, {JCM_MASTER__COST_CODE.Cost_Code})
and I need to find the highest value within the four totals in group footer section
You need to create two formula field for that 1st for variable initialization and 2nd for condition which value is bigger than other.
1: Create a first formula field and write down the following code. Give the name of that formula field to Initialization.
WhilePrintingRecords;
numbervar dMax := 0;
Then place that formula field in the Report Header section.
2: Now, create another formula field and write down following code in that formula field.
WhilePrintingRecords;
//dont initialize the 0 in this variable we have already initialized in 1st formula field
numbervar dMax;
//Following condition will check that current sum of that field is greater than
//values stored dMax variable. If the condition is satisfied then value will be initialized
//In dMax variable.
if (IsNull(Sum({TableName.FieldName}, {TableName.GroupField})) = False AND
Sum({TableName.FieldName}, {TableName.GroupField}) > dMax)
dMax:=Sum({TableName.FieldName}, {TableName.GroupField});
dMax;
Now, put this formula field where the summarized value is calculated. for example in group footer.
UPDATE:
If you want to find out the max value withing the four group total. then write down the following code in your formula field and put it in the group footer.
WhilePrintingRecords;
numbervar dMax1:=0;
if (Sum ({#Total Contracted Value}, {JCM_MASTER__COST_CODE.Cost_Code})) > (Sum ({#Current Budget}, {JCM_MASTER__COST_CODE.Cost_Code}))
dMax1:=Sum ({#Total Contracted Value}, {JCM_MASTER__COST_CODE.Cost_Code});
else
dMax1:=Sum ({#Current Budget}, {JCM_MASTER__COST_CODE.Cost_Code});
numbervar dMax2:=0;
if (Sum ({#Costs to Date}, {JCM_MASTER__COST_CODE.Cost_Code}) ) > (Sum ({#Projected Final PM Input}, {JCM_MASTER__COST_CODE.Cost_Code}))
dMax2:=Sum ({#Costs to Date}, {JCM_MASTER__COST_CODE.Cost_Code});
else
dMax2:=Sum ({#Projected Final PM Input}, {JCM_MASTER__COST_CODE.Cost_Code});
if (dMax1 < dMax2)
dMax1 := dMax2;
dMax1;
Try using the arrays...
Store all values in an array and in group footer just take the maximum of the array.
When you summarize the value at the same time store the values in array and retrive maximum from the array. Place below formula after summarizied data in group
//#Storedatainarray
Shared StringVar Array x;
x:=x+totext(Sum ({field}, {#group}));
Now create one more formula #display
EvaluateAfter(#Storedatainarray);
Whileprintingrecords;
Shared StringVar Array x;
Maximum(x);
Let me know how it goes?
Edit....................................
Create a formula #Display and write below code in group footer:
Shared StringVar Array x;
x[1]:= Sum ({#Total Contracted Value}, {JCM_MASTER__COST_CODE.Cost_Code});
x[2]:= Sum ({#Current Budget}, {JCM_MASTER__COST_CODE.Cost_Code});
x[3]:= Sum ({#Costs to Date}, {JCM_MASTER__COST_CODE.Cost_Code});
x[4]:= Sum ({#Projected Final PM Input}, {JCM_MASTER__COST_CODE.Cost_Code});
Maximum(x);

Sumifs in Crystal

I'm working on a database that basically looks like this (in its simplest form):
{Phase} {Code} {Qty}
Example:
{Qty} for {Phase}="R" and {Code}="Nat" = 0
{Qty} for {Phase}="F" and {Code}="Nat" = 5
{Qty} for {Phase}="R" and {Code}="Int" = 10
{Qty} for {Phase}="F" and {Code}="Int" = 15
I am trying to get a result to show me the Qty for phase "R" and Code "Nat" (where R is <> 0) otherwise give me the qty for phase "F". So for the above example I would get an answer = 5 for Nat (because qty for phase R is 0) and an answer of 10 where the code is Int (because qty for phase R <> 0)
I have used three formula fields to do this:
1: if ({PHASE}="F" and {CODE}="NAT") then {QTY} else 0
2: if ({PHASE}="R" and {Code}="NAT") then {QTY} else 0
3: if {2} = 0 then {1} else {2}
Formula fields 1 & 2 come up with the correct amounts. However formula field {3} returns both phases. For example Code "Int" Phase "R" shows as qty = 25 instead of qty = 10.
How do I get around this?
You need to group by {table.code} because this is not a one-row calculation, but needs to be a calculation over each code for 2+ phases (meaning 2+ rows of data).
Create a formula with two variables that will store the values of each phase, F and R. This formula needs to go in the Details section of the report.
whileprintingrecords;
numbervar Fqty;
numbervar Rqty;
if {table.phase}="F" then Fqty:={table.qty}
else Rqty:={table.qty};
Now, in the group footer, you can reference both quantity values via the variables.
whileprintingrecords;
numbervar Fqty;
numbervar Rqty;
if Fqty=0 then Rqty else Fqty
And you're done. Don't forget to reset the two variables in the group header so you don't carry the quantity over between different codes.