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: 

Urgent need of code for abap hr program

Former Member
0 Kudos

Hi,

Can any one provide with coding to calculate the leave balance for employee

for a given period. Its very urgent.

Thanks in advance,

Subha

1 ACCEPTED SOLUTION

Former Member
0 Kudos

Hi

See this sample code for calculation of absence quota

using 2001 and 2006 infotypes

make changes as per your requirement

REPORT zh_absence_quota

NO STANDARD PAGE HEADING

MESSAGE-ID zh_msg

LINE-SIZE 169

LINE-COUNT 60(1).

************************************************************************

  • T A B L E S D E C L A R A T I O N S

************************************************************************

TABLES: pernr, " Logical PNP

t001p, " Personnel Subarea

t529u, " Employment Status

t500p, " Personnel Area

t501, " Employee Group

t503k, " Employee Subgroup

t549a, " Payroll Area

t554s, " Absence Type

t554t, " Absence Type Texts

t556a, " Quota Type

t527x, " Orgn. Unit

t556b, " Quota Type Text

pa0003. " Payroll Status

INFOTYPES:

0000, " Actions

0001, " Organizational Assignment

2006, " Absence Quota

2001. " Absences

************************************************************************

  • T Y P E S D E C L A R A T I O N S

************************************************************************

  • Employee Absence Structure

TYPES: BEGIN OF s_2001,

pernr TYPE persno, " Personal Number

awart TYPE awart, " Absence Type

subty TYPE subty, " Sub Type

endda TYPE endda, " End date

begda TYPE begda, " Begin date

abrtg TYPE abrtg, " Absence days

ename TYPE emnam, " employee Name

atext TYPE abwtxt, " Absence Type Text

END OF s_2001.

  • Employee Absence Quota Structure

TYPES: BEGIN OF s_2006,

pernr TYPE persno, " Personal Number

ktart TYPE abwko, " Absence Quota Type

year(4) TYPE n, " Year

subty TYPE subty, " Sub Type

endda TYPE endda, " End date

begda TYPE begda, " Begin date

anzhl TYPE ptm_quonum, " Absence Entitlement days

ename TYPE emnam, " employee Name

ktext TYPE kotxt, " Absence Type Text

kverb TYPE kverb, " Deduction Quota days

anzhb TYPE ptm_quonum, " Balance days

END OF s_2006.

  • Combined Employee Absence and Quota Structure

TYPES: BEGIN OF s_rep,

pernr TYPE persno, " Personal Number

ktart TYPE abwko, " Absence Quota Type

year(4) TYPE n, " Year

anzhl TYPE ptm_quonum, " Absence Entitlement days

kverb TYPE kverb, " Deduction Quota days

anzhb TYPE ptm_quonum, " Balance days

ktext TYPE kotxt, " Quota Type Text

awart TYPE awart, " Absence Type

abrtg TYPE abrtg, " Absence days

ename TYPE emnam, " employee Name

atext TYPE abwtxt, " Absence Type Text

endda TYPE endda, " End date

begda TYPE begda, " Begin date

END OF s_rep.

***********************************************************************

  • Declaration of Variables

***********************************************************************

DATA : gv_atext TYPE abwtxt, " Absence Type Text

gv_ktext TYPE kotxt, " Absence Type Text

gv_title1 TYPE sylisel, " Report title

gv_year(4) TYPE c, " Year

gv_mon(2) TYPE c, " Month

gv_hrs TYPE abwtg, " Hours

gv_date TYPE sydatum, " Date

gv_date1 TYPE sydatum, " Date

gv_dial. " Color flag

***********************************************************************

  • Declaration of Constants

***********************************************************************

CONSTANTS :

c_x TYPE c VALUE 'X', " Sign

c_1 TYPE persg VALUE '1', " Emp Group

c_pernr(8) TYPE n VALUE '00000000', " Pernr

c_moabw TYPE moabw VALUE '01', " Per SA Grouping

c_mozko TYPE mozko VALUE '01', " Per SA Grouping

c_mopgk TYPE mopgk VALUE '1', " Emp SGrp Grouping

c_endda TYPE sydatum VALUE '99991231', " End Date

c_val1(2) TYPE c VALUE '31', " Date Type

c_val2(2) TYPE c VALUE '12', " Date Type

c_val LIKE p0041-dar01 VALUE '01', " Date Type

c_date1 LIKE sy-datum VALUE '18000101'. " Date

************************************************************************

  • I N T E R N A L T A B L E S D E C L A R A T I O N S

************************************************************************

DATA: i_2001 TYPE STANDARD TABLE OF s_2001 WITH HEADER LINE,

i_2006 TYPE STANDARD TABLE OF s_2006 WITH HEADER LINE,

i_rep1 TYPE STANDARD TABLE OF s_2006 WITH HEADER LINE,

i_rep TYPE STANDARD TABLE OF s_rep WITH HEADER LINE.

************************************************************************

  • S E L E C T I O N S C R E E N

************************************************************************

SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE text-001.

SELECT-OPTIONS: s_ktart FOR t556a-ktart, " Absence Quota Type

s_awart FOR t554s-subty. " Absence Type

SELECTION-SCREEN END OF BLOCK b1.

SELECTION-SCREEN BEGIN OF BLOCK b2 WITH FRAME TITLE text-002.

SELECTION-SCREEN BEGIN OF LINE.

SELECTION-SCREEN COMMENT 1(33) text-003. " Quota & Absence

PARAMETERS: p_qa RADIOBUTTON GROUP rb1.

SELECTION-SCREEN END OF LINE.

SELECTION-SCREEN BEGIN OF LINE.

SELECTION-SCREEN COMMENT 1(33) text-004. " Quota

PARAMETERS: p_q RADIOBUTTON GROUP rb1.

SELECTION-SCREEN END OF LINE.

SELECTION-SCREEN BEGIN OF LINE.

SELECTION-SCREEN COMMENT 1(33) text-005. " Absence

PARAMETERS: p_a RADIOBUTTON GROUP rb1.

SELECTION-SCREEN END OF LINE.SELECTION-SCREEN END OF BLOCK b2.

************************************************************************

  • I N I T I A L I Z A T I O N *

************************************************************************

INITIALIZATION.

************************************************************************

  • A T S E L E C T I O N - S C R E E N *

************************************************************************

AT SELECTION-SCREEN.

  • Validate the screen fields

PERFORM validate_screen.

************************************************************************

  • S T A R T - O F - S E L E C T I O N *

************************************************************************

START-OF-SELECTION.

  • Selection of Period

PERFORM get_period.

  • Get PERNR from LDB

GET pernr.

IF p0000-stat2 <> '0'.

  • Get the data from PA0001,PA2001, PA2006

PERFORM get_pers_data.

ENDIF.

************************************************************************

  • T O P - O F - P A G E *

************************************************************************

TOP-OF-PAGE.

  • Header of the List

PERFORM header.

************************************************************************

  • E N D - O F - P A G E *

************************************************************************

  • Footer

END-OF-PAGE.

IF p_qa = c_x.

  • Display both Absence and Quota Data

WRITE /1(188) sy-uline.

ELSEIF p_q = c_x.

  • Display only Quota Data

WRITE /1(114) sy-uline.

ELSEIF p_a = c_x.

  • Display only Absence Data

WRITE /1(125) sy-uline.

ENDIF.

************************************************************************

  • E N D - O F - S E L E C T I O N *

************************************************************************

END-OF-SELECTION.

  • Combine the Absence and Quota Data

PERFORM append_data.

IF p_qa = c_x.

  • Display both Absence and Quota Data

PERFORM display_qa_data.

