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!!).

Enno Wulff
Letzte Artikel von Enno Wulff (Alle anzeigen)