MaLo-Checker in ABAP

BW, SRM, Berechtigung etc.
6 Beiträge • Seite 1 von 1
6 Beiträge Seite 1 von 1

MaLo-Checker in ABAP

Beitrag von chhe001 (ForumUser / 26 / 1 / 0 ) »
Hallo,

es geht hier um ein Thema aus dem Bereich IS-U. Ich müsste eine gegebene Marktlokations-Id auf Zulässigkeit prüfen. Grundsätzlich muss sie 11-stellig sein, darf nur aus Ziffern bestehen und die Prüfziffer am Ende muss stimmen. Die Prüfziffernberechnung erfolgt im "Lok- and Waggon-Kennzeichnungsverfahren" nach folgendem Schema:

a) Quersumme aller Ziffern in ungerader Position
b) Quersumme aller Ziffern auf gerader Position multipliziert mit 2
c) Summe von a) und b)
d) Differenz von c) zum nächsten Vielfachen von 10 (ergibt sich hier 10, wird die Prüfziffer 0 genommen)

Beispiel:
MaLo-ID: 4 1 3 7 3 5 5 9 2 4 Prüfziffer
a)4 + 3 + 3 + 5 + 2 = 17
b)(1 + 7 + 5 + 9 + 4) * 2 = 52
c)17 + 52 = 69
d)70 - 69 = 1 -> Prüfziffer "1"

Malo-ID: 4 1 3 7 3 5 5 9 2 4 1

Gibt es eine solche Prüfung bereits im SAP-System oder muss ich das von Hand zu Fuß programmieren? Vielleicht weiß jemand was oder kann mir bei der Programmierung behilflich sein, das wäre echt super.

Viele Grüsse
chhe001

gesponsert
Stellenangebote auf ABAPforum.com schalten
kostenfrei für Ausbildungsberufe und Werksstudenten


Re: MaLo-Checker in ABAP

Beitrag von ewx (Top Expert / 4792 / 295 / 629 ) »
Ich stelle inzwischen KI mit sowas gnadenlos auf die Probe.

BING copilot hat - mit ein bisserl Nachhilfe von mir - folgendes ausgespuckt:

Code: Alles auswählen.


CLASS zcl_market_location DEFINITION.
  PUBLIC SECTION.
    METHODS:
      constructor,
      calculate_check_digit
        IMPORTING
          iv_market_location    TYPE clike
        RETURNING
          VALUE(rv_check_digit) TYPE string.
ENDCLASS.

CLASS zcl_market_location IMPLEMENTATION.
  METHOD constructor.
  ENDMETHOD.

  METHOD calculate_check_digit.
    DATA: lt_digits      TYPE TABLE OF string,
          lv_odd_sum     TYPE i,
          lv_even_sum    TYPE i,
          lv_total_sum   TYPE i,
          lv_check_digit TYPE i,
          lv_char        TYPE char1,
          lv_position    TYPE i.

    SPLIT iv_market_location AT space INTO TABLE lt_digits.

    LOOP AT lt_digits INTO lv_char.
      lv_position = sy-tabix.
      IF lv_position MOD 2 = 1.
        lv_odd_sum = lv_odd_sum + lv_char.
      ELSE.
        lv_even_sum = lv_even_sum + lv_char.
      ENDIF.
    ENDLOOP.

    lv_total_sum = lv_odd_sum + ( lv_even_sum * 2 ).
    lv_check_digit = 10 - ( lv_total_sum MOD 10 ).

    rv_check_digit = lv_check_digit.
  ENDMETHOD.
ENDCLASS.

START-OF-SELECTION.

  DATA(lo_market_location) = NEW zcl_market_location( ).
  DATA(lv_market_location) = '4 1 3 7 3 5 5 9 2 4'.

  DATA(lv_check_digit) = lo_market_location->calculate_check_digit(
    iv_market_location = lv_market_location ).

  WRITE: 'Prüfziffer für die Marktlokations-Id ', lv_market_location,
         ' ist ', lv_check_digit.
Das mit "wenn 10, dann 0" hat copilot nicht berücksichtigt.
ich habe noch um unit tests gebeten, aber die sind allesamt murks.
Critical Assertion Error: 'Even position test failed'
Critical Assertion Error: 'Large market location test failed'
Critical Assertion Error: 'Multiple of 10 test failed'
Critical Assertion Error: 'Odd position test failed'
Critical Assertion Error: 'All zeros test failed'

Re: MaLo-Checker in ABAP

Beitrag von wreichelt (Top Expert / 1033 / 29 / 188 ) »
Hallo,

vielleicht ist da was dabei:

https://help.sap.com/doc/387481718b154a ... eitung.pdf

Gruß
Wolfgang

Re: MaLo-Checker in ABAP

Beitrag von chhe001 (ForumUser / 26 / 1 / 0 ) »
ewx hat geschrieben:
11.03.2024 11:31

Das mit "wenn 10, dann 0" hat copilot nicht berücksichtigt.
Vielen Dank, das hat wunderbar funktioniert. "wenn 10, dann 0" kann man ja ganz easy einrichten.

Re: MaLo-Checker in ABAP

Beitrag von ewx (Top Expert / 4792 / 295 / 629 ) »
wenn du deine MaLo-Nummer nicht mit spaces angeben möchtest, musst du hier auch nachbessern.

ich würde auf jeden Fall ein paar unit tests einbauen:

Code: Alles auswählen.