ELSEIF p_q = c_x.

  • Display only Quota Data

PERFORM display_q_data.

ELSEIF p_a = c_x.

  • Display only Absence Data

PERFORM display_a_data.

ENDIF.

&----


*& Form validate_screen

&----


  • Validation of Selection Screen fields

----


FORM validate_screen .

  • Validation of Personnel Number

CLEAR pa0003.

IF NOT pnppernr[] IS INITIAL.

SELECT pernr

FROM pa0003 UP TO 1 ROWS

INTO pa0003-pernr

WHERE pernr IN pnppernr.

ENDSELECT.

IF sy-subrc <> 0.

MESSAGE e999 WITH 'Incorrect Personnel Number'(006).

ENDIF.

ENDIF.

  • Validation of Employee Status

CLEAR t529u.

IF NOT pnpstat2[] IS INITIAL.

SELECT SINGLE statv

INTO t529u-statv

FROM t529u

WHERE statv IN pnpstat2 AND

statn = '2' AND

sprsl = sy-langu.

IF sy-subrc <> 0.

MESSAGE e999 WITH 'Invalid Employee Status'(007).

ENDIF.

ENDIF.

  • Validation of Personnel Area

CLEAR t500p.

IF NOT pnpwerks[] IS INITIAL.

SELECT persa

FROM t500p UP TO 1 ROWS

INTO t500p-persa

WHERE persa IN pnpwerks.

ENDSELECT.

IF sy-subrc <> 0.

MESSAGE e999 WITH 'Incorrect Personnel Area'(008).

ENDIF.

ENDIF.

  • Validation of Personnel Sub Area

CLEAR t001p.

IF NOT pnpbtrtl[] IS INITIAL.

SELECT btrtl

FROM t001p UP TO 1 ROWS

INTO t001p-btrtl

WHERE btrtl IN pnpbtrtl.

ENDSELECT.

IF sy-subrc <> 0.

MESSAGE e999 WITH 'Incorrect Personnel Sub Area'(009).

ENDIF.

ENDIF.

  • Validation of Employee Group

CLEAR t501.

IF NOT pnppersg[] IS INITIAL.

SELECT persg

FROM t501 UP TO 1 ROWS

INTO t501-persg

WHERE persg IN pnppersg.

ENDSELECT.

IF sy-subrc <> 0.

MESSAGE e999 WITH 'Incorrect Employee Group'(010).

ENDIF.

ENDIF.

  • Validation of Employee Sub Group

CLEAR t503k.

IF NOT pnppersk[] IS INITIAL.

SELECT persk

FROM t503k UP TO 1 ROWS

INTO t503k-persk

WHERE persk IN pnppersk.

ENDSELECT.

IF sy-subrc <> 0.

MESSAGE e999 WITH 'Incorrect Employee Sub Group'(011).

ENDIF.

ENDIF.

  • Validation of Payroll Area

CLEAR t549a.

IF NOT pnpabkrs[] IS INITIAL.

SELECT abkrs

FROM t549a UP TO 1 ROWS

INTO t549a-abkrs

WHERE abkrs IN pnpabkrs.

ENDSELECT.

IF sy-subrc <> 0.

MESSAGE e999 WITH 'Incorrect Employee Payroll Area'(026).

ENDIF.

ENDIF.

  • Validation of Absence Type

CLEAR t554s.

IF NOT s_awart[] IS INITIAL.

SELECT subty

FROM t554s UP TO 1 ROWS

INTO t554s-subty

WHERE subty IN s_awart AND

moabw EQ c_moabw AND

endda EQ c_endda.

ENDSELECT.

IF sy-subrc <> 0.

MESSAGE e999 WITH 'Incorrect Employee Absence Type'(012).

ENDIF.

ENDIF.

  • Validation of Absence Quota Type

CLEAR t556a.

IF NOT s_ktart[] IS INITIAL.

SELECT ktart

FROM t556a UP TO 1 ROWS

INTO t556a-ktart

WHERE ktart IN s_ktart AND

mopgk EQ c_mopgk AND

mozko EQ c_mozko AND

endda EQ c_endda.

ENDSELECT.

IF sy-subrc <> 0.

MESSAGE e999 WITH 'Incorrect Employee Quota Type'(013).

ENDIF.

ENDIF.

ENDFORM. "validate_screen

&----


*& Form get_period

&----


  • Get the Correct Period based on Selection screen selection

----


FORM get_period.

CLEAR: gv_year,gv_mon, gv_date, gv_date1.

gv_year = sy-datum+0(4).

gv_mon = sy-datum+4(2).

IF pnptimr1 = c_x. " Current Date

pnpbegda = sy-datum.

pnpendda = sy-datum.

ELSEIF pnptimr2 = c_x. " Current Month

CONCATENATE gv_year gv_mon c_val INTO gv_date.

CONCATENATE gv_year gv_mon c_val1 INTO gv_date1.

pnpbegda = gv_date.

pnpendda = gv_date1.

ELSEIF pnptimr3 = c_x. " Current Year

CONCATENATE gv_year c_val c_val INTO gv_date.

CONCATENATE gv_year c_val2 c_val1 INTO gv_date1.

pnpbegda = gv_date.

pnpendda = gv_date1.

ELSEIF pnptimr4 = c_x. " Upto Today

pnpbegda = c_date1.

pnpendda = sy-datum.

ELSEIF pnptimr5 = c_x. " From Today

pnpbegda = sy-datum.

pnpendda = c_endda.

ELSE.

IF ( pnpbegda IS INITIAL AND pnpendda IS INITIAL ).

pnpbegda = c_date1.

pnpendda = c_endda.

ELSEIF pnpbegda IS INITIAL AND NOT pnpendda IS INITIAL.

pnpbegda = c_date1.

pnpendda = pnpendda.

ELSEIF NOT ( pnpbegda IS INITIAL AND pnpendda IS INITIAL ).

pnpbegda = pnpbegda.

pnpendda = pnpendda.

ENDIF.

ENDIF.

ENDFORM. "get_period

&----


*& Form get_pers_data

&----


  • Get the Absence and Quota Data from PA0001,PA2001,PA2006

----


FORM get_pers_data.

DATA: lv_year1(4) TYPE n,

lv_year2(4) TYPE n,

lv_date1 TYPE sydatum,

lv_date2 TYPE sydatum,

lv_anzhb TYPE ptm_quonum. " Last Year Balance days

  • Get data from Respective Infotypes

rp_provide_from_last p0001 space pnpbegda pnpendda.

  • Absence Data

LOOP AT p2001 WHERE pernr = pernr-pernr AND

begda GE pnpbegda AND

endda LE pnpendda.

IF p2001-awart IN s_awart.

i_2001-pernr = pernr-pernr.

i_2001-subty = p2001-subty.

i_2001-awart = p2001-awart.

i_2001-abrtg = p2001-abrtg.

i_2001-begda = p2001-begda.

i_2001-endda = p2001-endda.

READ TABLE p0001 WITH KEY pernr = p2001-pernr.

i_2001-ename = p0001-ename.

  • Get the Absence Type Text

CLEAR gv_atext.

SELECT SINGLE atext INTO gv_atext FROM t554t

WHERE sprsl = sy-langu AND

moabw = c_moabw AND

awart = p2001-awart.

IF sy-subrc = 0.

i_2001-atext = gv_atext.

ENDIF.

APPEND i_2001.

CLEAR i_2001.

ENDIF.

ENDLOOP.

  • Quota Data

LOOP AT p2006 WHERE pernr = pernr-pernr AND

begda GE pnpbegda AND

endda LE pnpendda.

