Application Development 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: 

Dynamic ALV issue regarding filling of fieldcat

0 Kudos

Hello SAP Community,

  • My requirement is to build a Dynamic ALV in which earning, Deduction, Net value fields are to be filled dynamically through by calling FM Evaluation Class. Now the issue is internal table is filled accordingly but when I am calling call method create dynamic table, fieldcat is not filled accordingly in short I am not able to fill the dynamic Column. Hereby I am attaching the code for your reference.

And I am getting garbage values at various places. Can anybody guide me.

 LOOP AT payroll_99-inter-rt INTO wa_rt.

CALL FUNCTION 'HR_99S_GET_EVAL_CLASS_VALUE'
EXPORTING
p_molga = gv_molga
p_lgart = wa_rt-lgart
p_eval_class = '02'
p_keydate = pn-begda
* P_T512W =
IMPORTING
p_value = ev_value
* P_RETURN_CODE =
.
CLEAR:wa_amount,wa_col.
IF ev_value = '02'.
wa_amount-earnlgart = wa_rt-lgart.
wa_amount-earnbetrg = wa_amount-earnbetrg + wa_rt-betrg."amount for earning
* CLEAR:wa_rt.
IF wa_amount-earnbetrg IS NOT INITIAL.
totearn = totearn + wa_amount-earnbetrg.
MOVE-CORRESPONDING wa_final TO wa_amount.
count_earn = count_earn + 1.
COLLECT wa_amount INTO it_amount .
* CLEAR:wa_amount."add
wa_col-lgart = wa_rt-lgart.
COLLECT wa_col INTO dy_col.
CLEAR:wa_rt,wa_amount,wa_final,wa_col.
ENDIF.


ELSEIF ev_value = '04'."Deduction
wa_amount-earnlgart = wa_rt-lgart.
wa_amount-dedbetrg = wa_amount-dedbetrg + wa_rt-betrg."amount for deduction
* CLEAR:wa_rt.
* wa_col-lgart = wa_rt-lgart.
IF wa_amount-dedbetrg IS NOT INITIAL.
totded = totded + wa_amount-dedbetrg.
MOVE-CORRESPONDING wa_final TO wa_amount.
count_ded = count_ded + 1.
COLLECT wa_amount INTO it_amount .
wa_col-lgart = wa_rt-lgart.
COLLECT wa_col INTO dy_col.
CLEAR:wa_rt,wa_amount,wa_final,wa_col.
ENDIF.


ELSEIF ev_value = '06'."Deduction
wa_amount-earnlgart = wa_rt-lgart.
wa_amount-dedbetrg = wa_amount-dedbetrg + wa_rt-betrg."amount for deduction
* CLEAR:wa_rt.
* wa_col-lgart = wa_rt-lgart.
IF wa_amount-dedbetrg IS NOT INITIAL.
totded = totded + wa_amount-dedbetrg.
MOVE-CORRESPONDING wa_final TO wa_amount.
count_ded = count_ded + 1.
COLLECT wa_amount INTO it_amount .
wa_col-lgart = wa_rt-lgart.
COLLECT wa_col INTO dy_col.
CLEAR:wa_rt,wa_amount,wa_final,wa_col.
ENDIF.


ELSEIF ev_value = '08'."Deduction
wa_amount-earnlgart = wa_rt-lgart.
wa_amount-dedbetrg = wa_amount-dedbetrg + wa_rt-betrg."amount for deduction
* CLEAR:wa_rt.
* wa_col-lgart = wa_rt-lgart.
IF wa_amount-dedbetrg IS NOT INITIAL.
totded = totded + wa_amount-dedbetrg.
MOVE-CORRESPONDING wa_final TO wa_amount.
count_ded = count_ded + 1.
COLLECT wa_amount INTO it_amount .
wa_col-lgart = wa_rt-lgart.
COLLECT wa_col INTO dy_col.
CLEAR:wa_rt,wa_amount,wa_final,wa_col.
ENDIF.
ENDIF.
ENDLOOP.
wa_col-lgart = 'TE'.
* wa_col-seq = 'W1.1'.
APPEND wa_col TO dy_col.
CLEAR : wa_col.
wa_col-lgart = 'TD'.
* wa_col-seq = 'W2.1'.
APPEND wa_col TO dy_col.
CLEAR : wa_col.



