SAP HCM ABAP CLUSTER
From SapWiki
Revision as of 20:14, 12 February 2021 by WikiSysop (talk | contribs) (→Function Module: CD_EVALUATION_PERIODS)
Contents
Lectura de datos de Préstamo
*----------------------------------------------------------------------*
* FORM .......
*----------------------------------------------------------------------*
* copiado de include MP004541
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
form get_loan_results tables pt_savp structure gt_savp
using pf_pernr
pf_dlart
pf_objps
pf_dbtcu
changing pfx_opelo
pfx_paylo
pfx_abrdt
p_cuota
pfx_subrc.
data: ltx_rgdir like pc261 occurs 0 with header line,
ltx_rgdir_o like pc261 occurs 0 with header line,
lsx_rgdir like ltx_rgdir,
lsx_result type pay99_result,
lsx_v0 like line of lsx_result-inter-v0,
lsx_rt like line of lsx_result-inter-rt,
lfx_relid like pcl2-relid,
lfx_molga like t500l-molga,
lsx_t500l like t500l,
lfx_amount like q0045-darbt,
lfx_line like sy-tabix,
lfx_fday type d,
lfx_lday type d,
lfx_opecu like q0045-opecu,
ls_paper type pc2paper,
lf_payment_value_date type datum,
ls_loid_33 type pclo_id. "Note 834827
data wa_prest_ipc type zhr_prest_ipc.
*##--BEGIN--##
clear: pfx_opelo, pfx_paylo, pfx_abrdt, pfx_subrc.
call function 'CU_READ_RGDIR_NEW'
exporting
persnr = pf_pernr
check_read_authority = space
importing
molga = lfx_molga
tables
in_rgdir = ltx_rgdir
exceptions
others = 1.
if sy-subrc <> 0.
move sy-subrc to pfx_subrc.
return.
endif.
move sy-subrc to pfx_subrc.
* Limitar directorio de cluster al período seleccionado
call function 'CD_SELECT_DATE_RANGE'
exporting
fpper_begda = g_begda
fpper_endda = g_endda
tables
in_rgdir = ltx_rgdir
out_rgdir = ltx_rgdir_o.
"take only regular and actual periods
loop at ltx_rgdir_o transporting no fields
where void = abap_true
or payty <> space
or srtza <> 'A'.
delete ltx_rgdir_o index sy-tabix.
endloop.
ltx_rgdir[] = ltx_rgdir_o[].
sort ltx_rgdir descending by seqnr.
data(l_lines) = lines( ltx_rgdir ).
if l_lines = 0.
pfx_subrc = 9.
return.
endif.
* get relid
select single * from t500l
into lsx_t500l
where molga = lfx_molga.
move lsx_t500l-relid to lfx_relid.
data(lflag_loan_exists) = abap_false.
data lv_subrc type sy-subrc.
loop at ltx_rgdir into lsx_rgdir
where fpend >= p0045-begda. "for performance
if lflag_loan_exists = abap_true.
exit. "stop loop at rgdir, because period was found
endif.
call function 'PYXX_READ_PAYROLL_RESULT'
exporting
clusterid = lfx_relid
employeenumber = pf_pernr
sequencenumber = lsx_rgdir-seqnr
read_only_international = 'X'
check_read_authority = ' '
changing
payroll_result = lsx_result
exceptions
others = 1.
if sy-subrc <> 0.
move sy-subrc to pfx_subrc.
else.
move sy-subrc to pfx_subrc.
* get loan result .....
loop at lsx_result-inter-v0 into lsx_v0 where v0typ = 'L'.
if pf_dlart = lsx_v0-vinfo+0(4) and
pf_objps = lsx_v0-vinfo+4(2).
lflag_loan_exists = abap_true.
pfx_abrdt = lsx_rgdir-fpend.
lv_subrc = 1.
loop at lsx_result-inter-rt into lsx_rt
where v0typ = 'L'
and v0znr = lsx_v0-v0znr
and lgart = '/LLB'.
if lsx_rt-betrg = 0. "this is a potential period
"here the loan is already paid back completely
lv_subrc = 1. "this is equal to that no /LLB exists
exit. "the loop and check previous period
else.
* verificar si ya se actualizo por IPC
select single * into wa_prest_ipc from zhr_prest_ipc where pernr = pf_pernr and
seqnr = lsx_rgdir-seqnr.
if sy-subrc <> 0.
move: lsx_result-inter-versc-waers to lfx_opecu,
lsx_rt-betrg to pfx_opelo.
lv_subrc = 0.
else.
lv_subrc = 1.
pfx_opelo = 0.
exit.
endif.
endif.
endloop.
if lv_subrc = 0.
loop at lsx_result-inter-rt into lsx_rt
where v0typ = 'L'
and v0znr = lsx_v0-v0znr
and lgart = '/LRP'.
if lsx_rt-betrg = 0. "this is a potential period
"here the loan is already paid back completely
lv_subrc = 1. "this is equal to that no /LLB exists
exit. "the loop and check previous period
else.
move lsx_rt-betrg to p_cuota.
endif.
endloop.
endif.
else. "this loan is not yet processed in payroll
move '7' to pfx_subrc.
endif.
endloop.
endif.
endloop.
endform. " GET_LOAN_RESULTS
Modificar Cluster
- Ejemplo de lectura de cluster con modificacion a tabla BT
CLEAR rgdir.
REFRESH rgdir.
CALL FUNCTION 'CU_READ_RGDIR_NEW'
EXPORTING
persnr = i_pernr
TABLES
in_rgdir = rgdir
EXCEPTIONS
no_record_found = 1
import_mismatch_error = 2
no_read_authority = 3
OTHERS = 4.
check sy-subrc = 0.
DELETE rgdir WHERE fpper NE i_fpper.
DESCRIBE TABLE rgdir LINES sy-tfill.
check sy-tfill > 0.
LOOP AT rgdir.
ld_pernr = i_pernr.
ld_seqnr = rgdir-seqnr.
CALL FUNCTION 'PYXX_READ_PAYROLL_RESULT'
EXPORTING
clusterid = 'CL'
employeenumber = ld_pernr
sequencenumber = ld_seqnr
read_only_buffer = ' '
CHANGING
payroll_result = ls_result
EXCEPTIONS
illegal_isocode_or_clusterid = 1
error_generating_import = 2
import_mismatch_error = 3
subpool_dir_full = 4
no_read_authority = 5
no_record_found = 6
versions_do_not_match = 7
OTHERS = 8.
* procesar bt
loop at ls_result-inter-bt into gs_bt.
add i_monto to gs_bt-betrg.
modify ls_result-inter-bt from gs_bt.
ENDLOOP.
check sy-subrc = 0.
CALL FUNCTION 'PYXX_WRITE_PAYROLL_RESULT'
EXPORTING
clusterid = 'CL'
employeenumber = ld_pernr
sequencenumber = ld_seqnr
payroll_result = ls_result
EXCEPTIONS
illegal_isocode_or_clusterid = 1
error_generating_export = 2
export_error = 3
subpool_dir_full = 4
no_update_authority = 5
incomplete_result_imported = 6
OTHERS = 7.
IF sy-subrc <> 0.
* error
EXIT.
ENDIF.
CALL FUNCTION 'HR_FLUSH_BUFFER_UPDATE_PCLX'
EXPORTING
test = ' '
EXCEPTIONS
insert_error = 1
no_update_authority = 2
OTHERS = 3.
IF sy-subrc <> 0.
* error
EXIT.
ENDIF.
Leer payroll completo
REPORT yleer_cluster.
CLASS cl_payroll DEFINITION.
PUBLIC SECTION.
CLASS-METHODS: leer_payroll IMPORTING i_pernr TYPE p0000-pernr
EXPORTING et_payres TYPE STANDARD TABLE
EXCEPTIONS no_data.
ENDCLASS.
CLASS cl_payroll IMPLEMENTATION.
METHOD leer_payroll.
DATA lt_rgdir TYPE STANDARD TABLE OF pc261.
DATA: ls_payres TYPE REF TO data,
lt_payres TYPE REF TO data.
DATA: l_pernr TYPE p0003-pernr,
l_molga TYPE t500l-molga,
l_relid TYPE t500l-relid,
l_typename TYPE t52relid-typename,
l_tabname TYPE t52relid-tabname.
FIELD-SYMBOLS <ls_evp> TYPE any.
FIELD-SYMBOLS: <ls_payres> TYPE any,
<es_payres> TYPE any,
<lt_payres> TYPE STANDARD TABLE.
CALL FUNCTION 'CU_READ_RGDIR_NEW'
EXPORTING
persnr = i_pernr
IMPORTING
molga = l_molga
TABLES
in_rgdir = lt_rgdir.
IF l_molga IS INITIAL.
RAISE no_data.
ENDIF.
SELECT SINGLE relid INTO l_relid
FROM t500l
WHERE molga = l_molga.
* read typename from t52relid.
SELECT SINGLE typename tabname
FROM t52relid
INTO (l_typename, l_tabname)
WHERE relid = l_relid.
CREATE DATA ls_payres TYPE (l_typename). "PAYCL_RESULT
CREATE DATA lt_payres TYPE TABLE OF (l_typename).
ASSIGN ls_payres->* TO <ls_payres>.
ASSIGN lt_payres->* TO <lt_payres>.
LOOP AT lt_rgdir INTO DATA(ls_rgdir).
"Read payroll results
CALL FUNCTION 'PYXX_READ_PAYROLL_RESULT'
EXPORTING
clusterid = l_relid
employeenumber = i_pernr
sequencenumber = ls_rgdir-seqnr
filter_cumulations = abap_false
CHANGING
payroll_result = <ls_payres>
EXCEPTIONS
OTHERS = 1.
IF sy-subrc = 0.
"Get evp
ASSIGN COMPONENT 'EVP' OF STRUCTURE <ls_payres> TO <ls_evp>.
<ls_evp> = ls_rgdir.
APPEND <ls_payres> TO <lt_payres>.
ENDIF.
ENDLOOP.
et_payres[] = <lt_payres>.
ENDMETHOD.
ENDCLASS.
PARAMETERS p_pernr TYPE p0000-pernr.
START-OF-SELECTION.
DATA lt_payres TYPE TABLE OF paycl_result.
CALL METHOD cl_payroll=>leer_payroll
EXPORTING
i_pernr = p_pernr
IMPORTING
et_payres = lt_payres
EXCEPTIONS
no_data = 1.
if sy-subrc <> 0.
return.
endif.
Función PYXX_READ_RGDIR_PAYRESULTS
DATA: lt_results TYPE table of pay99_result,
lt_rgdir type table of pc261.
data: l_pernr type pernr_d,
l_molga TYPE t500l-molga.
l_pernr = i_pernr.
CALL FUNCTION 'CU_READ_RGDIR_NEW'
EXPORTING
persnr = l_pernr
check_read_authority = space
IMPORTING
molga = l_molga
TABLES
in_rgdir = lt_rgdir
EXCEPTIONS
OTHERS = 1.
IF sy-subrc <> 0.
RETURN.
ENDIF.
CALL FUNCTION 'PYXX_READ_RGDIR_PAYRESULTS'
EXPORTING
clusterid = 'CL'
employeenumber = l_pernr
read_only_international = 'X'
TABLES
rgdir = lt_rgdir
imported_periods = lt_results
EXCEPTIONS
import_error = 1
OTHERS = 2.
Function Module: CD_EVALUATION_PERIODS
This module transfers the payroll results to a payroll run as ‘A’ records (current). It also transfers the accompanying ‘P’ records (previous). This is the module most frequently used in evaluation programs.
TYPES: BEGIN OF tinper_directory_entry.
TYPES: iperm LIKE pc261-iperm,
inper LIKE pc261-inper,
inpty LIKE pc261-inpty,
inpid LIKE pc261-inpid,
inocr LIKE pc261-inocr,
ipend LIKE pc261-ipend,
END OF tinper_directory_entry.
TYPES: tinper_directory TYPE tinper_directory_entry OCCURS 0.
DATA: inper_directory_entry TYPE tinper_directory_entry,
inper_directory TYPE tinper_directory.
FORM read_cluster TABLES p_rgdir STRUCTURE pc261
p_coava STRUCTURE pc2co_ava
USING p_pernr LIKE pernr-pernr
p_molga LIKE t500l-molga
CHANGING p_waers LIKE pc202-waers. .
REFRESH: p_rgdir, p_coava, inper_directory.
CLEAR: p_rgdir, p_coava, inper_directory_entry, inper_directory.
CALL FUNCTION 'CU_READ_RGDIR'
EXPORTING
persnr = pernr-pernr
IMPORTING
molga = molga
TABLES
in_rgdir = p_rgdir
EXCEPTIONS
no_record_found = 1
OTHERS = 2.
IF sy-subrc <> 0.
ENDIF.
LOOP AT p_rgdir WHERE ipend BETWEEN pn-begda AND pn-endda
AND void IS INITIAL.
MOVE-CORRESPONDING p_rgdir TO inper_directory_entry.
COLLECT inper_directory_entry INTO inper_directory.
ENDLOOP.
LOOP AT inper_directory INTO inper_directory_entry.
CLEAR evp_inper. REFRESH evp_inper.
CALL FUNCTION 'CD_EVALUATION_PERIODS'
EXPORTING
bonus_date = inper_directory_entry-ipend
inper_modif = inper_directory_entry-iperm
inper = inper_directory_entry-inper
pay_type = inper_directory_entry-inpty
pay_ident = inper_directory_entry-inpid
TABLES
rgdir = p_rgdir
evpdir = evp_inper
EXCEPTIONS
no_record_found = 1
OTHERS = 2.
IF sy-subrc <> 0.
EXIT.
ENDIF.
LOOP AT evp_inper INTO evp
WHERE fpend BETWEEN pn-begda AND pn-endda.
IF evp-srtza EQ 'P'.
MOVE-CORRESPONDING inper_directory_entry TO evp. "important
ENDIF.
APPEND evp.
ENDLOOP.
ENDLOOP.
DESCRIBE TABLE evp LINES evp_number_lines.
CHECK evp_number_lines GT 0.
LOOP AT evp.
PERFORM data_cluster TABLES evp
p_coava
USING evp-fpper
CHANGING p_waers.
ENDLOOP.
ENDFORM. " read_cluster
*&--------------------------------------------------------------------*
*& Form data_cluster
*&--------------------------------------------------------------------*
* text
*---------------------------------------------------------------------*
* -->P_EVP text
* -->P_COAVA text
* -->P_FPPER text
*---------------------------------------------------------------------*
FORM data_cluster TABLES p_evp STRUCTURE pc261
p_coava STRUCTURE pc2co_ava
USING p_fpper LIKE evp-fpper
CHANGING p_waers TYPE waers.
DATA: ls_coava LIKE pc2co_ava OCCURS 0 WITH HEADER LINE.
CALL FUNCTION 'PYXX_READ_PAYROLL_RESULT'
EXPORTING
clusterid = import_relid
employeenumber = pernr-pernr
sequencenumber = p_evp-seqnr
read_only_international = ' '
check_read_authority = ' '
CHANGING
payroll_result = result
EXCEPTIONS
illegal_isocode_or_clusterid = 1
error_generating_import = 2
import_mismatch_error = 3
subpool_dir_full = 4
no_read_authority = 5
no_record_found = 6
versions_do_not_match = 7
OTHERS = 8.
IF sy-subrc <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
* WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ELSE.
p_waers = result-inter-versc-waers.
CLEAR ls_coava.
REFRESH ls_coava.
LOOP AT result-nat-coava INTO ls_coava
WHERE ( indcl EQ '02' OR indcl EQ '08' ) AND pyper EQ p_fpper.
MOVE ls_coava TO p_coava.
APPEND p_coava.
ENDLOOP.
SORT p_coava BY abkrs indcl indcm pyper inper fpper
begda endda awart. "+
DELETE ADJACENT DUPLICATES FROM p_coava.
ENDIF.
ENDFORM. " data_cluster