Abhängige Suchhilfe
Immer wieder ein Thema in Selektionsbildschirmen oder Dynpros: Abhängig vom Feldwert eines anderen Feldes die Suchhilfe für die angeforderte Suchhilfe einschränken.
Die wirklich einfachste Möglichkeit ist die über die Verknüpfung der Felder in einer Struktur: Feldabhängige Selektion
Manchmal reicht das jedoch nicht aus oder man möchte anhand anderer Feldwerte unterschiedliche Suchhilfen aufrufen. Das folgende Coding zeigt die Möglichkeit mit Hilfe der Funktionsbausteine DYNP_VALUES_READ und DYNP_VALUES_UPDATE.
Feldübertragung / PAI – PBO
Eine kurze Info, warum mit den genannten Bausteinen gearbeitet werden muss: Ein Dynpro ist ein eigenes Objekt. Es können zwar Feldnamen (Variablen) aus dem ABAP-Programm verwendet werden, aber diese sind erst einmal unabhängig vom Dynpro. Ebenso können im Dynpro Felder definiert werden, die im ABAP-Programm nicht bekannt sind.
Die Übertragung der Feldwerte erfolgt über Namensgleichheit.
Ein Dynpro wird im PBO – Process Before Output initialisiert. Hier können Feldattribute (Sichtbar, eingabebereit, …) gesetzt werden. Der GUI-Status und GUI-Titel können gesetzt bzw. geändert werden. Felder können befüllt werden bzw. werden aus dem ABAP-Programm übernommen.
Danach wird das Dynpro mit den Feldern, Feldwerten und Feldattributen angezeigt.
Bei Tastendruck wird das PAI – Process After Input ausgeführt. Hier werden geänderte Feldwerte in die ABAP-Variablen, nach Prüfung auf Richtigkeit (Datum, Festwerte etc), übernommen. Der OK-Code kann ausgewertet werden.
Es gibt drei Ausnahmen von dieser Logik:
- F1-Hilfe: Die Taste F1 wird ausgeführt, ohne dass der PAI angestoßen wird.
- F4-Wertehilfe: Auch die F4-Hilfe bewirkt keinen PAI. Das bedeutet, dass ein soeben eingegebener Wert in ein Eingabe bereites Feld nicht in die entsprechende ABAP-Variable übernommen wird!
- Exit-Kommandos: Funktionen, die im GUI-Status als “Exit-Funktion” gekennzeichnet sind bewirken zwar einen PAI, jedoch ohne dass Feldprüfungen statt finden oder Feldwerte übernommen werden
F4-Falle
Diese Besonderheiten muss man wissen, um zu verstehen, warum bei einer F4-Hilfe die Datenübertragung zwischen Dynpro und ABAP-Programm nachprogrammiert werden muss. Wenn du im Dynpro in FELD1 einen Wert eingibst und dann, ohne eine Funktionstaste zu drücken (ENTER, F2, F3, etc.) und mit dem Cursor in das FELD2 springst, dann ist der Wert aus FELD1 noch nicht im ABAP-Programm bekannt! Wenn du nun in FELD2 die F4-Werthilfe betätigst, weiß das ABAP-Programm nichts von dem soeben eingegebenen Wert in FELD1. Der Wert muss erst mit DYNP_VALUES_READ ermittelt werden.
Änderst du den Wert für FELD2, also das Feld für das du die Werthilfe aufgerufen hast, dann kannst du im ABAP-Programm dieses Feld einfach füllen. Der Transport zum Dynpro erfolgt automatisch. Wenn du allerdings ein anderes Feld ändern möchtest, dann musst du DYNP_VALUES_UPDATE verwenden.
Beispielprogramm
Das Beispielprogramm demonstriert die Verwendung von DYNP_VALUES_GET und DYNP_VALUES_UPDATE. Bei F4 im Feld P_EINS werden Werte gesetzt. Bei F4 im Feld P_ZWEI wird abhängig von P_EINS ein anderer Wert gesetzt.
Code
REPORT. PARAMETERS p_eins TYPE char10. PARAMETERS p_zwei TYPE char10. AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_eins. PERFORM eins. AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_zwei. PERFORM zwei. FORM eins. DATA lt_fields TYPE STANDARD TABLE OF dynpread. DATA ls_field TYPE dynpread. p_eins = 'Z'. p_zwei = '999'. ls_field-fieldname = 'P_ZWEI'. ls_field-fieldvalue = p_zwei. APPEND ls_field TO lt_fields. CALL FUNCTION 'DYNP_VALUES_UPDATE' EXPORTING dyname = sy-cprog dynumb = sy-dynnr TABLES dynpfields = lt_fields EXCEPTIONS OTHERS = 8. IF sy-subrc = 0. MESSAGE 'Feldwert gesetzt' TYPE 'S'. ENDIF. ENDFORM. FORM zwei. DATA lt_fields TYPE STANDARD TABLE OF dynpread. DATA ls_field TYPE dynpread. CALL FUNCTION 'DYNP_VALUES_READ' EXPORTING dyname = sy-repid dynumb = sy-dynnr translate_to_upper = 'X' request = 'A' perform_conversion_exits = 'X' TABLES dynpfields = lt_fields EXCEPTIONS OTHERS = 11. READ TABLE lt_fields INTO ls_field WITH KEY fieldname = 'P_EINS'. IF sy-subrc = 0. p_eins = ls_field-fieldvalue. ENDIF. CASE p_eins. WHEN 'A'. p_zwei = '1'. WHEN 'B'. p_zwei = '2'. WHEN 'C'. p_zwei = '3'. ENDCASE. ENDFORM.
- 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