Nützliche ABAP Transformationsroutinen

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.

Durch einen Erfahrungsaustausch lässt sich viel voneinander lernen. Tauschen Sie sich deshalb jetzt mit Experten auf Ihrem Gebiet aus und erweitern Sie Ihr Netzwerk! Treten Sie jetzt der exklusiven Gruppe von SAP Experten bei.

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.
ABAP Tipps und Tricks

Jetzt anfordern!

* Pflichtfeld
 
Kein SPAM. Ich hasse Spam genau so wie du.

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.

0 Kommentare

Hinterlasse einen Kommentar

An der Diskussion beteiligen?
Hinterlasse uns deinen Kommentar!

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.