‎2014 Nov 26 1:20 PM
Hi Frds,
Newly working on dynamic internal table...
I have two structures need to display in two different lines...
Tot consumption field not populating properly displaying in the random month...............
I have doubt in assigning fileld components .....Pls help me ....
FIELD-SYMBOLS : <lfs_wa> TYPE ANY,
<lfs_wa1> TYPE ANY,
<lfs_fld> TYPE ANY,
<lfs_matnr> TYPE ANY,
<lfs_maktx> TYPE ANY,
<lfs_lifnr> TYPE ANY,
<lfs_name1> TYPE ANY,
<lfs_tot> TYPE ANY.
CLEAR: gt_out.
SELECT mseg~bwart mseg~matnr mseg~lifnr mseg~menge mseg~ebeln
mkpf~budat
ekko~knumv
makt~maktx
lfa1~name1
INTO CORRESPONDING FIELDS OF TABLE gt_out FROM mseg AS mseg
INNER JOIN mkpf AS mkpf ON mkpf~mblnr = mseg~mblnr AND mkpf~mjahr = mseg~mjahr
INNER JOIN ekko AS ekko ON ekko~ebeln = mseg~ebeln
INNER JOIN makt AS makt ON makt~matnr = mseg~matnr
INNER JOIN lfa1 AS lfa1 ON lfa1~lifnr = mseg~lifnr AND lfa1~spras = 'EN'
INNER JOIN mara AS mara ON mara~matnr = mseg~matnr
WHERE mkpf~budat GE gv_po_date_low AND mkpf~budat LE gv_po_date_high
AND mara~mtart = 'ROH'
AND mseg~matnr IN s_matnr
AND mseg~werks = p_werks
AND mseg~bwart = '101'.
SELECT knumv
kschl
kbetr
INTO CORRESPONDING FIELDS OF TABLE gt_price
FROM konv FOR ALL ENTRIES IN gt_out
WHERE knumv = gt_out-knumv
AND kschl = 'P000'.
CLEAR: gt_mseg.
SELECT mseg~matnr mseg~lifnr mseg~menge mkpf~budat
INTO CORRESPONDING FIELDS OF TABLE gt_mseg
FROM mseg AS mseg
INNER JOIN mkpf AS mkpf ON mkpf~mblnr = mseg~mblnr AND mkpf~mjahr = mseg~mjahr
INNER JOIN mara AS mara ON mara~matnr = mseg~matnr AND mara~mtart = 'ROH'
WHERE mkpf~budat GE gv_po_date_low AND mkpf~budat LE gv_po_date_high
AND mseg~bwart = '261'
AND mseg~matnr IN s_matnr
AND mseg~werks = p_werks.
SELECT matnr
werks
spmon
mgvbr
FROM s031
INTO TABLE gt_mseg
WHERE matnr IN s_matnr
AND werks = p_werks
AND spmon BETWEEN p_low AND p_high.
LOOP AT gt_mseg INTO wa_mseg.
CLEAR: lv_ktx.
SELECT SINGLE ktx INTO lv_ktx FROM t247
WHERE spras = sy-langu
AND mnr = wa_mseg-spmon.
wa_mseg-price = lv_ktx.
CONCATENATE lv_ktx wa_mseg-year '_' 'PRICE' INTO wa_mseg-price.
MOVE:wa_mseg-mgvbr TO wa_output3-tot_consum,
wa_mseg-matnr to wa_output3-matnr,
wa_mseg-price to wa_output3-price.
APPEND wa_output3 TO gt_output3.
ENDLOOP.
SORT gt_out BY lifnr matnr.
CLEAR: wa_out, lv_kbetr.
LOOP AT gt_out INTO wa_out.
wa_out-month = wa_out-budat+4(2).
wa_out-year = wa_out-budat+0(4).
READ TABLE gt_price INTO wa_price WITH KEY knumv = wa_out-knumv.
IF sy-subrc IS INITIAL.
wa_out-kbetr = wa_price-kbetr.
ENDIF.
CLEAR: lv_ktx.
SELECT SINGLE ktx INTO lv_ktx FROM t247
WHERE spras = sy-langu
AND mnr = wa_out-budat+4(2).
wa_out-price = lv_ktx.
CONCATENATE lv_ktx wa_out-year '_' 'PRICE' INTO wa_out-price.
CLEAR: wa_output.
MOVE-CORRESPONDING wa_out TO wa_output.
APPEND wa_output TO gt_output.
ENDLOOP.
CLEAR: wa_fieldcat.
LOOP AT gt_fieldcat INTO wa_fieldcat.
CLEAR: wa_field.
MOVE-CORRESPONDING wa_fieldcat TO wa_field.
APPEND wa_field TO gt_field.
ENDLOOP.
CALL METHOD cl_alv_table_create=>create_dynamic_table
EXPORTING
it_fieldcatalog = gt_field
IMPORTING
ep_table = lt_dyntab.
ASSIGN lt_dyntab->* TO <gfs_table>.
CREATE DATA lwa_dyntab LIKE LINE OF <gfs_table>.
ASSIGN lwa_dyntab->* TO <lfs_wa>.
SORT gt_output BY matnr lifnr.
APPEND LINES OF gt_output TO gt_output1.
CLEAR: wa_output.
LOOP AT gt_output INTO wa_output.
CLEAR: wa_fieldcat.
ASSIGN COMPONENT 'MATNR' OF STRUCTURE <lfs_wa> TO <lfs_fld>.
IF sy-subrc IS INITIAL.
<lfs_fld> = wa_output-matnr.
ENDIF.
ASSIGN COMPONENT 'MAKTX' OF STRUCTURE <lfs_wa> TO <lfs_fld>.
IF sy-subrc IS INITIAL.
<lfs_fld> = wa_output-maktx.
ENDIF.
ASSIGN COMPONENT 'LIFNR' OF STRUCTURE <lfs_wa> TO <lfs_fld>.
IF sy-subrc IS INITIAL.
<lfs_fld> = wa_output-lifnr.
ENDIF.
ASSIGN COMPONENT 'NAME1' OF STRUCTURE <lfs_wa> TO <lfs_fld>.
IF sy-subrc IS INITIAL.
<lfs_fld> = wa_output-name1.
ENDIF.
CLEAR: wa_output1.
LOOP AT gt_field INTO wa_field WHERE fieldname NE 'MATNR' AND fieldname NE 'MAKTX' AND fieldname NE 'LIFNR' AND fieldname NE 'NAME1'.
ASSIGN COMPONENT wa_field-fieldname OF STRUCTURE <lfs_wa> TO <lfs_fld>.
IF sy-subrc IS INITIAL.
READ TABLE gt_output1 INTO wa_output1 WITH KEY matnr = wa_output-matnr lifnr = wa_output-lifnr price = wa_field-fieldname.
IF sy-subrc IS INITIAL.
DELETE gt_output1 INDEX sy-tabix.
<lfs_fld> = wa_output1-kbetr.
lv_pur_qty = wa_output1-price.
REPLACE FIRST OCCURRENCE OF 'PRICE' IN lv_pur_qty WITH 'PUR_QTY'.
ASSIGN COMPONENT lv_pur_qty OF STRUCTURE <lfs_wa> TO <lfs_fld>.
IF sy-subrc IS INITIAL.
<lfs_fld> = wa_output1-menge.
ENDIF.
ENDIF.
ELSEIF sy-subrc IS NOT INITIAL.
EXIT.
ENDIF.
ENDLOOP.
APPEND <lfs_wa> TO <gfs_table>.
CLEAR: <lfs_wa>.
ENDLOOP.
*Delete entries with empty dyanamic field value
LOOP AT <gfs_table> ASSIGNING <lfs_wa>.
lv_tabix = sy-tabix.
lv_index = 5.
DO .
lv_delete = 'X'.
ASSIGN COMPONENT lv_index OF STRUCTURE <lfs_wa> TO <lfs_fld>.
IF sy-subrc IS INITIAL.
IF <lfs_fld> IS NOT INITIAL.
lv_delete = ''.
EXIT.
ENDIF.
ELSEIF sy-subrc IS NOT INITIAL.
EXIT.
ENDIF.
lv_index = lv_index + 1.
ENDDO.
IF lv_delete = 'X'.
DELETE <gfs_table> INDEX lv_tabix.
ENDIF.
ENDLOOP.
gt_output1[] = gt_output[].
* DELETE gt_output1 WHERE tot_consum = '0.000'.
* SORT gt_output1 BY matnr price tot_consum.
* DELETE ADJACENT DUPLICATES FROM gt_output1 COMPARING matnr price tot_consum.
CALL METHOD cl_alv_table_create=>create_dynamic_table
EXPORTING
it_fieldcatalog = gt_field
IMPORTING
ep_table = lt_dyntab1.
ASSIGN lt_dyntab1->* TO <gfs_table1>.
CREATE DATA lwa_dyntab1 LIKE LINE OF <gfs_table1>.
ASSIGN lwa_dyntab1->* TO <lfs_wa1>.
CLEAR: wa_output1, wa_matnr.
LOOP AT gt_output1 INTO wa_output1.
wa_matnr-matnr = wa_output1-matnr.
APPEND wa_matnr TO gt_matnr.
ENDLOOP.
SORT gt_matnr BY matnr.
DELETE ADJACENT DUPLICATES FROM gt_matnr COMPARING matnr.
CLEAR: wa_matnr.
LOOP AT gt_matnr INTO wa_matnr.
LOOP AT gt_output1 INTO wa_output1 WHERE matnr = wa_matnr-matnr.
ASSIGN COMPONENT 'MATNR' OF STRUCTURE <lfs_wa1> TO <lfs_matnr>.
lv_pur_qty = wa_output1-price.
REPLACE FIRST OCCURRENCE OF 'PRICE' IN lv_pur_qty WITH 'TOT_CONSUM'.
ASSIGN COMPONENT lv_pur_qty OF STRUCTURE <lfs_wa1> TO <lfs_tot>.
IF sy-subrc IS INITIAL.
READ TABLE gt_output1 INTO wa_output2 WITH KEY matnr = wa_output1-matnr.
IF sy-subrc IS INITIAL.
ASSIGN COMPONENT 'MAKTX' OF STRUCTURE <lfs_wa1> TO <lfs_maktx>.
ASSIGN COMPONENT 'LIFNR' OF STRUCTURE <lfs_wa1> TO <lfs_lifnr>.
ASSIGN COMPONENT 'NAME1' OF STRUCTURE <lfs_wa1> TO <lfs_name1>.
<lfs_maktx> = '*'.
<lfs_lifnr> = '*'.
<lfs_matnr> = wa_output1-matnr.
<lfs_tot> = wa_output1-tot_consum.
ENDIF.
ELSEIF sy-subrc IS NOT INITIAL.
EXIT.
ENDIF.
ENDLOOP.
APPEND <lfs_wa1> TO <gfs_table1>.
CLEAR: <lfs_wa1>.
ENDLOOP.
APPEND LINES OF <gfs_table1> TO <gfs_table>.
‎2014 Nov 26 1:32 PM
Hi.
Code is a little bit confused cause it's all in one, but I suggest you, when you use dynamic field, to retrieve field-names dictionary (MAKTX, MATNR,LIFNR; etcc) from you gt_fieldcat structure, without an explicit reference in the command lines.
After that I can't imagine your needs from the code, but be sure to get some improvement from this or you'll better try to use separated JOINS and binary searches.
Try perhaps to tell what are your doubts about it.
Hope to help
BYe
‎2014 Nov 26 1:32 PM
Hi.
Code is a little bit confused cause it's all in one, but I suggest you, when you use dynamic field, to retrieve field-names dictionary (MAKTX, MATNR,LIFNR; etcc) from you gt_fieldcat structure, without an explicit reference in the command lines.
After that I can't imagine your needs from the code, but be sure to get some improvement from this or you'll better try to use separated JOINS and binary searches.
Try perhaps to tell what are your doubts about it.
Hope to help
BYe
‎2014 Nov 26 1:58 PM
Hi kabil,
Could you please re-check with the usage of 'MNR' field from 'T247: Month name and short text' ?.
Check with the entries in your system ( I am sure it should have 12 entries by default ) and have a breakpoint and debug with this parameter and check for 'MNR' field - it should be '10' in case of 'September'.
If this is not the case, then you could check previous statements where the year/month number gets assigned.
Cheers,
Vivek Raj Kumar M.
‎2014 Nov 26 2:13 PM
Hi Vivek,
Its is Triggering on correct month
When it comes to these below line not reading those below lines.
At end part code.......
LOOP AT gt_output1 INTO wa_output1 WHERE matnr = wa_matnr-matnr.
ASSIGN COMPONENT 'MATNR' OF STRUCTURE <lfs_wa1> TO <lfs_matnr>.
lv_pur_qty = wa_output1-price.
REPLACE FIRST OCCURRENCE OF 'PRICE' IN lv_pur_qty WITH 'TOT_CONSUM'.
ASSIGN COMPONENT lv_pur_qty OF STRUCTURE <lfs_wa1> TO <lfs_tot>.
IF sy-subrc IS INITIAL.
READ TABLE gt_output1 INTO wa_output2 WITH KEY matnr = wa_output1-matnr.
IF sy-subrc IS INITIAL.
ASSIGN COMPONENT 'MAKTX' OF STRUCTURE <lfs_wa1> TO <lfs_maktx>.
ASSIGN COMPONENT 'LIFNR' OF STRUCTURE <lfs_wa1> TO <lfs_lifnr>.
ASSIGN COMPONENT 'NAME1' OF STRUCTURE <lfs_wa1> TO <lfs_name1>.
<lfs_maktx> = '*'.
<lfs_lifnr> = '*'.
<lfs_matnr> = wa_output1-matnr.
<lfs_tot> = wa_output1-tot_consum.
ENDIF.
ELSEIF sy-subrc IS NOT INITIAL.
EXIT.
ENDIF.
ENDLOOP.
APPEND <lfs_wa1> TO <gfs_table1>.
CLEAR: <lfs_wa1>.
ENDLOOP.
APPEND LINES OF <gfs_table1> TO <gfs_table>.
‎2014 Nov 26 2:25 PM
Thanks Kabil G.
Do we have the MATNR entries in the previous loop just before this one. Incase there are null entries matching all your condition then it is obvious that this LOOP gets skipped.
Check for the validation condition before entering into this LOOP condition.
That might help I guess.
Cheers,
Vivek Raj Kumar M.
‎2014 Nov 28 6:35 AM