After seeing Tim Dexter post about fixed line and row filler decided to post about the handling string wrapping in the template.
1. Need to display fixed lines.
2. If there are only few lines and the page is not filled then we need to print blank lines to fill the page.
3. At the end of the report we need to display the summary as shown above.
4. At the end of the rows including the rows with values and blank rows we need to print a line to end the box.
Here is the invoice template screen shot,
To handle the string wrapping I had taken the number of characters that will fit into item description field (this is expected to wrap), in my example 24 characters will fit in a single line.
Here is the mini logic i have will also consider single word wrapping to next line.
ln_Act_lgth := length(lc_data);
ln_lgth:=0;
ln_row:=1;
loop
-- Get the first word of the string without the space.
lc_word := substr(lc_data,1,instr(lc_data,' ')-1);
--get the length of the existing word on the current line with the current word.
ln_lgth := ln_lgth + NVL(length(lc_word),0);
--Add 1 for space when calculating the total length so.
ln_tot_lgth := ln_tot_lgth + NVL(length(lc_word),0)+1;
--if length of the existing word on the current line with the current word
--is more than 24 means then the line will break into two.
IF ln_lgth >= 24 THEN
ln_row := ln_row+1;
ln_lgth:= NVL(length(lc_word),0);
END IF;
ln_lgth := ln_lgth+1;
exit when ln_tot_lgth >= ln_Act_lgth;
--get the balance remaining string apart from the current word.
lc_data := substr(lc_data,instr(lc_data,' ')+1);
end loop;
ln_lgth:=0;
ln_row:=1;
loop
-- Get the first word of the string without the space.
lc_word := substr(lc_data,1,instr(lc_data,' ')-1);
--get the length of the existing word on the current line with the current word.
ln_lgth := ln_lgth + NVL(length(lc_word),0);
--Add 1 for space when calculating the total length so.
ln_tot_lgth := ln_tot_lgth + NVL(length(lc_word),0)+1;
--if length of the existing word on the current line with the current word
--is more than 24 means then the line will break into two.
IF ln_lgth >= 24 THEN
ln_row := ln_row+1;
ln_lgth:= NVL(length(lc_word),0);
END IF;
ln_lgth := ln_lgth+1;
exit when ln_tot_lgth >= ln_Act_lgth;
--get the balance remaining string apart from the current word.
lc_data := substr(lc_data,instr(lc_data,' ')+1);
end loop;
And again as per my example 36 lines will fit into one page (including the summary).
Now let me give you the pseudocode of my logic.
START
IF v_rowcount >= 36 THEN
§ Print the line to close the box.
§ Reset v_rowcount to zero.
END IF;
END LOOP
IF v_balance_lines <>) THEN
§ Print blank lines for remaining lines to find the number of blank rows to be printed use the variable v_rowcount. so here the no of blank lines will be 36 - (v_rowcount)
§ Print the line to close the box.
§ Enable a flag to say we need to print empty rows in the 29 empty rows in the next page, So that the summary comes at the end.
ELSE IF v_balance_lines > 7 THEN
§ Print blank lines by making sure you leave 7 lines to print summary. to find the number of blank rows to be printed use the variable v_rowcount. so here the no of blank lines will be 36 - (v_rowcount+ 7)
§ Print the line to close the box.
§ Print the summary
END IF;
5. Check whether the flag is enables to print 29 blank lines. If yes,
§ Print 29 blank lines.
§ Print the line to close the box.
§ Print the summary
END
That’s all. If you closely watch the above pseudocode you will get the logic of handling text wrapping.