Cerca nel blog

martedì 30 luglio 2019

ABAP: Nuove istruzioni in SAP release 7.4


Nuove istruzioni in SAP release 7.4

Inserisco una serie di istruzioni utili da usare all’interno dei programmi:

Togliere gli zeri

lv_product  = |{ gv_matnr_s     ALPHA = OUT } |.

Inserire gli zeri

lv_product  = |{ lv_product     ALPHA = IN  } |.

CONCATENAZIONE

DATI: stringa_caratteri TIPO stringa.

character_string = |La lunghezza dell'elemento di testo 001 ({ text–001 }) è { strlen( text–001 ) }|.

({ nome_variabile}) 

Dichiarazione e assegnazione di un valore

DATA(text) = 'ABC'.


Dichiarazione e valorizzazione di una tabella

  SELECT matnr, werks, lgort, labst
    
INTO TABLE @DATA(lt_stock)
    
FROM mard
    
UP TO 10 ROWS
    
ORDER BY PRIMARY KEY.

Creazione di un range con il valore di una tabella con dichiarazione inline

data gt_range_ekko         TYPE RANGE OF EBELN.

 SELECT 'I', 'EQ', EBELN
    FROM ekko
    INTO TABLE
@gt_range_ekko.

Dichiarazione inline e copia di una tabella

 DATA(lt_stock_tmp) = lt_stock[].

Appendere una riga in una tabella

UNASSIGN <fs_output>.
APPEND INITIAL LINE TO gt_output ASSIGNING <fs_output>.
IF <fs_output> IS ASSIGNED.


Loop in una Work Area

LOOP AT itab INTO DATA(wa).  
  …
ENDLOOP.

Lettura di una riga di una tabella

types: BEGIN OF ty_mard,
        matnr type mard-matnr,
        werks type mard-werks,
        lgort type mard-lgort,
        labst type mard-labst,
      END OF ty_mard.

DATA: lwa_stock  TYPE ty_mard.


TRY.
   lwa_stock = lt_stock[ 2 ].

  
CATCH cx_sy_itab_line_not_found.
ENDTRY.

equivale a :
READ TABLE lt_stock INDEX 2 into lwa_stock

Lettura di una tabella interna CON DICHIARAZIONE di una struttura


READ TABLE lt_stock  INTO DATA(lwa_stock)
          WITH KEY matnr = '0003444334'.


Estrazione dati da tabella CON DICHIARAZIONE e FOR ALL ENTRIES

    SELECT zzasnum_mo,  zzcivilistica, zzgestionale
              INTO TABLE @DATA(lt_prest_wbe)
              FROM zmm_prest_wbe
              FOR ALL ENTRIES IN @lt_somma_tmp
             WHERE zzasnum_mo = @lt_somma_tmp-service.

Modifica il valore di una colonna di una tabella

types: BEGIN OF ty_mard,
        matnr type mard-matnr,
        werks type mard-werks,
        lgort type mard-lgort,
        labst type mard-labst,
      END OF ty_mard.

DATA: lwa_stock  TYPE ty_mard.

lwa_stock-labst = 50.

  MODIFY lt_stock  FROM lwa_stock TRANSPORTING labst
  WHERE labst = 0.

Esistenza di un record in tabella

  IF line_exists( lt_stock[ matnr = '000000000010000001' lgort = 'MACE' ] ).
     WRITE: / ' Record Trovato'.
  else.
     WRITE: / ' Record Non Trovato'.
  endif.
 equivale a :

  READ TABLE lt_stock
    WITH KEY matnr = '000000000010000001' 
             lgort = 'MACE'  
  TRANSPORTING NO FIELDS.


Valorizzazione di una struttura con operatore VALUE

  lwa_stock = VALUE ty_mard( matnr = '000000000070000001'
                              werks = 'WERK'
                              lgort = 'MAG1'
                              labst = 76
                            ).


Assegnamenti condizionati (switch)

data: lv_testo type string,
      lv_numero type i.

lv_numero = 2.

lv_testo = SWITCH #( lv_numero
              WHEN 1 THEN 'Primo'
              WHEN 2 THEN 'Secondo'
              WHEN 3 THEN 'Terzo'
              ELSE 'Altro' ).


WRITE: / ' lv_testo=', lv_testo.

Assegnamenti condizionati (cond)

  DATA: lv_testo  TYPE string,
        lv_numero TYPE i.

  lv_numero = 2.

CLASS cx_cant_be DEFINITION INHERITING FROM cx_no_check.
ENDCLASS.

