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 matnrwerkslgortlabst
    
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

typesBEGIN OF ty_mard,
        matnr type mard-matnr,
        werks type mard-werks,
        lgort type mard-lgort,
        labst type mard-labst,
      END OF ty_mard.

DATAlwa_stock  TYPE ty_mard.


TRY.
   lwa_stock lt_stock[ ].

  
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,  zzcivilisticazzgestionale
              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

typesBEGIN OF ty_mard,
        matnr type mard-matnr,
        werks type mard-werks,
        lgort type mard-lgort,
        labst type mard-labst,
      END OF ty_mard.

DATAlwa_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_existslt_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_mardmatnr '000000000070000001'
                              werks 'WERK'
                              lgort 'MAG1'
                              labst 76
                            ).


Assegnamenti condizionati (switch)

datalv_testo type string,
      lv_numero type i.

lv_numero 2.

lv_testo SWITCH #lv_numero
              WHEN THEN 'Primo'
              WHEN THEN 'Secondo'
              WHEN THEN 'Terzo'
              ELSE 'Altro' ).


WRITE' lv_testo='lv_testo.

Assegnamenti condizionati (cond)

  DATAlv_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


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

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

  DATAlv1_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.
      CLEARls_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.