Switch für Ausnahmen eines Funktionsbausteins [ABAP740]

Seit Release ABAP740 gibt es die Anweisung SWITCH. Sehr anschaulich beschrieben im Blog von Horst Keller: ABAP News for Release 7.40 – Constructor Operators COND and SWITCH

Was mich bei Funktionsbausteinen schon immer gestört hat ist, dass man bei der sinnvollen Protokollierung von Returncodes von Funktionsbausteinen umständliche CASE-Konstrukte benötigt. Natürlich nur, wenn der Funktionsbaustein bei einem Fehler lediglich RAISE EXCEPTION verwendet aber nicht MESSAGE RAISING. Und Ersteres ist leider sehr häufig der Fall.

Mit dem neuen Feature SWITCH jedenfalls lässt sich ein Konstrukt bauen, das immer noch nicht schön ist, jedoch einigermaßen gut verwendbar. Hier am Beispiel von Funktionsbaustein CO_RU_CONFIRMATION, der schön viele Ausnahmen hat:

 "Rückmeldung buchen
 CALL FUNCTION 'CO_RU_CONFIRMATION'
   EXPORTING
     afrud_imp = ls_afrud
     aktyp_imp = 'H'
     commit_flag = 'X'
     no_dialog_flag = 'X'
     rueck_imp = ls_afrud-rueck
     split_imp = ls_afrud-split
     call_from_list = ' '
   EXCEPTIONS
     confirmation_not_allowed = 1
     conf_canceled = 2
     different_key = 3
     interrupt_by_user = 4
     key_not_defined = 5
     material_data_not_found = 6
     missing_authority = 7
     new_status_not_possible = 8
     not_allowed = 9
     not_found = 10
     operation_not_found = 11
     operation_not_selectable = 12
     order_already_locked = 13
     order_category_not_valid = 14
     order_deleted = 15
     order_not_found = 16
     order_without_operation = 17
     predec_not_confirmed = 18
     sequence_not_found = 19
     table_entry_not_found = 20
     unit_conversion_not_possible = 21
     conf_data_false = 22
     conf_date_in_future = 23
     standard_conf_not_possible = 24
     work_center_not_found = 25
     conversion_error = 26
     order_data_not_found = 27
     wrong_aktyp = 28
     split_not_found = 29
     OTHERS = 30.
 IF sy-subrc = 0.
   COMMIT WORK.
 ELSE.
   data(subrc) = sy-subrc.
   "Fehler
   RAISE EXCEPTION TYPE zcx_hkv_pp_mig_general
         MESSAGE ID 'OO'
         NUMBER '000'
         WITH 'Fehler CO_RU_CONFIRMATION:'
              |{ subrc }|
           SWITCH #( subrc
 WHEN 1 THEN 'confirmation_not_allowed '
 WHEN 2 THEN 'conf_canceled '
 WHEN 3 THEN 'different_key '
 WHEN 4 THEN 'interrupt_by_user '
 WHEN 5 THEN 'key_not_defined '
 WHEN 6 THEN 'material_data_not_found '
 WHEN 7 THEN 'missing_authority '
 WHEN 8 THEN 'new_status_not_possible '
 WHEN 9 THEN 'not_allowed '
 WHEN 10 THEN 'not_found '
 WHEN 11 THEN 'operation_not_found '
 WHEN 12 THEN 'operation_not_selectable '
 WHEN 13 THEN 'order_already_locked '
 WHEN 14 THEN 'order_category_not_valid '
 WHEN 15 THEN 'order_deleted '
 WHEN 16 THEN 'order_not_found '
 WHEN 17 THEN 'order_without_operation '
 WHEN 18 THEN 'predec_not_confirmed '
 WHEN 19 THEN 'sequence_not_found '
 WHEN 20 THEN 'table_entry_not_found '
 WHEN 21 THEN 'unit_conversion_not_possible '
 WHEN 22 THEN 'conf_data_false '
 WHEN 23 THEN 'conf_date_in_future '
 WHEN 24 THEN 'standard_conf_not_possible '
 WHEN 25 THEN 'work_center_not_found '
 WHEN 26 THEN 'conversion_error '
 WHEN 27 THEN 'order_data_not_found '
 WHEN 28 THEN 'wrong_aktyp '
 WHEN 29 THEN 'split_not_found '
 WHEN 30 THEN 'OTHERS' ).

Zusammen mit dem Blockmarkiermodus (ALT-Taste während der Markierung des Quelltextes gedrückt halten) lässt sich auf diese Weise einfach eine saubere Protokollierung programmieren. Leider trotzdem sehr schade, dass man nicht mit Hilfe eines ABAP-Befehls den Text bzw. die Ausnahme erhalten kann.

PS: Der Zusatz MESSAGE zur Anweisung RAISE EXCEPTION ist erst ab Release ABAP750 vorhanden… Siehe Beitrag Ausnahmen mit T100-Nachricht

Enno Wulff
Letzte Artikel von Enno Wulff (Alle anzeigen)

COMMENTS

  • <cite class="fn">abapkadabra</cite>

    Ich überlege gerade, ob man nicht eine Methode bauen könnte, die anhand des Fuba-Namens aus der Tabelle FUPARAREF den Wert aus Spalte PARAMETER mit PARAMTYPE = X und PPOSITION = sy-subrc ermittelt und daraus dann eine Message generiert… Aber das würde nur funktionieren, wenn der Fuba am besten über Muster ins Coding einkopiert und nicht an den Wertzuweisungen zu den Exceptions herumgespielt wurde.

    • <cite class="fn">Enno Wulff</cite>

      Das ist genau das entscheidende Problem… 🙁
      Zudem kann ein Funktionsbaustein auch noch nachträglich geändert werden und es kann eine Ausnahme hinzukommen oder wegfallen. Dann würden auch über Muster eingefügte Aufrufe nicht mehr passen. Eine falsche Fehlermeldung ist meistens schlimmer, als gar keine.

Comments are closed.