TRY.
    lv_testo = COND #(
              WHEN lv_numero < 10 THEN 'Numero minore di 10'
              WHEN lv_numero >= 10 THEN 'Numero maggiore di 10'
              ELSE
                THROW cx_cant_be( ) ).
  CATCH cx_cant_be.
ENDTRY.

WRITE: / ' lv_testo=', lv_testo.



Lettura Tabelle con Chiave


  DATA: t_usr01_k TYPE TABLE OF usr01 WITH UNIQUE SORTED KEY key_bname
       COMPONENTS bname.
*key_BNAME è il nome della chiave. Contiene un campo: BNAME.

  DATA: ls_usr01_k LIKE LINE OF t_usr01_k.
  SELECT *
    INTO TABLE t_usr01_k
         FROM usr01
    ORDER BY bname.

  TRY.
      ls_usr01_k = t_usr01_k[ KEY key_bname COMPONENTS bname = 'EE98EE' ].
    CATCH cx_sy_itab_line_not_found.
      STOP.
  ENDTRY.


USO DI SUBQUERY

SELECT ebeln, ebelp, matnr INTO TABLE @DATA(lt_venduto_a)
    FROM ekpo WHERE ebeln =  ( SELECT ebeln FROM ekko WHERE ebeln = @p_ebeln ).


Valorizzare una nuova tabella copiando alcuni campi di un altra tabella

DATA:  pt_item_change TYPE tt_bapimeoutitem.

*Mi valorizzo la struttra degli item con le posizioni da sbidonare
  pt_item_change = VALUE #( FOR ls_ekpo IN gt_table_sbidonate
                            ( item_no     = ls_ekpo-pos_contr_cat
                              delete_ind  = ls_ekpo-bidonato
                            )
                           ).

Copiare alcuni campi da una tabella (con la clausola WHERE) in un altra

DATA:  pt_item_change TYPE tt_bapimeoutitem.

*Mi valorizzo la struttra degli item con le posizioni da sbidonare
  pt_item_change = VALUE #( FOR ls_ekpo IN gt_table_sbidonate
                                                  WHERE ( delete_ind = 'X' )
                                                       ( item_no     = ls_ekpo-pos_contr_cat
                                                         delete_ind  = ls_ekpo-bidonato
                                                      )
                                                  ).

Inserisco nuovi record in una tabella

  LOOP AT gt_table_ctrl INTO DATA(ls_ctrl).
    APPEND VALUE #(
    item_no    = ls_ctrl-pos_contr_cat
    material   = ls_ctrl-mat_sap
    net_price  = ls_ctrl-prezzo_unit
    price_unit = 1
    orderpr_un = ls_ctrl-um_oda
    acctasscat = gc_knttp_u
    conv_num1  = 1
    conv_den1  = ls_ctrl-conv_um " 1
    )
    TO pt_item_change.
  ENDLOOP.

 


Passare dinamicamente una tabella ad una routine, ed eliminare dei record 

DATA: t_ee_i0000 TYPE STANDARD TABLE OF  ZHR_SFI_P9040.

PERFORM cancella_dati_prima_go_live CHANGING t_ee_i0000[].

FORM cancella_dati_prima_go_live CHANGING pt_table_infotype TYPE table.

  DATA: lv1_index         TYPE sy-tabix,
        lv_dt_go_live     TYPE sy-datum
        dref              TYPE REF TO data,
        ls_appo           TYPE zhr_sfi_eedata_log.
*        lv_where          type string.

  FIELD-SYMBOLS: <st_data> TYPE ANY.

  check not pt_table_infotype is INITIAL.

  CREATE DATA dref LIKE LINE OF pt_table_infotype .
  ASSIGN dref->* TO <st_data> .

*  clear: lv_where.
*  CONCATENATE lv_where 'begda <= lv_dt_go_live' INTO lv_where
*    SEPARATED BY space.

  LOOP AT pt_table_infotype ASSIGNING <st_data>.
*    WHERE (lv_where).

    lv1_index = sy-tabix.
    MOVE-CORRESPONDING <st_data> TO ls_appo.
    IF ls_appo-begda <= lv_dt_go_live.
      CLEAR: ls_eedata_log.
      MOVE-CORRESPONDING <st_data> TO ls_eedata_log.
      APPEND ls_eedata_log TO lt_eedata_log.
      CLEAR  ls_eedata_log.

 
      DELETE pt_table_infotype INDEX lv1_index.
    ENDIF.
  ENDLOOP.