0% found this document useful (0 votes)
663 views12 pages

Calculate and Default Wage Type Amount in Infotype 0008

This document provides steps to calculate a special allowance amount based on certain parameters and default that amount into infotype 0008 (Basic Salary) using a USER-EXIT called PBAS0001. It includes ABAP code to implement the logic in a function exit, including creating structures, reading additional infotypes, performing calculations, and defaulting the value. Subroutines are also defined to handle parts of the calculation logic.

Uploaded by

Abhishek Gupta
Copyright
© Attribution Non-Commercial (BY-NC)
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as DOCX, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
663 views12 pages

Calculate and Default Wage Type Amount in Infotype 0008

This document provides steps to calculate a special allowance amount based on certain parameters and default that amount into infotype 0008 (Basic Salary) using a USER-EXIT called PBAS0001. It includes ABAP code to implement the logic in a function exit, including creating structures, reading additional infotypes, performing calculations, and defaulting the value. Subroutines are also defined to handle parts of the calculation logic.

Uploaded by

Abhishek Gupta
Copyright
© Attribution Non-Commercial (BY-NC)
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as DOCX, PDF, TXT or read online on Scribd
You are on page 1/ 12

Calculate and Default wage type amount in infotype 0008 (Basic Salary)

By Rajesh Badita, Arshiya International Ltd

1.

Introduction

To calculate amount for wage type 1010 called special allowance based on some parameters and to default the same amount in infotype 0008 in Process After Input (PAI) Event on screen . This can be implemented through USER-EXIT PBAS0001. This user-exit is used for defaulting values or keying validations checks to transaction PA40 or PA30 for any PA or Recruitment infotypes 2. Steps

Go to CMOD transaction and create project say ZHR_PA.

Assign enhancement PBAS0001

Click on components push button and double click on function exit EXIT_SAPFP50M_002

Now double click on ZXPADU02 which is include program.

Implement ABAP logic:

Create a structure ZTBLGART as shown in below screenshot

TYPE-POOLS: abap. DATA: lw_p0000 TYPE p0000, lw_p0002 TYPE p0002, lw_p0008 TYPE p0008, lw_p0023 TYPE p0023, lv_spa TYPE pc207-betrg, gt_p0000 TYPE TABLE OF p0000, gw_p0000 TYPE p0000. DATA: lv_retirement_date LIKE p0002-gbdat. DATA: wa_0008 TYPE p0008, lv_wgetype TYPE pa0008-lga01, lv_payment TYPE t510-betrg, lv_syindex TYPE n LENGTH 2. DATA: lv_cal_begda TYPE begda, lv_cal_endda TYPE endda, lv_cnt TYPE i, gt_pa2001 TYPE TABLE OF pa2001. DATA : return TYPE bapireturn1. DATA: dy_table TYPE REF TO data, dy_line TYPE REF TO data, xfc TYPE lvc_s_fcat, ifc TYPE lvc_t_fcat. DATA : idetails TYPE abap_compdescr_tab, xdetails TYPE abap_compdescr. DATA : ref_table_des TYPE REF TO cl_abap_structdescr. DATA: lv_basic TYPE ansal_15. FIELD-SYMBOLS <fs_betrg> TYPE ztblgart. FIELD-SYMBOLS: <dyn_table> TYPE STANDARD TABLE, <dyn_wa>, <dyn_field>.

