I have a formula that takes value from query data
Now, I want to skip the formula if the query data is 0
Example: [value1]-[value2]/[value1]*100
If the [value1] is 0, skip the formula.
First of all, Pentaho Report Designer have build-in Formula Editor, which can greatly simplify your life when constructing these formulas. Not sure starting which version it available, but in 3.6.1 it's for sure.
Also in Pentaho Wiki you may find a useful page describing Formula Expressions: http://wiki.pentaho.com/display/Reporting/Formula+Expressions
As for your particular issue, I think this formula should work:
=IF([value1] = 0; ""; [value1]-[value2]/[value1]*100)
Starting equal sign is required in each formula!
By observing your formula, [value1] field is there in the denominator, there might be a chance to get zero(0) for that field. This is logical error.
If you handle that one, you can overcome this error.
For your case this formula would work.
= ( [value1]-[value2]/ IF(OR(ISEMPTYDATA([value1]); [value1] = 0) ;1;[value1]) )*100
I had an error where I used one date type as type "Date" and another as "Date(SQL)" where I used the first parameter with format "Date" to derive the other parameter with format "Date(SQL)" through a formula. Which came back to bite me.
Related
I'm using below formula to calculate sum product with if condition using Apache poi 3.15 version, but it's not evaluating with if condition (--(A1:A6="A")) and its giving "#VALUE" error.
The same formula if i use directly in excel, its working as expected. and if I remove "--(A1:A6="A")" this condition, it works fine with poi.
Formula:
=SUMPRODUCT(--(A1:A6="A"),B1:B6,C1:C6)
Could you please tell me how to evaluate this kind of formula or is there any alternative way to evaluate this?
Okay, sorry for originally barking up the wrong tree...
A fresh pair of Monday eyes and I can see the issue:
You are using quotes " inside a quoted string, you need to escape the quotes in the formula with \ - cell.setCellFormula("SUMPRODUCT(--(A1:A6=\"A\"),B1:B6,C1:C6)");
=SUMPRODUCT(--(A1:A6="A")*(B1:B6)*(C1:C6)) - Edited to desired logic
By using the double unary "--" you convert true/false in to 0 or 1.
This is an if condition, so you need to also multiple each row of data by the 0 or 1 and sum the result; when the condition is false the product of the row will multiply by 0 giving a total of 0 to be summed for that row.
The issue is not with the formula, it's with the workbook which I'm using. The workbook SXSSFWorkbook has an issue with evaluation. When I changed to XSSFWorkbook, it started evaluating properly.
I suggest using either XSSFWorkbook(.xlsx) or HSSFWorkbook(.xls) in order to make the formula work properly.
=SUMPRODUCT(B1:B6,C1:C6,--(A1:A6="A"))
Note: Do not put IF condition (--(A1:A6="A")) as first argument.
Thanks
I've looked through a number of tutorials and asks, and haven't found a working solution to my problem.
Suppose my dataset has two columns: sort_order and field_value. sort_order is an integer and field_value is a numerical (10,2).
I want to format some rows as #,#0 and others as #,#0.00.
Normally I would just do
iif( fields!sort_order.value = 1 or fields!sort_order.value = 23 or .....
unfortunately, the list is fairly long.
I'd like to do the equivalent of if fields!sort_order.value in (1,2,21,63,78,...) then...)
As recommended in another post, I tried the following (if sort in list, then just output a 0, else a 1. this is just to test the functionality of the IN operator):
=iif( fields!sort_order.Value IN split("1,2,3,4,5,6,8,10,11,15,16,17,18,19,20,21,26,30,31,33,34,36,37,38,41,42,44,45,46,49,50,52,53,54,57,58,59,62,63,64,67,68,70,71,75,76,77,80,81,82,92,98,99,113,115,116,120,122,123,127,130,134,136,137,143,144,146,147,148,149,154,155,156,157,162,163,164,165,170,171,172,173,183,184,185,186,192,193,194,195,201,202,203,204,210,211,212,213,263",","),0,1)
However, it doesn't look like the SSRS expression editor wants to accept the "IN" operator. Which is strange, because all the examples I've found that solve this problem use the IN operator.
Any advice?
Try using IndexOf function:
=IIF(Array.IndexOf(split("1,2,3,4,...",","),fields!sort_order.Value)>-1,0,1)
Note all values must be inside quotations.
Consider the recommendation of #Jakub, I recommend this solution if
your are feeding your report via SP and you can't touch it.
Let me know if this helps.
I want to convert a string to int like this:
CAST(TestSth3.Emp_Code AS int)
I need output as 1234 in crystal report, shows me correctly when i get the output from database, but in Crystal it again converts to 1,234 instead of 1234.
I am using vb.net 2008 and SQL server.
I think you need to try this solution, Replace ',' to '' in the string
Take a look on below code
CAST(REPLACE(TestSth3.Emp_Code, ',', '') AS int) As Clm
it is unclear your question i just point out some facts here
if your string is 1234
then when you try select cast(yournum,int) will give you the correct result
example
select cast('1234'as int) as num
will results
1234
or if your string is something like 1,234
then
try the following it will give results
declare #num varchar(10) ='1,234'
select CONVERT(int, replace(#num,',',''))as number
or
select CAST(replace(#num,',','') AS int)as number2
both results 1234
also you need to double check TestSth3.Emp_Code what is that ?? is it a parameter ??
if yes then need #before that and i think it is not possible to create a parameter name including .(dot) so double check that too.
UPDATE
if the problem based on crystal report then follow below steps
Right mouse click on that field, and select "Format object". Select
"Custom Style" in the Style list, and click "Customize". Untick
"Thousands Separator", and any other unwanted formatting.
Failing that, you could try selecting the field and deleting the ","
value from the property "ThousandSeperator" in your properties window.
or use below formula
CStr(YourField, 0, '')
I think this post summarises the problem much better. #MattWhitfield says:
Formatting numbers for display is something that should be done in the
display layer, and not within the database. So, in whatever
application this data ends up being used, you should format it there.
Management Studio, unfortunately, does not offer much control in this
regard.
Edit: Integers don't have formats. E.g. Six eggs are formatted as eggs, not digits, but they are still 6. The formatting has nothing to do with the number. However if you want to display the integer in a particular format (with or without thousands separator - commas), then convert it back to a string again in the report or VB form, not in the database (or leave it as a string since it's already a string).
Easy way is to use crystal report functions:
ToNumber(TestSth3.Emp_Code)
I'm trying to write a function of this form:
Function cont(requestdate As Date)
cont = requestdate
End Function
Unfortunately, when I enter =cont(12/12/2012) into a cell, I do not get my date back. I get a very small number, which I think equals 12 divided by 12 divided by 2012. How can I get this to give me back the date? I do not want the user to have to enter =cont("12/12/2012").
I've attempted to google for an answer, unfortunately, I have not found anything helpful. Please let me know if my vocabulary is correct.
Let's say my user pulled a report with 3 columns, a, b and c. a has beginning of quarter balances, b has end of quarter balances and c has a first and last name. I want my user to put in column d: =cont(a1,b1,c1,12/12/2012) and make it create something like:
BOQ IS 1200, EOQ IS 1300, NAME IS EDDARD STARK, DATE IS 12/12/2012
So we could load this into a database. I apologize for the lack of info the first time around. To be honest, this function wouldn't save me a ton of time. I'm just trying to learn VBA, and thought this would be a good exercise... Then I got stuck.
Hard to tell what you are really trying to accomplish.
Function cont(requestdate As String) As String
cont = Format(Replace(requestdate, ".", "/"), "'mm_dd_YYYY")
End Function
This code will take a string that Excel does not recognize as a number e.g. 12.12.12 and formats it (about the only useful thing I can think of for this UDF) and return it as a string (that is not a number or date) to a cell that is formatted as text.
You can get as fancy as you like in processing the string entered and formatting the string returned - just that BOTH can never be a number or a date (or anything else Excel recognizes.)
There is no way to do exactly what you're trying to do. I will try to explain why.
You might think that because your function requires a Date argument, that this somehow forces or should force that 12/12/2012 to be treated as a Date. And it is treated as a Date — but only after it's evaluated (only if the evaluated expression cannot be interpreted as a Date, then you will get an error).
Why does Excel evaluate this before the function receives it?
Without requiring string qualifiers, how could the application possibly know what type of data you intended, or whether you intended for that to be evaluated? It could not possibly know, so there would be chaos.
Perhaps this is best illustrated by example. Using your function:
=Cont(1/1/0000) should raise an error.
Or consider a very simple formula:
=1/2
Should this formula return .5 (double) or January 2 (date) or should it return "1/2" (string literal)? Ultimately, it has to do one of these, and do that one thing consistently, and the one thing that Excel will do in this case is to evaluate the expression.
TL;DR
Your problem is that unqualified expression will be evaluated before being passed, and this is done to avoid confusion or ambiguity (per examples).
Here is my method for allowing quick date entry into a User Defined Function without wrapping the date in quotes:
Function cont(requestdate As Double) As Date
cont = CDate((Mid(Application.Caller.Formula, 7, 10)))
End Function
The UDF call lines up with the OP's initial request:
=cont(12/12/2012)
I believe that this method would adapt just fine for the OP's more complex ask, but suggest moving the date to the beginning of the call:
=cont(12/12/2012,a1,b1,c1)
I fully expect that this method can be optimized for both speed and flexibility. Working on a project now that might require me to further dig into the speed piece, but it suits my needs in the meantime. Will update if anything useful turns up.
Brief Explanation
Application.Caller returns a Range containing the cell that called the UDF. (See Caveat #2)
Mid returns part of a string (the formula from the range that called the UDF in this case) starting at the specified character count (7) of the specified length (10).
CDate may not actually be necessary, but forces the value into date format if possible.
Caveats
This does require use of the full dd/mm/yyyy (1/1/2012 would fail) but pleasantly still works with my preferred yyyy/mm/dd format as well as covering some other delimiters. dd-mm-yyyy or dd+mm+yyyy would work, but dd.mm.yyyy will not because excel does not recognize it as a valid number.
Additional work would be necessary for this to function as part of a multi-cell array formula because Application.Caller returns a range containing all of the associated cells in that case.
There is no error handling, and =cont(123) or =cont(derp) (basically anything not dd/mm/yyy) will naturally fail.
Disclaimers
A quick note to the folks who are questioning the wisdom of a UDF here: I've got a big grid of items and their associated tasks. With no arguments, my UDF calculates due dates based on a number of item and task parameters. When the optional date is included, the UDF returns a delta between the actual date and what was calculated. I use this delta to monitor and calibrate my calculated due dates.
All of this can absolutely be performed without the UDF, but bulk entry would be considerably more challenging to say the least.
Removing the need for quotes sets my data entry up such that loading =cont( into the clipboard allows my left hand to F2/ctrl-v/tab while my right hand furiously enters dates on the numpad without need to frequently (and awkwardly) shift left-hand position for a shift+'.
Hey, I have a report parameter which looks like this: 01.01.2009 00:00:00
Its a date (as string), as you might have guessed :). The problem is, this param can be an empty string as well. So I tried those expressions:
=IIf(IsDate(Parameters!DateTo.Value), CDate(Parameters!DateTo.Value), "")
=IIf(Len(Parameters!DateTo.Value) > 0, CDate(Parameters!DateTo.Value), "")
Both dont work and the value for the textfield where I print the expressions result is always #Error. As soon as I remove the CDate stuff, it works, but I have to use it. IS there another way to achieve that? What I want is to display nothing if its not a date or the date (format dd.mm.yyyy) if its a date.
Ideas?
Thanks :)
All arguments to the IIf are evaluated, which results in your error, since the CDate will fail for an empty string.
You can get around this by just writting a function along these lines, using a standard if statement:
Function FormatDate(ByVal s As String) As String
If (s <> "") Then
Return CDate(s).ToString()
Else
Return ""
End If
End Function
Then call it with: =Code.FormatDate(Parameters!DateTo.Value)
First, fix your database to properly store dates rather than doing these workarounds. You probably have bad data in there as well (Feb 30 2010 for example or my favorite, ASAP). Truly there is no excuse for not fixing this at the database level where it needs to be fixed except if this is vendor provided software that you can't change (I would yell at them though, well notify them really, and ask them to fix their data model or go to a new product designed by someone who knows what they are doing. A vendor who can't use dates properly is likely to have software that is very poor all around).
In the query that you use to select the infomation, have you considered just converting all non-dates to null?