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