Nützliche ABAP Transformationsroutinen
In diesem Beitrag stelle ich Ihnen verschiedene ABAP Routinen vor. Wenn Sie diese Code Snippets implementieren, beachten Sie die Performance Richtlinien.
Interne Tabellen buffern
*In PRIVATE SECTION von CLASS lcl_transform DEFINITION. *$*$ begin of global - insert your declaration only below this line *-* CLASS-DATA: lt_global TYPE STANDARD TABLE OF sflight. *$*$ end of global - insert your declaration only before this line *-* *In CLASS lcl_transform IMPLEMENTATION. *$*$ begin of routine - insert your code only below this line *-* IF lt_global[] IS INITIAL. SELECT * FROM sflight INTO TABLE lt_global. ENDIF. *$*$ end of routine - insert your code only before this line *-*
Source System aus dem Material nachlesen
DATA: lt_zmaterial TYPE HASHED TABLE OF /bic/pzmaterial WITH UNIQUE KEY /BIC/ZMATERIAL, ls_zmaterial TYPE /bic/pzmaterial. IF lt_zmaterial[] IS INITIAL. "Wenn Body der Tabelle leer * Bisher wurden keine Attribute zur Material geladen, * daher werden jetzt alle Attribute, die aktuell * gültig sind in die Tabelle lt_zmaterial geladen. SELECT * FROM /bic/pzmaterial INTO TABLE lt_zmaterial WHERE objvers = 'A'. ENDIF. *den oberen Teil am besten in der Start- und Globalroutine ausführen. Performance READ TABLE lt_zmaterial INTO ls_zmaterial WITH TABLE KEY /BIC/ZMATERIAL = SOURCE_FIELDS-/BIC/ZAPOMAT. IF sy-subrc = 0. RESULT = ls_zmaterial-SOURSYSTEM. ENDIF.
0FISCPER aus 0CALMONTH2 und 0CALYEAR
DATA: lv_calmonth TYPE /bi0/oicalmonth, lv_fiscper TYPE /bi0/oifiscper. lv_calmonth+0(4) = source_fields-calyear. lv_calmonth+4(2) = source_fields-calmonth2. *find out the fiscal period IF lv_calmonth IS NOT INITIAL. CALL METHOD cl_rsar_function=>calmonth_fiscper EXPORTING i_calmonth = lv_calmonth i_fiscvar = 'V9' "die jeweilige Variante IMPORTING e_fiscper = lv_fiscper. IF sy-subrc <> 0. lv_fiscper = '000000'. ENDIF. ELSE. "lv_calmonth is initial lv_fiscper = '000000'. ENDIF. RESULT = lv_fiscper. *Anschließend können wir das Geschäftjahr bestimmen *lv_fiscyear = lv_fiscper+0(4).
Die Funktionsgruppe ADAT enthält einige nützliche Funktionsbausteine mit Kalenderfunktionen.
0CALQUARTER aus 0CALMONTH2 und 0CALYEAR, die auch Werte 00 liefern können.
DATA: lv_calmonth TYPE /bi0/oicalmonth, lv_calquarter TYPE /bi0/oicalquarter. lv_calmonth+0(4) = source_fields-calyear. lv_calmonth+4(2) = source_fields-calmonth2. *find out the calendar quarter IF lv_calmonth IS NOT INITIAL. CALL METHOD cl_rsar_function=>month_quarter EXPORTING i_month = lv_calmonth IMPORTING e_quarter = lv_calquarter. IF sy-subrc <> 0. lv_calquarter = '00000'. ENDIF. ELSE. "lv_calmonth is initial lv_calquarter = '00000'. ENDIF. RESULT = lv_calquarter.
Nur Großbuchstaben verwenden
DATA: V_TBWCPRODI TYPE /BIC/OITBWCPRODI. * convert characters to upper-case characters V_TBWCPRODI = SOURCE_FIELDS-/BIC/TBWCPRODI. TRANSLATE V_TBWCPRODI TO UPPER CASE. RESULT = V_TBWCPRODI.
Bestimmte Datensätze überspringen
DATA: lv_PARTNER TYPE string. lv_PARTNER = SOURCE_FIELDS-PARTNER. IF STRLEN( lv_PARTNER ) > 4. raise exception type CX_RSROUT_SKIP_RECORD. ELSE. RESULT = lv_PARTNER. ENDIF.
Die ersten zwei Nullen löschen
DATA: lv_PARTNER TYPE string. lv_PARTNER = SOURCE_FIELDS-PARTNER. SHIFT lv_PARTNER BY 2 PLACES LEFT. RESULT = lv_PARTNER.
15-Stelliges Timestamp in 8-Stelliges Datenfeld umwandeln
DATA: lv_CHANGED_ON TYPE string. lv_CHANGED_ON = SOURCE_FIELDS-CHANGED_ON. IF STRLEN( lv_CHANGED_ON ) >= 8. RESULT = lv_CHANGED_ON+0(8). ELSE. RESULT = '00000000'. ENDIF.
0CALMONTH2 und 0CALYEAR zu 0CALMONTH
data l_calmonth type /BI0/OICALMONTH. l_calmonth+0(4) = SOURCE_FIELDS-CALYEAR. l_calmonth+4(2) = SOURCE_FIELDS-CALMONTH2. RESULT = l_calmonth.
0FISCPER Jahr immer 2012, z.B. um Testdaten aus IDEA zu laden
DATA: lv_year TYPE /bi0/oifiscyear, lv_per TYPE /bi0/oifiscper3. * lv_year = source_fields_rule-perio+0(4). lv_year = 2012. *lv_year + 3. lv_per = source_fields_rule-perio+4(3). CONCATENATE lv_year lv_per INTO RESULT.
0CALMONTH im DTP-Filter per Routine auf den aktuellen Kalendarjahr/monat setzen.
form c_CALMONTH tables l_t_range structure rssdlrange using i_r_request type ref to IF_RSBK_REQUEST_ADMINTAB_VIEW i_fieldnm type RSFIELDNM changing p_subrc like sy-subrc. * Insert source code to current selection field *$*$ begin of routine - insert your code only below this line *-* DATA: rec LIKE LINE OF l_t_range. rec-iobjnm = '0CALMONTH'. rec-fieldname = 'CALMONTH'. rec-sign = 'I'. rec-option = 'EQ'. rec-low = sy-datum+0(6). APPEND rec TO l_t_range. *folgendes sollte auch gehen, ohne rec * l_t_range-iobjnm = '0CALMONTH'. * l_t_range-fieldname = 'CALMONTH'. * l_t_range-sign = 'I'. * l_t_range-option = 'EQ'. * l_t_range-low = sy-datum+0(6). * APPEND l_t_range. *$*$ end of routine - insert your code only before this line *-* endform.
Vormonat ermitteln
DATA: lv_datum TYPE d. lv_datum = sy-datum. lv_datum+6(2) = '01'. lv_datum = lv_datum - 1.
InfoPackage Routine Selektion von dem aktuellen Monat bis 2099
DATA: l_idx LIKE sy-tabix, rec LIKE LINE OF l_t_range. READ TABLE l_t_range WITH KEY fieldname = 'CALMONTH'. l_idx = sy-tabix. rec-iobjnm = '0CALMONTH'. rec-fieldname = 'CALMONTH'. rec-sign = 'I'. rec-option = 'BT'. rec-low = sy-datum+0(6). rec-high = '209912'. MODIFY l_t_range INDEX l_idx FROM rec. p_subrc = 0.
Unerlaubte Zeichen entfernen
DATA: l_d_offset LIKE sy-index. CONSTANTS: c_allowed(100) TYPE c value 'ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890_'. RESULT = SOURCE_FIELDS-/BIC/NAME. * Es sind nur Großbuchstaben erlaubt, also Umwandlung in Großbuchstaben. TRANSLATE RESULT TO UPPER CASE. DO 60 TIMES. l_d_offset = sy-index – 1. IF RESULT+l_d_offset(1) CO c_allowed. * Erlaubtes Zeichen, mache nichts ELSE. * Zeichen nicht erlaubt, ersetzen durch Leerzeichen RESULT+l_d_offset(1) = ' '. ENDIF. ENDDO.
Unerlaubte Zeichen entfernen 2
Umgekehrter Ansatz
lv_TBWCSPORT = <result_fields>-/BIC/TBWCSPORT. TRANSLATE lv_TBWCSPORT to upper case. REPLACE ALL OCCURRENCES OF REGEX '[^!"%&''()*+,-./:;<=>?_ 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ.]' IN lv_TBWCSPORT with '_'. <result_fields>-/BIC/TBWCSPORT = lv_TBWCSPORT.
Mit Nullen auffüllen
SHIFT lv_matnr RIGHT DELETING TRAILING SPACE. OVERLAY lv_matnr WITH '000000000000000000'. *Für rein numerische matnr könnte man auch *UNPACK LV_MATNR TO LV_MATNR. verwenden
Oder Alpha Conversion
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT' EXPORTING input = SOURCE_FIELDS-/bic/zmatnr IMPORTING output = RESULT.
Letztes Zeichen löschen
DATA: lv_len TYPE i, lv_line TYPE string. lv_len = strlen( lv_line ). lv_len = lv_len - 1. lv_line = lv_line+0(lv_len).
Technische User nicht laden – DTP Variable
data: l_idx like sy-tabix, l_s_range like LINE OF l_t_range. read table l_t_range with key fieldname = 'CUSER'. l_idx = sy-tabix. *Exclude Technical Users l_s_range-iobjnm = '0USERNAME'. l_s_range-fieldname = 'CUSER'. l_s_range-SIGN = 'E'. l_s_range-OPTION = 'CP'. l_s_range-low = 'ALE_*'. append l_s_range to l_t_range. if l_idx <> 0. modify l_t_range index l_idx. else. append l_t_range. endif. p_subrc = 0.
Konten- zu Kennzahlenmodell
Transformation zur InfoSource. Konten(ZGRP_KPI) und Kennzahlen (ZSTRLC) des Kontenmodells in der InfoSource.
loop at RESULT_PACKAGE assigning <RESULT_FIELDS>. IF <RESULT_FIELDS>-/BIC/ZGRP_KPI = '201'. <RESULT_FIELDS>-/BIC/ZGRSA1 = <RESULT_FIELDS>-/BIC/ZSTRLC. ELSEIF <RESULT_FIELDS>-/BIC/ZGRP_KPI = '202'. <RESULT_FIELDS>-/BIC/ZDISC1 = <RESULT_FIELDS>-/BIC/ZSTRLC. ELSEIF <RESULT_FIELDS>-/BIC/ZGRP_KPI = '203'. <RESULT_FIELDS>-/BIC/ZNETS1 = <RESULT_FIELDS>-/BIC/ZSTRLC. ELSEIF <RESULT_FIELDS>-/BIC/ZGRP_KPI = '247'. <RESULT_FIELDS>-/BIC/ZSALM1 = <RESULT_FIELDS>-/BIC/ZSTRLC. ELSEIF <RESULT_FIELDS>-/BIC/ZGRP_KPI = '301'. <RESULT_FIELDS>-/BIC/ZNETQ1 = <RESULT_FIELDS>-/BIC/ZSTRQTY. ENDIF. endloop.
Dateinamen aus Datum (für DTPs oder InfoPackages)
DATA: lv_vortag TYPE sy-datum. lv_vortag = sy-datum - 1. CONCATENATE '/tmp/actuals_' lv_vortag '.csv' INTO p_filename.
Testdaten aus vorhandenen Daten generieren (Feldroutinen)
DATA lv_fiscper TYPE /bi0/oifiscper. lv_fiscper = source_fields_rule-fiscper. REPLACE '2019' IN lv_fiscper WITH '2020'. result = lv_fiscper. DATA lv_calmonth TYPE /bi0/oicalmonth. lv_calmonth = source_fields_rule-calmonth. REPLACE '2019' IN lv_calmonth WITH '2020'. result = lv_calmonth. DATA lv_calquarter TYPE /bi0/oicalquarter. lv_calquarter = source_fields_rule-calquarter. REPLACE '2019' IN lv_calquarter WITH '2020'. result = lv_calquarter. DATA: lv_percentage TYPE i, lv_trnover TYPE /bic/oizdtrnover. DATA(lo_rand) = cl_abap_random_int=>create( seed = CONV i( sy-uzeit )min = 1max = 100 ). lv_percentage = lo_rand->get_next( ). lv_trnover = source_fields_rule-/bic/zdtrnover + source_fields_rule-/bic/zdtrnover * lv_percentage / 100. result = lv_trnover.
DTP Filter auf heute setzen
form c_/BIC/TIMESTAMP tables l_t_range structure rssdlrange using i_r_request type ref to IF_RSBK_REQUEST_ADMINTAB_VIEW i_fieldnm type RSFIELDNM changing p_subrc like sy-subrc. * Insert source code to current selection field *$*$ begin of routine - insert your code only below this line *-* DATA: l_idx LIKE sy-tabix, l_s_range LIKE LINE OF l_t_range. READ TABLE l_t_range WITH KEY fieldname = '/BIC/TIMESTAMP'. l_idx = sy-tabix. *Todays date is set per default l_s_range-iobjnm = 'TIMESTAMP'. l_s_range-fieldname = '/BIC/TIMESTAMP'. l_s_range-sign = 'I'. l_s_range-option = 'EQ'. l_s_range-low = sy-datum. APPEND l_s_range TO l_t_range. IF l_idx <> 0. MODIFY l_t_range INDEX l_idx. ELSE. APPEND l_t_range. ENDIF. p_subrc = 0.
Diese ABAP Tricks machen Ihr Leben leichter!
- In meinem Newsletter gebe ich eine Menge Tipps und Kniffe rund um ABAP.
- Die Mini-Tutorials unterstützen Sie dabei, Software in ABAP effizienter zu entwickeln.
- Praktische Anleitungen ermöglichen Ihnen schnelle Erfolge bei der Optimierung Ihrer Arbeit.
- Bei der Anmeldung zu meinem Newsletter erhalten Sie das Buch „ABAP Tipps und Tricks“ als Willkommensgeschenk.
Falls Ihnen dieser Beitrag weitergeholfen hat, wäre es eine sehr nette Anerkennung meiner Arbeit wenn Sie z.B. Ihre Bücher über Amazon bestellen würden. Wenn Sie ein Produkt kaufen, erhalte ich dafür eine Provision. Für Sie ändert sich am Preis des Produktes gar nichts. Ich möchte mich an dieser Stelle jetzt schon für Ihre Unterstützung bedanken.
Hinterlasse einen Kommentar
An der Diskussion beteiligen?Hinterlasse uns deinen Kommentar!