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

Dynamic Internal table passing values doubt

kabil_g
Active Participant
0 Likes
935

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>.

1 ACCEPTED SOLUTION
Read only

roberto_vacca2
Active Contributor
0 Likes
897

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

5 REPLIES 5
Read only

roberto_vacca2
Active Contributor
0 Likes
898

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

Read only

iamvivekrk
Participant
0 Likes
897

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.

Read only

kabil_g
Active Participant
0 Likes
897

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>.

Read only

0 Likes
897

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.

Read only

kabil_g
Active Participant
0 Likes
897

Solved Myself Thanks.

Closing the thread