FIELD-SYMBOLS <fs_amount> TYPE ANY. FIELD-SYMBOLS: <l_betrg> TYPE pad_amt7s, <l_lgart> TYPE lgart. IF sy-tcode = 'PA40' OR sy-tcode = 'PA30'. CASE innnn-infty. WHEN '0008'. IF ( ( ipsyst-ioper EQ insert OR ipsyst-ioper EQ copy OR ipsystioper EQ 'MOD' ) OR sy-ucomm EQ 'UPD' ). DATA lv_field TYPE char40. CALL METHOD cl_hr_pnnnn_type_cast=>prelp_to_pnnnn EXPORTING prelp = innnn IMPORTING pnnnn = lw_p0008. CLEAR lv_spa. PERFORM default_spl_allow USING lw_p0008 CHANGING lv_spa. *** Finding Wage Type field number for the Wage Type 1010 DO 40 TIMES VARYING lv_wgetype FROM lw_p0008-lga01 NEXT lw_p0008-lga02. IF lv_wgetype = '1010'. lv_syindex = sy-index. CONCATENATE 'lw_p0008-bet' lv_syindex INTO lv_field. ASSIGN (lv_field) TO <fs_amount>. <fs_amount> = lv_spa. EXIT. ENDIF. ENDDO. IF lv_spa IS NOT INITIAL. * Get the structure of the table. ref_table_des ?= cl_abap_typedescr=>describe_by_name( 'ZTBLGART' ). idetails[] = ref_table_des->components[]. LOOP AT idetails INTO xdetails. CLEAR xfc. xfc-fieldname = xdetails-name . * xfc-datatype = xdetails-type_kind. CASE xdetails-type_kind. WHEN 'C'. xfc-datatype = 'CHAR'. WHEN 'N'. xfc-datatype = 'NUMC'. WHEN 'D'. xfc-datatype = 'DATE'. WHEN 'P'. xfc-datatype = 'PACK'. WHEN OTHERS. xfc-datatype = xdetails-type_kind. ENDCASE. xfc-inttype = xdetails-type_kind. xfc-intlen = xdetails-length. xfc-decimals = xdetails-decimals. APPEND xfc TO ifc.

ENDLOOP. * Create dynamic internal table and assign to FS CALL METHOD cl_alv_table_create=>create_dynamic_table EXPORTING it_fieldcatalog = ifc i_length_in_byte = 'X' IMPORTING ep_table = dy_table. ASSIGN dy_table->* TO <dyn_table>. ASSIGN ('(MP000800)TBLGART[]') TO <dyn_table>. * Create dynamic work area and assign to FS CREATE DATA dy_line LIKE LINE OF <dyn_table>. ASSIGN dy_line->* TO <dyn_wa>. LOOP AT <dyn_table> ASSIGNING <dyn_wa>. ASSIGN COMPONENT 'LGART' OF STRUCTURE <dyn_wa> TO <l_lgart>. IF <l_lgart> = '1010'. ASSIGN COMPONENT 'BETRG' OF STRUCTURE <dyn_wa> TO <l_betrg>. <l_betrg> = lv_spa. EXIT. ENDIF. ENDLOOP. CALL METHOD cl_hr_pnnnn_type_cast=>pnnnn_to_prelp EXPORTING pnnnn = lw_p0008 IMPORTING prelp = innnn. ENDIF. ENDIF. ENDCASE. ENDIF.

Subroutine logic:

*----------------------------------------------------------------------* ***INCLUDE ZXPADF02 . *----------------------------------------------------------------------* *&---------------------------------------------------------------------* *& Form DEFAULT_SPL_ALLOW *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * -->P_LW_P0008 text * <--P_LV_SPA text *----------------------------------------------------------------------* FORM default_spl_allow USING p_p0008 TYPE p0008 CHANGING p_betrg type pc207-betrg. TABLES t511. DATA: BEGIN OF lwa_wage, lgart TYPE p0008-lga01, betrg TYPE p0008-bet01, END OF lwa_wage, BEGIN OF lwa_indbw, indbw TYPE p0008-ind01, END OF lwa_indbw, BEGIN OF lwa_betrg, bet TYPE p0008-bet01, END OF lwa_betrg. DATA: lit_ptbindbw TYPE TABLE OF ptbindbw, lwa_ptbindbw TYPE ptbindbw. DATA: l_date TYPE d. DATA: BEGIN OF lt_ptbindbw OCCURS 20, seqnr(3). INCLUDE STRUCTURE ptbindbw. DATA: END OF lt_ptbindbw.

" sequence number