LOOP AT payroll_99-inter-rt INTO wa_rt
WHERE lgart = '/560'
AND betrg IS NOT INITIAL.
wa_amount-netpay = wa_rt-betrg.
wa_amount-earnlgart = wa_rt-lgart.

MOVE-CORRESPONDING wa_final TO wa_amount.
COLLECT wa_amount INTO it_amount.
CLEAR:wa_amount.

wa_col-lgart = wa_rt-lgart.
* wa_col-seq = 'W3'.
COLLECT wa_col INTO dy_col.
CLEAR : wa_col.
CLEAR : wa_rt.
ENDLOOP.

ENDIF.

END-OF-SELECTION.
DATA:it_fieldcat TYPE lvc_t_fcat, "slis_t_fieldcat_alv,
wa_fieldcat TYPE lvc_s_fcat. " slis_fieldcat_alv.
DATA:wa_layout TYPE slis_layout_alv.

* SORT dy_col ASCENDING BY seq.
DELETE ADJACENT DUPLICATES FROM dy_col COMPARING lgart.

SELECT lgart lgtxt FROM t512t
INTO TABLE it_t512
FOR ALL ENTRIES IN dy_col
WHERE sprsl = 'E'
AND molga = '40'
AND lgart = dy_col-lgart.


LOOP AT dy_col INTO wa_col.
READ TABLE it_t512 INTO wa_t512 WITH KEY lgart = wa_col-lgart.
IF sy-subrc = 0.
wa_col-text = wa_t512-lgtxt.
TRANSLATE wa_col-text TO UPPER CASE.
REPLACE ALL OCCURRENCES OF SUBSTRING '&' IN wa_col-text WITH '_'.
REPLACE ALL OCCURRENCES OF SUBSTRING '.' IN wa_col-text WITH ''.
* REPLACE ALL OCCURRENCES OF SUBSTRING blank IN wa_col-text WITH ''.
MODIFY dy_col FROM wa_col TRANSPORTING text.
ENDIF.
IF wa_col-lgart = 'TE'.
wa_col-text = 'Total_Earning'.
MODIFY dy_col FROM wa_col TRANSPORTING text.
ELSEIF wa_col-lgart = 'TD'.
wa_col-text = 'Total_Deducation'.
MODIFY dy_col FROM wa_col TRANSPORTING text.
ENDIF.
CLEAR : wa_col,wa_t512.
ENDLOOP.

LOOP AT it_amount INTO wa_amount.
READ TABLE it_t512 INTO wa_t512 WITH KEY lgart = wa_amount-earnlgart.
IF sy-subrc = 0.
wa_amount-earnlgtxt = wa_t512-lgtxt.
TRANSLATE wa_amount-earnlgtxt TO UPPER CASE.
REPLACE ALL OCCURRENCES OF SUBSTRING '&' IN wa_amount-earnlgtxt WITH '_'.
CONDENSE wa_amount-earnlgtxt NO-GAPS.
REPLACE ALL OCCURRENCES OF SUBSTRING '.' IN wa_col-text WITH ''.
MODIFY it_amount FROM wa_amount TRANSPORTING earnlgtxt.
ENDIF.
CLEAR : wa_amount,wa_t512,wa_amount-earnlgtxt.
ENDLOOP.

* SORT dy_col ASCENDING BY seq.
PERFORM get_structure.
PERFORM create_dynamic_structure.
PERFORM alv_display.

*&---------------------------------------------------------------------*
*& Form GET_STRUCTURE
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM get_structure .
wa_layout-zebra = 'X'.
wa_layout-colwidth_optimize = 'X'.

wa_fieldcat-fieldname = 'PERNR'.
wa_fieldcat-scrtext_l = 'Personal No'.
wa_fieldcat-col_pos = 1.
APPEND wa_fieldcat TO it_fieldcat.
CLEAR wa_fieldcat.

wa_fieldcat-fieldname = 'CNAME'.
wa_fieldcat-scrtext_l = 'Full Name'.
wa_fieldcat-outputlen = '30'.
wa_fieldcat-col_pos = 2.
APPEND wa_fieldcat TO it_fieldcat.
CLEAR wa_fieldcat.