CLASS zcl_market_location_test DEFINITION FOR TESTING RISK LEVEL HARMLESS DURATION short.
  PRIVATE SECTION.
    METHODS:
      calc_check_digit_odd for TESTING,
      calc_check_digit_even for TESTING,
      calc_check_digit_mult_of_10 for TESTING,
      calc_check_digit_zero for TESTING,
      calc_check_digit_large for TESTING.
ENDCLASS.

CLASS zcl_market_location_test IMPLEMENTATION.
  METHOD calc_check_digit_odd.
    DATA(lo_market_location) = NEW zcl_market_location( ).
    DATA(lv_market_location) = '4 1 3 7 3 5 5 9 2 4'.
    data(lv_check_digit) = lo_market_location->calc_check_digit(
      iv_market_location = lv_market_location ).

    cl_abap_unit_assert=>assert_equals(
      act = lv_check_digit
      exp = '1'
      msg = 'Odd position test failed' ).
  ENDMETHOD.

  METHOD calc_check_digit_even.
    DATA(lo_market_location) = NEW zcl_market_location( ).
    DATA(lv_market_location) = '1 2 3 4 5 6 7 8 9 0'.
    data(lv_check_digit) = lo_market_location->calc_check_digit(
      iv_market_location = lv_market_location ).

    cl_abap_unit_assert=>assert_equals(
      act = lv_check_digit
      exp = '9'
      msg = 'Even position test failed' ).
  ENDMETHOD.

  METHOD calc_check_digit_mult_of_10.
    DATA(lo_market_location) = NEW zcl_market_location( ).
    DATA(lv_market_location) = '9 8 7 6 5 4 3 2 1 0 9'.

    data(lv_check_digit) = lo_market_location->calc_check_digit(
      iv_market_location = lv_market_location ).

    cl_abap_unit_assert=>assert_equals(
      act = lv_check_digit
      exp = '0'
      msg = 'Multiple of 10 test failed' ).
  ENDMETHOD.

  METHOD calc_check_digit_zero.
    DATA(lo_market_location) = NEW zcl_market_location( ).
    DATA(lv_market_location) = '0 0 0 0 0 0 0 0 0 0'.

    data(lv_check_digit) = lo_market_location->calc_check_digit(
      iv_market_location = lv_market_location ).

    cl_abap_unit_assert=>assert_equals(
      act = lv_check_digit
      exp = '0'
      msg = 'All zeros test failed' ).
  ENDMETHOD.

  METHOD calc_check_digit_large.
    DATA(lo_market_location) = NEW zcl_market_location( ).
    DATA(lv_market_location) = '1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0'.

    data(lv_check_digit) = lo_market_location->calc_check_digit(
      iv_market_location = lv_market_location ).

    cl_abap_unit_assert=>assert_equals(
      act = lv_check_digit
      exp = '8'
      msg = 'Large market location test failed' ).
  ENDMETHOD.
ENDCLASS.

Re: MaLo-Checker in ABAP

Beitrag von A6272 (Specialist / 231 / 6 / 36 ) »
eine MaLo (Marktlokation) hat keine Leerzeichen zwischen den Ziffern. Die ist 11 Zeichen lang und besteht nur aus Ziffern und beginnt mit 1 bis 9 (keine führende 0)
Das Datenelement ist üblicherweise CHAR50 (Tabelle EIUTRANS --> EXTUI)

Der Splitt auf SPACE sollte daher nicht funktionieren. --> Den SPLIT + Loop würde ich ganz primitiv durch ein For ... 1 bis 10 ... next und Zugriff auf die Ziffer per Offset umsetzen.

Seite 1 von 1

Vergleichbare Themen

0
Antw.
113
Views
SEPA XML-Checker
von HH_ABAP » 20.11.2023 10:26 • Verfasst in ABAP® für Anfänger
5
Antw.
10082
Views
Kundeneigene ABAP-Muster Vorlage im ABAP-Editor anlegen
von Stentor » 19.07.2005 11:10 • Verfasst in Basis
3
Antw.
15748
Views
ABAP 7.02 - Neues Feature - Pragmas in ABAP
von foessleitnerj » 09.01.2013 17:02 • Verfasst in Tips + Tricks & FAQs
2
Antw.
3086
Views
ABAP Objects oder ABAP Referenz
von Gast » 23.06.2005 15:52 • Verfasst in ABAP® für Anfänger
6
Antw.
4670
Views
ABAP Workbench und ABAP Dictionary - für Einsteiger
von schnonus » 03.04.2008 10:39 • Verfasst in ABAP® für Anfänger

Aktuelle Forenbeiträge

Passwörter speichern
Gestern von ewx gelöst 4 / 44
Massenpflege Customer
Gestern von Thomas R. gelöst 18 / 13972
Abstimmschlüssel ändern
vor 2 Tagen von FS1895 1 / 34

Newsletter Anmeldung

Keine Beiträge verpassen! Wöchentlich versenden wir lesenwerte Beiträge aus unserer Community.
Die letzte Ausgabe findest du hier.
Details zum Versandverfahren und zu Ihren Widerrufsmöglichkeiten findest du in unserer Datenschutzerklärung.

Aktuelle Forenbeiträge

Passwörter speichern
Gestern von ewx gelöst 4 / 44
Massenpflege Customer
Gestern von Thomas R. gelöst 18 / 13972
Abstimmschlüssel ändern
vor 2 Tagen von FS1895 1 / 34

Unbeantwortete Forenbeiträge

Abstimmschlüssel ändern
vor 2 Tagen von FS1895 1 / 34
Application-Log, SLG1 Meldungstext
vor 3 Wochen von chhe001 1 / 688
Transporte sind verschwunden
vor 3 Wochen von Abapriest69 1 / 407