Heute hat ein Gruppenmitglied in unserer Telegram Chatgruppe die Frage gestellt, wie man das Minuszeichen vor dem Wert anstatt hinter dem Wert im ALV anzeigen kann. Dabei soll aber die Möglichkeit der Summen- und Zwischensummenbildung erhalten bleiben.
Anforderung an den Test:
Einen Weg finden das Minuszeichen vor den Wert zu bringen
Sicherstellen, dass die Dezimaldarstellung des Benutzers erhalten bleibt
Fragestellung und Entscheidung zur Umsetzung:
Kann es unter Berücksichtigung des Standards umgesetzt werden?
Nein, denn weder der Feldkatalog noch das Layout des ALV bieten eine Möglichkeit.
Muss hier entwickelt werden?
Ja, wir benötigen eine Konvertierungsroutine. Das bedeutet, dass wir eine Funktionsgruppe und zwei Funktionsbausteine anlegen müssen.
Umsetzungsschritte
Info: Ich habe alle Popup mit Warnungen und Paketzuweisungen nicht in Artikel aufgenommen. Alle Warnungen, die in diesem Beispiel auftreten habe ignoriert und die Objekte habe ich in das lokale Paket $TMP aufgenommen.
Gedanken über die Anforderung und die Probleme während der Implementierung machen.
Wenn wir eine Konvertierungsroutine für eine Zahl implementieren möchten, müssen wir auch daran denken, dass die Dezimaldarstellung des Benutzers aus seinen Einstellungen (TAC:SU01/SU3) erhalten bleibt. Das bedeutet, dass wir eine flexible EDIT MASK in die Konvertierungsroutine für die Anzeige einbauen müssen.
Konvertierungsroutine anlegen.
Eine Konvertierungs-Routine wird über einen fünfstelligen Namen identifiziert und ist als Gruppe von zwei Funktionsbausteinen abgelegt. Die Funktionsbausteine haben dabei eine festgelegte Namenskonvention. Der Konvertierungs-Routine xxxxx sind folgende Funktionsbausteine zugeordnet:
CONVERSION_EXIT_xxxxx_INPUT
CONVERSION_EXIT_xxxxx_OUTPUT
Funktionsgruppe anlegen
Navigiere zum Topinclude der Funktionsgruppe und füge den folgenden Code ein:
" Get the Decimal Format from the user settings (SU01/SU3)
" Dezimaldarstellung aus den Benutzereinstellungen holen (SU01/SU3)
IFgv_decimal_signIS INITIAL.CALL FUNCTION'CLSE_SELECT_USR01'EXPORTINGusername=sy-unameiv_delete_buffer=abap_trueIMPORTINGdecimal_sign=gv_decimal_signseparator=gv_separator.ENDIF.DATA(lv_input)=CONVstring(input).DATA(lv_negativ_number)=boolc(lv_inputCS'-').REPLACE ALLOCCURRENCESOF'-'INlv_inputWITH''.SPLITlv_inputAT'.'INTODATA(lv_number)DATA(lv_decimals).REPLACE ALLOCCURRENCESOF'.'INlv_inputWITH''.DOstrlen(lv_number)TIMES.IFsy-indexEQ1.DATA(lv_mask)=|_|.CONTINUE.ENDIF.lv_mask=|_{COND#(WHENsy-indexMOD3EQ1THENgv_separator)}{lv_mask}|.ENDDO.DOstrlen(lv_decimals)TIMES.IFsy-indexEQ1.lv_mask=|{lv_mask}{gv_decimal_sign}_|.CONTINUE.ENDIF.lv_mask=|{lv_mask}_|.ENDDO.lv_mask=|{COND#(WHENlv_negativ_numberEQabap_trueTHEN|-|)}{lv_mask}|.WRITElv_inputTOoutputUSINGEDITMASKlv_mask.
" Get the Decimal Format from the user settings (SU01/SU3)
" Dezimaldarstellung aus den Benutzereinstellungen holen (SU01/SU3)
IFgv_decimal_signIS INITIAL.CALL FUNCTION'CLSE_SELECT_USR01'EXPORTINGusername=sy-unameiv_delete_buffer=abap_trueIMPORTINGdecimal_sign=gv_decimal_signseparator=gv_separator.ENDIF.DATA(lv_input)=CONVstring(input).REPLACE ALL OCCURRENCES OF gv_separatorINlv_inputWITH''.REPLACE gv_decimal_signINlv_inputWITH'.'.CONDENSElv_inputNO-GAPS.TRY.output=lv_input.CATCHcx_sy_conversion_no_number." Clear message fields of sy structure, so that 'Conversion error' will be raised
" Alle Message Felder der sy Struktur löschen, damit 'Fehler bei der Konvertierung.' geworfen wird
CLEAR:sy-msgty,sy-msgno,sy-msgv1,sy-msgv2,sy-msgv3,sy-msgv4.RAISEerror_message.ENDTRY.
Aktivierung der neuen Funktionsgruppe und Funktionsbausteine
Konvertierungsroutine implementieren
Konvertierungsroutine in eine Domäne implementieren
Konvertierungsroutine zur Laufzeit in ein ALV implementieren
In dem Demo Report findest du, wie du die Konvertierungsroutine zur Laufzeit den Feldern des ALV zuweisen kannst.
Demo Report
Hier ist ein kleiner Demo Report mit der Implementierung.
Die vierte Spalte “Frei verwendbar” benutzt die neue Konvertierungsroutine nicht und zeigt das Minuszeichen somit hinter dem Wert an.
Die fünfte Spalte “Frei verwendbar” benutzt die neue Konvertierungsroutine und zeigt das Minuszeichen, wie erwartet, somit vor dem Wert an.
Die sechste Spalte “Baugruppenstufe” ist vom Typ Integer, benutzt die neue Konvertierungsroutine und zeigt das Minuszeichen, wie erwartet, somit vor dem Wert an.