Mussfelder
Ein häufiger Wunsch ist die dynamische Aktivierung von Musseingabefeldern. Hierbei gibt es jedoch das Problem, dass die Mussfelder nicht beliebig hin- und hergeschaltet werden können. Denn: Ist ein Mussfeld einmal aktiv, muss es auch gefüllt werden. Andere Aktionen werden mit “Bitte erst alle Mussfelder ausfüllen” quittiert.
Um dieses – ansich ja gewollte Verhalten – zu umgehen, müssen wir uns einiger Tricks bedienen…
Im folgenden wollen wir an einem Beispiel zeigen, wie die Mussfeldeigenschaft von Feldern geändert werden kann, sobald ein anderer Radiobutton aktiv ist.
Trick 1
Wir hinterlegen beim Radiobutton einen Funktionscode und versehen ihn mit dem Funktionstyp “E” (Exit-Kommando).
Damit können wir im PAI des Dynpros das aktivieren der Radiobuttons mittels des folgenden Befehls abfangen:
MODULE MyExitModule AT EXIT-COMMAND
Nun brauchen wir in MyExitModule nur noch auf “RB” abzufragen, machen dann nix und… Wir kriegen die Meldung “Bitte alle Mussfelder ausfüllen”.
Wir könnten nun zwar noch ein “LEAVE SCREEN” hinten dran hängen, aber dann erfolgt kein Transport der Feldwerte in die ABAP-Variablen, also wird auch unser Radiobutton auf dem alten Wert belassen.
Trick 2
Wir simulieren den Feldtransport mit dem Funktionsbaustein “DYNP_VALUES_READ” und verlassen danach die Verarbeitung. Effekt: Die Radiobuttons werden korrekt gesetzt und auch alle bereits eingegebenen Werte bleiben erhalten.
CALL FUNCTION 'DYNP_VALUES_READ' EXPORTING dyname = repid dynumb = dynnr request = 'A' perform_conversion_exits = 'X' perform_input_conversion = ' ' TABLES dynpfields = t_fields EXCEPTIONS OTHERS = 11.
Normalerweise muss man dem Baustein alle zu lesenden Feldnamen übergeben. Wenn wir den Parameter REQUEST aber mit “A” füllen, dann liefert der Baustein alle auf dem Dynpro vorhandenen Felder zurück… 😀
Wir müssen jetzt noch die Feldinhalte in die entsprechenden Felder stellen:
LOOP AT t_fields INTO wa_field. ASSIGN (wa_field-fieldname) TO <field>. CHECK sy-subrc = 0. <field> = wa_field-fieldvalue. ENDLOOP.
Jetzt können wir schon mit den Radiobuttons hin- und herschalten und je nach Radiobutton ein anderes Feld zum Mussfeld machen.
Wenn jedoch Datumsfelder, Uhrzeiten oder Dezimalzahlen auf dem Dynpro auftauchen, müssen wir diese auch selbst ins interne Format umwandeln.
Deswegen:
Trick 3
DESCRIBE FIELD <field> TYPE lv_field_type. CASE lv_field_type. WHEN 'P'. *** Packed CALL FUNCTION 'RS_CONV_EX_2_IN_DTEL' EXPORTING input_external = wa_field-fieldvalue dtel = 'NETWR' IMPORTING output_internal = <field> EXCEPTIONS OTHERS = 21. WHEN 'T'. *** Time CALL FUNCTION 'CONVERSION_EXIT_TIMLO_INPUT' EXPORTING input = wa_field-fieldvalue IMPORTING output = <field> EXCEPTIONS wrong_input = 1 OTHERS = 2. WHEN 'D'. *** Date CALL FUNCTION 'CONVERSION_EXIT_SDATE_INPUT' EXPORTING input = wa_field-fieldvalue IMPORTING output = <field>. WHEN OTHERS. *** other fields <field> = wa_field-fieldvalue. ENDCASE.
Beispielprogramm
Hier gibt es nochmal das ganze Coding.
Hier die Ablauflogik vom Dynpro:
PROCESS BEFORE OUTPUT. MODULE status_0100. * PROCESS AFTER INPUT. MODULE exit_command_0100 AT EXIT-COMMAND. MODULE user_command_0100.
Der GUI-Status ‘100’ muss natürlich noch angelegt werden. Es müssen nur die Tasten F3, SHIFT-F3 und F12 mit “EXIT” belegt werden (Exit-Code “E” nicht vergsessen!!).
- Interview mit Björn Schulz (Software-Heroes.com) - 3. September 2024
- Daten aus ALV ermitteln - 3. September 2024
- So lange es den SAPGUI noch gibt… - 27. Juni 2024