Difference between revisions of "SAP HCM TIME"
From SapWiki
| (5 intermediate revisions by the same user not shown) | |||
| Line 55: | Line 55: | ||
OTHERS = 4.</nowiki> | OTHERS = 4.</nowiki> | ||
| + | <nowiki> | ||
| + | FORM get_hini_hfin USING iv_pernr TYPE pernr_d | ||
| + | iv_begda TYPE begda | ||
| + | iv_am TYPE abap_bool | ||
| + | CHANGING ev_beguz | ||
| + | ev_enduz. | ||
| + | DATA lt_pers_avail TYPE STANDARD TABLE OF pdpsp. | ||
| + | DATA: lv_hora_inicio TYPE t, " Horario te rico inicio (SOBEG) | ||
| + | lv_horas_total TYPE p DECIMALS 2, " Horas trabajo te r. (SOLLZ) | ||
| + | lv_mitad_segs TYPE i, " Segundos a sumar | ||
| + | lv_hora_corte TYPE t. " El resultado final (El medio d a) | ||
| + | |||
| + | CALL FUNCTION 'HR_READ_TIMEDATA_PSP' | ||
| + | EXPORTING | ||
| + | begin_date = iv_begda | ||
| + | end_date = iv_begda | ||
| + | person_id = iv_pernr | ||
| + | * PERSON_TYP = 'P' | ||
| + | * RP_BUILD_PSP_ERROR = ' ' | ||
| + | TABLES | ||
| + | pers_avail = lt_pers_avail | ||
| + | EXCEPTIONS | ||
| + | no_capacity_available = 1 | ||
| + | no_integration_activ = 2 | ||
| + | timeinfo_error = 3 | ||
| + | OTHERS = 4. | ||
| + | IF sy-subrc <> 0. | ||
| + | * Implement suitable error handling here | ||
| + | RETURN. | ||
| + | ENDIF. | ||
| + | |||
| + | READ TABLE lt_pers_avail INTO DATA(ls_pers_avail) INDEX 1. | ||
| + | IF sy-subrc <> 0. | ||
| + | * Implement suitable error handling here | ||
| + | RETURN. | ||
| + | ENDIF. | ||
| + | |||
| + | lv_hora_inicio = ls_pers_avail-begzt. | ||
| + | lv_horas_total = ls_pers_avail-dauer. | ||
| + | |||
| + | " 2. Calculamos la mitad en segundos | ||
| + | " Dividimos las horas a la mitad (4.415) y multiplicamos por 3600 (segundos en una hora) | ||
| + | " 4.415 * 3600 = 15894 segundos. | ||
| + | lv_mitad_segs = ( lv_horas_total / 2 ) * 3600. | ||
| + | |||
| + | |||
| + | " 3. Sumamos los segundos a la hora de inicio | ||
| + | " En ABAP, sumar un n mero entero a un tipo 'T' autom ticamente suma segundos. | ||
| + | lv_hora_corte = lv_hora_inicio + lv_mitad_segs. | ||
| + | |||
| + | IF iv_am = abap_true. | ||
| + | ev_beguz = ls_pers_avail-begzt. | ||
| + | ev_enduz = lv_hora_corte. | ||
| + | ELSE. | ||
| + | ev_beguz = lv_hora_corte. | ||
| + | ev_enduz = ls_pers_avail-endzt. | ||
| + | ENDIF. | ||
| + | |||
| + | ENDFORM.</nowiki> | ||
| + | |||
| + | ===Leer feriado=== | ||
| + | <nowiki> | ||
| + | FUNCTION Z_HCM_FERIADO. | ||
| + | *"---------------------------------------------------------------------- | ||
| + | *"*"Interfase local | ||
| + | *" IMPORTING | ||
| + | *" REFERENCE(I_PERNR) TYPE PERNR_D | ||
| + | *" REFERENCE(I_BEGDA) TYPE BEGDA | ||
| + | *" EXPORTING | ||
| + | *" REFERENCE(E_FERIADO) TYPE FLAG | ||
| + | *"---------------------------------------------------------------------- | ||
| + | DATA: lt_persavail TYPE STANDARD TABLE OF pdpsp, | ||
| + | ls_persavail TYPE pdpsp. | ||
| + | |||
| + | CALL FUNCTION 'HR_READ_TIMEDATA_PSP' | ||
| + | EXPORTING | ||
| + | begin_date = i_begda | ||
| + | end_date = i_begda | ||
| + | person_id = i_pernr | ||
| + | * PERSON_TYP = 'P' | ||
| + | * RP_BUILD_PSP_ERROR = ' ' | ||
| + | TABLES | ||
| + | pers_avail = lt_persavail | ||
| + | EXCEPTIONS | ||
| + | no_capacity_available = 1 | ||
| + | no_integration_activ = 2 | ||
| + | timeinfo_error = 3 | ||
| + | OTHERS = 4. | ||
| + | IF sy-subrc <> 0. | ||
| + | * Implement suitable error handling here | ||
| + | ELSE. | ||
| + | ENDIF. | ||
| + | |||
| + | READ TABLE lt_persavail INTO ls_persavail WITH KEY datum = i_begda. | ||
| + | IF sy-subrc EQ 0. | ||
| + | IF ls_persavail-tprog EQ 'LIBR' OR ls_persavail-tagty EQ '1'. | ||
| + | e_feriado = 'X'. | ||
| + | ENDIF. | ||
| + | ENDIF. | ||
| + | |||
| + | ENDFUNCTION. | ||
| + | </nowiki> | ||
=== Leer Cluster de Tiempos === | === Leer Cluster de Tiempos === | ||
CALL FUNCTION 'HR_TIME_RESULTS_GET' | CALL FUNCTION 'HR_TIME_RESULTS_GET' | ||
| Line 75: | Line 177: | ||
. | . | ||
====Leer cluster B2==== | ====Leer cluster B2==== | ||
| + | =====ejemplo 1===== | ||
<nowiki> | <nowiki> | ||
DATA: gt_cluster TYPE table of hrf_tim_b2. | DATA: gt_cluster TYPE table of hrf_tim_b2. | ||
| Line 96: | Line 199: | ||
endloop. | endloop. | ||
</nowiki> | </nowiki> | ||
| + | =====ejemplo 2===== | ||
| + | <nowiki> | ||
| + | *-----Import der Tabellen ZES, SALDO und ZL aus Cluster B2 | ||
| + | CALL FUNCTION 'HR_TIME_RESULTS_IN_INTERVAL' | ||
| + | EXPORTING | ||
| + | int_pernr = pernr-pernr | ||
| + | int_begda = begda | ||
| + | int_endda = endda | ||
| + | TABLES | ||
| + | int_time_results = time_results | ||
| + | EXCEPTIONS | ||
| + | wrong_cluster_version = 1 | ||
| + | no_read_authority = 2 | ||
| + | cluster_archived = 3 | ||
| + | technical_error = 4 | ||
| + | OTHERS = 5. | ||
| + | |||
| + | clear: zl[], saldo[], zes[]. | ||
| + | clear: zl, saldo, zes. | ||
| + | loop at time_results into time_results_wa. | ||
| + | append lines of time_results_wa-zes to zes. | ||
| + | append lines of time_results_wa-saldo to saldo. | ||
| + | append lines of time_results_wa-zl to zl. | ||
| + | endloop. | ||
| + | </nowiki> | ||
| + | |||
====Ejemplo: leer saldo de vacaciones==== | ====Ejemplo: leer saldo de vacaciones==== | ||
<nowiki>FORM get_saldo_vaca USING p_pernr TYPE p0000-pernr | <nowiki>FORM get_saldo_vaca USING p_pernr TYPE p0000-pernr | ||
| Line 147: | Line 276: | ||
ENDFORM. "get_saldo_vaca</nowiki> | ENDFORM. "get_saldo_vaca</nowiki> | ||
| + | |||
| + | ejemplo 2 | ||
| + | <nowiki> | ||
| + | * buscar saldo de vacaciones | ||
| + | CALL FUNCTION 'HR_TIME_RESULTS_IN_INTERVAL' | ||
| + | EXPORTING | ||
| + | int_pernr = ls_p2001-pernr | ||
| + | int_begda = l_begda | ||
| + | int_endda = l_endda | ||
| + | TABLES | ||
| + | int_time_results = time_results | ||
| + | EXCEPTIONS | ||
| + | wrong_cluster_version = 1 | ||
| + | no_read_authority = 2 | ||
| + | cluster_archived = 3 | ||
| + | technical_error = 4 | ||
| + | OTHERS = 5. | ||
| + | |||
| + | loop at time_results into time_results_wa. | ||
| + | append lines of time_results_wa-zl to zl. | ||
| + | endloop. | ||
| + | |||
| + | * leer ultimo saldo, Dìas devengados de vacaci, ver tran. PT66 | ||
| + | sort zl by datum. | ||
| + | loop at zl into ls_zl where lgart = '5T12'. | ||
| + | ENDLOOP. | ||
| + | if sy-subrc = 0. | ||
| + | l_saldo = ls_zl-anzhl. | ||
| + | endif. | ||
| + | |||
| + | if l_saldo < 0. | ||
| + | l_saldo = 0. | ||
| + | endif. | ||
| + | </nowiki> | ||
| + | |||
====Leer mensajes==== | ====Leer mensajes==== | ||
CALL FUNCTION 'HR_FORMS_TIM_GET_B2_RESULTS' | CALL FUNCTION 'HR_FORMS_TIM_GET_B2_RESULTS' | ||
| Line 204: | Line 368: | ||
==[[SAP_HCM_TRN#Time_Management|Transacciones gestión de tiempos]]== | ==[[SAP_HCM_TRN#Time_Management|Transacciones gestión de tiempos]]== | ||
| + | ==Definir tipos de absentismo/presencia== | ||
| + | You configure absence types using the following menu path: Time Management > Time Data Recording and Administration > Absences > Absence Catalog > Define Absence Types. You can also configure absence types using configuration Table/view: V_T554S | ||
Latest revision as of 22:58, 14 April 2026
Contents
Codigos
Leer Plan de Horario de Trabajo
Ejemplo: Reporte RPTPSH10
DATA: psp LIKE ptpsp OCCURS 0 WITH HEADER LINE.
CLEAR:psp.
REFRESH:psp[].
CALL FUNCTION 'HR_PERSONAL_WORK_SCHEDULE'
EXPORTING
pernr = pernr-pernr
begda = pn-begda
endda = pn-endda
switch_activ = '0'
i0001_i0007_error = '0'
read_cluster = 'X'
TABLES
perws = psp
EXCEPTIONS
error_occured = 1
abort_occured = 2
OTHERS = 3.
call function 'HR_WORK_SCHEDULE_TIMES'
exporting
pernr = pernr-pernr
begda = pn-begda
endda = pn-endda
tables
i0001 = p0001
i0007 = p0007
i2003 = p2003
* I0049 =
perws = psp
daygen = daygen
dayint = dayint
exceptions
error_occured = 1
perws_error = 2
others = 3
.
* horario teórico
CALL FUNCTION 'HR_READ_TIMEDATA_PSP'
EXPORTING
begin_date = p_begda
end_date = p_endda
person_id = p_pernr
TABLES
pers_avail = lt_psp
EXCEPTIONS
no_capacity_available = 1
no_integration_activ = 2
timeinfo_error = 3
OTHERS = 4.
FORM get_hini_hfin USING iv_pernr TYPE pernr_d
iv_begda TYPE begda
iv_am TYPE abap_bool
CHANGING ev_beguz
ev_enduz.
DATA lt_pers_avail TYPE STANDARD TABLE OF pdpsp.
DATA: lv_hora_inicio TYPE t, " Horario te rico inicio (SOBEG)
lv_horas_total TYPE p DECIMALS 2, " Horas trabajo te r. (SOLLZ)
lv_mitad_segs TYPE i, " Segundos a sumar
lv_hora_corte TYPE t. " El resultado final (El medio d a)
CALL FUNCTION 'HR_READ_TIMEDATA_PSP'
EXPORTING
begin_date = iv_begda
end_date = iv_begda
person_id = iv_pernr
* PERSON_TYP = 'P'
* RP_BUILD_PSP_ERROR = ' '
TABLES
pers_avail = lt_pers_avail
EXCEPTIONS
no_capacity_available = 1
no_integration_activ = 2
timeinfo_error = 3
OTHERS = 4.
IF sy-subrc <> 0.
* Implement suitable error handling here
RETURN.
ENDIF.
READ TABLE lt_pers_avail INTO DATA(ls_pers_avail) INDEX 1.
IF sy-subrc <> 0.
* Implement suitable error handling here
RETURN.
ENDIF.
lv_hora_inicio = ls_pers_avail-begzt.
lv_horas_total = ls_pers_avail-dauer.
" 2. Calculamos la mitad en segundos
" Dividimos las horas a la mitad (4.415) y multiplicamos por 3600 (segundos en una hora)
" 4.415 * 3600 = 15894 segundos.
lv_mitad_segs = ( lv_horas_total / 2 ) * 3600.
" 3. Sumamos los segundos a la hora de inicio
" En ABAP, sumar un n mero entero a un tipo 'T' autom ticamente suma segundos.
lv_hora_corte = lv_hora_inicio + lv_mitad_segs.
IF iv_am = abap_true.
ev_beguz = ls_pers_avail-begzt.
ev_enduz = lv_hora_corte.
ELSE.
ev_beguz = lv_hora_corte.
ev_enduz = ls_pers_avail-endzt.
ENDIF.
ENDFORM.
Leer feriado
FUNCTION Z_HCM_FERIADO.
*"----------------------------------------------------------------------
*"*"Interfase local
*" IMPORTING
*" REFERENCE(I_PERNR) TYPE PERNR_D
*" REFERENCE(I_BEGDA) TYPE BEGDA
*" EXPORTING
*" REFERENCE(E_FERIADO) TYPE FLAG
*"----------------------------------------------------------------------
DATA: lt_persavail TYPE STANDARD TABLE OF pdpsp,
ls_persavail TYPE pdpsp.
CALL FUNCTION 'HR_READ_TIMEDATA_PSP'
EXPORTING
begin_date = i_begda
end_date = i_begda
person_id = i_pernr
* PERSON_TYP = 'P'
* RP_BUILD_PSP_ERROR = ' '
TABLES
pers_avail = lt_persavail
EXCEPTIONS
no_capacity_available = 1
no_integration_activ = 2
timeinfo_error = 3
OTHERS = 4.
IF sy-subrc <> 0.
* Implement suitable error handling here
ELSE.
ENDIF.
READ TABLE lt_persavail INTO ls_persavail WITH KEY datum = i_begda.
IF sy-subrc EQ 0.
IF ls_persavail-tprog EQ 'LIBR' OR ls_persavail-tagty EQ '1'.
e_feriado = 'X'.
ENDIF.
ENDIF.
ENDFUNCTION.
Leer Cluster de Tiempos
CALL FUNCTION 'HR_TIME_RESULTS_GET'
EXPORTING
get_pernr = l_pernr
get_pabrj = l_pabrj "año
get_pabrp = l_pabrp "periodo
TABLES
get_zes = gt_zes
get_pt = gt_pt
get_vert = gt_vert
get_ab = gt_ab
EXCEPTIONS
no_period_specified = 1
wrong_cluster_version = 2
no_read_authority = 3
cluster_archived = 4
technical_error = 5
OTHERS = 6
.
Leer cluster B2
ejemplo 1
DATA: gt_cluster TYPE table of hrf_tim_b2.
CALL FUNCTION 'HR_FORMS_TIM_GET_B2_RESULTS'
EXPORTING
pernr = ls_pernr-pernr
begda = gv_begda
endda = gv_endda
IMPORTING
tim_b2 = gt_cluster
EXCEPTIONS
wrong_cluster_version = 1
no_read_authority = 2
cluster_archived = 3
technical_error = 4
OTHERS = 5.
LOOP AT gt_cluster-ft_zl INTO wa_zl
* do something
endloop.
ejemplo 2
*-----Import der Tabellen ZES, SALDO und ZL aus Cluster B2
CALL FUNCTION 'HR_TIME_RESULTS_IN_INTERVAL'
EXPORTING
int_pernr = pernr-pernr
int_begda = begda
int_endda = endda
TABLES
int_time_results = time_results
EXCEPTIONS
wrong_cluster_version = 1
no_read_authority = 2
cluster_archived = 3
technical_error = 4
OTHERS = 5.
clear: zl[], saldo[], zes[].
clear: zl, saldo, zes.
loop at time_results into time_results_wa.
append lines of time_results_wa-zes to zes.
append lines of time_results_wa-saldo to saldo.
append lines of time_results_wa-zl to zl.
endloop.
Ejemplo: leer saldo de vacaciones
FORM get_saldo_vaca USING p_pernr TYPE p0000-pernr
CHANGING p_saldo TYPE pc2bf-anzhl
p_begda type p2001-begda.
DATA: lt_zes TYPE STANDARD TABLE OF pc2b6 WITH HEADER LINE,
lt_ab TYPE STANDARD TABLE OF pc20i WITH HEADER LINE,
lt_zl TYPE STANDARD TABLE OF pc2bf WITH HEADER LINE.
DATA: ls_b2_key TYPE pc2b0,
ls_keytable TYPE ptm_clst_perview.
DATA lt_pcl2 TYPE TABLE OF pcl2.
DATA ls_pcl2 LIKE LINE OF lt_pcl2.
DATA l_srtfdlow TYPE pcl2-srtfd.
DATA l_srtfdhigh TYPE pcl2-srtfd.
CONCATENATE p_pernr '18000101' INTO l_srtfdlow.
CONCATENATE p_pernr '99991231' INTO l_srtfdhigh.
SELECT * FROM pcl2 INTO TABLE lt_pcl2 WHERE relid EQ 'B2'
AND srtfd BETWEEN l_srtfdlow AND l_srtfdhigh
AND srtf2 EQ '00'
ORDER BY PRIMARY KEY. "#EC PORTABLE
IF sy-subrc = 0.
* leer ultimo
LOOP AT lt_pcl2 INTO ls_pcl2.
ENDLOOP.
ls_b2_key = ls_pcl2-srtfd.
MOVE-CORRESPONDING ls_pcl2 TO ls_keytable.
MOVE-CORRESPONDING ls_b2_key TO ls_keytable.
CALL FUNCTION 'HR_TIME_RESULTS_GET'
EXPORTING
get_pernr = p_pernr
get_pabrj = ls_keytable-pabrj
get_pabrp = ls_keytable-pabrp
TABLES
get_zes = lt_zes
get_ab = lt_ab
get_zl = lt_zl.
LOOP AT lt_zl WHERE lgart = '5T12'.
ADD lt_zl-anzhl TO p_saldo.
ENDLOOP.
p_begda = ls_pcl2-aedtm.
ENDIF.
ENDFORM. "get_saldo_vaca
ejemplo 2
* buscar saldo de vacaciones
CALL FUNCTION 'HR_TIME_RESULTS_IN_INTERVAL'
EXPORTING
int_pernr = ls_p2001-pernr
int_begda = l_begda
int_endda = l_endda
TABLES
int_time_results = time_results
EXCEPTIONS
wrong_cluster_version = 1
no_read_authority = 2
cluster_archived = 3
technical_error = 4
OTHERS = 5.
loop at time_results into time_results_wa.
append lines of time_results_wa-zl to zl.
endloop.
* leer ultimo saldo, Dìas devengados de vacaci, ver tran. PT66
sort zl by datum.
loop at zl into ls_zl where lgart = '5T12'.
ENDLOOP.
if sy-subrc = 0.
l_saldo = ls_zl-anzhl.
endif.
if l_saldo < 0.
l_saldo = 0.
endif.
Leer mensajes
CALL FUNCTION 'HR_FORMS_TIM_GET_B2_RESULTS'
EXPORTING
pernr = l_pernr
begda = l_begda
endda = l_endda
IMPORTING
tim_b2 = ls_b2
EXCEPTIONS
wrong_cluster_version = 1
no_read_authority = 2
cluster_archived = 3
technical_error = 4
OTHERS = 5.
LOOP AT ls_b2-ft_fehler INTO ls_fehler .
* do whatever
select single * from t555f WHERE error = ls_fehler-error
and errty = ls_fehler-errty.
.
.
.
ENDLOOP.
Ampliaciones (SMOD/CMOD)
PTIMTMW : Campos específicos del cliente en table controls del TMW (transaccion PTMW)
ejemplo EXIT_SAPLHRTIM00DVEXIT_001 asignar nombre a columna HRS1 COLUMNS_TITLES-HRS1_TITLE = 'Mi columna'.
ejemplo EXIT_SAPLHRTIM00DVEXIT_002 calcular valor para columna HRS1
CALL FUNCTION 'HR_TIME_RESULTS_GET'
EXPORTING
get_pernr = im_pernr
get_pabrj = im_date+0(4)
get_pabrp = im_date+4(2)
TABLES
get_pt = gt_pt
EXCEPTIONS
no_period_specified = 1
wrong_cluster_version = 2
no_read_authority = 3
cluster_archived = 4
technical_error = 5
OTHERS = 6
.
LOOP AT gt_pt WHERE ldate EQ im_date. * do whatever ... ... ENDLOOP. columns_entries-hrs1 = l_hora.
Transacciones gestión de tiempos
Definir tipos de absentismo/presencia
You configure absence types using the following menu path: Time Management > Time Data Recording and Administration > Absences > Absence Catalog > Define Absence Types. You can also configure absence types using configuration Table/view: V_T554S