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
Um die benötigte Funktionsgruppe anzulegen, habe ich die Transaktion SE37 benutzt. Dafür sollte das Funktionsbaustein Feld leer bleiben und wir navigieren zu Menü->Springen->FGruppenverwaltung->Gruppe anlegen.Gewünschten Name und Kurztext für die Gruppe eingeben und Sichern.
Navigiere zum Topinclude der Funktionsgruppe und füge den folgenden Code ein:
Im Einstiegsbild der SE37 einen Namen für den Funktionsbaustein eingeben “CONVERSION_EXIT_XXXXX_OUTPUT” (XXXX durch den gewünschten Namen für die Routine ersetzen).Den Funktionsbaustein der neuen Funktionsgruppe zuweisen, den Kurztext eingeben und Sichern.Es ist erforderlich einen Importingparameter mit INPUT zubenennen.Es ist erforderlich einen Exportingparameter mit OUTPUT zubenennen.
" 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.
Funktionsbaustein Anzeige -> Intern anlegen
Im Einstiegsbild der SE37 einen Namen für den Funktionsbaustein eingeben “CONVERSION_EXIT_XXXXX_OUTPUT” (XXXX durch den bereits für OUTPUT benutzen Namen für die Routine ersetzen).Den Funktionsbaustein der neuen Funktionsgruppe zuweisen, den Kurztext eingeben und Sichern.Es ist erforderlich einen Importingparameter mit INPUT zubenennen.Es ist erforderlich einen Exportingparameter mit OUTPUT zubenennen.Für die korrekte Fehlerbehandlung, falls der Benutzer eine ungültige Zahl eingibt, ist es erforderlich einen Exceptionparameter mit ERROR_MESSAGE zubenennen.
" 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
Jetzt müssen die Funktionsgruppe und die Funktionsbausteine noch aktiviert werden.
Konvertierungsroutine implementieren
Konvertierungsroutine in eine Domäne implementieren
Nun legen wir eine neue Domäne an oder kopieren eine vorhandene und weisen die neu angelegte Konvertierungsroutine der Domäne zu.
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.