Creditor Reference berechnen

17. März 2021 14:24

Ich muss für einen Zahlschein eine Creditor Reference erstellen. Das ist ja eigentlich eine IBAN mit vorangestelltem RF anstelle eines Ländercodes.

Die Prüfziffer dafür muss mit Modulo 97 berechnet werden.

Hat das ev. schon einmal jemand gemacht und könnte mir sagen, wie das zu lösen ist?

Re: Creditor Reference berechnen

17. März 2021 15:28

Das Verfahren ist in ISO 11649 festgelegt.
https://www.mobilefish.com/services/cre ... erence.php
https://wiki.xmldation.com/General_Info ... _Reference
Die MOD-Funktion hat C/AL im Angebot. Die Besonderheit ist bei dieser Nummer, dass auch Buchstaben enthalten sein können und vor der Prüfung in Zahlen umgewandelt werden müssen.

Das sind kleine Auschnitte aus einer Funktion dazu, die ich vor einigen Jahren mal dafür gemacht habe, als ISO 20022 CH eingeführt wurde. Kompletten Code kann ich hier natürlich nicht veröffentlichen :wink: .
Code:
CASE UPPERCASE(FORMAT(ISOreference[i])) OF
    […]
    'A': NumericRefText += '10';
    'B': NumericRefText += '11';
    'C': NumericRefText += '12';
    […]
    'Y': NumericRefText += '34';
    'Z': NumericRefText += '35';
END;


Code:
TempText1 := FORMAT(TempBigInt1) + '271500'; // RF00
EVALUATE(TempBigInt1,TempText1);
Remainder := 98 - (TempBigInt1 MOD 97);
IF Remainder >= 10 THEN
  CalcChkDig := FORMAT(Remainder)
ELSE
  CalcChkDig := '0' + FORMAT(Remainder);

Re: Creditor Reference berechnen

17. März 2021 16:06

Danke Kai, dein kleiner Leak hilft mir schon viel weiter :-D

Was ich nicht verstehe:
Warum braucht es diese beiden Zeilen?

TempText1 := FORMAT(TempBigInt1) + '271500'; // RF00
EVALUATE(TempBigInt1,TempText1)

Könnte man nicht auch einfach die Textvariable mit dem String füllen, und dann die BigInt mit EVALUATE setzen?

Re: Creditor Reference berechnen

17. März 2021 16:19

Die Vorbelegung mit RF00 als Suffix muss mit dazu, damit die richtige Prüfziffer berechnet wird.
R = 27
F = 15
00 = 00

Es mag auch andere Verfahren geben, aber so funktioniert es jedenfalls.

Re: Creditor Reference berechnen

17. März 2021 16:35

Sorry, sollte keine Kritik sein.

Bei mir klappt das nicht, darum habe ich nachgefragt.

Re: Creditor Reference berechnen

17. März 2021 17:12

Ich habe es auch nicht als Kritik verstanden, aber das Ganze habe ich vor fünf Jahren programmiert, und daher auch nicht mehr alles dazu greifbar. Ich kann mich allerdings erinnern, seinerzeit nur mit dieser Methode die richtige Prüfziffer bekommen zu haben. Die komplette Funktion kann natürlich auch in unserem Addon eingesehen werden (Codeunit Payment Tools).

Re: Creditor Reference berechnen

17. März 2021 17:17

Darf ich noch was fragen?

Die BigInteger muss ja gesetzt werden vorher. Ich habe gelesen, dass man das mit einem angefügten L tun kann, ähnlich D oder DT bei Datum und Zeit.
Aber ich habe einen Codestring aus Zahlen, den ich die BigInteger übernehmen sollte und bekomme das so nicht hin.

Hast du mir ev. noch einen Tipp dazu? Danach gebe ich Ruhe. :wink:

Re: Creditor Reference berechnen

17. März 2021 17:29

Das ist nur ein EVALUATE für BigInteger nach der Umwandlung in die numerische Referenz.
Code:
IF NOT EVALUATE(TempBigInt1,NumericRefText) THEN
  ERROR('Converted reference text is not numeric.');

Wenn die nicht funktioniert, befinden sich andere als die zulässigen Buchstaben in der alphanumerischen Referenz, die die obige CASE-Funktion dann nicht umwandeln kann.

Re: Creditor Reference berechnen

18. März 2021 15:22

Das hat grundsätzlich wunderbar funktioniert, besten Dank.

Die mögliche Länge einer solchen Referenz kann ja 25 Stellen betragen. Also RF mit nachfolgend 23 Ziffern z.B.
Das wird dann aber für die Berechnung der Prüfziffer zu lang für die BigInteger-Variable.

Muss man sich hier einfach beschränken oder kann man das anders lösen?

Re: Creditor Reference berechnen

26. März 2021 12:22

rotsch hat geschrieben:Muss man sich hier einfach beschränken oder kann man das anders lösen?

Ein Zerlegungsverfahren zur Prüfziffernberechnung für solch lange Referenzen ist mir nicht bekannt, bislang waren die auch immer wesentlich kürzer.
In diesem Sinne : "In der Beschränkung zeigt sich erst der Meister" - J.W. v. Goethe :wink:

Der Trick mit dem Suffix wird z.B. hier unter 6.2.2 anders erwähnt, also vier Ziffern vorne abschneiden und nach hinten verlegen, und dann statt 00 mit den vorhandenen Prüfziffern.

Re: Creditor Reference berechnen

26. April 2021 17:52

Im Standard der CH-Version in Codeunit 11518 Swiss QR-Bill Mgt. ist übrigens auch eine Funktion CalcCheckDigitForCreditorReference für die Prüfzifferermittlung.
Hier in AL:
https://github.com/StefanMaron/MSDyn365BC.Code.History/blob/ch-18/SwissQRBill/Source/QR-Bill%20Management%20for%20Switzerland/src/core/Mgt.Codeunit.al