quarta-feira, 1 de junho de 2022

AMDP - Usando WHILE, leitura tipo READ TABLE, variável de sistema

CLASS zcl_szk_amdp1 DEFINITION
  PUBLIC
  FINAL
  CREATE PUBLIC .

  PUBLIC SECTION.

    TYPES: BEGIN OF tp_transp,
             nodeid type char05,
             hierarchy type char05,
             parentid type char05,
             tknum type tknum,
             vbeln type likp-vbeln,
             posnr type lips-posnr,
             matnr type lips-matnr,
             maktx type makt-maktx,
             lfimg type lips-lfimg,
             meins type lips-meins,
           END OF tp_transp.

    TYPES tp_vttk type table of vttk WITH DEFAULT KEY.
    types tp_transp_tab type TABLE OF tp_transp with DEFAULT KEY
    .

    INTERFACES if_amdp_marker_hdb .
    METHODS get_transport_detail IMPORTING VALUE(iv_mandt) type sy-mandt
                                           VALUE(iv_tknum) type vttk-tknum
                                           default ' ' "Indica parâmetro opcional
                                 EXPORTING value(et_transp) type tp_transp_tab
                                           value(e_text) type char10.

    class-METHODS get_transporte1 FOR TABLE FUNCTION zteste_szk2.

  PROTECTED SECTION.
  PRIVATE SECTION.
ENDCLASS.



CLASS zcl_szk_amdp1 IMPLEMENTATION.

  METHOD get_transport_detail BY DATABASE PROCEDURE FOR HDB LANGUAGE SQLSCRIPT
                                OPTIONS READ-ONLY USING VTTK vttp lips makt.

   DECLARE lt_transp TABLE LIKE :et_transp;
   DECLARE lv_index INTEGER;
   DECLARE lv_nodeid INTEGER;
   DECLARE lv_rows INTEGER;
   DECLARE lv_tknum "$ABAP.type( TKNUM )";
   DECLARE lv_pos INTEGER;

   it_vttk = select tknum
                from vttk
               WHERE mandt = :IV_MANDT;

   lv_rows = record_count( :it_vttk ); "igual ao LINES no ABAP

   lv_index = 1;

   while lv_index <= lv_rows do
     lv_nodeid = lv_index;
     lt_transp.tknum[ :lv_nodeid ] = :it_vttk.tknum[ :lv_index ];
     lt_transp.nodeid[ :lv_nodeid ] = :lv_nodeid;
     lv_index = lv_index + 1;
   END WHILE;

   it_rem = select vttp.tknum,
                   vttp.vbeln,
                   posnr,
                   lips.matnr,
                   maktx,
                   lfimg,
                   meins
              from vttp
                   INNER join :it_vttk as vttk
                   on vttk.tknum = vttp.tknum
                   INNER join lips
                   on lips.vbeln = vttp.vbeln
                   "Mandante é importante, podem vir linhas duplicadas 
                   "caso não seja informado
                   and lips.mandt = vttp.mandt 
                   INNER join makt
                   on makt.matnr = lips.matnr
                   and makt.mandt = lips.mandt
           where vttp.mandt = session_context('CLIENT') "tipo SY-MANDT
             AND makt.spras = session_context('LOCALE_SAP'); "tipo SY-LANGU



    lv_index = 1;
    lv_rows = record_count( :it_rem );

    while lv_index <= lv_rows do

     lv_nodeid = lv_nodeid + 1;
     lt_transp.tknum[ :lv_nodeid ] = :it_rem.tknum[ :lv_index ];
     lv_tknum = :it_rem.tknum[ :lv_index ];
     lt_transp.nodeid[ :lv_nodeid ] = :lv_nodeid;
     lt_transp.vbeln[ :lv_nodeid ] = :it_rem.vbeln[ :lv_index ];
     lt_transp.posnr[ :lv_nodeid ] = :it_rem.posnr[ :lv_index ];
     lt_transp.matnr[ :lv_nodeid ] = :it_rem.matnr[ :lv_index ];
     lt_transp.maktx[ :lv_nodeid ] = :it_rem.maktx[ :lv_index ];
     lt_transp.lfimg[ :lv_nodeid ] = :it_rem.lfimg[ :lv_index ];
     lt_transp.meins[ :lv_nodeid ] = :it_rem.meins[ :lv_index ];
     "SEARCH - faz a busca igual read table
     lv_pos = :lt_transp.search( ( tknum ), :it_rem.tknum[ :lv_index ] );
     IF lv_pos <> 0 THEN
         lt_transp.hierarchy[ :lv_nodeid ] = :lt_transp.nodeid[ :lv_pos ];
         lv_index = lv_index + 1;
     END IF;
    END WHILE ;

   et_transp = SELECT *
                FROM :lt_transp;

  ENDMETHOD.

  method get_transporte1 BY DATABASE FUNCTION FOR HDB LANGUAGE SQLSCRIPT
                               OPTIONS READ-ONLY using vttk vttp lips.

    return select vttk.mandt,
                  vttk.tknum,
                  vttp.vbeln,
                  posnr,
                  lfimg,
                  meins
             from vttk
                  INNER join vttp
                  on vttp.tknum = vttk.tknum
                  inner join lips
                  on lips.vbeln = vttp.vbeln;

  endmethod.

ENDCLASS.

============================  OUTRA BUSCA ==========================

Busca utilizando SEARCH com 2 campos.
No caso o Pedido e Saida são campos da minha tabela