Application Development and Automation Discussions
Join the discussions or start your own on all things application development, including tools and APIs, programming models, and keeping your skills sharp.
cancel
Showing results for 
Search instead for 
Did you mean: 
Read only

Update internal table using data from second internal table.

Former Member
0 Likes
786

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

1 ACCEPTED SOLUTION
Read only

jaideepsharma
Active Contributor
0 Likes
755

Hi,

Try clearing LT_STOCKS header line after loop.

KR Jaideep,

6 REPLIES 6
Read only

jaideepsharma
Active Contributor
0 Likes
756

Hi,

Try clearing LT_STOCKS header line after loop.

KR Jaideep,

Read only

jaideepsharma
Active Contributor
0 Likes
755

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,

Read only

Former Member
0 Likes
755

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.

Read only

0 Likes
755

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

Read only

0 Likes
755

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

Read only

0 Likes
755

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