IF p2006-ktart IN s_ktart.

i_2006-pernr = pernr-pernr.

i_2006-subty = p2006-subty.

i_2006-begda = p2006-begda.

i_2006-endda = p2006-endda.

i_2006-year = p2006-endda+0(4).

i_2006-ktart = p2006-ktart.

i_2006-anzhl = p2006-anzhl.

i_2006-kverb = p2006-kverb.

i_2006-anzhb = p2006-anzhl - p2006-kverb.

READ TABLE p0001 WITH KEY pernr = p2001-pernr.

i_2006-ename = p0001-ename.

  • Get the Quota Type Text

CLEAR gv_ktext.

SELECT SINGLE ktext INTO gv_ktext FROM t556b

WHERE sprsl = sy-langu AND

mopgk = c_mopgk AND

mozko = c_mozko AND

ktart = p2006-ktart.

IF sy-subrc = 0.

i_2006-ktext = gv_ktext.

ENDIF.

APPEND i_2006.

CLEAR i_2006.

ENDIF.

ENDLOOP.

  • For Vacation Quota (80) get the Balance of the Last Year and

  • add to the Current Year Quota

LOOP AT i_2006.

IF i_2006-ktart = '80'.

lv_year1 = i_2006-endda+0(4).

lv_year2 = lv_year1 - 1.

CONCATENATE lv_year2 '01' '01' INTO lv_date1.

CONCATENATE lv_year2 '12' '31' INTO lv_date2.

LOOP AT p2006 WHERE pernr = i_2006-pernr AND

begda GE lv_date1 AND

endda LE lv_date2 AND

ktart = '80'.

lv_anzhb = p2006-anzhl - p2006-kverb.

i_rep1-pernr = i_2006-pernr.

i_rep1-ktext = i_2006-ktext.

i_rep1-anzhl = p2006-anzhl.

i_rep1-kverb = p2006-kverb.

i_rep1-ename = i_2006-ename.

i_rep1-begda = p2006-begda.

i_rep1-endda = p2006-endda.

i_rep1-anzhb = lv_anzhb.

i_rep1-ktart = '80'.

i_rep1-year = lv_year2.

APPEND i_rep1.

CLEAR: i_rep1.

ENDLOOP.

ENDIF.

CLEAR: lv_year1, lv_year2,

lv_date1, lv_date2,lv_anzhb.

ENDLOOP.

SORT i_rep1 BY pernr ktart.

ENDFORM. "get_pers_data

&----


*& Form append_data

&----


  • Put the Absence and Quota Data into one Report Int Table

----


FORM append_data.

CLEAR: i_rep.

REFRESH: i_rep.

SORT i_2001 BY pernr awart.

SORT i_2006 BY pernr ktart year.

  • Move I_REP1 data into i_2006

LOOP AT i_rep1.

MOVE-CORRESPONDING i_rep1 TO i_2006.

APPEND i_2006.

CLEAR i_2006.

ENDLOOP.

  • Move the Absence and Quota Data into a final Int Table

LOOP AT i_2006.

i_rep-pernr = i_2006-pernr.

i_rep-ename = i_2006-ename.

i_rep-ktart = i_2006-ktart.

i_rep-anzhl = i_2006-anzhl.

i_rep-kverb = i_2006-kverb.

i_rep-ktext = i_2006-ktext.

i_rep-anzhb = i_2006-anzhb.

i_rep-year = i_2006-year.

CLEAR i_2001.

CASE i_2006-ktart.

WHEN '81'.

PERFORM get_2001 USING i_2006-pernr '1000' i_2006-year.

WHEN '50'.

PERFORM get_2001 USING i_2006-pernr '1002' i_2006-year.

WHEN '80'.

PERFORM get_2001 USING i_2006-pernr '1001' i_2006-year.

WHEN '56'.

PERFORM get_2001 USING i_2006-pernr '1003' i_2006-year.

WHEN '51'.

PERFORM get_2001 USING i_2006-pernr '1004' i_2006-year.

WHEN '52'.

PERFORM get_2001 USING i_2006-pernr '1005' i_2006-year.

WHEN '54'.

PERFORM get_2001 USING i_2006-pernr '1006' i_2006-year.

WHEN '53'.

PERFORM get_2001 USING i_2006-pernr '1007' i_2006-year.

WHEN '55'.

PERFORM get_2001 USING i_2006-pernr '1008' i_2006-year.

WHEN '57'.

PERFORM get_2001 USING i_2006-pernr '1009' i_2006-year.

WHEN '90'.

PERFORM get_2001 USING i_2006-pernr '2000' i_2006-year.

WHEN '58'.

PERFORM get_2001 USING i_2006-pernr '2001' i_2006-year.

WHEN '59'.

PERFORM get_2001 USING i_2006-pernr '2002' i_2006-year.

WHEN '91'.

PERFORM get_2001 USING i_2006-pernr '2003' i_2006-year.

ENDCASE.

IF sy-subrc <> 0.

APPEND i_rep.

ENDIF.

CLEAR i_rep.

ENDLOOP.

SORT i_rep BY pernr ktart year.

DELETE i_rep WHERE pernr = ' '.

ENDFORM. " append_data

&----


*& Form display_qa_data

&----


  • Display the Absence and Quota Data

----


FORM display_qa_data.

DATA: lv_flag, " New Flag

lv_tot2 TYPE ptm_quonum. " Absence Balance days

IF i_rep[] IS INITIAL.

MESSAGE i000 WITH 'No Data found'(014).

ELSE.

LOOP AT i_rep.

  • toggle color

PERFORM toggle_color.

IF lv_flag <> space.

NEW-LINE.

ENDIF.

AT NEW pernr.

READ TABLE i_rep INDEX sy-tabix.

WRITE:/1 sy-vline,2(8) i_rep-pernr,

10 sy-vline,11(40) i_rep-ename.

ENDAT.

AT NEW ktart.

READ TABLE i_rep INDEX sy-tabix.

WRITE: 1 sy-vline, 10 sy-vline,

51 sy-vline,52(25) i_rep-ktext.

ENDAT.

AT NEW year.

READ TABLE i_rep INDEX sy-tabix.

WRITE: 1 sy-vline, 10 sy-vline,

51 sy-vline,

77 sy-vline, 78(4) i_rep-year,

82 sy-vline, 83(11) i_rep-anzhl,

94 sy-vline, 95(25) i_rep-atext,

120 sy-vline,133 sy-vline,

144 sy-vline,

155 sy-vline,156(13) i_rep-anzhb,

169 sy-vline.

lv_tot2 = lv_tot2 + i_rep-anzhb.

ENDAT.

WRITE: 1 sy-vline, 10 sy-vline,

51 sy-vline, 77 sy-vline,

82 sy-vline, 94 sy-vline,

120 sy-vline,121(12) i_rep-abrtg NO-ZERO,

133 sy-vline,134(10) i_rep-begda NO-ZERO,

144 sy-vline,145(10) i_rep-endda NO-ZERO,

155 sy-vline,169 sy-vline.

NEW-LINE.

AT END OF pernr.

WRITE : /1(169) sy-uline.

SUM.

FORMAT COLOR 3.

WRITE:/1 sy-vline, 10 sy-vline,

51 sy-vline, 77 sy-vline,

82 sy-vline, 94 sy-vline,

120 sy-vline,121(12) i_rep-abrtg,

133 sy-vline,144 sy-vline,

155 sy-vline, 156(13) lv_tot2,

169 sy-vline.

FORMAT COLOR OFF.

WRITE : /1(169) sy-uline.

CLEAR lv_tot2.

ENDAT.

