Cerca nel blog

mercoledì 20 luglio 2022

ABAP: Nuove istruzioni in SAP release 7.5


Nuove istruzioni in SAP release 7.5

Le espressioni possono essere usate anche nel lato sinistro di confronti con WHERE, HAVING, ON e CASE e come operandi di un'espressione CAST. Si noti che ciò include le variabili host e le espressioni host come operandi di espressioni SQL.
Le seguenti funzioni SQL possono ora essere utilizzate nelle espressioni SQL: ROUND, CONCAT, LPAD, LENGTH, REPLACE, RIGHT, RTRIM, SUBSTRING. La funzione COALESCE ora può avere fino a 255 argomenti.

Come esempio di espressione aritmetica sul lato sinistro di una condizione WHERE, vedere:

SELECT carrid, connid, fldate, seatsmax, seatsocc,
       seatsmax – seatsocc AS seatsfree
  FROM sflight
 WHERE seatsmax – seatsocc > @( meth( ) )
 INTO TABLE @DATA(result).

Come esempio per le funzioni di stringa, vedere la seguente concatenazione di colonne in una colonna con CONCAT:

SELECT CONCAT( CONCAT( carrid,
                       LPAD( carrname,21,’ ‘ ) ),
               LPAD( url,40,’ ‘ ) ) AS line
  FROM scarr
 INTO TABLE @DATA(result).

Questa concatenazione non è possibile con l'operatore && disponibile da ABAP 7.40. 

SELECT CON DICHIARAZIONE INLINE DELLA TABELLA

DATA(lv_bukrs) = '1000'. 

SELECT mandt, bukrs, kostl
  FROM ztable
 INTO TABLE @DATA(lt_test)
 WHERE bukrs = @lv_bukrs.

 IF sy-subrc = 0.
    READ TABLE lt_test INTO DATA(ls_test) WITH KEY bukrs = lv_bukrs.
    IF sy-subrc = 0.
         WRITE: / ls_test-bukrs.
     ENDIF.
 ENDIF.

SELECT UNION

DATA prog_range TYPE RANGE OF trdir-name.


SELECT 'I' AS sign, 'EQ' AS option,

       obj_name AS low, ' ' AS high

  FROM tadir

 WHERE pgmid = 'R3TR' 

   AND object = 'PROG' 

   AND devclass = @devclass

UNION

SELECT 'I' AS sign, 'CP' AS option, 

       obj_name && '*' AS low, ' ' AS high

  FROM tadir

 WHERE pgmid = 'R3TR' 

   AND object = 'CLAS' 

   AND devclass = @devclass

UNION

SELECT 'I' AS sign, 'EQ' AS option, 

       'SAPL' && obj_name AS low, ' ' AS high

  FROM tadir

 WHERE pgmid = 'R3TR' 

   AND object = 'FUGR'

   AND devclass = @devclass

UNION

SELECT 'I' AS sign, 'CP' AS option, 

       'L' && obj_name && '+++' AS low, ' ' AS high

  FROM tadir

  WHERE pgmid = 'R3TR'

    AND object = 'FUGR'

AND devclass = @devclass

INTO TABLE @prog_range.


Lettura di una riga da una tabella interna in una Work Area

DATA(lv_bukrs) = '1000'. 

SELECT mandt, bukrs, kostl
  FROM ztable
 INTO TABLE @DATA(lt_test)
 WHERE bukrs = @lv_bukrs.

  IF sy-subrc 0.
    TRY.
        DATA(ls_testlt_test[ BUKRS lv_bukrs ].
        WRITE/ ls_test-bukrs.
      CATCH cx_sy_itab_line_not_found.
        MESSAGE e000(dbWITH 'Record non trovato'.
    ENDTRY.

  ENDIF.

 CONV operator

Il requisito nell'esempio è convertire il tipo di dati del valore all'interno della variabile 'Testo' che è di tipo 'C' nel tipo di dati 'String'.

DATA: text TYPE c LENGTH 255. 
DATA(xstr) = cl_abap_codepage=>convert_to( source = CONV #( text ) ).

Il requisito nell'esempio è convertire il risultato della divisione tra interi in un float. 

IF CONV decfloat34( 1 / 3 ) > 0 
    ....
ENDIF.

 SU DB HANA, è possibile fare la select su tabelle interne

select matnr into table @data(lt)
  from mara
  up to 10 rows.


select mara~matnrmara~mtart
  from @lt as zmara
  INNER JOIN mara
    on mara~matnr zmara~matnr
  into TABLE @data(lt_mara).

  cl_demo_output=>display_datalt_mara ).

 

SU DB HANA, è possibile fare un estrazione di dati facendo una ricerca su un campo indipendentemente da come è scritto in tabella

DATAlt_table TYPE STANDARD TABLE OF kna1-name1.
  DATA(lr_resultNEW cl_sql_statement)->execute_query(
   `SELECT NAME1 FROM KNA1 WHERE CONTAINS(NAME1, 'domestique')`).

  lr_result->set_param_table(
    EXPORTING
      itab_ref REF #lt_table[] )
  ).
  lr_result->next_packageupto 100 ).
  lr_result->close).

  cl_demo_output=>display_datalt_table ).