wa_fieldcat-fieldname = 'WERKS'.
wa_fieldcat-scrtext_l = 'Personal Area'.
wa_fieldcat-col_pos = 3.
APPEND wa_fieldcat TO it_fieldcat.
CLEAR wa_fieldcat.

wa_fieldcat-fieldname = 'BTRTL'.
wa_fieldcat-scrtext_l = 'Personal Sub-Area'.
wa_fieldcat-col_pos = 4.
APPEND wa_fieldcat TO it_fieldcat.
CLEAR wa_fieldcat.

wa_fieldcat-fieldname = 'ABKRS'.
wa_fieldcat-scrtext_l = 'Payroll Area'.
wa_fieldcat-col_pos = 5.
APPEND wa_fieldcat TO it_fieldcat.
CLEAR wa_fieldcat.

wa_fieldcat-fieldname = 'PERSG'.
wa_fieldcat-scrtext_l = 'Employee Group'.
wa_fieldcat-col_pos = 6.
APPEND wa_fieldcat TO it_fieldcat.
CLEAR wa_fieldcat.

wa_fieldcat-fieldname = 'PERSK'.
wa_fieldcat-scrtext_l = 'Employee Sub-Group'.
wa_fieldcat-col_pos = 7.
APPEND wa_fieldcat TO it_fieldcat.
CLEAR wa_fieldcat.

wa_fieldcat-fieldname = 'STEXT'.
wa_fieldcat-scrtext_l = 'Designation'.
wa_fieldcat-col_pos = 8.
APPEND wa_fieldcat TO it_fieldcat.
CLEAR wa_fieldcat.

wa_fieldcat-fieldname = 'HIRE_DATE'.
wa_fieldcat-scrtext_l = 'DOJ'.
wa_fieldcat-col_pos = 9.
APPEND wa_fieldcat TO it_fieldcat.
CLEAR wa_fieldcat.

wa_fieldcat-fieldname = 'BEGDA'.
wa_fieldcat-scrtext_l = 'DOL'.
wa_fieldcat-col_pos = 10.
APPEND wa_fieldcat TO it_fieldcat.
CLEAR wa_fieldcat.

wa_fieldcat-fieldname = 'EEPFM'.
wa_fieldcat-scrtext_l = 'PF No.'.
wa_fieldcat-col_pos = 11.
APPEND wa_fieldcat TO it_fieldcat.
CLEAR wa_fieldcat.

wa_fieldcat-fieldname = 'ICNUM'.
wa_fieldcat-scrtext_l = 'UAN No'.
wa_fieldcat-col_pos = 12.
APPEND wa_fieldcat TO it_fieldcat.
CLEAR wa_fieldcat.

wa_fieldcat-fieldname = 'ICNUM1'.
wa_fieldcat-scrtext_l = 'PAN No'.
wa_fieldcat-col_pos = 13.
APPEND wa_fieldcat TO it_fieldcat.
CLEAR wa_fieldcat.

wa_fieldcat-fieldname = 'ICNUM2'.
wa_fieldcat-scrtext_l = 'Aadhar No'.
wa_fieldcat-col_pos = 14.
APPEND wa_fieldcat TO it_fieldcat.
CLEAR wa_fieldcat.

wa_fieldcat-fieldname = 'BANKA'.
wa_fieldcat-scrtext_l = 'Bank Name'.
wa_fieldcat-col_pos = 15.
APPEND wa_fieldcat TO it_fieldcat.
CLEAR wa_fieldcat.

wa_fieldcat-fieldname = 'BANKN'.
wa_fieldcat-scrtext_l = 'Bank Account Number'.
wa_fieldcat-col_pos = 16.
APPEND wa_fieldcat TO it_fieldcat.
CLEAR wa_fieldcat.

wa_fieldcat-fieldname = 'ICNUM3'.
wa_fieldcat-scrtext_l = 'IFSCD code'.
wa_fieldcat-col_pos = 17.
APPEND wa_fieldcat TO it_fieldcat.
CLEAR wa_fieldcat.