ENDLOOP.

ENDIF.

ENDFORM. " display_qa_data

&----


*& Form display_q_data

&----


  • Display only the Quota Data

----


FORM display_q_data.

DATA: lv_flag. " New Flag

SORT i_2006 BY pernr ktart year.

IF i_2006[] IS INITIAL.

MESSAGE i000 WITH 'No Data found'(014).

ELSE.

LOOP AT i_2006.

  • Toggle Color

PERFORM toggle_color.

IF lv_flag <> space.

NEW-LINE.

ENDIF.

AT NEW pernr.

READ TABLE i_2006 INDEX sy-tabix.

WRITE: /1 sy-vline, 2(8) i_2006-pernr,

10 sy-vline,11(40) i_2006-ename.

ENDAT.

AT NEW ktart.

READ TABLE i_2006 INDEX sy-tabix.

WRITE: 1 sy-vline,10 sy-vline,

51 sy-vline,52(25) i_2006-ktext.

ENDAT.

AT NEW year.

READ TABLE i_2006 INDEX sy-tabix.

WRITE: 1 sy-vline, 10 sy-vline,

51 sy-vline,

77 sy-vline,78(4) i_2006-year,

82 sy-vline,83(11) i_2006-anzhl,

94 sy-vline,95(13) i_2006-anzhb,

108 sy-vline.

NEW-LINE.

ENDAT.

AT END OF pernr.

WRITE : /1(108) sy-uline.

SUM.

FORMAT COLOR 3.

WRITE: /1 sy-vline, 10 sy-vline,

51 sy-vline,

77 sy-vline, 82 sy-vline,

94 sy-vline, 95(13) i_2006-anzhb,

108 sy-vline.

FORMAT COLOR OFF.

WRITE : /1(108) sy-uline.

ENDAT.

ENDLOOP.

ENDIF.

ENDFORM. " display_q_data

&----


*& Form display_a_data

&----


  • Display Only the Absence Quota

----


FORM display_a_data.

DATA: lv_flag. " New Flag

SORT i_2001 BY pernr awart.

IF i_2001[] IS INITIAL.

MESSAGE i000 WITH 'No Data found'(014).

ELSE.

LOOP AT i_2001.

  • Toggle Color

PERFORM toggle_color.

IF lv_flag <> space.

NEW-LINE.

ENDIF.

AT NEW pernr.

READ TABLE i_2001 INDEX sy-tabix.

WRITE: /1 sy-vline, 2(10) i_2001-pernr,

10 sy-vline,11(40) i_2001-ename.

ENDAT.

WRITE: 1 sy-vline, 10 sy-vline,

51 sy-vline,52(25) i_2001-atext,

77 sy-vline,78(12) i_2001-abrtg,

90 sy-vline,91(10) i_2001-begda,

101 sy-vline,102(10) i_2001-endda,

112 sy-vline.

NEW-LINE.

AT END OF pernr.

WRITE : /1(112) sy-uline.

SUM.

FORMAT COLOR 3.

WRITE: /1 sy-vline, 10 sy-vline,

51 sy-vline,

77 sy-vline,78(12) i_2001-abrtg,

90 sy-vline,101 sy-vline,

112 sy-vline.

FORMAT COLOR OFF.

WRITE : /1(112) sy-uline.

ENDAT.

ENDLOOP.

ENDIF.

ENDFORM. " display_a_data

&----


*& Form header

&----


  • Write the Report Header

----


FORM header .

data : lv_pers type pbtxt,

lv_orgn type orgtx.

gv_title1 = sy-title. " Set List Header

IF p_qa = c_x.

NEW-PAGE LINE-SIZE 193.

ELSEIF p_a = c_x.

NEW-PAGE LINE-SIZE 125.

ELSEIF p_q = c_x.

NEW-PAGE LINE-SIZE 119.

ENDIF.

  • Standard header

FORMAT RESET.

CALL FUNCTION 'Z_STANDARD_HEADER'

EXPORTING

title1 = gv_title1.

  • Get the Personal Area and Org.Unit Texts

clear : lv_pers,lv_orgn.

select single name1 into lv_pers

from t500p where persa = pnpwerks-low.

select single orgtx into lv_orgn

from t527x where sprsl = sy-langu and

orgeh = pnporgeh-low and

endda = c_endda.

if not lv_pers is initial.

write : /2 'Personal Area:'(017), 17(25) lv_pers color 7.

endif.

if not lv_orgn is initial.

write : /2 'Organization Unit:'(021), 20(25) lv_orgn color 3.

endif.

IF p_qa = c_x.

FORMAT COLOR COL_HEADING.

WRITE : /1(169) sy-uline.

WRITE:/1 sy-vline,2(8) 'Emp.No'(015) CENTERED,

10 sy-vline,11(40) 'Employee Name'(016) CENTERED,

51 sy-vline,52(25) 'Quota Description'(018) CENTERED,

77 sy-vline,78(4) 'Year'(027),

82 sy-vline,83(11) 'Entitlement'(019),

94 sy-vline,95(25) 'Absence Description'(022) CENTERED,

120 sy-vline,121(12) 'Absence days'(023),

133 sy-vline,134(10) 'From Date'(024),

144 sy-vline,145(10) 'To Date'(025),

155 sy-vline,156(13) 'Quota Balance'(020),

169 sy-vline.

WRITE : /1(169) sy-uline.

ELSEIF p_q = c_x.

FORMAT COLOR COL_HEADING.

WRITE : /1(108) sy-uline.

WRITE:/1 sy-vline,2(8) 'Emp.No'(015) CENTERED,

10 sy-vline,11(40) 'Employee Name'(016) CENTERED,

51 sy-vline,52(25) 'Quota Description'(018) CENTERED,

77 sy-vline,78(4) 'Year'(027),

82 sy-vline,83(11) 'Entitlement'(019),

94 sy-vline,95(13) 'Quota Balance'(020),

108 sy-vline.

WRITE : /1(108) sy-uline.

ELSEIF p_a = c_x.

FORMAT COLOR COL_HEADING.

WRITE : /1(112) sy-uline.

WRITE:/1 sy-vline,2(8) 'Emp.No'(015) CENTERED,

10 sy-vline,11(40) 'Employee Name'(016) CENTERED,

51 sy-vline,52(25) 'Absence Description'(022) CENTERED,

77 sy-vline,78(12) 'Absence days'(023),

90 sy-vline,91(10) 'From Date'(024),

101 sy-vline,102(10) 'To Date'(025),

112 sy-vline.

WRITE : /1(112) sy-uline.

ENDIF.

ENDFORM. " header

&----


*& Form toggle_color

&----


  • This routine alters the color of the records in the list

----


FORM toggle_color.

IF gv_dial = space.

FORMAT COLOR COL_NORMAL INTENSIFIED OFF.

gv_dial = c_x.

ELSE.

FORMAT COLOR 1 INTENSIFIED OFF.

CLEAR gv_dial.

ENDIF.

ENDFORM. " toggle_color

&----


*& Form get_2001

&----


  • Get the ABsence type for each Quota type

----


FORM get_2001 USING p_pernr TYPE persno

p_value TYPE awart

p_year.

LOOP AT i_2001 WHERE pernr = p_pernr AND

awart = p_value AND

endda+0(4) = p_year.

i_rep-awart = i_2001-awart.

i_rep-abrtg = i_2001-abrtg.

i_rep-atext = i_2001-atext.

i_rep-begda = i_2001-begda.

i_rep-endda = i_2001-endda.

APPEND i_rep.

ENDLOOP.

ENDFORM. " get_2001

<b>