DATA lw_lgart TYPE lgart. DATA: lv_basic TYPE betrg, lv_hra TYPE betrg, lv_conv TYPE betrg, lv_educ TYPE betrg, lv_gross TYPE betrg, lv_car TYPE betrg, lv_med TYPE betrg, lv_food TYPE betrg, lv_attire TYPE betrg, lv_cca TYPE betrg, lv_fuel TYPE betrg, lv_lta TYPE betrg, lv_bonus TYPE betrg, lv_gratuity TYPE betrg, lv_pf TYPE betrg. DATA: gw_p0001 gw_p0007 gw_p0014 gw_p0015 DATA: gt_p0001 gt_p0007 gt_p0014 gt_p0015 TYPE p0001, TYPE p0007, TYPE p0014, TYPE p0015. TYPE TABLE OF p0001, TYPE TABLE OF p0007, TYPE TABLE OF p0014, TYPE TABLE OF p0015.

CLEAR: lv_basic, lv_hra, lv_conv, lv_educ, lv_gross, lv_car, lv_med, lv_foo d, lv_attire, lv_cca, lv_fuel, lv_lta, lv_gratuity, lv_pf, lv_bonus. REFRESH gt_p0001. CALL FUNCTION 'HR_READ_INFOTYPE' EXPORTING * TCLAS = 'A' pernr = p_p0008-pernr infty = '0001' * BEGDA = '18000101' * ENDDA = '99991231' * BYPASS_BUFFER ='' * LEGACY_MODE ='' * IMPORTING * SUBRC = TABLES infty_tab = gt_p0001 EXCEPTIONS infty_not_found = 1 OTHERS = 2 . IF sy-subrc <> 0. * MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO

WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4. ENDIF. SORT gt_p0001 DESCENDING BY endda. READ TABLE gt_p0001 INTO gw_p0001 INDEX 1.

REFRESH gt_p0007. CALL FUNCTION 'HR_READ_INFOTYPE' EXPORTING * TCLAS = 'A' pernr = p_p0008-pernr infty = '0007' * BEGDA = '18000101' * ENDDA = '99991231' * BYPASS_BUFFER ='' * LEGACY_MODE ='' * IMPORTING * SUBRC = TABLES infty_tab = gt_p0007 EXCEPTIONS infty_not_found = 1 OTHERS = 2 . IF sy-subrc <> 0. * MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO * WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4. ENDIF. SORT gt_p0007 DESCENDING BY endda. READ TABLE gt_p0007 INTO gw_p0007 INDEX 1. REFRESH lit_ptbindbw. DO 40 TIMES VARYING lwa_wage-lgart FROM p_p0008-lga01 NEXT p_p0008-lga02 VARYING lwa_indbw-indbw FROM p_p0008-ind01 NEXT p_p0008-ind02 VARYING lwa_betrg-bet FROM p_p0008-bet01 NEXT p_p0008-bet02. IF lwa_wage-lgart IS NOT INITIAL. MOVE-CORRESPONDING lwa_wage TO lwa_ptbindbw. MOVE-CORRESPONDING lwa_indbw TO lwa_ptbindbw. MOVE lwa_betrg-bet TO lwa_ptbindbw-betrg. APPEND lwa_ptbindbw TO lit_ptbindbw. ELSE. EXIT. ENDIF. ENDDO. CALL FUNCTION 'RP_EVALUATE_INDIRECTLY_P0008' EXPORTING ppernr = gw_p0001-pernr

* *

pmolga pbegda pp0001 pp0007 pp0008 IMPORTING pendda = v_endda TABLES ptbindbw EXCEPTIONS error_at_indirect_evaluation

= = = = =

'40' " gw_molga p_p0008-begda gw_p0001 gw_p0007 p_p0008

= lit_ptbindbw = 1.

