SAP HCM ABAP BAPI
Contents
FM BAPI_BASICPAY_GETDETAIL
Ojo que esta BAPI calcula los conceptos indirectos :-)
FORM get_p0008_detail tables gt_bapi_wagetypes structure bapip0008p
USING p0008 LIKE p0008.
DATA ld_amount_external LIKE bapicurr-bapicurr.
DATA lt_return LIKE TABLE OF bapireturn1 WITH HEADER LINE.
CLEAR gt_bapi_wagetypes[].
CALL FUNCTION 'BAPI_BASICPAY_GETDETAIL'
EXPORTING
employeenumber = p0008-pernr
subtype = p0008-subty
objectid = p0008-objps
lockindicator = p0008-sprps
validitybegin = p0008-begda
validityend = p0008-endda
recordnumber = p0008-seqnr
IMPORTING
return = lt_return
TABLES
wagetypes = gt_bapi_wagetypes.
endform.
Como leer codigo de empleado (PERNR) via usuario SAP (SY-UNAME)
Funciónes BAPI_USR01DOHR_GETEMPLOYEE - RP_GET_PERNR_FROM_USERID con usrty = '0001'
BAPI_PTMGRATTABS_MNGCREATION - Crear Absentismo IT2001
FORM crear_abs USING p_pernr
p_subty
p_begda
p_endda
p_beguz
p_enduz
p_simulate
CHANGING p_retorno TYPE bapiret2_tab
p_hrabsatt_out TYPE bapihrabsatt_out
p_text.
DATA: lt_retorno LIKE bapiret2 OCCURS 0 WITH HEADER LINE,
ls_key TYPE bapihrtimeskey, " Campos clave BAPI p.entradas tiempos personal (HR)
ls_abs TYPE bapihrabsatt_in. " Campos presencia/absentismo, entrada sin datos adicionale.
* Lock the employee record
CALL FUNCTION 'BAPI_EMPLOYEE_ENQUEUE'
EXPORTING
number = p_pernr
IMPORTING
return = ls_return
EXCEPTIONS
OTHERS = 1.
if ls_return is NOT INITIAL .
MOVE-CORRESPONDING ls_return to p_retorno.
return.
endif.
CLEAR: ls_abs.
ls_abs-from_date = p_begda. " Inicio de la validez
ls_abs-to_date = p_endda. " Fin de la validez
ls_abs-start_time = p_beguz. " Hora de inicio
ls_abs-end_time = p_enduz. " Hora final
ls_abs-abs_att_hours = ''. " Horas de presencia/absentismo
ls_abs-previous_day = ''. " Indicador de día anterior
IF p_beguz IS NOT INITIAL AND p_enduz IS NOT INITIAL.
* ----> Logica de Horas para el dia
ls_abs-all_day_flag = space.
ELSE.
* ----> Logica Considera
ls_abs-all_day_flag = 'X'.
ENDIF.
CALL FUNCTION 'BAPI_PTMGRATTABS_MNGCREATION'
EXPORTING
employeenumber = p_pernr " Nro. Personal
abs_att_type = p_subty " Clase de Absentismos
hrabsatt_in = ls_abs " Campos presencia/absentismo, entrada sin datos adicionales
simulate = p_simulate
IMPORTING
hrabsatt_out = p_hrabsatt_out
hrabsattext = p_text
TABLES
return = p_retorno. " Retorno
CALL FUNCTION 'BAPI_EMPLOYEE_DEQUEUE'
EXPORTING
number = p_pernr
.
loop at p_retorno into data(ls_retorno) where type = 'E' or type = 'A'.
endloop
if sy-subrc <> 0.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'.
* CALL FUNCTION 'HR_PSBUFFER_INITIALIZE'.
ELSE.
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
* CALL FUNCTION 'HR_PSBUFFER_INITIALIZE'.
endif.
ENDFORM.
BAPI_TIMEQUOTA_GETDETAILEDLIST - Rutinas para leer contingente
method GET_SALDO_DIAS.
*--------------------------------------------------------------------*
* Calculo de saldo días
*--------------------------------------------------------------------*
DATA: lt_abs_quota TYPE TABLE OF bapihrquota,
lt_ktart TYPE tim_quota_type_tab,
ra_ktart TYPE RANGE OF p2006-ktart,
wa_ktart LIKE LINE OF ra_ktart.
DATA lv_saldodias TYPE anzhl.
*--------------------------------------------------------------------*
* Calculo de saldo días
*--------------------------------------------------------------------*
CALL FUNCTION 'BAPI_TIMEQUOTA_GETDETAILEDLIST'
EXPORTING
employeenumber = i_solicitud-pernr
* QUOTASELECTIONMOD = '1' "absentismos
TABLES
absencequotareturntable = lt_abs_quota.
CALL FUNCTION 'Z_HCM_CONTINGENTE_FROM_ABS'
EXPORTING
i_pernr = i_solicitud-pernr
i_begda = i_solicitud-begda
i_endda = i_solicitud-endda
i_subty = i_solicitud-subty
IMPORTING
e_ktart = lt_ktart.
LOOP AT lt_ktart INTO DATA(ls_ktart).
wa_ktart-low = ls_ktart.
wa_ktart-sign = 'I'.
wa_ktart-option = 'EQ'.
APPEND wa_ktart TO ra_ktart.
CLEAR wa_ktart.
ENDLOOP.
lv_saldodias = 0.
IF ra_ktart[] IS NOT INITIAL.
LOOP AT lt_abs_quota INTO DATA(ls_abs_quota) WHERE quotatype IN ra_ktart.
lv_saldodias = lv_saldodias + ls_abs_quota-rest_free.
ENDLOOP.
ENDIF.
lv_saldodias = lv_saldodias - i_solicitud-quota_deduction.
IF lv_saldodias < 0.
lv_saldodias = 0.
ENDIF.
r_saldo = lv_saldodias. "type anzhl
endmethod.
FUNCTION z_hcm_contingente_from_abs.
*"----------------------------------------------------------------------
*"*"Interfase local
*" IMPORTING
*" REFERENCE(I_PERNR) TYPE PERNR_D
*" REFERENCE(I_BEGDA) TYPE BEGDA DEFAULT SY-DATUM
*" REFERENCE(I_ENDDA) TYPE ENDDA DEFAULT SY-DATUM
*" REFERENCE(I_SUBTY) TYPE T554S-SUBTY
*" EXPORTING
*" REFERENCE(E_KTART) TYPE TIM_QUOTA_TYPE_TAB
*"----------------------------------------------------------------------
DATA lt_p0001 TYPE TABLE OF p0001.
DATA ls_t503 TYPE t503.
DATA ls_t001p TYPE t001p.
DATA ls_t554s TYPE t554s.
DATA ls_t556c TYPE t556c.
DATA ls_t556r TYPE t556r.
CALL FUNCTION 'HR_READ_INFOTYPE'
EXPORTING
pernr = i_pernr
infty = '0001'
TABLES
infty_tab = lt_p0001
EXCEPTIONS
infty_not_found = 1
OTHERS = 2.
IF sy-subrc <> 0.
* Implement suitable error handling here
ENDIF.
LOOP AT lt_p0001 INTO DATA(ls_p0001) WHERE begda <= i_endda AND
endda >= i_begda.
ENDLOOP.
IF sy-subrc <> 0.
RETURN.
ENDIF.
SELECT SINGLE * INTO ls_t503 FROM t503
WHERE persg = ls_p0001-persg
AND persk = ls_p0001-persk.
SELECT SINGLE * INTO ls_t001p FROM t001p
WHERE werks = ls_p0001-werks
AND btrtl = ls_p0001-btrtl.
SELECT SINGLE * INTO ls_t554s FROM t554s
WHERE moabw = ls_t001p-moabw
AND subty = i_subty
AND endda >= i_begda
AND begda <= i_endda.
SELECT SINGLE * INTO ls_t556c FROM t556c
WHERE mopgk = ls_t503-konty
AND mozko = ls_t001p-mozko
AND crule = ls_t554s-crule
AND ctype = 'Q'.
SELECT SINGLE * INTO ls_t556r FROM t556r
WHERE "
mopgk = ls_t503-konty
AND mozko = ls_t001p-mozko
AND qtype = 'A'
AND dedrg = ls_t556c-deabp
AND endda >= i_begda
AND begda <= i_endda.
* copiado de LHRTIM00QUOTADEDUCTIONF01 #986
CONSTANTS: QSTEP TYPE I VALUE 2.
DATA: BEGIN OF selqtypes OCCURS 0,
cktart(2) TYPE c,
END OF selqtypes.
DATA:qttps TYPE qttps.
qttps = ls_t556r-qttps.
DO 100 TIMES.
selqtypes-cktart = qttps.
IF selqtypes-cktart IS INITIAL. "' '"
EXIT. "end-of-sequence was found
ENDIF.
APPEND selqtypes.
SHIFT qttps BY qstep PLACES LEFT.
ENDDO.
loop at selqtypes.
APPEND selqtypes-cktart to E_KTART.
endloop.
ENDFUNCTION.
La función anterior es equivalente al siguiente método:
DATA lt_p0001 TYPE p0001_tab.
CALL FUNCTION 'HR_READ_INFOTYPE'
EXPORTING
pernr = i_pernr
infty = '0001'
begda = i_begda
endda = i_endda
TABLES
infty_tab = lt_p0001
EXCEPTIONS
infty_not_found = 1
OTHERS = 2.
IF sy-subrc <> 0.
* Implement suitable error handling here
ENDIF.
CALL METHOD cl_hrpaybr_absence_quotas=>get_quota_type_tab
EXPORTING
iv_pernr = i_pernr
iv_begda = i_begda
iv_endda = i_endda
it_p0001 = lt_p0001
iv_subty = i_subty
IMPORTING
et_quota_type_tab = ra_ktart.
Tabla Contingentes: T556R - Reglamentación secuencia liquidación p.contingentes absent.
tabla PTQUODED
Key Details regarding PTQUODED: • Purpose: Contains entries for every day of absence deducted from an employee's quota, linked by document numbers of IT2001 and IT2006. • Trigger: When a deductible absence (configured in T554S) is created via IT2001, the system automatically creates an entry in PTQUODED. • Consistency Check: If deductions in IT2006 do not match IT2001 records, PTQUODED is often the source of the inconsistency, which can be fixed using report RPTBPC10 or HNZUPTC0. • Common Issues: If LSMW is used to update absences, PTQUODED might not be updated, leading to discrepancies in PT50, requiring manual or report-based corrections. • Key Fields: The table uses document numbers (DOCNR) and personnel numbers (PERNR) to link absence entries with quotas.