Reward points for useful Answers</b>

Regards

Anji

2 REPLIES 2

Former Member
0 Kudos

Hi,

Check the following link:

http://www.sap-img.com/sap-hr.htm

Regards,

Bhaskar

Former Member
0 Kudos

Hi

See this sample code for calculation of absence quota

using 2001 and 2006 infotypes

make changes as per your requirement

REPORT zh_absence_quota

NO STANDARD PAGE HEADING

MESSAGE-ID zh_msg

LINE-SIZE 169

LINE-COUNT 60(1).

************************************************************************

  • T A B L E S D E C L A R A T I O N S

************************************************************************

TABLES: pernr, " Logical PNP

t001p, " Personnel Subarea

t529u, " Employment Status

t500p, " Personnel Area

t501, " Employee Group

t503k, " Employee Subgroup

t549a, " Payroll Area

t554s, " Absence Type

t554t, " Absence Type Texts

t556a, " Quota Type

t527x, " Orgn. Unit

t556b, " Quota Type Text

pa0003. " Payroll Status

INFOTYPES:

0000, " Actions

0001, " Organizational Assignment

2006, " Absence Quota

2001. " Absences

************************************************************************

  • T Y P E S D E C L A R A T I O N S

************************************************************************

  • Employee Absence Structure

TYPES: BEGIN OF s_2001,

pernr TYPE persno, " Personal Number

awart TYPE awart, " Absence Type

subty TYPE subty, " Sub Type

endda TYPE endda, " End date

begda TYPE begda, " Begin date

abrtg TYPE abrtg, " Absence days

ename TYPE emnam, " employee Name

atext TYPE abwtxt, " Absence Type Text

END OF s_2001.

  • Employee Absence Quota Structure

TYPES: BEGIN OF s_2006,

pernr TYPE persno, " Personal Number

ktart TYPE abwko, " Absence Quota Type

year(4) TYPE n, " Year

subty TYPE subty, " Sub Type

endda TYPE endda, " End date

begda TYPE begda, " Begin date

anzhl TYPE ptm_quonum, " Absence Entitlement days

ename TYPE emnam, " employee Name

ktext TYPE kotxt, " Absence Type Text

kverb TYPE kverb, " Deduction Quota days

anzhb TYPE ptm_quonum, " Balance days

END OF s_2006.

  • Combined Employee Absence and Quota Structure

TYPES: BEGIN OF s_rep,

pernr TYPE persno, " Personal Number

ktart TYPE abwko, " Absence Quota Type

year(4) TYPE n, " Year

anzhl TYPE ptm_quonum, " Absence Entitlement days

kverb TYPE kverb, " Deduction Quota days

anzhb TYPE ptm_quonum, " Balance days

ktext TYPE kotxt, " Quota Type Text

awart TYPE awart, " Absence Type

abrtg TYPE abrtg, " Absence days

ename TYPE emnam, " employee Name

atext TYPE abwtxt, " Absence Type Text

endda TYPE endda, " End date

begda TYPE begda, " Begin date

END OF s_rep.

***********************************************************************

  • Declaration of Variables

***********************************************************************

DATA : gv_atext TYPE abwtxt, " Absence Type Text

gv_ktext TYPE kotxt, " Absence Type Text

gv_title1 TYPE sylisel, " Report title

gv_year(4) TYPE c, " Year

gv_mon(2) TYPE c, " Month

gv_hrs TYPE abwtg, " Hours

gv_date TYPE sydatum, " Date

gv_date1 TYPE sydatum, " Date

gv_dial. " Color flag

***********************************************************************

  • Declaration of Constants

***********************************************************************

CONSTANTS :

c_x TYPE c VALUE 'X', " Sign

c_1 TYPE persg VALUE '1', " Emp Group

c_pernr(8) TYPE n VALUE '00000000', " Pernr

c_moabw TYPE moabw VALUE '01', " Per SA Grouping

c_mozko TYPE mozko VALUE '01', " Per SA Grouping

c_mopgk TYPE mopgk VALUE '1', " Emp SGrp Grouping

c_endda TYPE sydatum VALUE '99991231', " End Date

c_val1(2) TYPE c VALUE '31', " Date Type

c_val2(2) TYPE c VALUE '12', " Date Type

c_val LIKE p0041-dar01 VALUE '01', " Date Type

c_date1 LIKE sy-datum VALUE '18000101'. " Date

************************************************************************

  • I N T E R N A L T A B L E S D E C L A R A T I O N S

************************************************************************

DATA: i_2001 TYPE STANDARD TABLE OF s_2001 WITH HEADER LINE,

i_2006 TYPE STANDARD TABLE OF s_2006 WITH HEADER LINE,

i_rep1 TYPE STANDARD TABLE OF s_2006 WITH HEADER LINE,

i_rep TYPE STANDARD TABLE OF s_rep WITH HEADER LINE.

************************************************************************

  • S E L E C T I O N S C R E E N

************************************************************************

SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE text-001.

SELECT-OPTIONS: s_ktart FOR t556a-ktart, " Absence Quota Type

s_awart FOR t554s-subty. " Absence Type

SELECTION-SCREEN END OF BLOCK b1.

SELECTION-SCREEN BEGIN OF BLOCK b2 WITH FRAME TITLE text-002.

SELECTION-SCREEN BEGIN OF LINE.

SELECTION-SCREEN COMMENT 1(33) text-003. " Quota & Absence

PARAMETERS: p_qa RADIOBUTTON GROUP rb1.

SELECTION-SCREEN END OF LINE.

SELECTION-SCREEN BEGIN OF LINE.

SELECTION-SCREEN COMMENT 1(33) text-004. " Quota

PARAMETERS: p_q RADIOBUTTON GROUP rb1.

SELECTION-SCREEN END OF LINE.

SELECTION-SCREEN BEGIN OF LINE.

SELECTION-SCREEN COMMENT 1(33) text-005. " Absence

PARAMETERS: p_a RADIOBUTTON GROUP rb1.

SELECTION-SCREEN END OF LINE.SELECTION-SCREEN END OF BLOCK b2.

************************************************************************

  • I N I T I A L I Z A T I O N *

************************************************************************

INITIALIZATION.

************************************************************************

  • A T S E L E C T I O N - S C R E E N *

************************************************************************

AT SELECTION-SCREEN.

  • Validate the screen fields

PERFORM validate_screen.

************************************************************************

  • S T A R T - O F - S E L E C T I O N *

************************************************************************

START-OF-SELECTION.

  • Selection of Period

PERFORM get_period.

  • Get PERNR from LDB

GET pernr.

IF p0000-stat2 <> '0'.

  • Get the data from PA0001,PA2001, PA2006

PERFORM get_pers_data.

ENDIF.

************************************************************************

  • T O P - O F - P A G E *

************************************************************************

TOP-OF-PAGE.

  • Header of the List

PERFORM header.

************************************************************************

  • E N D - O F - P A G E *

************************************************************************

  • Footer

END-OF-PAGE.

IF p_qa = c_x.

  • Display both Absence and Quota Data

WRITE /1(188) sy-uline.

ELSEIF p_q = c_x.

  • Display only Quota Data

WRITE /1(114) sy-uline.

ELSEIF p_a = c_x.

  • Display only Absence Data

WRITE /1(125) sy-uline.

ENDIF.

************************************************************************

  • E N D - O F - S E L E C T I O N *

************************************************************************

END-OF-SELECTION.

  • Combine the Absence and Quota Data

PERFORM append_data.

IF p_qa = c_x.

  • Display both Absence and Quota Data

PERFORM display_qa_data.