SU DB HANA,  LOOP...GROUP BY

DATA flights TYPE TABLE OF spfli WITH EMPTY KEY.


SELECT * FROM  spfli
         WHERE carrid = '…'
         INTO TABLE @flights.

DATA members LIKE flights.
LOOP AT flights INTO DATA(flight)
     GROUP BY ( carrier = flight-carrid cityfr = flight-cityfrom )
              ASCENDING
              ASSIGNING FIELD-SYMBOL(<group>).
  CLEAR members.
  LOOP AT GROUP <group> ASSIGNING FIELD-SYMBOL(<flight>).
    members = VALUE #( BASE members ( <flight> ) ).
  ENDLOOP.
  cl_demo_output=>write( members ).
ENDLOOP.
cl_demo_output=>display( ).


CREAZIONE DI UNA TABELLA DI INTERVALLI CON I VALORI DI UNA TABELLA DI DATABASE O DI UNA TABELLA INTERNA


SELECT FROM vbak

  FIELDS 'I' AS sign

         'EQ' AS option

         vbeln AS low

    CAST( @space AS CHAR( 10 ) )  AS high

 where kunnr = '272' 

 INTO TABLE @DATA ( lr_vbak ).



mercoledì 29 giugno 2022

Gestione Modifiche Master Data Vendor e relativo indirizzo mail

 

Gestione Modifiche Master Data Vendor e relativo indirizzo mail 


SVILUPPARE:
Creare un file csv da inviare su una cartella di un server esterno a sap con i dati principali del fornitore modificato compreso il suo indirizzo mail.


  1. Creare la BTE 1421 Master Data Vendor
Richiamare la transazione FIBF, poi selezionare PARAMETRIZZAZIONE-> PRODOTTI-> ... di un cliente



Inserire un codice prodotto, una descrizione e flaggare l'ultimo campo


Copiare il FM: SAMPLE_INTERFACE_00001421 in un nuovo FM ad esempio ZSD_INTERFACE_00001421
Associare l'evento ZSD1421 al nuovo FM ZSD_INTERFACE_00001421


quindi inserire il numero evento, prodotto e il FM creato


La problematica principale di questo sviluppo è stata quella di reperire l'indirizzo mail inserito di default, perchè quando scatta questo evento, il nuovo dato non è ancora inserito in tabella ADR6, ma si è riusciti come a leggere il nuovo dato.
Riporto il FM ZSD_INTERFACE_00001421 creato.

FUNCTION zsd_interface_00001421.


  DATAlwa_output TYPE zsd_output.

  FIELD-SYMBOLS<lfs_mail>   TYPE any,
                 <t_itab>     TYPE ANY TABLE,
                 <lfs_adsmtp> TYPE adsmtp.


  CLEARlwa_output.
  lwa_output-znome_rubrica gc_fornitori.
  lwa_output-z_aoo gc_aoo.
  lwa_output-z_cod_sap i_lfa1-lifnr.
  CONCATENATE i_lfa1-name1 i_lfa1-name2 INTO lwa_output-z_ragione_sociale
      SEPARATED BY space.
  lwa_output-z_piva i_lfa1-stcd2.
  lwa_output-z_codfisc i_lfa1-stcd1.
  lwa_output-z_indirizzo i_lfa1-stras.
  lwa_output-z_localita i_lfa1-ort01.
  lwa_output-z_cap i_lfa1-pstlz.
  lwa_output-z_provincia i_lfa1-regio.
  lwa_output-z_nazione i_lfa1-land1.

* Leggo i dati dell <lfs_mail>
  ASSIGN '(SAPMF02K)ADDR_COMPLETE-ADSMTP_TAB' TO <lfs_mail>.

  IF sy-subrc AND <lfs_mail> IS ASSIGNED.
    ASSIGN (<lfs_mail>TO <t_itab>.
    IF sy-subrc AND <t_itab> IS ASSIGNED.
      LOOP AT <t_itab> ASSIGNING FIELD-SYMBOL(<lfs_righe>).
        ASSIGN COMPONENT 'ADSMTP' OF STRUCTURE <lfs_righe> TO <lfs_adsmtp>.
        IF sy-subrc AND <lfs_adsmtp> IS ASSIGNED.
          IF <lfs_adsmtp>-flgdefault 'X'"mail di default
            lwa_output-z_email =  <lfs_adsmtp>-smtp_addr.
          ENDIF.
        ENDIF.
      ENDLOOP.
    ENDIF.
  ENDIF.


* QUI INSERIRE IL FM CHE SCRIVE SUL SERVER
ENDFUNCTION.