Business Central has removed the FormatNoText procedure from the check report, we used this function to convert an amount to words by using the following code:
checkreport.InitTextVariable();
checkreport.FormatNoText(TextArray, Amount, CurrencyCode);
but now it has been removed, there are two ways right now which i know to convert amount to words
1- Create your own procedure
2- Use FormatNoText from another report
I am going to show you both ways/
1- Creating own procedure:
I am going to put the code into the codeunit but you can put that code anywhere you want.
codeunit 50105 AmountToWords
{
procedure FormatNoText(var NoText: array[2] of Text[80]; No: Decimal; CurrencyCode: Code[10])
var
PrintExponent: Boolean;
Ones: Integer;
Tens: Integer;
Hundreds: Integer;
Exponent: Integer;
NoTextIndex: Integer;
DecimalPosition: Decimal;
Text026: Label 'ZERO';
Text027: Label 'HUNDRED';
Text028: Label 'AND';
begin
Clear(NoText);
NoTextIndex := 1;
NoText[1] := '****';
if No < 1 then
AddToNoText(NoText, NoTextIndex, PrintExponent, Text026)
else
for Exponent := 4 downto 1 do begin
PrintExponent := false;
Ones := No div Power(1000, Exponent - 1);
Hundreds := Ones div 100;
Tens := (Ones mod 100) div 10;
Ones := Ones mod 10;
if Hundreds > 0 then begin
AddToNoText(NoText, NoTextIndex, PrintExponent, OnesText[Hundreds]);
AddToNoText(NoText, NoTextIndex, PrintExponent, Text027);
end;
if Tens >= 2 then begin
AddToNoText(NoText, NoTextIndex, PrintExponent, TensText[Tens]);
if Ones > 0 then
AddToNoText(NoText, NoTextIndex, PrintExponent, OnesText[Ones]);
end else
if (Tens * 10 + Ones) > 0 then
AddToNoText(NoText, NoTextIndex, PrintExponent, OnesText[Tens * 10 + Ones]);
if PrintExponent and (Exponent > 1) then
AddToNoText(NoText, NoTextIndex, PrintExponent, ExponentText[Exponent]);
No := No - (Hundreds * 100 + Tens * 10 + Ones) * Power(1000, Exponent - 1);
end;
AddToNoText(NoText, NoTextIndex, PrintExponent, Text028);
DecimalPosition := GetAmtDecimalPosition(CurrencyCode);
AddToNoText(NoText, NoTextIndex, PrintExponent, (Format(No * DecimalPosition) + '/' + Format(DecimalPosition)));
if CurrencyCode <> '' then
AddToNoText(NoText, NoTextIndex, PrintExponent, CurrencyCode);
end;
local procedure AddToNoText(var NoText: array[2] of Text[80]; var NoTextIndex: Integer; var PrintExponent: Boolean; AddText: Text[30])
var
Text029: Label '%1 results in a written number that is too long.';
begin
PrintExponent := true;
while StrLen(NoText[NoTextIndex] + ' ' + AddText) > MaxStrLen(NoText[1]) do begin
NoTextIndex := NoTextIndex + 1;
if NoTextIndex > ArrayLen(NoText) then
Error(Text029, AddText);
end;
NoText[NoTextIndex] := DelChr(NoText[NoTextIndex] + ' ' + AddText, '<');
end;
local procedure GetAmtDecimalPosition(currencycode: Text): Decimal
var
Currency: Record Currency;
begin
if currencycode = '' then
Currency.InitRoundingPrecision
else begin
Currency.Get(currencycode);
Currency.TestField("Amount Rounding Precision");
end;
exit(1 / Currency."Amount Rounding Precision");
end;
procedure InitTextVariable()
begin
OnesText[1] := Text032;
OnesText[2] := Text033;
OnesText[3] := Text034;
OnesText[4] := Text035;
OnesText[5] := Text036;
OnesText[6] := Text037;
OnesText[7] := Text038;
OnesText[8] := Text039;
OnesText[9] := Text040;
OnesText[10] := Text041;
OnesText[11] := Text042;
OnesText[12] := Text043;
OnesText[13] := Text044;
OnesText[14] := Text045;
OnesText[15] := Text046;
OnesText[16] := Text047;
OnesText[17] := Text048;
OnesText[18] := Text049;
OnesText[19] := Text050;
TensText[1] := '';
TensText[2] := Text051;
TensText[3] := Text052;
TensText[4] := Text053;
TensText[5] := Text054;
TensText[6] := Text055;
TensText[7] := Text056;
TensText[8] := Text057;
TensText[9] := Text058;
ExponentText[1] := '';
ExponentText[2] := Text059;
ExponentText[3] := Text060;
ExponentText[4] := Text061;
end;
var
TensText: array[10] of Text[30];
OnesText: array[20] of Text[30];
ExponentText: array[5] of Text[30];
currencycode: Text;
Text032: Label 'ONE';
Text033: Label 'TWO';
Text034: Label 'THREE';
Text035: Label 'FOUR';
Text036: Label 'FIVE';
Text037: Label 'SIX';
Text038: Label 'SEVEN';
Text039: Label 'EIGHT';
Text040: Label 'NINE';
Text041: Label 'TEN';
Text042: Label 'ELEVEN';
Text043: Label 'TWELVE';
Text044: Label 'THIRTEEN';
Text045: Label 'FOURTEEN';
Text046: Label 'FIFTEEN';
Text047: Label 'SIXTEEN';
Text048: Label 'SEVENTEEN';
Text049: Label 'EIGHTEEN';
Text050: Label 'NINETEEN';
Text051: Label 'TWENTY';
Text052: Label 'THIRTY';
Text053: Label 'FORTY';
Text054: Label 'FIFTY';
Text055: Label 'SIXTY';
Text056: Label 'SEVENTY';
Text057: Label 'EIGHTY';
Text058: Label 'NINETY';
Text059: Label 'THOUSAND';
Text060: Label 'MILLION';
Text061: Label 'BILLION';
}
Then after that, you can basically call the codeunit and convert the amount just like before
cu.InitTextVariable();
cu.FormatNoText(TextArray, Amount, CurrencyCode);
2- The Second way is to use the FormatNoText from another built-in report.
you can create a record of the following report:
ChkTransMgt: Report "Check Translation Management";
then you can use the following statement with you desired parameters
ChkTransMgt.FormatNoText(DescriptionLine, CheckLedgEntry.Amount, CheckLanguage, BankAcc2."Currency Code")
No comments:
Post a Comment