ELSEIF p_q = c_x.

  • Display only Quota Data

PERFORM display_q_data.

ELSEIF p_a = c_x.

  • Display only Absence Data

PERFORM display_a_data.

ENDIF.

&----


*& Form validate_screen

&----


  • Validation of Selection Screen fields

----


FORM validate_screen .

  • Validation of Personnel Number

CLEAR pa0003.

IF NOT pnppernr[] IS INITIAL.

SELECT pernr

FROM pa0003 UP TO 1 ROWS

INTO pa0003-pernr

WHERE pernr IN pnppernr.

ENDSELECT.

IF sy-subrc <> 0.

MESSAGE e999 WITH 'Incorrect Personnel Number'(006).

ENDIF.

ENDIF.

  • Validation of Employee Status

CLEAR t529u.

IF NOT pnpstat2[] IS INITIAL.

SELECT SINGLE statv

INTO t529u-statv

FROM t529u

WHERE statv IN pnpstat2 AND

statn = '2' AND

sprsl = sy-langu.

IF sy-subrc <> 0.

MESSAGE e999 WITH 'Invalid Employee Status'(007).

ENDIF.

ENDIF.

  • Validation of Personnel Area

CLEAR t500p.

IF NOT pnpwerks[] IS INITIAL.

SELECT persa

FROM t500p UP TO 1 ROWS

INTO t500p-persa

WHERE persa IN pnpwerks.

ENDSELECT.

IF sy-subrc <> 0.

MESSAGE e999 WITH 'Incorrect Personnel Area'(008).

ENDIF.

ENDIF.

  • Validation of Personnel Sub Area

CLEAR t001p.

IF NOT pnpbtrtl[] IS INITIAL.

SELECT btrtl

FROM t001p UP TO 1 ROWS

INTO t001p-btrtl

WHERE btrtl IN pnpbtrtl.

ENDSELECT.

IF sy-subrc <> 0.

MESSAGE e999 WITH 'Incorrect Personnel Sub Area'(009).

ENDIF.

ENDIF.

  • Validation of Employee Group

CLEAR t501.

IF NOT pnppersg[] IS INITIAL.

SELECT persg

FROM t501 UP TO 1 ROWS

INTO t501-persg

WHERE persg IN pnppersg.

ENDSELECT.

IF sy-subrc <> 0.

MESSAGE e999 WITH 'Incorrect Employee Group'(010).

ENDIF.

ENDIF.

  • Validation of Employee Sub Group

CLEAR t503k.

IF NOT pnppersk[] IS INITIAL.

SELECT persk

FROM t503k UP TO 1 ROWS

INTO t503k-persk

WHERE persk IN pnppersk.

ENDSELECT.

IF sy-subrc <> 0.

MESSAGE e999 WITH 'Incorrect Employee Sub Group'(011).

ENDIF.

ENDIF.

  • Validation of Payroll Area

CLEAR t549a.

IF NOT pnpabkrs[] IS INITIAL.

SELECT abkrs

FROM t549a UP TO 1 ROWS

INTO t549a-abkrs

WHERE abkrs IN pnpabkrs.

ENDSELECT.

IF sy-subrc <> 0.

MESSAGE e999 WITH 'Incorrect Employee Payroll Area'(026).

ENDIF.

ENDIF.

  • Validation of Absence Type

CLEAR t554s.

IF NOT s_awart[] IS INITIAL.

SELECT subty

FROM t554s UP TO 1 ROWS

INTO t554s-subty

WHERE subty IN s_awart AND

moabw EQ c_moabw AND

endda EQ c_endda.

ENDSELECT.

IF sy-subrc <> 0.

MESSAGE e999 WITH 'Incorrect Employee Absence Type'(012).

ENDIF.

ENDIF.

  • Validation of Absence Quota Type

CLEAR t556a.

IF NOT s_ktart[] IS INITIAL.

SELECT ktart

FROM t556a UP TO 1 ROWS

INTO t556a-ktart

WHERE ktart IN s_ktart AND

mopgk EQ c_mopgk AND

mozko EQ c_mozko AND

endda EQ c_endda.

ENDSELECT.

IF sy-subrc <> 0.

MESSAGE e999 WITH 'Incorrect Employee Quota Type'(013).

ENDIF.

ENDIF.

ENDFORM. "validate_screen

&----


*& Form get_period

&----


  • Get the Correct Period based on Selection screen selection

----


FORM get_period.

CLEAR: gv_year,gv_mon, gv_date, gv_date1.

gv_year = sy-datum+0(4).

gv_mon = sy-datum+4(2).

IF pnptimr1 = c_x. " Current Date

pnpbegda = sy-datum.

pnpendda = sy-datum.

ELSEIF pnptimr2 = c_x. " Current Month

CONCATENATE gv_year gv_mon c_val INTO gv_date.

CONCATENATE gv_year gv_mon c_val1 INTO gv_date1.

pnpbegda = gv_date.

pnpendda = gv_date1.

ELSEIF pnptimr3 = c_x. " Current Year

CONCATENATE gv_year c_val c_val INTO gv_date.

CONCATENATE gv_year c_val2 c_val1 INTO gv_date1.

pnpbegda = gv_date.

pnpendda = gv_date1.

ELSEIF pnptimr4 = c_x. " Upto Today

pnpbegda = c_date1.

pnpendda = sy-datum.

ELSEIF pnptimr5 = c_x. " From Today

pnpbegda = sy-datum.

pnpendda = c_endda.

ELSE.

IF ( pnpbegda IS INITIAL AND pnpendda IS INITIAL ).

pnpbegda = c_date1.

pnpendda = c_endda.

ELSEIF pnpbegda IS INITIAL AND NOT pnpendda IS INITIAL.

pnpbegda = c_date1.

pnpendda = pnpendda.

ELSEIF NOT ( pnpbegda IS INITIAL AND pnpendda IS INITIAL ).

pnpbegda = pnpbegda.

pnpendda = pnpendda.

ENDIF.

ENDIF.

ENDFORM. "get_period

&----


*& Form get_pers_data

&----


  • Get the Absence and Quota Data from PA0001,PA2001,PA2006

----


FORM get_pers_data.

DATA: lv_year1(4) TYPE n,

lv_year2(4) TYPE n,

lv_date1 TYPE sydatum,

lv_date2 TYPE sydatum,

lv_anzhb TYPE ptm_quonum. " Last Year Balance days

  • Get data from Respective Infotypes

rp_provide_from_last p0001 space pnpbegda pnpendda.

  • Absence Data

LOOP AT p2001 WHERE pernr = pernr-pernr AND

begda GE pnpbegda AND

endda LE pnpendda.

IF p2001-awart IN s_awart.

i_2001-pernr = pernr-pernr.

i_2001-subty = p2001-subty.

i_2001-awart = p2001-awart.

i_2001-abrtg = p2001-abrtg.

i_2001-begda = p2001-begda.

i_2001-endda = p2001-endda.

READ TABLE p0001 WITH KEY pernr = p2001-pernr.

i_2001-ename = p0001-ename.

  • Get the Absence Type Text

CLEAR gv_atext.

SELECT SINGLE atext INTO gv_atext FROM t554t

WHERE sprsl = sy-langu AND

moabw = c_moabw AND

awart = p2001-awart.

IF sy-subrc = 0.

i_2001-atext = gv_atext.

ENDIF.

APPEND i_2001.

CLEAR i_2001.

ENDIF.

ENDLOOP.

  • Quota Data

LOOP AT p2006 WHERE pernr = pernr-pernr AND

begda GE pnpbegda AND

endda LE pnpendda.

IF p2006-ktart IN s_ktart.

