‎2009 Aug 24 4:47 PM
Hi, I've the following scenario.
I've an internnal table (LT_AUX) and i need to update some fields (labst2000,labst3000,labst4000,labst5000,labst6000)
with data that i've already at internal table (LT_STOCKS).
I do this way, but some materials have wrong data...
ON CHANGE OF lt_aux-matnr.
*RPimenta(18.08.2009)-Incluir stocks dos centros
SELECT labst werks lgort INTO CORRESPONDING FIELDS OF TABLE
lt_stocks FROM mard
WHERE matnr EQ lt_aux-matnr.
DELETE lt_stocks WHERE lgort NS '001'.
LOOP AT lt_stocks.
IF lt_stocks-werks EQ '2000'.
lt_aux-labst2000 = lt_stocks-labst.
ELSEIF lt_stocks-werks EQ '3000'.
lt_aux-labst3000 = lt_stocks-labst.
ELSEIF lt_stocks-werks EQ '4000'.
lt_aux-labst4000 = lt_stocks-labst.
ELSEIF lt_stocks-werks EQ '5000'.
lt_aux-labst5000 = lt_stocks-labst.
ELSEIF lt_stocks-werks EQ '6000'.
lt_aux-labst6000 = lt_stocks-labst.
ENDIF.
endloop.
endon.
Can somebody help me, anda tell me what's wrong ?
Thanks
‎2009 Aug 24 4:55 PM
‎2009 Aug 24 4:55 PM
‎2009 Aug 24 4:58 PM
Hi,
Try clearing LT_STOCKS header line inside loop at the end after populating the LT_AUX and write this statement before select.
FREE LT_STOCKS.KR Jaideep,
‎2009 Aug 24 5:16 PM
Content of LT_STOCKS
line LABST WERKS LGORT
1 0.000 1000 1001
2 19.000 2000 2001
3 13.000 3000 3001
4 25.000 4000 4001
5 0.000 5000 5001
6 0.000 6000 6001
at LT_AUX (LABSTxxxx fields after loop i've
LABST200 LABST3000 LABST4000 LABST5000 LABST6000
0.000 0.000 0.000 0.000 0.000
and i already put free LT_STOCKS after ENDLOOP.
‎2009 Aug 24 5:25 PM
Hi,
Please free LT_STOCKS just before the select query.
Can you please provide me with entire code of your program starting from data declaration to loop processing.
KR Jaideep,
Edited by: Jaideep Sharma on Aug 24, 2009 9:56 PM
‎2009 Aug 24 6:07 PM
REPORT zrpsd_prod_n_forn.
*-----DDIC--
*
TABLES: vbap, mara, lfa1, kna1, vbak, zmm_estocktt, ekko.
*-----TIPOS--
*
TYPE-POOLS: slis.
*-----TABELAS INTERNAS--
*
DATA: itab1 TYPE zpmr_nfo_alv01 OCCURS 0 WITH HEADER LINE,
itab2 TYPE zpmr_nfo_alv02 OCCURS 0 WITH HEADER LINE,
itab3 TYPE zpmr_nfo_alv03 OCCURS 0 WITH HEADER LINE,
BEGIN OF it_final OCCURS 0,
werks LIKE vbap-werks,
kunnr LIKE vbak-kunnr,
zzlifnr LIKE vbap-zzlifnr,
name1 LIKE kna1-name1,
matnr LIKE vbap-matnr,
2007.04.27 - MJA ->
lgpla LIKE mlgt-lgpla,
<-
zzdescr60 LIKE mara-zzdescr60,
zzestock LIKE vbap-zzestock,
zdesc LIKE zmm_estocktt-zdesc,
zqntd_nf LIKE zpmr_nfo_alv02-zqntd_nf,
wavwr LIKE zpmr_nfo_alv02-verpr,
zzesgt LIKE zpmr_nfo_alv02-zzesgt,
zstockdm LIKE zpmr_nfo_alv02-zstockdm,
zdesc_dm LIKE zpmr_nfo_alv02-zdesc_dm,
nlinp LIKE zpmr_nfo_alv02-nlinp,
kwmeng LIKE vbap-kbmeng,
kbmeng LIKE vbap-kbmeng,
vkorg LIKE vbak-vkorg,
labst2000 LIKE mard-labst,
labst3000 LIKE mard-labst,
labst4000 LIKE mard-labst,
labst5000 LIKE mard-labst,
labst6000 LIKE mard-labst,
aedat2000 LIKE ekko-aedat,
aedat3000 LIKE ekko-aedat,
aedat4000 LIKE ekko-aedat,
aedat5000 LIKE ekko-aedat,
aedat6000 LIKE ekko-aedat,
*<-
END OF it_final.
DATA: BEGIN OF lt_stocks OCCURS 0,
labst LIKE mard-labst,
werks LIKE mard-werks,
lgort LIKE mard-lgort,
END OF lt_stocks.
DATA: BEGIN OF lt_pedido OCCURS 0,
ebeln LIKE ekko-ebeln,
werks LIKE ekko-ekorg,
aedat LIKE ekko-aedat,
kunnr LIKE ekko-kunnr,
END OF lt_pedido.
DATA: ls_pedido LIKE LINE OF lt_pedido OCCURS 0 WITH HEADER LINE,
ls_aux LIKE LINE OF it_final OCCURS 0 WITH HEADER LINE.
DATA: l_bsart LIKE ekko-bsart.
*-----PARAMETERS/SELECT-OPTIONS--
*
PARAMETERS: p_bukrs LIKE t001-bukrs MEMORY ID buk OBLIGATORY .
SELECT-OPTIONS: s_vkorg FOR vbak-vkorg ,
s_werks FOR vbap-werks OBLIGATORY,
s_erdat FOR vbak-erdat OBLIGATORY.
PARAMETERS p_factor TYPE zzqntd_n_forn.
SELECTION-SCREEN ULINE.
SELECT-OPTIONS: s_zzesto FOR vbap-zzestock,
s_matnr FOR mara-matnr,
s_lifnr FOR lfa1-lifnr,
s_kunnr FOR kna1-kunnr.
SELECTION-SCREEN ULINE.
Selecção do processamento
SELECTION-SCREEN BEGIN OF BLOCK rad1 WITH FRAME TITLE text-003.
PARAMETERS: r11 RADIOBUTTON GROUP gr1,
r12 RADIOBUTTON GROUP gr1,
r13 RADIOBUTTON GROUP gr1.
SELECTION-SCREEN END OF BLOCK rad1.
*----
*
START-OF-SELECTION *
*----
*
START-OF-SELECTION.
CALL FUNCTION 'Z_BC_UNIF_AUTORIZ'
EXPORTING
i_param = p_bukrs
EXCEPTIONS
e_sem_autorizacao = 1
e_erro_parametro = 2
OTHERS = 3.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
CALL FUNCTION 'Z_BC_UNIF_AUTORIZ'
EXPORTING
i_param = s_vkorg[]
EXCEPTIONS
e_sem_autorizacao = 1
e_erro_parametro = 2
OTHERS = 3.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
CALL FUNCTION 'Z_BC_UNIF_AUTORIZ'
EXPORTING
i_param = s_werks[]
EXCEPTIONS
e_sem_autorizacao = 1
e_erro_parametro = 2
OTHERS = 3.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
PERFORM selecciona_dados.
*----
*
END-OF-SELECTION *
*----
*
END-OF-SELECTION.
PERFORM lista_dados.
*----
*
FORM SELECCIONA_DADOS *
*----
*
FORM selecciona_dados.
DATA: BEGIN OF lt_zzestock OCCURS 0,
zzestock TYPE zmm_estock1,
zdesc TYPE vtext30,
END OF lt_zzestock,
lt_aux LIKE it_final OCCURS 0 WITH HEADER LINE,
lt_campos TYPE fieldname OCCURS 0 WITH HEADER LINE,
lt_campos_vbak TYPE fieldname OCCURS 0 WITH HEADER LINE,
BEGIN OF lt_vbak OCCURS 0,
vbeln LIKE vbak-vbeln,
kunnr LIKE vbak-kunnr,
vkorg LIKE vbak-vkorg,
*
END OF lt_vbak,
l_lgtyp LIKE mlgt-lgtyp,
l_lgnum LIKE mlgt-lgnum.
APPEND: 'VBELN' TO lt_campos_vbak.
APPEND: 'VKORG' TO lt_campos_vbak.
*
Em termos globais.
IF r11 = 'X'.
APPEND: 'ZZESTOCK' TO lt_campos,
'KBMENG' TO lt_campos,
'KWMENG' TO lt_campos,
'WAVWR' TO lt_campos,
'WERKS' TO lt_campos.
Por fornecedor e material
ELSEIF r12 = 'X'.
APPEND: 'ZZESTOCK' TO lt_campos,
'KBMENG' TO lt_campos,
'KWMENG' TO lt_campos,
'WAVWR' TO lt_campos,
'MATNR' TO lt_campos,
'ZZLIFNR' TO lt_campos,
'WERKS' TO lt_campos.
Por cliente e material
ELSEIF r13 = 'X'.
APPEND: 'ZZESTOCK' TO lt_campos,
'KBMENG' TO lt_campos,
'KWMENG' TO lt_campos,
'WAVWR' TO lt_campos,
'MATNR' TO lt_campos,
'WERKS' TO lt_campos.
APPEND: 'KUNNR' TO lt_campos_vbak.
ENDIF.
SELECT (lt_campos_vbak) FROM vbak
INTO CORRESPONDING FIELDS OF TABLE lt_vbak
WHERE erdat IN s_erdat AND
vkorg IN s_vkorg AND
kunnr IN s_kunnr.
REFRESH lt_aux.
LOOP AT lt_vbak.
SELECT (lt_campos)
FROM vbap APPENDING CORRESPONDING FIELDS OF TABLE
lt_aux
WHERE vbeln EQ lt_vbak-vbeln AND
zzestock IN s_zzesto AND
zzlifnr IN s_lifnr AND
matnr IN s_matnr AND
werks IN s_werks.
lt_aux-vkorg = lt_vbak-vkorg.
MODIFY lt_aux TRANSPORTING vkorg WHERE vkorg IS INITIAL.
*
IF r13 EQ 'X'.
lt_aux-kunnr = lt_vbak-kunnr.
MODIFY lt_aux TRANSPORTING kunnr WHERE kunnr IS INITIAL.
ENDIF.
DELETE lt_vbak.
ENDLOOP.
Obtém as descrições dos estados de stock
SELECT zzestock zdesc FROM zmm_estocktt INTO TABLE lt_zzestock
WHERE spras EQ sy-langu.
SORT lt_aux.
LOOP AT lt_aux.
Cálcula as diferenças
lt_aux-zqntd_nf = lt_aux-kwmeng - lt_aux-kbmeng.
Verifica se já foi tudo fornecido
IF lt_aux-zqntd_nf EQ 0.
DELETE lt_aux.
ENDIF.
ENDLOOP.
Obtém os dados da empresa
CALL FUNCTION 'Z_BC_GERAL_EMPRESA_ACTIVA'
IMPORTING
lgnum = l_lgnum
lgtyp = l_lgtyp
EXCEPTIONS
OTHERS = 1.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
CLEAR: lt_aux-matnr,
lt_aux-werks.
LOOP AT lt_aux.
ON CHANGE OF lt_aux-werks.
CALL FUNCTION 'Z_BC_UNIF_DADOS_ACTIVOS'
EXPORTING
i_werks = lt_aux-werks
IMPORTING
o_lgnum = l_lgnum
o_lgtyp = l_lgtyp
EXCEPTIONS
not_found = 1
parametros_incompletos = 2
OTHERS = 3.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
ENDON.
ON CHANGE OF lt_aux-matnr.
SELECT labst werks lgort INTO CORRESPONDING FIELDS OF TABLE
lt_stocks FROM mard
WHERE matnr EQ lt_aux-matnr.
DELETE lt_stocks WHERE lgort NS '001'.
LOOP AT lt_stocks.
IF lt_stocks-werks EQ '2000'.
lt_aux-labst2000 = lt_stocks-labst.
ELSEIF lt_stocks-werks EQ '3000'.
lt_aux-labst3000 = lt_stocks-labst.
ELSEIF lt_stocks-werks EQ '4000'.
lt_aux-labst4000 = lt_stocks-labst.
ELSEIF lt_stocks-werks EQ '5000'.
lt_aux-labst5000 = lt_stocks-labst.
ELSEIF lt_stocks-werks EQ '6000'.
lt_aux-labst6000 = lt_stocks-labst.
ENDIF.
ENDLOOP.
IF r11 IS INITIAL.
SELECT SINGLE lgpla FROM mlgt INTO lt_aux-lgpla
WHERE matnr EQ lt_aux-matnr AND
lgnum EQ l_lgnum AND
lgtyp EQ l_lgtyp.
SELECT SINGLE zzdescr60 FROM mara INTO lt_aux-zzdescr60
WHERE matnr EQ lt_aux-matnr.
MODIFY lt_aux FROM lt_aux TRANSPORTING lgpla zzdescr60
WHERE matnr EQ lt_aux-matnr.
ENDIF.
ENDON.
<-
IF r12 EQ 'X' OR r13 EQ 'X'.
AT NEW zzlifnr.
DELETE lt_pedido WHERE kunnr <> lt_aux-zzlifnr.
LOOP AT lt_stocks.
CASE lt_stocks-werks.
WHEN '2000'.
l_bsart = 'ZNB2'.
WHEN '3000'.
l_bsart = 'ZNB3'.
WHEN '4000'.
l_bsart = 'ZNB4'.
WHEN '5000'.
l_bsart = 'ZNB5'.
WHEN '6000'.
l_bsart = 'ZNB6'.
ENDCASE.
ls_pedido-werks = lt_stocks-werks.
ls_pedido-kunnr = lt_aux-zzlifnr.
SELECT MAX( ebeln ) INTO ls_pedido-ebeln
FROM ekko
WHERE ekorg EQ lt_stocks-werks AND
lifnr EQ lt_aux-zzlifnr AND
bsart EQ l_bsart.
SELECT SINGLE aedat INTO ls_pedido-aedat
FROM ekko WHERE ebeln EQ ls_pedido-ebeln AND
bsart EQ l_bsart AND
lifnr EQ lt_aux-zzlifnr.
IF sy-subrc EQ 0.
APPEND ls_pedido TO lt_pedido.
ENDIF.
ENDLOOP.
LOOP AT lt_pedido.
IF lt_pedido-werks EQ '2000'.
ls_aux-aedat2000 = lt_pedido-aedat.
ELSEIF lt_pedido-werks EQ '3000'.
ls_aux-aedat3000 = lt_pedido-aedat.
ELSEIF lt_pedido-werks EQ '4000'.
ls_aux-aedat4000 = lt_pedido-aedat.
ELSEIF lt_pedido-werks EQ '5000'.
ls_aux-aedat5000 = lt_pedido-aedat.
ELSEIF lt_pedido-werks EQ '6000'.
ls_aux-aedat6000 = lt_pedido-aedat.
ENDIF.
ENDLOOP.
IF NOT lt_aux-zzlifnr IS INITIAL.
MODIFY lt_aux FROM ls_aux TRANSPORTING aedat2000 aedat3000
aedat4000 aedat5000 aedat6000 WHERE zzlifnr = lt_aux-zzlifnr.
ENDIF.
CLEAR it_final-name1.
IF NOT lt_aux-zzlifnr IS INITIAL.
SELECT SINGLE name1 FROM lfa1 INTO it_final-name1
WHERE lifnr EQ lt_aux-zzlifnr.
ELSEIF NOT lt_aux-kunnr IS INITIAL.
SELECT SINGLE name1 FROM kna1 INTO it_final-name1
WHERE kunnr EQ lt_aux-kunnr.
ENDIF.
IF NOT it_final-name1 IS INITIAL.
lt_aux-name1 = it_final-name1.
MODIFY lt_aux TRANSPORTING name1
WHERE zzlifnr EQ lt_aux-zzlifnr AND
kunnr EQ lt_aux-kunnr.
ENDIF.
ENDAT.
ENDIF.
it_final = lt_aux.
Cálcula as diferenças
it_final-zqntd_nf = it_final-kwmeng - it_final-kbmeng.
Verifica se já foi tudo fornecido
IF it_final-zqntd_nf EQ 0.
CONTINUE.
ENDIF.
*RP(16.09.2008)-Incluir Estado de Produto para seq Cliente/Material
IF r12 EQ 'X' OR r13 EQ 'X'.
AT NEW matnr.
SELECT SINGLE zzestock zzesgt FROM marc
INTO (it_final-zstockdm, it_final-zzesgt)
WHERE matnr EQ it_final-matnr AND
werks EQ it_final-werks.
CLEAR lt_zzestock.
READ TABLE lt_zzestock WITH KEY zzestock = it_final-zstockdm.
lt_aux-zdesc_dm = it_final-zdesc_dm = lt_zzestock-zdesc.
lt_aux-zstockdm = it_final-zstockdm.
lt_aux-zzesgt = it_final-zzesgt.
MODIFY lt_aux TRANSPORTING zdesc_dm zstockdm zzesgt
WHERE matnr EQ lt_aux-matnr AND
werks EQ lt_aux-werks.
ENDAT.
ENDIF.
it_final-wavwr = it_final-wavwr *
( it_final-zqntd_nf / it_final-kwmeng ) *
( 1 + p_factor ).
CLEAR lt_zzestock.
READ TABLE lt_zzestock WITH KEY zzestock = it_final-zzestock.
it_final-zdesc = lt_zzestock-zdesc.
Acumula o número de linhas pedidas
it_final-nlinp = 1.
COLLECT it_final.
FREE lt_stocks.
ENDLOOP.
FREE lt_aux.
SORT it_final.
ENDFORM. " SELECCIONA_DADOS
‎2009 Aug 24 6:35 PM
Hi,
I would suggest you to write this logic in a separate loop. Program is already very complex.
LOOP AT lt_aux.
ON CHANGE OF MATNR.
SELECT labst werks lgort INTO CORRESPONDING FIELDS OF TABLE
lt_stocks FROM mard
WHERE matnr EQ lt_aux-matnr.
DELETE lt_stocks WHERE lgort NS '001'.
LOOP AT lt_stocks.
IF lt_stocks-werks EQ '2000'.
lt_aux-labst2000 = lt_stocks-labst.
ELSEIF lt_stocks-werks EQ '3000'.
lt_aux-labst3000 = lt_stocks-labst.
ELSEIF lt_stocks-werks EQ '4000'.
lt_aux-labst4000 = lt_stocks-labst.
ELSEIF lt_stocks-werks EQ '5000'.
lt_aux-labst5000 = lt_stocks-labst.
ELSEIF lt_stocks-werks EQ '6000'.
lt_aux-labst6000 = lt_stocks-labst.
ENDIF.
ENDLOOP.
ENDON.
ENDLOOP.KR Jaideep,
Edited by: Jaideep Sharma on Aug 24, 2009 11:06 PM