nocin.eu

Homelab, Linux, JS & ABAP (~˘▾˘)~
 

[ABAP] Log using CL_BAL_LOGOBJ

 DATA(lr_log) = NEW cl_bal_logobj( i_log_object        = 'ZMM'
                                   i_default_subobject = 'ZMM_LOGGING' ).

 lr_log->add_statustext( i_statustext = |Write a text.| ).

 lr_log->add_exception( lo_excp ).

 lr_log->add_errortext( lo_excp->get_longtext( ) ).

 lr_log->add_msg( i_probclass = '1' ).   "will use sy-msgty sy-msgid sy-msgno sy-msgv1 ...

 lr_log->save( i_client = sy-mandt ).

 lr_log->display( ).

Note: When using on EHP 7.40 you will get some confusing & & around your message texts.
https://tricktresor.de/blog/ausnahmen-mit-t100-nachricht-abap750/

Possible values for i_probclass:

[ABAP] SALV

    TRY.
        cl_salv_table=>factory( IMPORTING r_salv_table = DATA(alv_table)
                                CHANGING  t_table      = lt_display_data ).
        alv_table->display( ).

      CATCH cx_salv_msg.
    ENDTRY.

[ABAP] Modify Infotype

METHOD operate_it.

    DATA ls_return TYPE bapireturn1.
    DATA key       TYPE bapipakey.

    CALL FUNCTION 'BAPI_EMPLOYEE_ENQUEUE'
      EXPORTING
        number = is_2002-pernr
      IMPORTING
        return = ls_return.
    IF ls_return IS NOT INITIAL.
      RAISE EXCEPTION TYPE zcx_xxx MESSAGE ID ls_return-id TYPE ls_return-type NUMBER ls_return-number.
    ENDIF.

    CALL FUNCTION 'HR_INFOTYPE_OPERATION'
      EXPORTING
        infty         = '2002'
        number        = is_2002-pernr
        subtype       = is_2002-subty
        objectid      = is_2002-objps
        lockindicator = is_2002-sprps
        validityend   = is_2002-endda
        validitybegin = is_2002-begda
        recordnumber  = is_2002-seqnr
        record        = is_2002_chg
        operation     = iv_actio          "MOD,INS,DEL
        tclas         = 'A'
        dialog_mode   = '0'
      IMPORTING
        return        = ls_return
        key           = key.
    IF ls_return IS NOT INITIAL.
      RAISE EXCEPTION TYPE zcx_xxx MESSAGE ID ls_return-id TYPE ls_return-type NUMBER ls_return-number.
    ENDIF.

    CALL FUNCTION 'BAPI_EMPLOYEE_DEQUEUE'
      EXPORTING
        number = is_2002-pernr.

ENDMETHOD.

[ABAP] BAPI_ACC_DOCUMENT_POST