* gv_num = 17.
* SORT dy_col BY lgart seq.
* LOOP AT dy_col INTO wa_col WHERE seq = 'W1'.
* gv_num = gv_num + 1.
* PERFORM create_dy_field USING wa_col-text wa_col-text.
* CLEAR : wa_col.
* ENDLOOP.
*
* wa_col = VALUE #( dy_col[ seq = 'W1.1' ] OPTIONAL ).
* IF wa_col IS NOT INITIAL.
* gv_num = gv_num + 1.
* PERFORM create_dy_field USING wa_col-text wa_col-text.
* CLEAR : wa_col.
* ENDIF.
*
* LOOP AT dy_col INTO wa_col WHERE seq = 'W2'.
* gv_num = gv_num + 1.
* PERFORM create_dy_field USING wa_col-text wa_col-text.
* CLEAR : wa_col.
* ENDLOOP.
*
* wa_col = VALUE #( dy_col[ seq = 'W2.1' ] OPTIONAL ).
* IF wa_col IS NOT INITIAL.
* gv_num = gv_num + 1.
* PERFORM create_dy_field USING wa_col-text wa_col-text.
* CLEAR : wa_col.
* ENDIF.
*
* LOOP AT dy_col INTO wa_col WHERE seq = 'W3'.
* gv_num = gv_num + 1.
* PERFORM create_dy_field USING wa_col-text wa_col-text.
* CLEAR : wa_col.
* ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form CREATE_DYNAMIC_STRUCTURE
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM create_dynamic_structure .

CALL METHOD cl_alv_table_create=>create_dynamic_table
EXPORTING
it_fieldcatalog = it_fieldcat
IMPORTING
ep_table = it_table.
ASSIGN it_table->* TO <l_table>.
CREATE DATA new_line LIKE LINE OF <l_table>.
ASSIGN new_line->* TO <dyn_wa>.

LOOP AT it_amount INTO wa_amount.

ASSIGN COMPONENT 'PERNR' OF STRUCTURE <dyn_wa> TO <l_field>.
<l_field> = wa_amount-pernr.

ASSIGN COMPONENT 'CNAME' OF STRUCTURE <dyn_wa> TO <l_field>.
<l_field> = wa_amount-cname.

ASSIGN COMPONENT 'WERKS' OF STRUCTURE <dyn_wa> TO <l_field>.
<l_field> = wa_amount-werks.

ASSIGN COMPONENT 'BTRTL' OF STRUCTURE <dyn_wa> TO <l_field>.
<l_field> = wa_amount-btrtl.

ASSIGN COMPONENT 'ABKRS' OF STRUCTURE <dyn_wa> TO <l_field>.
<l_field> = wa_amount-abkrs.

ASSIGN COMPONENT 'PERSG' OF STRUCTURE <dyn_wa> TO <l_field>.
<l_field> = wa_amount-persg.

ASSIGN COMPONENT 'PERSK' OF STRUCTURE <dyn_wa> TO <l_field>.
<l_field> = wa_amount-persk.

ASSIGN COMPONENT 'STEXT' OF STRUCTURE <dyn_wa> TO <l_field>.
<l_field> = wa_amount-stext.

ASSIGN COMPONENT 'HIRE_DATE' OF STRUCTURE <dyn_wa> TO <l_field>.
CONCATENATE wa_amount-hire_date+6(2) wa_amount-hire_date+4(2)
wa_amount-hire_date+0(4) INTO <l_field> SEPARATED BY '.'.

ASSIGN COMPONENT 'BEGDA' OF STRUCTURE <dyn_wa> TO <l_field>.
CONCATENATE wa_amount-begda+6(2) wa_amount-begda+4(2)
wa_amount-begda+0(4) INTO <l_field> SEPARATED BY '.'.

ASSIGN COMPONENT 'EEPFM' OF STRUCTURE <dyn_wa> TO <l_field>.
<l_field> = wa_amount-eepfm.

ASSIGN COMPONENT 'ICNUM' OF STRUCTURE <dyn_wa> TO <l_field>.
<l_field> = wa_amount-icnum.

ASSIGN COMPONENT 'ICNUM1' OF STRUCTURE <dyn_wa> TO <l_field>.
<l_field> = wa_amount-icnum1.

ASSIGN COMPONENT 'ICNUM2' OF STRUCTURE <dyn_wa> TO <l_field>.
<l_field> = wa_amount-icnum2.

ASSIGN COMPONENT 'BANKA' OF STRUCTURE <dyn_wa> TO <l_field>.
<l_field> = wa_amount-banka.