CLEAR lwa_ptbindbw. READ TABLE lit_ptbindbw INTO lwa_ptbindbw WITH KEY lgart = '1002'. IF sy-subrc EQ 0. MOVE lwa_ptbindbw-betrg TO lv_basic. ENDIF. CLEAR lwa_ptbindbw. READ TABLE lit_ptbindbw INTO lwa_ptbindbw WITH KEY lgart = '1006'. IF sy-subrc EQ 0. MOVE lwa_ptbindbw-betrg TO lv_hra. ENDIF. CLEAR lwa_ptbindbw. READ TABLE lit_ptbindbw INTO lwa_ptbindbw WITH KEY lgart = '1008'. IF sy-subrc EQ 0. MOVE lwa_ptbindbw-betrg TO lv_conv. ENDIF. CLEAR lwa_ptbindbw. READ TABLE lit_ptbindbw INTO lwa_ptbindbw WITH KEY lgart = '1007'. IF sy-subrc EQ 0. MOVE lwa_ptbindbw-betrg TO lv_educ. ENDIF. CLEAR lwa_ptbindbw. READ TABLE lit_ptbindbw INTO lwa_ptbindbw WITH KEY lgart = '1005'. IF sy-subrc EQ 0. MOVE lwa_ptbindbw-betrg TO lv_med. ENDIF. CLEAR lwa_ptbindbw. READ TABLE lit_ptbindbw INTO lwa_ptbindbw WITH KEY lgart = '1012'. IF sy-subrc EQ 0. MOVE lwa_ptbindbw-betrg TO lv_food. ENDIF. CLEAR lwa_ptbindbw. READ TABLE lit_ptbindbw INTO lwa_ptbindbw WITH KEY lgart = '1015'. IF sy-subrc EQ 0. MOVE lwa_ptbindbw-betrg TO lv_fuel.

ENDIF. lv_gross = p_p0008-ansal / 12. REFRESH gt_p0015. CALL FUNCTION 'HR_READ_INFOTYPE' EXPORTING * TCLAS = 'A' pernr = p_p0008-pernr infty = '0015' * BEGDA = '18000101' * ENDDA = '99991231' * BYPASS_BUFFER ='' * LEGACY_MODE ='' * IMPORTING * SUBRC = TABLES infty_tab = gt_p0015 EXCEPTIONS infty_not_found = 1 OTHERS = 2 . IF sy-subrc <> 0. * MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO * WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4. ENDIF. LOOP AT gt_p0015 INTO gw_p0015 WHERE begda LE p_p0008-endda AND endda GE p_p0008-begda. IF gw_p0015-lgart EQ '1004' OR gw_p0015-lgart EQ '1028'. lv_lta = gw_p0015-betrg / 12. ELSEIF gw_p0015-lgart EQ '1001'. lv_bonus = gw_p0015-betrg / 12. ENDIF. ENDLOOP. lv_pf = ( lv_basic * 12 ) / 100. lv_gratuity = ( ( 15 * lv_basic ) / 26 ) / 12. p_betrg = lv_gross ( lv_basic + lv_hra + lv_conv + lv_educ + lv_med + lv_food + lv_fuel + lv_lta + lv_pf + lv_gratuity ). CALL FUNCTION 'HR_IN_ROUND_AMT' EXPORTING amount = p_betrg rndoff = '100' rndlmt = 'N' IMPORTING retamt = p_betrg * DLTAMT = .

ENDFORM. " DEFAULT_SPL_ALLOW *&---------------------------------------------------------------------* *& Form re511 *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * -->P_MOLGA text * -->P_LGART text * -->P_ENDDA text *----------------------------------------------------------------------* FORM re511 USING p_molga TYPE molga p_lgart TYPE lgart p_endda TYPE endda. IF ( t511-molga NE p_molga ) OR ( t511-lgart NE p_lgart ) OR ( t511-endda LE p_endda ) OR ( t511-begda GE p_endda ). SELECT * FROM t511 WHERE molga = p_molga AND lgart = p_lgart AND endda GE p_endda AND begda LE p_endda. ENDSELECT. IF sy-subrc NE 0. CLEAR t511. ENDIF. ENDIF. ENDFORM.

3.

Desired Result:

Go to PA30 and create infotype 0008 record for an employee

Now press enter or click on save button after entering other components like basic, hra, conveyance etc, user exit will be called and calculates special allowance component automatically based on other wage types amounts. Hence it defaults calculated amount for wage type 1010 in infotype 0008 as shown in below screenshot.

You might also like