How to handle BAPI_ACC_DOCUMENT_POST with a document split at position 980. The method create_document fills the necessary tables and calls post_document, if it reaches position 980, to post the current document. Then the method create_document calls itself recursiv for the next positions.

  METHOD create_document.

    DATA: lt_pos                    TYPE TABLE OF bapiacgl09,
          lt_pos_amt                TYPE TABLE OF bapiaccr09.

    gr_listlog->append_log_entry( iv_type = gr_listlog->gc_log_type_info
                                  iv_text = |Beginne Belegerstellung|
                                  iv_alog = abap_true ).

    "Belegkopf
    DATA(ls_documentheader) = VALUE bapiache09( comp_code   = gs_sel-p_bukrs
                                                header_txt  = |header text|
                                                pstng_date  = sy-datum
                                                doc_date    = sy-datum
                                                fisc_year   = sy-datum(4)
                                                fis_period  = sy-datum+4(2)
                                                doc_type    = gs_sel-p_blart
                                                username    = sy-uname ).
    "Fülle Positionen
    LOOP AT it_xxx ASSIGNING FIELD-SYMBOL(<ls_xxx>).

      APPEND VALUE #( itemno_acc     = lines( lt_pos ) + 1
                      gl_account     = <ls_xxx>-hkont
                      stat_con       = abap_false
                      acct_type      = 'S'                      "Sachkonto
                      bus_area       = '0030'
                      fis_period     = sy-datum+4(2)
                      fisc_year      = sy-datum(4)
                      pstng_date     = sy-datum
                      value_date     = sy-datum
                      item_text      = |item text|
                      alloc_nmbr     = <ls_xxx>-zuonr
                      doc_type       = <ls_xxx>-blart
                      comp_code      = <ls_xxx>-bukrs
                      func_area      = '0030'
                      costcenter     = <ls_xxx>-kostl
                      tax_code       = <ls_xxx>-mwskz ) TO lt_pos.

      APPEND VALUE #( itemno_acc   = lines( lt_pos_amt ) + 1
                      curr_type    = '00'                       "Belegwährung
                      currency     = |EUR|
                      amt_doccur   = <ls_xxx>-betrg ) TO lt_pos_amt.

      "Belegsplit notwendig?
      IF lines( lt_pos ) = 980.
        gr_listlog->append_log_entry( iv_type = gr_listlog->gc_log_type_statistic
                                      iv_text = |Belegsplit notwendig!|
                                      iv_alog = abap_true ).

        "Verbuche die aktuellen Positionen
        post_document( is_documentheader = ls_documentheader
                       it_pos            = lt_pos
                       it_pos_amt        = lt_pos_amt ).

        "Rekursiver Aufruf der Methode! Nur mit den Sätzen die noch nicht verarbeitet wurden
        create_document( it_xxx = FILTER #( it_xxx USING KEY sort_key WHERE xxx = xxx ) ).

        "Verlasse bei Rekursion hier
        RETURN.
      ENDIF.



    ENDLOOP.


    "Wenn alle Positionen hinzugefügt, lege den Beleg an
    post_document( is_documentheader = ls_documentheader
                   it_pos            = lt_pos
                   it_pos_amt        = lt_pos_amt ).

  ENDMETHOD.

Calling the BAPI:

  METHOD post_document.

    DATA lt_return            TYPE STANDARD TABLE OF bapiret2.

    IF gs_sel-p_test = abap_true.
      gr_listlog->append_log_entry( iv_type = gr_listlog->gc_log_type_info
                                    iv_text = |Testlauf: Keine Belegbuchung|
                                    iv_alog = abap_true ).
      RETURN. "Im Testlauf hier verlassen
    ENDIF.

    SET UPDATE TASK LOCAL.

    CALL FUNCTION 'BAPI_ACC_DOCUMENT_POST'
      EXPORTING
        documentheader = is_documentheader
      TABLES
        accountgl      = it_pos
        currencyamount = it_pos_amt
        return         = lt_return.

    "Protokollzeilen mit BAPI Meldungen hinzufügen
    LOOP AT lt_return ASSIGNING FIELD-SYMBOL(<ls_return>).
      gr_listlog->append_log_entry( iv_type = <ls_return>-type
                                    iv_text = CONV #( <ls_return>-message )
                                    iv_alog = abap_true ).
    ENDLOOP.

    "Prüfen, ob eine Fehlermeldung vorliegt
    IF line_exists( lt_return[ type = 'A' ] ) OR line_exists( lt_return[ type = 'E' ] ).
      "Rollback
      CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
    ELSE.
      "Alles gut -> commit
      CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
        EXPORTING
          wait = 'X'.

      "Protokollzeile mit der Erzeugten Belegnummer nochmal explizit ins Log
      DATA(lv_documentnumber) = lt_return[ 1 ]-message_v2(10). "hier steht laut Doku die Belegnummer drin
      gr_listlog->append_log_entry( iv_type = gr_listlog->gc_log_type_success
                                    iv_text = |Belegnummer: { lv_documentnumber }|
                                    iv_alog = abap_true ).
    ENDIF.

  ENDMETHOD.

[Terminal] Neofetch + lolcat

1. Install neofetch.

sudo apt install neofetch

2. Install lolcat.

# When installing with "apt install lolcat", you will get version: lolcat 42.0.99
# To get the current version use:
sudo apt remove lolcat -y
wget https://github.com/busyloop/lolcat/archive/master.zip
unzip master.zip
rm master.zip
cd lolcat-master/bin
sudo gem install lolcat

3. Append the following line at the end of your ~/.bashrc (or at the beginning, if you are using zsh: ~/.zshrc) file, to get the neofetch output on every terminal run.

neofetch | lolcat

If you want to change the config of neofetch, you’ll find it here:

~/.config/neofetch/config.conf

[Shell] Replace pattern

How to replace a specific pattern in a file or folder name. In my case I needed to correct the season on each file of a series from “S08” to “S09”:

for f in *; do mv "$f" "$(echo "$f" | sed s/S08/S09/)"; done      

If you want to replace a pattern recursive, use the command “find”:

find . -name '*' -exec bash -c 'echo mv $0 ${0/S08/S09}' {} \;    // with echo for testrun

[Empfehlung] Kanutour auf der Trave

Eingesetzt haben wir bei der Herrenmühle in der Nähe von Schwissel. Die Trave führte uns hinab bis nach Bad Oldesloe und die Fahrt hat 4,5 Stunden gedauert.

Erste Etappe auf der Trave (orange markiert) vom Einstiegspunkt Herrenmühle bis zum zu überquerenden Wehr und dem Rastplatz in der Kurve unten rechts.

Der Einsetzpunkt ist leicht zu finden, da der Fluss hier durch ein Wehr aufgestaut wird, welches von einer einspurigen Straße überführt wird, auf der Autos nur abwechselnd passieren können. Von der Straße bis zu dem kleinen Steg sind ca. 30 Meter leicht abfälliger Feldweg zu bewältigen.

Die Trave hat größtenteils ein sehr flaches Ufer, sodass links und rechts zumeist ein weiter Blick möglich ist.

Nach dem ersten Kilometer verlässt man die Ebene und die Trave verläuft durch einen Wald.

Auf der gesamten Strecke bis Bad Oldesloe ist lediglich ein einziges Wehr zu überqueren. Kurz vor dem Wehr muss das Kanu über einen kleinen Wall durch einige Brennesel getragen werden. Nach der Überquerung findet sich direkt eine kleine Bank, bei der wir eine Rast eingelegt haben.

Der Rastplatz und im Hintergrund das zu überquerende Wehr.

Auch ein kurzer Abstecher von 20 Meter in das Dickicht lohnt. Dort findet man einen kleinen Seitenarm, der zwischen Steinen an dem Wehr vorbei durch den Wald plätschert.

Einblick in das Dickicht beim Rastplatz.

Direkt nach dem Wehr bzw. dem Rastplatz sind die “schwierigsten” Stromschnellen zu überwinden. Der ein oder andere größere Stein oder Baum muss hier umfahren werden, bis der Wald verlassen wird und wieder ein weiter Blick über die Ebene möglich ist.

Der zweite Abschnitt bis Bad Oldesloe ist deutlich länger, hier machten wir nur kurze Pausen, u.a. bei einer Sole, die wir aufgrund des guten Wasserstandes problemlos passieren konnten. Für andere Verhältnisse gibt es hier zwei Stege, die den Ein- und Ausstieg zum Umsetzen erleichtern.

Zweiter Abschnitt von dem Wehr bis Bad Oldesloe.

Auf einem längeren Abschnitt, der geradezu begradigt wirkt, passiert man immer wieder Feldern mit dem ein oder anderen tierischem Zuschauer. Eine für Nutztiere vorhandene Holzbrücke muss unterfahren werden. Bei hohem Wasserstand ggf. eine sehr knappe Angelegenheit, denn eine Möglichkeit zum Umsetzen gibt es hier nicht.

Dass man sich auf den letzten Kilometern befindet, merkt man an dem wieder zunehmenden Baumbestand. Nähert man sich dem Brenner Moor beginnt links und rechts dichter Schilf. In dem Brenner Moor überquert eine Fußgängerbrücke den Fluss. Hier lohnt sich ein kleiner Stopp auf der rechten Seite und ein Blick auf die Infotafel am Wegesrand.

Von hier an sind es noch knappe zwei Kilometer. Beim Einfahren nach Bad Oldesloe passiert man eine Jugendherberge, danach nimmt die Trave eine starke Rechtskurve und nach wenigen Metern gibt es einen Steg mit angrenzendem Parkplatz. Hier kann die Trave problemlos mit dem Kanu verlassen werden.

[Terminal] Command Line Audio Visualizer

Look at Github cli-visualizer for installation instructions.

Path to config file: ~/.config/vis/config
I’ve decommented these two lines:

audio.sources=pulse
colors.scheme=rainbow

Run with “vis”.
Use the following controls when running:

KeyDescription
spaceSwitch visualizers
q or CTRL-CQuit
rReload config
cNext color scheme
sToggle Mono/Stereo Mode
+Increase scaling by 10%
Decrease scaling by 10%

[Terminal] Simple man page

If you are using the man command, e.g.:

man find

You will often get a very long manual.
But there is a much easier to read man page called tldr, with examples how to use the command.

apt install tldr
tldr find