Kundennummern, Materialnummern und Belegnummern liegen in SAP-Systemen intern mit führenden Nullen. Nach außen zeigt man sie ohne. Der Konvertierungsexit ALPHA wechselt zwischen beiden Darstellungen, und viele Routinen rufen ihn auf, weil eine Quelle das eine Format liefert und das Ziel das andere erwartet. In SQLScript übernehmen LTRIM und LPAD diese Aufgabe.
ALPHA-Konvertierung
Die ABAP-Routine
Beide Richtungen: eine Kundennummer für die Anzeige ohne Nullen, eine Materialnummer aus einer externen Quelle auf die interne Länge von 18 Stellen. Neuere Routinen schreiben dasselbe als Zeichenkettenvorlage mit ALPHA = OUT und ALPHA = IN.
METHOD end_routine.
LOOP AT result_package ASSIGNING FIELD-SYMBOL(<ls_result>).
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_OUTPUT'
EXPORTING
input = <ls_result>-customer
IMPORTING
output = <ls_result>-customer_ext.
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
input = <ls_result>-material_ext
IMPORTING
output = <ls_result>-material.
ENDLOOP.
ENDMETHOD.
Die SQLScript-Fassung
LTRIM( feld, '0' ) entfernt alle führenden Nullen. LPAD( feld, 18, '0' ) füllt links mit Nullen auf 18 Stellen auf; die Länge ist die des Ziel-InfoObjects.
CONVERSION_EXIT_ALPHA_INPUT füllt nur Werte auf, die ausschließlich aus Ziffern bestehen. Ein alphanumerischer Wert wie AB-4711 bleibt unverändert. LPAD kennt diese Regel nicht und würde daraus 00000000000AB-4711 machen. Die Prüfung mit LIKE_REGEXPR '^[0-9]+$' stellt das Verhalten des Exits nach.
outTab = SELECT customer,
LTRIM( customer, '0' ) AS customer_ext,
material_ext,
CASE
WHEN material_ext LIKE_REGEXPR '^[0-9]+$'
THEN LPAD( material_ext, 18, '0' )
ELSE material_ext
END AS material,
record,
sql__procedure__source__record
FROM :inTab;
Ein Wert, der nur aus Nullen besteht, wird bei LTRIM zur leeren Zeichenkette. Wenn das Ziel dort eine 0 erwartet, fängt CASE WHEN LTRIM( … ) = '' THEN '0' den Fall ab. Trägt das Ziel-InfoObject den Konvertierungsexit ALPHA, konvertiert BW beim Laden oft selbst; dann ist die Routine an dieser Stelle gar nicht nötig.