Structure ZTEVEN PERNR PERNR_D NUMC 8 0 KOSTL KOSTL CHAR 10 0 IN_DATE LDATE DATS 8 0 OUT_DATE LDATE DATS 8 0 IN_TIME LTIME TIMS 6 0 OUT_TIME LTIME TIMS 6 0 INS_DATE LDATE DATS 8 0 OUTS_DATE LDATE DATS 8 0 INS_TIME LTIME TIMS 6 0 OUTS_TIME LTIME TIMS 6 0 ACT_HRS AFX_DTE_DURATION INT4 10 0 PLN_HRS AFX_DTE_DURATION INT4 10 0 FUNCTION Z_HCM_TC_TIMEEVENTS. *"---------------------------------------------------------------------- *"*"Local Interface: *" IMPORTING *" VALUE(BEGDA) LIKE P0007-BEGDA OPTIONAL *" VALUE(ENDDA) LIKE P0007-ENDDA OPTIONAL *" TABLES *" SEL_EMPLOYEE STRUCTURE BAPIHRSELEMPLOYEE OPTIONAL *" RESULT STRUCTURE ZTEVEN *"---------------------------------------------------------------------- DATA: lt_teven like teven OCCURS 1000. DATA: ls_teven like teven. DATA: lsp_teven like teven. DATA: ls_result like ZTEVEN. data: last_row like sy-tabix. data: ls_psp type ptpsp, ls_dayint type pwsdayint, ls_daygen type pwsdaygen. RANGES: R_EMPLOYEE FOR SEL_EMPLOYEE-LOW. * Init IF BEGDA IS INITIAL. BEGDA = LOW_DATE. ENDIF. IF ENDDA IS INITIAL. ENDDA = HIGH_DATE. ENDIF. IF SEL_EMPLOYEE IS REQUESTED. loop at sel_employee into r_employee. append r_employee. endloop. ENDIF. IF r_employee is INITIAL. SELECT DISTINCT PERNR FROM PA0050 INTO r_employee-low WHERE BDEGR EQ '900' AND SPRPS EQ SPACE. r_employee-sign = 'I'. r_employee-option = 'EQ'. append r_employee. endselect. endif. select * from teven into CORRESPONDING FIELDS OF TABLE lt_teven where pernr in r_employee and ldate between begda and endda and stokz ne 'X' order by pernr ldate ltime satza. loop at lt_teven into ls_teven. if lsp_teven-pernr <> ls_teven-pernr. " new record clear ls_result. if ls_teven-satza = 'P10'. ls_result-pernr = ls_teven-pernr. ls_result-in_date = ls_teven-ldate. ls_result-in_time = ls_teven-ltime. else. ls_result-pernr = ls_teven-pernr. ls_result-out_date = ls_teven-ldate. ls_result-out_time = ls_teven-ltime. endif. append ls_result to result. last_row = sy-tabix. elseif lsp_teven-pernr = ls_teven-pernr and lsp_teven-satza = ls_teven-satza. " new record clear ls_result. if ls_teven-satza = 'P10'. ls_result-pernr = ls_teven-pernr. ls_result-in_date = ls_teven-ldate. ls_result-in_time = ls_teven-ltime. else. ls_result-pernr = ls_teven-pernr. ls_result-out_date = ls_teven-ldate. ls_result-out_time = ls_teven-ltime. endif. append ls_result to result. last_row = sy-tabix. else. read table result into ls_result index last_row. if sy-subrc = 0. " update record if ls_teven-satza = 'P10'. ls_result-pernr = ls_teven-pernr. ls_result-in_date = ls_teven-ldate. ls_result-in_time = ls_teven-ltime. else. ls_result-pernr = ls_teven-pernr. ls_result-out_date = ls_teven-ldate. ls_result-out_time = ls_teven-ltime. endif. modify result from ls_result index last_row. last_row = 0. else. " new record clear ls_result. if ls_teven-satza = 'P10'. ls_result-pernr = ls_teven-pernr. ls_result-in_date = ls_teven-ldate. ls_result-in_time = ls_teven-ltime. else. ls_result-pernr = ls_teven-pernr. ls_result-out_date = ls_teven-ldate. ls_result-out_time = ls_teven-ltime. endif. append ls_result to result. last_row = sy-tabix. endif. endif. move ls_teven to lsp_teven. endloop. " Fill schedule time and cost center loop at result. perform build_psp using result-pernr result-in_date result-in_date changing ls_psp ls_dayint ls_daygen result-kostl . if ls_dayint-enduz gt '240000'. ls_dayint-enduz = ls_dayint-enduz + '0'. result-ins_date = result-in_date. result-ins_time = ls_dayint-beguz. result-outs_date = result-in_date + 1. result-outs_time = ls_dayint-enduz. else. result-ins_date = result-in_date. result-ins_time = ls_dayint-beguz. result-outs_date = result-in_date. result-outs_time = ls_dayint-enduz. endif. result-ins_date = result-in_date. result-ins_time = ls_dayint-beguz. result-outs_time = ls_dayint-enduz. modify result. " Insert durations " Planned if result-ins_date is not initial and result-ins_time is not initial and result-outs_date is not initial and result-outs_time is not initial. CALL FUNCTION 'SWI_DURATION_DETERMINE' EXPORTING START_DATE = result-ins_date END_DATE = result-outs_date START_TIME = result-ins_time END_TIME = result-outs_time IMPORTING DURATION = result-pln_hrs . endif. " Actual if result-in_date is not initial and result-in_time is not initial and result-out_date is not initial and result-out_time is not initial. CALL FUNCTION 'SWI_DURATION_DETERMINE' EXPORTING START_DATE = result-in_date END_DATE = result-out_date START_TIME = result-in_time END_TIME = result-out_time IMPORTING DURATION = result-act_hrs . endif. modify result. clear ls_psp. clear ls_dayint. clear ls_daygen. endloop. ENDFUNCTION. *---------------------------------------------------------------------- * FORM BUILD_PSP *---------------------------------------------------------------------- form build_psp using pernr type pernr_d begda like P0007-BEGDA endda like P0007-ENDDA changing ls_psp type ptpsp ls_dayint type pwsdayint ls_daygen type pwsdaygen kostl type kostl . data: psp like ptpsp occurs 0 with header line, dayint like pwsdayint occurs 0 with header line, daygen like pwsdaygen occurs 0 with header line, p0001 type table of p0001 with HEADER LINE. call function 'HR_PERSONAL_WORK_SCHEDULE' exporting pernr = pernr begda = begda endda = endda i0001_i0007_error = '0' * IMPORTING * WARNING_OCCURED = tables perws = psp exceptions error_occured = 1 abort_occured = 2 others = 3. call function 'HR_WORK_SCHEDULE_TIMES' exporting pernr = pernr begda = begda endda = endda tables perws = psp daygen = daygen dayint = dayint exceptions error_occured = 1 perws_error = 2 others = 3 . read table psp into ls_psp index 1. read table dayint into ls_dayint index 1. read table daygen into ls_daygen index 1. " Read master cost center call function 'HR_READ_INFOTYPE' EXPORTING pernr = pernr infty = '0001' begda = begda "note 687169 endda = endda "note 687169 TABLES infty_tab = p0001. loop at p0001. kostl = p0001-kostl. exit. endloop. endform.