cl_demo_output=>new( )->write_data( lt_display_data )->display( ).
*or
cl_demo_output=>display( lt_display_data ).
[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.
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.
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.
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.
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:
Key | Description |
---|---|
space | Switch visualizers |
q or CTRL-C | Quit |
r | Reload config |
c | Next color scheme |
s | Toggle Mono/Stereo Mode |
+ | Increase scaling by 10% |
– | Decrease scaling by 10% |