i_2006-pernr = pernr-pernr.

i_2006-subty = p2006-subty.

i_2006-begda = p2006-begda.

i_2006-endda = p2006-endda.

i_2006-year = p2006-endda+0(4).

i_2006-ktart = p2006-ktart.

i_2006-anzhl = p2006-anzhl.

i_2006-kverb = p2006-kverb.

i_2006-anzhb = p2006-anzhl - p2006-kverb.

READ TABLE p0001 WITH KEY pernr = p2001-pernr.

i_2006-ename = p0001-ename.

  • Get the Quota Type Text

CLEAR gv_ktext.

SELECT SINGLE ktext INTO gv_ktext FROM t556b

WHERE sprsl = sy-langu AND

mopgk = c_mopgk AND

mozko = c_mozko AND

ktart = p2006-ktart.

IF sy-subrc = 0.

i_2006-ktext = gv_ktext.

ENDIF.

APPEND i_2006.

CLEAR i_2006.

ENDIF.

ENDLOOP.

  • For Vacation Quota (80) get the Balance of the Last Year and

  • add to the Current Year Quota

LOOP AT i_2006.

IF i_2006-ktart = '80'.

lv_year1 = i_2006-endda+0(4).

lv_year2 = lv_year1 - 1.

CONCATENATE lv_year2 '01' '01' INTO lv_date1.

CONCATENATE lv_year2 '12' '31' INTO lv_date2.

LOOP AT p2006 WHERE pernr = i_2006-pernr AND

begda GE lv_date1 AND

endda LE lv_date2 AND

ktart = '80'.

lv_anzhb = p2006-anzhl - p2006-kverb.

i_rep1-pernr = i_2006-pernr.

i_rep1-ktext = i_2006-ktext.

i_rep1-anzhl = p2006-anzhl.

i_rep1-kverb = p2006-kverb.

i_rep1-ename = i_2006-ename.

i_rep1-begda = p2006-begda.

i_rep1-endda = p2006-endda.

i_rep1-anzhb = lv_anzhb.

i_rep1-ktart = '80'.

i_rep1-year = lv_year2.

APPEND i_rep1.

CLEAR: i_rep1.

ENDLOOP.

ENDIF.

CLEAR: lv_year1, lv_year2,

lv_date1, lv_date2,lv_anzhb.

ENDLOOP.

SORT i_rep1 BY pernr ktart.

ENDFORM. "get_pers_data

&----


*& Form append_data

&----


  • Put the Absence and Quota Data into one Report Int Table

----


FORM append_data.

CLEAR: i_rep.

REFRESH: i_rep.

SORT i_2001 BY pernr awart.

SORT i_2006 BY pernr ktart year.

  • Move I_REP1 data into i_2006

LOOP AT i_rep1.

MOVE-CORRESPONDING i_rep1 TO i_2006.

APPEND i_2006.

CLEAR i_2006.

ENDLOOP.

  • Move the Absence and Quota Data into a final Int Table

LOOP AT i_2006.

i_rep-pernr = i_2006-pernr.

i_rep-ename = i_2006-ename.

i_rep-ktart = i_2006-ktart.

i_rep-anzhl = i_2006-anzhl.

i_rep-kverb = i_2006-kverb.

i_rep-ktext = i_2006-ktext.

i_rep-anzhb = i_2006-anzhb.

i_rep-year = i_2006-year.

CLEAR i_2001.

CASE i_2006-ktart.

WHEN '81'.

PERFORM get_2001 USING i_2006-pernr '1000' i_2006-year.

WHEN '50'.

PERFORM get_2001 USING i_2006-pernr '1002' i_2006-year.

WHEN '80'.

PERFORM get_2001 USING i_2006-pernr '1001' i_2006-year.

WHEN '56'.

PERFORM get_2001 USING i_2006-pernr '1003' i_2006-year.

WHEN '51'.

PERFORM get_2001 USING i_2006-pernr '1004' i_2006-year.

WHEN '52'.

PERFORM get_2001 USING i_2006-pernr '1005' i_2006-year.

WHEN '54'.

PERFORM get_2001 USING i_2006-pernr '1006' i_2006-year.

WHEN '53'.

PERFORM get_2001 USING i_2006-pernr '1007' i_2006-year.

WHEN '55'.

PERFORM get_2001 USING i_2006-pernr '1008' i_2006-year.

WHEN '57'.

PERFORM get_2001 USING i_2006-pernr '1009' i_2006-year.

WHEN '90'.

PERFORM get_2001 USING i_2006-pernr '2000' i_2006-year.

WHEN '58'.

PERFORM get_2001 USING i_2006-pernr '2001' i_2006-year.

WHEN '59'.

PERFORM get_2001 USING i_2006-pernr '2002' i_2006-year.

WHEN '91'.

PERFORM get_2001 USING i_2006-pernr '2003' i_2006-year.

ENDCASE.

IF sy-subrc <> 0.

APPEND i_rep.

ENDIF.

CLEAR i_rep.

ENDLOOP.

SORT i_rep BY pernr ktart year.

DELETE i_rep WHERE pernr = ' '.

ENDFORM. " append_data

&----


*& Form display_qa_data

&----


  • Display the Absence and Quota Data

----


FORM display_qa_data.

DATA: lv_flag, " New Flag

lv_tot2 TYPE ptm_quonum. " Absence Balance days

IF i_rep[] IS INITIAL.

MESSAGE i000 WITH 'No Data found'(014).

ELSE.

LOOP AT i_rep.

  • toggle color

PERFORM toggle_color.

IF lv_flag <> space.

NEW-LINE.

ENDIF.

AT NEW pernr.

READ TABLE i_rep INDEX sy-tabix.

WRITE:/1 sy-vline,2(8) i_rep-pernr,

10 sy-vline,11(40) i_rep-ename.

ENDAT.

AT NEW ktart.

READ TABLE i_rep INDEX sy-tabix.

WRITE: 1 sy-vline, 10 sy-vline,

51 sy-vline,52(25) i_rep-ktext.

ENDAT.

AT NEW year.

READ TABLE i_rep INDEX sy-tabix.

WRITE: 1 sy-vline, 10 sy-vline,

51 sy-vline,

77 sy-vline, 78(4) i_rep-year,

82 sy-vline, 83(11) i_rep-anzhl,

94 sy-vline, 95(25) i_rep-atext,

120 sy-vline,133 sy-vline,

144 sy-vline,

155 sy-vline,156(13) i_rep-anzhb,

169 sy-vline.

lv_tot2 = lv_tot2 + i_rep-anzhb.

ENDAT.

WRITE: 1 sy-vline, 10 sy-vline,

51 sy-vline, 77 sy-vline,

82 sy-vline, 94 sy-vline,

120 sy-vline,121(12) i_rep-abrtg NO-ZERO,

133 sy-vline,134(10) i_rep-begda NO-ZERO,

144 sy-vline,145(10) i_rep-endda NO-ZERO,

155 sy-vline,169 sy-vline.

NEW-LINE.

AT END OF pernr.

WRITE : /1(169) sy-uline.

SUM.

FORMAT COLOR 3.

WRITE:/1 sy-vline, 10 sy-vline,

51 sy-vline, 77 sy-vline,

82 sy-vline, 94 sy-vline,

120 sy-vline,121(12) i_rep-abrtg,

133 sy-vline,144 sy-vline,

155 sy-vline, 156(13) lv_tot2,

169 sy-vline.

FORMAT COLOR OFF.

WRITE : /1(169) sy-uline.

CLEAR lv_tot2.

ENDAT.

ENDLOOP.

ENDIF.