ASSIGN COMPONENT 'BANKN' OF STRUCTURE <dyn_wa> TO <l_field>.
<l_field> = wa_amount-bankn.

ASSIGN COMPONENT 'ICNUM3' OF STRUCTURE <dyn_wa> TO <l_field>.
<l_field> = wa_amount-icnum3.


IF wa_amount-earnbetrg IS NOT INITIAL.
READ TABLE it_fieldcat INTO wa_fieldcat WITH KEY fieldname = wa_amount-earnlgtxt.
IF sy-subrc = 0.
ASSIGN COMPONENT sy-tabix OF STRUCTURE <dyn_wa> TO <l_field>.
<l_field> = wa_amount-earnbetrg.
ENDIF.
READ TABLE it_fieldcat INTO wa_fieldcat WITH KEY fieldname = 'Total_Earning'.
IF sy-subrc = 0.
ASSIGN COMPONENT sy-tabix OF STRUCTURE <dyn_wa> TO <l_field>.
<l_field> = wa_amount-earnbetrg.
ENDIF.
* READ TABLE it_fieldcat INTO wa_fieldcat WITH KEY fieldname = 'Net_Salary'.
* IF sy-subrc = 0.
* ASSIGN COMPONENT sy-tabix OF STRUCTURE <dyn_wa> TO <l_field>.
* <l_field> = wa_amount-earnbetrg.
* ENDIF.
ENDIF.


IF wa_amount-dedbetrg IS NOT INITIAL.
READ TABLE it_fieldcat INTO wa_fieldcat WITH KEY fieldname = wa_amount-earnlgtxt.
IF sy-subrc = 0.
ASSIGN COMPONENT sy-tabix OF STRUCTURE <dyn_wa> TO <l_field>.
<l_field> = wa_amount-dedbetrg.
ENDIF.
READ TABLE it_fieldcat INTO wa_fieldcat WITH KEY fieldname = 'Total_Deducation'.
IF sy-subrc = 0.
ASSIGN COMPONENT sy-tabix OF STRUCTURE <dyn_wa> TO <l_field>.
<l_field> = wa_amount-dedbetrg.
ENDIF.
* READ TABLE it_fieldcat INTO wa_fieldcat WITH KEY fieldname = 'Net_Salary'.
* IF sy-subrc = 0.
* wa_amount-dedbetrg = wa_amount-dedbetrg * -1.
* ASSIGN COMPONENT sy-tabix OF STRUCTURE <dyn_wa> TO <l_field>.
* <l_field> = wa_amount-dedbetrg.
* ENDIF.
ENDIF.

ASSIGN COMPONENT 'netpay' OF STRUCTURE <dyn_wa> TO <l_field>.
<l_field> = wa_amount-netpay.

* CLEAR: wa_amount.
APPEND <dyn_wa> TO <l_table>.
CLEAR: <dyn_wa>.
CLEAR: wa_amount.

ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form ALV_DISPLAY
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM alv_display .
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
EXPORTING
i_callback_program = sy-repid
it_fieldcat_lvc = it_fieldcat[]
* it_events = it_events[]
* i_callback_user_command = 'USER_COMMAND'
* i_callback_pf_status_set = 'PF_STATUS'
i_save = 'X'
TABLES
t_outtab = <l_table>.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form CREATE_DY_FIELD
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_WA_COL_TEXT text
* -->P_WA_COL_TEXT text
*----------------------------------------------------------------------*
FORM create_dy_field USING VALUE(p_name) TYPE lgtxt
VALUE(name) TYPE lgtxt.
CONDENSE p_name NO-GAPS.
wa_fieldcat-fieldname = p_name.
wa_fieldcat-scrtext_l = name.
wa_fieldcat-datatype = 'P'.
wa_fieldcat-inttype = 'P'.
wa_fieldcat-intlen = 20.
wa_fieldcat-decimals = 2.
wa_fieldcat-col_pos = gv_num.
APPEND wa_fieldcat TO it_fieldcat.
CLEAR wa_fieldcat.
ENDFORM.
1 REPLY 1

ThorstenHoefer
Active Contributor
0 Kudos

Hi Jinson,

please try to generate dynamic structures and tables with the classes

CL_ABAP_STRUCTDESCR, CL_ABAP_TABLEDESCR

For the ALV output, you can use the class CL_SALV_TABLE.

Regards
Thorsten