Formatting specific found words within a text string in Crystal Reports - crystal-reports

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.

Related

mask a field with no fixed length in crystal reports 2008

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.

Mask address in Crystal Reports

I am creating a report by Crystal Reports which will mask address field depending upon parameter set to the report. I know this can be done using formula. I can successfully mask with hard coded value. However I need something like password masking. For example, if address is D/302 ABC apartment, it should be displayed as X/XXX XXX XXXXXXXXX. Only characters and numbers to be masked space and special characters not be masked. In addition length of masked data should match actual data.
I think you can use a formula like this:
Local StringVar str := "";
Local NumberVar strLen := Length({User.Address});
Local NumberVar i;
For i := 1 To strLen Do
(
if (ChrW({User.Address}[i]) in (AscW("A") to AscW("Z"))) or (ChrW({User.Address}[i]) in (AscW("a") to AscW("z"))) or (ChrW({User.Address}[i]) in (AscW("0") to AscW("9"))) Then
str := str + "X"
else
str := str + {User.Address}[i];
);
str
Logic is correct.. I have done the same thing by using Mid function instead of chrW (). No need to use asw () either. Simply use range operator.
Logic is correct.. I have done the same thing by using Mid function instead of chrW (). Additional you can use formula as ReplicateString ("X",len(address));
Only problem is space will be also masked

crystal reports trimming strings

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 +" )

Format number formula

I have a number field in Crystal Report that must be shown in a specific format:
Eg:
12345678
must be shown as
1234-5678
I'm using a formula to transform the number to string, substring it 2 times and concatenate both values:
StringVar ordenT := Totext(GroupName ({DataTableInfCR.Orden}));
StringVar OrdenT1 := MID(ordenT,1,4);
StringVar OrdenT2 := MID(ordenT,4,4);
StringVar NroOrden := OrdenT1 +"-"+ OrdenT2;
However, the output for this code ends up being somthing like this:
12.3-45.6
I'm sure it because the default number format is with dots (ex: 12345678 will be 12.345.678)
How can I change the format via formula before my code??
Thanks!
To answer your question, to remove the decimals you use
StringVar ordenT := Totext(GroupName ({DataTableInfCR.Orden}),0);
or
StringVar ordenT := cStr(GroupName ({DataTableInfCR.Orden}),0);
EDIT:
See if this will take care of it all:
totext(GroupName({DataTableInfCR.Orden}),0,""),"xxxx-xxxx")

Crystal reports 11: How to handle or trim special characters

In my crystal report, I noticed one of the fields being pulled from a table has special characters. More specifically carriage returns and tabs. Is there a way to strip this out, so it doesn't show up blank in my reports?
Thanks in advance.
This should do it:
stringvar output := {TABLE_NAME.FIELD_NAME};
output := Trim(output); //get rid of leading & trailing spaces
output := Replace(output,Chr(13),''); //get rid of line feed character
output := Replace(output,Chr(10),''); //get rid of carriage return character
//add any other special characters you want to strip out.
If you have a lot of characters to strip out, you can use this slightly fancier approach. Just add whatever characters you want to strip out to the in[]:
stringvar input := {DROPME.TEST_FIELD};
stringvar output := '';
numbervar i;
input := Trim(input);
for i := 1 to Length(input) Step 1 do
if not(input[i] in [Chr(13),Chr(10)]) then
output := output + input[i];
output