I need advanced help with the proper case function in crystal reports. I'm using the following formula for individual first and last name fields which work great.
ProperCase ({table.field})
My issue is finding a way to fix the "T" in my address example below. The "T" needs to read "t" after the 8.
8Th Street Apt
See screenshot: Address Error
Address formula:
ProperCase ({table.address1}) + " " + ProperCase ({table.address2})
The format looks silly when sending it this way to employees. Please comment your suggestions!
Try this?
stringvar array ins := split({table.address1} + " "+ {table.address2}," ");
stringvar out;
numbervar z := ubound(ins);
numbervar y;
for y := 1 to z DO
(
if asc(left(ins[y],1)) in [97 to 122] then ins[y] := propercase(ins[y]) ;
);
out := join(ins," ");
out
Related
i want to split data to make it into array. so given for example: 12345678
i want to get string array like this => ["234","678"]
is it possible in crystal report?
Yes, it is possible. But the requirements are not clear.
Data type of input (string or Number?)
Logic: discard 1st character? Then, groups of 3 skipping the 4th character?
Here is formula code that takes "12345678" and returns "^234^678":
local stringvar myString := "12345678";
local stringvar myDelimitedString := "";
local numbervar StringLength := Len(myString);
local numbervar i;
For i := 1 to StringLength step 4 do
myDelimitedString := myDelimitedString + "^" + MID(myString, i+ 1, 3);
myDelimitedString;
I have a field in crystal reports that displays customer's names. the requirement however is to just display the first 5 characters, which includes spacing as well. whatever comes after the 5th character will be converted into * and the spacing shall be displayed as a space still. as the name field varies, how do i accomplish this?
currently i only have this, which displays the first 5 characters and replaces only the 6th character with an *
Replace({Command.CUST_NAME},MID({Command.CUST_NAME},6),"*")
Unfortunately, it seems Crystal does not suport regex.
So, i would do a function. Try this:
stringvar input := {Command.CUST_NAME};
stringvar output := MID(input, 1, 5);
numbervar i;
for i:=5 to Length (input) step 1 do (
stringvar aChar := MID(input, i, 1);
if aChar <> " " then aChar := "*";
output := output + aChar;
);
output
Maybe you will have to handle if {Command.CUST_NAME} is smaller than 5 chars.
I am using CR version 13.0.2.000.I want to display the following Record
1,2,5,10,50,100
in the following way
$1
$2
$5
$10
$50
$100
I have tried the replace method and it successfully show the data columnwise but dont know how to append $ sign before the starting of each element
The formula i tried is given below
Replace({Table7.Value},",",chrw(10))
Keep in mind that you won't be able to use a formula to 'manufacture' rows; this will need to be done at the database.
If you just want to change the display, try:
// {#display}
Local Stringvar CRLF := Chr(10)+Chr(13);
// convert values to an array; 1,2,5,10,50,100
Stringvar Array tokens := Split({Table7.Value}, ",");
// join array
"$" + Join( tokens, CRLF + "$");
If you need to tally the array, try:
// {#aggregate}
Local Numbervar i;
Local Numbervar x;
// tally
for i := 1 to ubound(tokens) do (
x := x + ToNumber(tokens[i]);
);
// display
x
Try this solution. I tried by hardcoding strings and its worked for me.
WhilePrintingRecords;
Local StringVar Array x:=split({Table7.Value},",");
Local NumberVar i;
Local Stringvar y;
for i:=1 to Count(x) do
y:=y+"$"+x[i]+",";
Replace(y,",",chrw(13))
I’m new on crystal reports and don’t have much knowledge of programming. I’m looking for a formula that will separate the notes (example: To Syd+We miss you+From Bill&Pat) into 3 different field. Any help would be greatly appreciated.
local stringVar subject := 'To Syd+We miss you+From Bill&Pat';
local numberVar location := instr(subject, '+');
if location > 0 then
left(subject, location)
else
subject;
I have hardcoded the string to be modified, but you can replace it with {table.field}
Also, if there will definitely always be + you can simplify things by removing the if.
a note that Lee's answer will get you the leftmost bit of text only.
instr(subject,"+") returns the location of the leftmost presence of +
left(subject,location) pulls out a chunk of subject of 'location' number of characters
if you then wanted to fish out the second and third bit, you could do this:
local stringvar subject := "string1+string2+string3";
local numberVar location1;
local numberVar location2;
location1 := instr(subject, "+");
location2 := instr(location1+1, subject, "+");
/////this instr only starts to look from location1 for the next leftmost + and I'll show below how you can use
( if location1 > 0
then left(subject, location1-1)
/////use Lee's 'left' command to bring up the first bit, I added the minus1 so that the actual + would not show
else "missing first +" )
+chrw(13)+ //I was displaying this on screen so I added a ENTER, you can get rid of this line
( if location2 > 0
/////error checking is sanity-saving sooner or later
then
(
mid(subject, location1+1, location2-1-location1)
/////pulls a chunk from within subject, starting at location1+1 [to get past the + at location1 itself],
/////going rightward to grab 'location2-1-location1' characters
/////(play a few times with the +1/-1 to get hte idea.
/////try it with a two-character seperator, say "To john12Hello12From jane", helped me get my head straight
+ chrw(13)+ //again, this is just for my proofing
right(subject, length(subject)-location2)
/////pulls a chunk from the right of subject, of size 'length of subject' minus location2,
/////so everything from the end until hit that +
)
else "missing second +" )
I have a list of words that I am searching through a "Notes" field within a table, that when I display that Notes field in my Crystal Report, I would like to somehow highlight (change font color) for only the specific flagged word within the note text string.
Example:
word list: Joe, Sarah, Amy, Jeff
note text: "I stopped by and talked with Joe to check on the account status, and Amy said hello."
desired result: Note text displays in the report with the words "Joe" and "Amy" in red.
I've tried using RTF and HTML in the Text Interpretation parameter within the properties, where I can successfully format the note text to either of these text outputs. However, I still don't know the right code to isolate and format the specific words from my list, especially if more than one of my words shows up within the field text.
Thanks in advance for any help you can give me!
I know this is old, but i found it searching for an issue i had. The answered code works, but seemed a bit cluttered for me, and also i needed to be able to provide a list of words to highlight. Here is what i came up with.
Local Stringvar Array searchwords:=MakeArray("Joe", "Sarah", "Amy");
local stringvar notes:={Notes};
local numbervar i;
for i:=1 to count(searchwords) do (
notes:=replace(notes,searchwords[i],"<font color='red'>" & searchwords[i] & "</font>",1,-1,1);
);
notes
The only thing to note, is that this will find results when the search word is part of a larger word - i.e. "WORK" would be BOLDED in "Workshop".
While this works for our needs as we want "working","work","worked" etc. to all highlight, crystal reports not supporting Regex is quite a large downside.
I did something similar a couple of years ago:
StringVar SearchText := "has";
StringVar Htm1 := "<b>";
StringVar Htm2 := "</b>";
StringVar Result := "";
StringVar Temp := "";
NumberVar Start := 1;
NumberVar Ln := Len(SearchText);
NumberVar Loc := Instr({#TextField}, SearchText);
While Loc > 0 Do (
Temp := Mid({#TextField}, Start, Loc - Start) + Htm1 + Mid({#TextField}, Loc, Ln) & Htm2;
Result := Result + Temp;
Start := Loc + Ln;
Loc := Instr(Start, {#TextField}, SearchText);
);
Temp := Mid({#TextField}, Start);
Result := Result + Temp;
Result
In this case I am searching the field called #TextField for the value in SearchText and am bolding the values. Probably not the most efficient code, but it works.