Wieso, weshalb, warum ? 😄

In meinen ersten drei Jahren als Berater habe ich wesentlich, wie viele andere auch, mit der Entwicklung gestartet,da ich auch bereits ein Coding-Background hatte. Dank sehr guter KollegInnen, aber besonders eines Kollegen habe ich früh den Umgang mit dem Business Application Log gelernt. Das Parade-Beispiel ist die IDoc-Verarbeitung in der man nur eine Fehlermeldung angeben kann, wenn das IDoc nicht verarbeitet werden konnte. Hier bietet es sich an wichtige Schritte bei der IDoc-Verarbeitung zu loggen, sodass man bequem die Logs prüfen kann, wenn IDocs auf Rot laufen.

Der besagte Kollege hatte hier eine Z-Klasse erstellt, sodas ein vereinfachtes Erstellen von BAL-Einträgen möglich war. Diese Z-Klasse habe ich mit der Zeit immer mehr zu schätzen gelernt, da mich der Umgang mit den ganzen FuBas auf Dauer genervt hat 😄.

Durch den Jobwechsel konnte ich die Z-Klasse natürlich nicht mitnehmen. Daher musste ich mich ranmachen und selber eine Z-Klasse erstellen 😄. Anders als der Kollege habe ich nicht die BAL FuBas genommen, sondern auf eine Klasse und ein Interface zurückgegriffen. Allerdings hat mir hier die Kombo wie man BAL Einträge erstellt nicht gefallen und ich habe das in eine Z-Klasse gekapselt, sodass ein besseres Handling möglich ist. Auch in Bezug dazu wie man Nachrichten abspeichern kann und generell statische Methoden, um Nachrichten zu sammeln ohne direkt ein Objekt zu erzeugen.

Ein paar Anwendungszwecke

Eine komplette Übersicht kann im Wiki-Artikel entnommen werden: https://wiki.m1ch3l.de/ZCL_BAL
Wie man die Z-Klasse ZCL_BAL nutzen kann, zeigt das Demoprogramm, das von GitLab ebenfalls heruntergeladen werden kann: https://s.m1ch3l.de/zclbal 🍺

Sammeln der Nachrichten mittels statischer Methode ohne Objekterzeugung

** VIA SY WITH STATIC METHOD IN LOCAL LOG WITHOUT CREATING BEFORE BAL OBJECT
MESSAGE a053(start_messages) WITH |EXAMPLE ABORT MESSAGE| INTO gv_msg.
zcl_bal=>add_sy_msg_to_itab( CHANGING
                              "xt_recamsg   =
                               xt_bal_t_msg = gt_bal_t_log
                              "xt_bapiret2  =
                            ).

Objekterzeugung

DATA(go_bal) = NEW zcl_bal( iv_object = zcl_bal=>cs_object-test
                            iv_subobject = zcl_bal=>cs_subobject-test
                            iv_extnumber = |'TEST' && { sy-sysid } { sy-datum } etc.|
                            iv_deldate = |20210820|
                          ).

BAL speichern und anzeigen oder nur anzeigen

* SHOW MESSAGES WITHOUT SAVING
TRY.
    go_bal->add_msg_with_balmsg(
      EXPORTING
        it_bal_t_msg = gt_bal_t_log
*       is_bal_s_msg =
    ).
    go_bal->display( iv_single = abap_true ).
  CATCH zcx_bal INTO go_cx_bal.
    MESSAGE w001(poc_main) WITH |DISPLAY OF BAL NOT POSSSIBLE| INTO gv_msg.
    go_cx_bal->send_message_to_gui( ).
ENDTRY.

* SHOW MESSAGES AFTER SAVING
TRY.
    go_bal->store_display_free( ).
  CATCH zcx_bal INTO go_cx_bal.
    MESSAGE w001(poc_main) WITH |DISPLAY OF BAL NOT POSSSIBLE| INTO gv_msg.
    go_cx_bal->send_message_to_gui( ).
ENDTRY.

* SAVE ONLY
TRY.
    go_bal->store_and_free( ).
  CATCH zcx_bal INTO go_cx_bal.
    MESSAGE w001(poc_main) WITH |DISPLAY OF BAL NOT POSSSIBLE| INTO gv_msg.
    go_cx_bal->send_message_to_gui( ).
ENDTRY.