SAP ABAP 740
From SapWiki
Contents
Ejemplos
Manejo de strings
character_string = |{ a_numeric_variable }|. character_string = |This resulted in return code { sy-subrc }|.
LO_OBJECT->STRING2XML( |{ converted_xml }{ xml_row-row_close_tag }| ).
v_var1 = 'Esto es'. v_var2 = 'un'. v_var3 = 'String'. lv_result = v_var1 && v_var2 && v_var3.
[WIDTH = len] [ALIGN = LEFT|RIGHT|CENTER|(val)] [PAD = c] [CASE = RAW|UPPER|LOWER|(val)] [SIGN = LEFT|LEFTPLUS|LEFTSPACE|RIGHT|RIGHTPLUS|RIGHTSPACE|(val)] [EXPONENT = exp] [DECIMALS = dec] [ZERO = YES|NO|(val)] [XSD = YES|NO|(val)] [STYLE = SIMPLE|SIGN_AS_POSTFIX|SCALE_PRESERVING |SCIENTIFIC|SCIENTIFIC_WITH_LEADING_ZERO |SCALE_PRESERVING_SCIENTIFIC|ENGINEERING |(val)] [CURRENCY = cur] [NUMBER = RAW|USER|ENVIRONMENT|(val)] [DATE = RAW|ISO|USER|ENVIRONMENT|(val)] [TIME = RAW|ISO|USER|ENVIRONMENT|(val)] [TIMESTAMP = SPACE|ISO|USER|ENVIRONMENT|(val)] [TIMEZONE = tz] [COUNTRY = cty] ... l_dir = |including a \{ bracket|. l_dir = |c:\\temp|. "c:\temp'
TRY. WRITE: / |string|. WRITE: / |{ my_variable }|. WRITE: / |i'm a { my_variable }!|. WRITE: / |i'm number { my_number * 10 }!| . WRITE: / |client 000 is called: | && |{ clients[ mandt = '000' ]-mtext }|. WRITE: / |i'm going to be in upper case: | && |{ my_variable CASE = UPPER }|. WRITE: / |function and formatting:| && | date raw - { my_string->date( ) DATE = RAW }| && | date iso - { my_string->date( ) DATE = ISO }|. CATCH cx_root. ENDTRY.
Manejo de Tablas
DATA l_pernr TYPE p0001-pernr VALUE '00003019'. SELECT * INTO TABLE @DATA(lt_p2010) FROM pa2010 WHERE pernr = @l_pernr.
line_exists
IF line_exists( lt_p2010[ pernr = l_pernr begda = '20181101' ] ). * do something WRITE:/ 'Existe'. ENDIF.
line_index
DATA(l_index) = line_index( lt_p2010[ pernr = l_pernr begda = '20181101' ] ). WRITE:/ l_index.
Modify the contents based on TABLE-KEY
TRY. lt_p2010[ pernr = l_pernr ]-begda = '20200101'. CATCH cx_sy_itab_line_not_found. ENDTRY.
search line
TRY. DATA(ls_p2010) = lt_p2010[ pernr = l_pernr ]. CATCH cx_sy_itab_line_not_found. RETURN. ENDTRY. WRITE:/ ls_p2010-begda.
CORRESPONDING
data lt_p0002 type TABLE OF p0002. lt_p0002 = CORRESPONDING #( lt_p2010 ). data(ls_p0002) = lt_p0002[ 1 ]. write:/ ls_p0002-pernr.
FUNCTION z_rfc_read_id. *"---------------------------------------------------------------------- *"*"Interfase local *" IMPORTING *" VALUE(I_ID) TYPE ZRFCID *" TABLES *" T_ID STRUCTURE ZTABLE *" T_RETURN STRUCTURE ZRETURN *" T_RETURN_2 STRUCTURE ZRETURN_2 OPTIONAL ... ... ... t_return_2[] = CORRESPONDING #( t_return[] ). APPEND LINES OF lt_return TO t_return_2. t_return[] = CORRESPONDING #( t_return_2[] ).
Inicializar tabla
lt_p0002 = VALUE #( ( pernr = l_pernr begda = sy-datum ) ).
agregar registros a tabla (append)
lt_p0002 = VALUE #( BASE lt_p0002 ( pernr = l_pernr begda = '20200201' ) ).
FILTER
DATA lt_p0002_s TYPE STANDARD TABLE OF p0002 WITH NON-UNIQUE SORTED KEY pernr COMPONENTS pernr. lt_p0002_s = VALUE #( ( pernr = l_pernr begda = '20200201' ) ( pernr = '00003020' begda = '20200301' ) ). DATA(lt_p0002_h) = FILTER #( lt_p0002_s USING KEY pernr WHERE pernr = l_pernr ). * Create a filter internal table with multiple values DATA filter_tab TYPE SORTED TABLE OF p0002-pernr WITH UNIQUE KEY table_line. filter_tab = VALUE #( ( l_pernr ) ). * Apply filters lt_p0002_h = FILTER #( lt_p0002_s IN filter_tab WHERE pernr = table_line ). * TYPES: BEGIN OF ty_filter, pernr TYPE p0002-pernr, begda TYPE p0002-begda, END OF ty_filter, ty_filter_tab TYPE HASHED TABLE OF ty_filter WITH UNIQUE KEY pernr begda. DATA(lt_filter_tab) = VALUE ty_filter_tab( ( pernr = l_pernr begda = '20200201' ) ). DATA lt_p0002_3 TYPE STANDARD TABLE OF p0002. lt_p0002_3 = VALUE #( ( pernr = l_pernr begda = '20200201' ) ( pernr = '00003020' begda = '20200301' ) ). clear lt_p0002_h. lt_p0002_h = FILTER #( lt_p0002_3 IN lt_filter_tab WHERE pernr = pernr AND begda = begda ).
ejemplo 2
DATA ti_teven TYPE TABLE OF teven. DATA l_pernr TYPE teven-pernr. TYPES: BEGIN OF filter, pernr TYPE teven-pernr, END OF filter, filter_tab TYPE HASHED TABLE OF filter WITH UNIQUE KEY pernr. DO 2 TIMES. IF sy-index = 1. l_pernr = '10000307'. ELSE. l_pernr = '00000000'. ENDIF. DATA(filter_tab) = VALUE filter_tab( ( pernr = l_pernr ) ). SELECT * FROM teven INTO TABLE ti_teven ORDER BY pernr ldate ltime erdat ertim pdsnr. DATA(lt_teven) = FILTER #( ti_teven IN filter_tab WHERE pernr = pernr ) . ENDDO.
VALUE
types ty_ra type RANGE OF vbak-auart. data(ra_auart) = VALUE ty_ra( ( low = 'Z1' sign = 'I' option = 'EQ' ) ( low = 'Z2' sign = 'I' option = 'EQ' ) ). select vbeln into table @data(LT_vbeln) from vbak where auart in @ra_auart.
DATA itab TYPE RANGE OF i. itab = VALUE #( sign = 'I' option = 'BT' ( low = 1 high = 10 ) ( low = 21 high = 30 ) ( low = 41 high = 50 ) option = 'GE' ( low = 61 ) ).
data ra_ktart TYPE RANGE OF p2006-ktart. CASE lw_solicitudes-subty. WHEN '0100'. ra_ktart = VALUE #( ( low = '01' sign = 'I' option = 'EQ' ) ( low = '02' sign = 'I' option = 'EQ' ) ). WHEN '0300' OR '0301' OR '0309'. ra_ktart = VALUE #( ( low = '17' sign = 'I' option = 'EQ' ) ). WHEN '0901'. ra_ktart = VALUE #( ( low = '10' sign = 'I' option = 'EQ' ) ). ENDCASE.
- APPEND VALUE
APPEND VALUE #( sign = 'I' option = 'EQ' low = 'A000' ) TO lr_einri. APPEND VALUE #( sign = 'I' option = 'EQ' low = 'C200' ) TO lr_einri.
CONV
data: l_dir type char200. l_dir = 'c:\temp'. data(l_resp) = cl_gui_frontend_services=>directory_exist( DIRECTORY = CONV #( l_dir ) ).
DATA l_date_c(8) VALUE '20200205'.
DATA(l_day) = cl_rs_time_service=>get_weekday( i_date = CONV #( l_date_c ) ). IF l_day > 4. WRITE:/ 'Solo lunes a jueves'. RETURN. ENDIF.
COND
DATA(time) = COND string( WHEN sy-timlo < '120000' THEN |{ sy-timlo TIME = ISO } AM| WHEN sy-timlo > '120000' THEN |{ CONV t( sy-timlo - 12 * 3600 ) TIME = ISO } PM| WHEN sy-timlo = '120000' THEN |High Noon| ELSE 'nada' ).
SWITCH
DATA l_flag TYPE flag. DATA(l_status) = SWITCH #( l_flag WHEN 'X' THEN 'OK' ELSE 'Error' ).
DATA(l_number) = SWITCH string( sy-index WHEN 1 THEN 'uno' WHEN 2 THEN 'dos' WHEN 3 THEN 'tres' else 'nada' ).
BOOLC
p_f = boolc( p2001[] is not initial ).
NEW
DATA g_sol TYPE REF TO cl_sol. CREATE OBJECT g_sol EXPORTING i_iddocumento = p_id .
data(g_sol2) = NEW cl_sol( i_iddocumento = p_id ).
Non-class-based exceptions of the instance constructor cannot be handled, which means that sy-subrc is never set to a value other than 0. The return code sy-subrc is not set when anonymous data objects are created.
OPEN SQL
- SQL Expressions sql_exp
- String Functions
- Demos: DEMO_SQL_*
SELECT FROM pa0002 FIELDS pernr,vorna WHERE gbdat >= '19900101' INTO TABLE @DATA(lt_pernr2). SELECT FROM vbrk INNER JOIN vbrp ON vbrk~vbeln = vbrp~vbeln FIELDS vbrk~*,vbrp~posnr,vbrp~matnr WHERE fkdat >= '20190101' INTO TABLE @DATA(itab). *ITAB[1]-VBRK-VBELN = '0090156792' DATA city TYPE spfli-cityfrom VALUE 'NEW YORK'. SELECT * FROM sflight AS s WHERE seatsocc < s~seatsmax AND EXISTS ( SELECT * FROM spfli WHERE carrid = s~carrid AND connid = s~connid AND cityfrom = @city ) INTO TABLE @DATA(free_flights). DATA: carr_id TYPE spfli-carrid VALUE 'LH', conn_id TYPE spfli-connid VALUE '400'. SELECT SINGLE city, latitude, longitude FROM sgeocity WHERE city IN ( SELECT cityfrom FROM spfli WHERE carrid = @carr_id AND connid = @conn_id ) INTO (@DATA(city), @DATA(lati), @DATA(longi)). SELECT planetype, seatsmax FROM saplane AS plane WHERE seatsmax < @wa-seatsmax AND seatsmax >= ALL ( SELECT seatsocc FROM sflight WHERE carrid = @wa-carrid AND connid = @wa-connid ) ORDER BY seatsmax INTO (@DATA(plane), @DATA(seats)). SELECT SINGLE FROM demo_expressions FIELDS CAST( num1 AS CHAR( 20 ) ) AS col1, CAST( numlong1 AS CHAR( 20 ) ) AS col2, CAST( dec3 AS CHAR( 20 ) ) AS col3, CAST( dats2 AS CHAR( 20 ) ) AS col4 WHERE id = 'X' INTO @DATA(result).
constantes en select list
SELECT carrid, connid, '007' as tipo FROM spfli INTO table @DATA(result). SELECT carrid, connid, @abap_true as tipo FROM spfli INTO table @DATA(result). SELECT carrid, connid, @sy-datum as fecha_ejecucion FROM spfli INTO table @DATA(result). SELECT SINGLE vorna && ' ' && nachn && ' ' && name2 AS nombre_emp, gbdat INTO (@wa-nombre_emp, @wa-gbdat) FROM pa0002 WHERE pernr = @pernr AND begda <= @sy-datum AND
CASE
SELECT SINGLE j~partner, i~rut_pagador, i~total_pagar, i~nom_archivo, CASE i~banco_abon WHEN ' ' THEN i~banco_abon2 ELSE i~banco_abon END AS banco INTO CORRESPONDING FIELDS OF @wa_data FROM zfi_histra_paso AS i INNER JOIN but000 AS j ON i~rut_pagador = j~bu_sort2 INNER JOIN zfi_bp_datos_com AS z ON j~partner = z~bp WHERE i~folio = @g_folio_histra AND i~rut_pagador IN @s_rut AND i~nom_archivo LIKE 'A%' AND j~partner IN @s_bp AND z~tipo_sucursal = '00' . "#EC CI_SEL_NESTED SELECT pernr, vorna, CASE WHEN vorna <> 'Homero' THEN 'MAGIOS' ELSE 'NO MAGIOS' END AS secta FROM pa0002 INTO TABLE @DATA(lt_pernr).
CONCAT
SELECT FROM spfli FIELDS CONCAT( CONCAT( carrid , '_' ), CAST( connid AS CHAR ) ) AS key, cityto, 1 AS cities INTO TABLE @DATA(result). KEY CITYTO CITIES LH_0400 NEW YORK 1 AA_0017 SAN FRANCISCO 1 AZ_0555 FRANKFURT 1 REPORT demo_sql_function_concat. CLASS demo DEFINITION. PUBLIC SECTION. CLASS-METHODS main. ENDCLASS. CLASS demo IMPLEMENTATION. METHOD main. SELECT CONCAT( CONCAT( carrid, LPAD( carrname,21,' ' ) ), LPAD( url,40,' ' ) ) AS line FROM scarr INTO TABLE @DATA(result). cl_demo_output=>display( result ). ENDMETHOD. ENDCLASS. START-OF-SELECTION. demo=>main( ).
SUBSTRING
*PRmmaaRppnnnnnn *0208020 + aa + mm + nnnnnn *Ejemplo: PR0720R007188233 se convierte en 02080202007188233 SELECT concat( '0208020', ( concat( substring( xblnr,5,2 ), ( concat( substring( xblnr,3,2 ), ( substring( xblnr,10,6 ) ) ) ) ) ) ) AS folio FROM bsis WHERE bukrs EQ @g_bukrs AND xblnr IN @s_xblnr AND augdt = '00000000' INTO CORRESPONDING FIELDS OF TABLE @gt_data .
Literal in SELECT List
SELECT SINGLE @abap_true FROM scarr WHERE carrid = @carrier INTO @DATA(exists). IF exists = abap_true. cl_demo_output=>display( |Carrier { carrier } exists in SCARR| ). ELSE. cl_demo_output=>display( |Carrier { carrier } does not exist in SCARR| ). ENDIF.
aggregations
* nombre completo empleado select VORNA && ' ' && nachn as nombre from pa0002 into table @data(lt_data) where pernr = '10000000'. *total factura select netwr + MWSBK as total from vbrk into table @data(lt_vbrk) UP TO 1 ROWS. * facturas con total > 1000000 select netwr + MWSBK as total from vbrk where netwr + MWSBK > 10000 and waerk = 'CLP' into table @data(lt_vbrk).
Códigos Varios
DATA(l_day) = cl_rs_time_service=>get_weekday( i_date = sy-datum ). IF l_day > 4. WRITE:/ 'Solo lunes a jueves'. RETURN. ENDIF.
IF cl_rs_time_service=>get_weekday( i_date = sy-datum ) > 4. WRITE:/ 'Solo lunes a jueves'. RETURN. ENDIF.
******************** DATA(components) = CAST cl_abap_structdescr( cl_abap_typedescr=>describe_by_name( 'T100' ) )->components.
Demos
[1] Demos