Difference between revisions of "SAP ABAP 740"

From SapWiki
Line 95: Line 95:
 
  lt_p0002 = VALUE #( BASE lt_p0002 ( pernr = l_pernr  begda = '20200201' ) ).
 
  lt_p0002 = VALUE #( BASE lt_p0002 ( pernr = l_pernr  begda = '20200201' ) ).
  
====FILTER====
+
====FILTER====
 
  DATA lt_p0002_s TYPE STANDARD TABLE OF p0002 WITH NON-UNIQUE SORTED KEY pernr COMPONENTS pernr.
 
  DATA lt_p0002_s TYPE STANDARD TABLE OF p0002 WITH NON-UNIQUE SORTED KEY pernr COMPONENTS pernr.
 
   
 
   

Revision as of 20:32, 30 June 2021

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.

*1 line_exists
IF line_exists( lt_p2010[ pernr = l_pernr begda = '20181101' ] ).
* do something
  WRITE:/ 'Existe'.
ENDIF.

*2 l_index
DATA(l_index) = line_index( lt_p2010[ pernr = l_pernr begda = '20181101' ] ).
WRITE:/ l_index.


*3 Modify the contents based on TABLE-KEY
TRY.
    lt_p2010[ pernr = l_pernr ]-begda = '20200101'.
  CATCH cx_sy_itab_line_not_found.
ENDTRY.

*4
 TRY.
   DATA(ls_p2010) = lt_p2010[ pernr = l_pernr ].
   CATCH cx_sy_itab_line_not_found.
     RETURN.
 ENDTRY.
WRITE:/ ls_p2010-begda.

*5
data lt_p0002 type TABLE OF p0002.

lt_p0002 = CORRESPONDING #( lt_p2010 ).

data(ls_p0002) = lt_p0002[ 1 ].
write:/ ls_p0002-pernr.
*6 Inicializar tabla
lt_p0002 = VALUE #( ( pernr = l_pernr  begda = sy-datum ) ).
*7 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 * INTO TABLE ti_teven FROM teven.

  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.

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

 
 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).

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