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