ENDFORM. " display_qa_data

&----


*& Form display_q_data

&----


  • Display only the Quota Data

----


FORM display_q_data.

DATA: lv_flag. " New Flag

SORT i_2006 BY pernr ktart year.

IF i_2006[] IS INITIAL.

MESSAGE i000 WITH 'No Data found'(014).

ELSE.

LOOP AT i_2006.

  • Toggle Color

PERFORM toggle_color.

IF lv_flag <> space.

NEW-LINE.

ENDIF.

AT NEW pernr.

READ TABLE i_2006 INDEX sy-tabix.

WRITE: /1 sy-vline, 2(8) i_2006-pernr,

10 sy-vline,11(40) i_2006-ename.

ENDAT.

AT NEW ktart.

READ TABLE i_2006 INDEX sy-tabix.

WRITE: 1 sy-vline,10 sy-vline,

51 sy-vline,52(25) i_2006-ktext.

ENDAT.

AT NEW year.

READ TABLE i_2006 INDEX sy-tabix.

WRITE: 1 sy-vline, 10 sy-vline,

51 sy-vline,

77 sy-vline,78(4) i_2006-year,

82 sy-vline,83(11) i_2006-anzhl,

94 sy-vline,95(13) i_2006-anzhb,

108 sy-vline.

NEW-LINE.

ENDAT.

AT END OF pernr.

WRITE : /1(108) sy-uline.

SUM.

FORMAT COLOR 3.

WRITE: /1 sy-vline, 10 sy-vline,

51 sy-vline,

77 sy-vline, 82 sy-vline,

94 sy-vline, 95(13) i_2006-anzhb,

108 sy-vline.

FORMAT COLOR OFF.

WRITE : /1(108) sy-uline.

ENDAT.

ENDLOOP.

ENDIF.

ENDFORM. " display_q_data

&----


*& Form display_a_data

&----


  • Display Only the Absence Quota

----


FORM display_a_data.

DATA: lv_flag. " New Flag

SORT i_2001 BY pernr awart.

IF i_2001[] IS INITIAL.

MESSAGE i000 WITH 'No Data found'(014).

ELSE.

LOOP AT i_2001.

  • Toggle Color

PERFORM toggle_color.

IF lv_flag <> space.

NEW-LINE.

ENDIF.

AT NEW pernr.

READ TABLE i_2001 INDEX sy-tabix.

WRITE: /1 sy-vline, 2(10) i_2001-pernr,

10 sy-vline,11(40) i_2001-ename.

ENDAT.

WRITE: 1 sy-vline, 10 sy-vline,

51 sy-vline,52(25) i_2001-atext,

77 sy-vline,78(12) i_2001-abrtg,

90 sy-vline,91(10) i_2001-begda,

101 sy-vline,102(10) i_2001-endda,

112 sy-vline.

NEW-LINE.

AT END OF pernr.

WRITE : /1(112) sy-uline.

SUM.

FORMAT COLOR 3.

WRITE: /1 sy-vline, 10 sy-vline,

51 sy-vline,

77 sy-vline,78(12) i_2001-abrtg,

90 sy-vline,101 sy-vline,

112 sy-vline.

FORMAT COLOR OFF.

WRITE : /1(112) sy-uline.

ENDAT.

ENDLOOP.

ENDIF.

ENDFORM. " display_a_data

&----


*& Form header

&----


  • Write the Report Header

----


FORM header .

data : lv_pers type pbtxt,

lv_orgn type orgtx.

gv_title1 = sy-title. " Set List Header

IF p_qa = c_x.

NEW-PAGE LINE-SIZE 193.

ELSEIF p_a = c_x.

NEW-PAGE LINE-SIZE 125.

ELSEIF p_q = c_x.

NEW-PAGE LINE-SIZE 119.

ENDIF.

  • Standard header

FORMAT RESET.

CALL FUNCTION 'Z_STANDARD_HEADER'

EXPORTING

title1 = gv_title1.

  • Get the Personal Area and Org.Unit Texts

clear : lv_pers,lv_orgn.

select single name1 into lv_pers

from t500p where persa = pnpwerks-low.

select single orgtx into lv_orgn

from t527x where sprsl = sy-langu and

orgeh = pnporgeh-low and

endda = c_endda.

if not lv_pers is initial.

write : /2 'Personal Area:'(017), 17(25) lv_pers color 7.

endif.

if not lv_orgn is initial.

write : /2 'Organization Unit:'(021), 20(25) lv_orgn color 3.

endif.

IF p_qa = c_x.

FORMAT COLOR COL_HEADING.

WRITE : /1(169) sy-uline.

WRITE:/1 sy-vline,2(8) 'Emp.No'(015) CENTERED,

10 sy-vline,11(40) 'Employee Name'(016) CENTERED,

51 sy-vline,52(25) 'Quota Description'(018) CENTERED,

77 sy-vline,78(4) 'Year'(027),

82 sy-vline,83(11) 'Entitlement'(019),

94 sy-vline,95(25) 'Absence Description'(022) CENTERED,

120 sy-vline,121(12) 'Absence days'(023),

133 sy-vline,134(10) 'From Date'(024),

144 sy-vline,145(10) 'To Date'(025),

155 sy-vline,156(13) 'Quota Balance'(020),

169 sy-vline.

WRITE : /1(169) sy-uline.

ELSEIF p_q = c_x.

FORMAT COLOR COL_HEADING.

WRITE : /1(108) sy-uline.

WRITE:/1 sy-vline,2(8) 'Emp.No'(015) CENTERED,

10 sy-vline,11(40) 'Employee Name'(016) CENTERED,

51 sy-vline,52(25) 'Quota Description'(018) CENTERED,

77 sy-vline,78(4) 'Year'(027),

82 sy-vline,83(11) 'Entitlement'(019),

94 sy-vline,95(13) 'Quota Balance'(020),

108 sy-vline.

WRITE : /1(108) sy-uline.

ELSEIF p_a = c_x.

FORMAT COLOR COL_HEADING.

WRITE : /1(112) sy-uline.

WRITE:/1 sy-vline,2(8) 'Emp.No'(015) CENTERED,

10 sy-vline,11(40) 'Employee Name'(016) CENTERED,

51 sy-vline,52(25) 'Absence Description'(022) CENTERED,

77 sy-vline,78(12) 'Absence days'(023),

90 sy-vline,91(10) 'From Date'(024),

101 sy-vline,102(10) 'To Date'(025),

112 sy-vline.

WRITE : /1(112) sy-uline.

ENDIF.

ENDFORM. " header

&----


*& Form toggle_color

&----


  • This routine alters the color of the records in the list

----


FORM toggle_color.

IF gv_dial = space.

FORMAT COLOR COL_NORMAL INTENSIFIED OFF.

gv_dial = c_x.

ELSE.

FORMAT COLOR 1 INTENSIFIED OFF.

CLEAR gv_dial.

ENDIF.

ENDFORM. " toggle_color

&----


*& Form get_2001

&----


  • Get the ABsence type for each Quota type

----


FORM get_2001 USING p_pernr TYPE persno

p_value TYPE awart

p_year.

LOOP AT i_2001 WHERE pernr = p_pernr AND

awart = p_value AND

endda+0(4) = p_year.

i_rep-awart = i_2001-awart.

i_rep-abrtg = i_2001-abrtg.

i_rep-atext = i_2001-atext.

i_rep-begda = i_2001-begda.

i_rep-endda = i_2001-endda.

APPEND i_rep.

ENDLOOP.

ENDFORM. " get_2001

<b>

Reward points for useful Answers</b>

Regards

Anji