20220826 SAP创建员工的接口 外部给号
开发环境外部给号可以的,QAS报错
fail:sapMessage=编号范围 02 在内部, 请勿输入人员编号;
FUNCTION ZRFC_HR_EMPLOYEE_ENTRY_C.
*"----------------------------------------------------------------------
*"*"局部接口:
*" IMPORTING
*" VALUE(L_PERNROUT) TYPE PERNR_D DEFAULT ''
*" EXPORTING
*" VALUE(R_PERNR) TYPE PERNR_D
*" TABLES
*" T_PERSON STRUCTURE ZHRIFRZXX_PERSON OPTIONAL
*" T_PA0021 STRUCTURE ZHRIFRZXX_PA0021 OPTIONAL
*" T_PA0023 STRUCTURE ZHRIFRZXX_PA0023 OPTIONAL
*" T_PA0022 STRUCTURE ZHRIFRZXX_PA0022 OPTIONAL
*" T_PA9107 STRUCTURE ZHRIFRZXX_PA9107 OPTIONAL
*" T_RETURN STRUCTURE ZZS_IF_RETURN OPTIONAL
*"----------------------------------------------------------------------
DATA: lt_callstack TYPE abap_callstack,
ls_callstack TYPE abap_callstack_line,
lv_funname TYPE rs38l_fnam.
DATA:lv_pernr TYPE pa0001-pernr.
DATA:e_msgid TYPE zzt_if000_log-msgid,
e_sendr TYPE zzt_if000_log-sendr.
DATA:lv_msgid TYPE sysuuid_x16.
DATA: lt_message TYPE STANDARD TABLE OF zzs_if_return.
IF e_msgid IS INITIAL.
TRY.
CALL METHOD cl_system_uuid=>if_system_uuid_static~create_uuid_c32
RECEIVING
uuid = lv_msgid.
CATCH cx_uuid_error .
ENDTRY.
ELSE.
lv_msgid = e_msgid.
ENDIF.
CALL FUNCTION 'SYSTEM_CALLSTACK'
EXPORTING
max_level = 0
IMPORTING
callstack = lt_callstack.
CLEAR lv_funname.
LOOP AT lt_callstack INTO ls_callstack. " or read INDEX 1
CHECK ls_callstack-blocktype EQ 'FUNCTION'.
CHECK ls_callstack-mainprogram EQ 'SAPLZRFCG_HR'.
lv_funname = ls_callstack-blockname.
EXIT.
ENDLOOP.
IF lv_funname IS INITIAL.
lv_funname = lv_funname.
ENDIF.
zfmparavalsave1 lv_funname.
zfmparavalsave2 'B' 'ZRFC_HR_EMPLOYEE_ENTRY_C' e_sendr 'ERP' lv_msgid.
*-----变量定义-----
"接口日志表
DATA: lt_log TYPE TABLE OF zzt_if000_log,
ls_log TYPE zzt_if000_log.
"命中条目数
DATA: lv_lines TYPE i.
"接口描述
DATA: lv_zifds TYPE zzt_if000_mconf-zifds.
"错误标识
DATA: lv_error TYPE c.
"日志:业务关键字
DATA: lv_zckey TYPE zzt_if000_log-zckey.
DATA:lv_langu TYPE spras.
"内表行数
DATA: lv_line TYPE i.
DATA:lv_objid TYPE objid .
RANGES lr_pernr FOR pa0000-pernr.
GET TIME.
*///清空返回表
FREE: t_return.
*///Message Id: 在PI上产生,RFC中接收,然后返回给外部系统
* 可通过此标识进行PI、ERP以及外围系统的接口日志核对
* i_msgid = lv_msgid.
CLEAR: lv_error.
REFRESH: lt_log.
"获得接口描述
CLEAR: lv_zifds.
SELECT SINGLE zifds
INTO lv_zifds "接口描述
FROM zzt_if000_mconf
WHERE zifno = 'ZRFC_HR_EMPLOYEE_ENTRY_C'
AND sendr = e_sendr
AND recer = 'ERP'
AND ifwrk = 'X'.
* IF sy-subrc <> 0.
* lv_error = 'X'.
*
* CLEAR: t_return.
* t_return-ifflg = 'E'. "消息标识:失败
* "接口 &1 从 &2 到 &3 未启用,请检查!
* MESSAGE s016(zif001) WITH gc_if217 e_sendr gc_erp INTO t_return-ifmsg.
* APPEND t_return.
*
* ENDIF.
*--------输入数据检查通过,在数据处理之前记录日志------
GET TIME.
FREE: lt_log.
CLEAR: ls_log.
ls_log-zifno = 'ZRFC_HR_EMPLOYEE_ENTRY_C'. "接口编号
CONCATENATE sy-datum
sy-uzeit
INTO ls_log-reqdt. "时间戳
ls_log-sendr = e_sendr. "发送方
ls_log-recer = 'ERP'. "接收方
ls_log-reqde = sy-datum. "请求日期
ls_log-reqte = sy-uzeit. "请求时间
ls_log-msgid = lv_msgid. "Message id
IF lv_error IS NOT INITIAL.
ls_log-repde = sy-datum. "返回日期
ls_log-repte = sy-uzeit. "返回时间
ls_log-ifflg = t_return-ifflg. "执行状态
ls_log-ifmsg = t_return-ifmsg. "消息
ENDIF.
ls_log-usnam = sy-uname. "用户名
ls_log-tcode = sy-tcode. "TCODE
ls_log-repid = lv_funname. "程序名
APPEND ls_log TO lt_log.
"保存日志
CALL FUNCTION 'ZZF_IF000_LOG_SAVE'
TABLES
t_log = lt_log.
DATA:wa_person TYPE zhrifrzxx_person,
wa_0021 TYPE zhrifrzxx_pa0021,
wa_0023 TYPE zhrifrzxx_pa0023,
wa_0022 TYPE zhrifrzxx_pa0022,
wa_9107 TYPE zhrifrzxx_pa9107.
DATA:i0000 TYPE p0000.
DATA:i0001 TYPE p0001.
DATA:i0002 TYPE p0002.
DATA:i0529 TYPE p0529.
DATA:ennnn TYPE STANDARD TABLE OF prelp.
DATA:innnn TYPE prelp.
DATA:l_date TYPE TABLE OF bapipakey,
lw_date TYPE bapipakey,
l_return TYPE STANDARD TABLE OF hrpad_return,
l_returnfun TYPE hrpad_return,
l_x TYPE boole_d.
DATA:lt_sfz TYPE STANDARD TABLE OF pa0185,
lw_sfz TYPE pa0185.
DATA:lt_lz TYPE STANDARD TABLE OF pa0000,
lw_lz TYPE pa0000.
DATA:l_sec(1)."二次标识
DATA:l_pernr TYPE pa0001-pernr."二次入职人员号
DATA:l_massn TYPE pa0000-massn,
l_massg TYPE pa0000-massg.
*查询系统中身份证号
SELECT *
INTO CORRESPONDING FIELDS OF TABLE lt_sfz
FROM pa0185
WHERE subty = '01'.
*取离职事件
SELECT *
INTO CORRESPONDING FIELDS OF TABLE lt_lz
FROM pa0000
WHERE massn EQ 'Z7' OR massn EQ 'Z8'.
*查询入职事件
*入职操作
LOOP AT t_person INTO wa_person.
*判断身份证号有没有在系统中存在,如果存在,判断有没有离职事件,如果存在,则进行二次入职
IF wa_person-icnum IS NOT INITIAL.
READ TABLE lt_sfz INTO lw_sfz WITH KEY icnum = wa_person-icnum.
IF sy-subrc = 0.
*获取到人员号
l_pernr = lw_sfz-pernr.
* 判断有无离职事件 wa_person-begda
READ TABLE lt_lz INTO lw_lz WITH KEY pernr = l_pernr.
IF sy-subrc = 0.
*做二次入职
l_sec = 'X'.
ELSE.
CLEAR: t_return.
t_return-ifflg = 'E'.
t_return-ifmsg = '员工没有做离职,不能做二次入职操作'.
APPEND t_return.
CLEAR: t_return.
CONTINUE.
ENDIF.
ENDIF.
ENDIF.
*判断是否二次入职
IF l_sec = 'X'.
l_massn = 'Z2'.
l_massg = '20'.
*二次入职、强行写信息类型
*写入0000,如果0000写成功,则代表二次入职成功,后续写0001,0002等信息
DATA: lw_return TYPE bapireturn1,
l_operation TYPE pspar-actio,
lw_p0000 TYPE p0000 ,
lt_bapiret2 TYPE STANDARD TABLE OF bapiret2.
l_operation = 'INS'.
lw_p0000-pernr = l_pernr .
lw_p0000-infty = '0000'.
lw_p0000-begda = wa_person-begda.
lw_p0000-endda = '99991231'.
lw_p0000-massn = l_massn.
lw_p0000-massg = l_massg.
* 加锁
CLEAR: lw_return.
CALL FUNCTION 'HR_EMPLOYEE_ENQUEUE'
EXPORTING
number = l_pernr
IMPORTING
return = lw_return.
IF lw_return-type EQ 'E'.
t_return-ifflg = 'E'.
t_return-ifmsg = lw_return-message.
ELSE.
* 操作
CALL FUNCTION 'HR_INFOTYPE_OPERATION'
EXPORTING
infty = lw_p0000-infty
number = lw_p0000-pernr
validityend = lw_p0000-endda
validitybegin = lw_p0000-begda
record = lw_p0000
operation = l_operation
IMPORTING
return = lw_return.
IF lw_return-type EQ 'E'.
t_return-ifflg = lw_return-type.
t_return-ifmsg = lw_return-message .
ENDIF.
ENDIF.
* 解锁
CLEAR: lw_return.
CALL FUNCTION 'HR_EMPLOYEE_DEQUEUE'
EXPORTING
number = l_pernr
IMPORTING
return = lw_return.
IF lw_return-type EQ 'E'.
t_return-ifflg = lw_return-type.
t_return-ifmsg = lw_return-message .
ENDIF.
*二次入职失败
IF t_return-ifflg EQ 'E'.
APPEND t_return.
CLEAR: t_return.
CONTINUE.
ELSE.
r_pernr = l_pernr.
ENDIF.
ELSE.
l_massn = 'Z1'.
l_massg = '10'.
l_pernr = l_pernrout."外部给号
*赋值 0000 0001 0002部分
*写入数据 把i0001 转化为prelp格式
i0001-infty = '0001'.
i0001-begda = wa_person-begda.
i0001-endda = '99991231'.
i0001-plans = wa_person-plans.
i0001-werks = wa_person-werks.
i0001-btrtl = '0001'.
i0001-persg = wa_person-persg.
i0001-persk = wa_person-persk.
i0001-abkrs = wa_person-abkrs.
* 工作合同
i0001-ansvh = wa_person-persk.
CALL METHOD cl_hr_pnnnn_type_cast=>pnnnn_to_prelp
EXPORTING
pnnnn = i0001
IMPORTING
prelp = innnn.
APPEND innnn TO ennnn .
*写入数据 把i0002 转化为prelp格式
i0002-infty = '0002'.
i0002-begda = wa_person-begda.
i0002-endda = '99991231'.
i0002-nachn = wa_person-nachn.
i0002-vorna = wa_person-vorna.
i0002-rufnm = wa_person-rufnm.
i0002-gbdat = wa_person-gbdat.
i0002-gesch = wa_person-gesch.
i0002-natio = wa_person-natio.
i0002-zhkxz = wa_person-zhkxz.
i0002-gbort = wa_person-gbort.
i0002-zgzdd = wa_person-zgzdd.
i0002-famst = wa_person-famst.
i0002-konfe = wa_person-kitxt.
i0002-sprsl = '1'.
CALL METHOD cl_hr_pnnnn_type_cast=>pnnnn_to_prelp
EXPORTING
pnnnn = i0002
IMPORTING
prelp = innnn.
APPEND innnn TO ennnn .
**写入数据 把i0529 转化为prelp格式
* i0529-infty = '0529'.
* i0529-begda = wa_person-begda.
* i0529-endda = '99991231'.
* i0529-pcode = wa_person-pcode.
* i0529-racky = wa_person-racky.
* i0529-zah = wa_person-zah.
* i0529-zfz = wa_person-zfz.
* CALL METHOD cl_hr_pnnnn_type_cast=>pnnnn_to_prelp
* EXPORTING
* pnnnn = i0529
* IMPORTING
* prelp = innnn.
* APPEND innnn TO ennnn .
*
CALL FUNCTION 'HR_PAD_HIRE_EMPLOYEE'
EXPORTING
employeenumber = l_pernr
* REFERENCEPERNR =
hiringdate = wa_person-begda
actiontype = l_massn
reasonforaction = l_massg
pnnnn_tab = ennnn
* PREF_TAB =
nocommit = ''
IMPORTING
return_tab = l_return
bapipakey_tab = l_date
is_ok = l_x.
ENDIF.
*判断是否入职成功
IF l_sec NE 'X'.
READ TABLE l_date INTO lw_date INDEX 1.
IF sy-subrc = 0.
r_pernr = lw_date-employeeno.
ELSE.
CLEAR: t_return.
t_return-ifflg = 'E'.
* MESSAGE
LOOP AT l_return INTO l_returnfun .
t_return-ifmsg = t_return-ifmsg && l_returnfun-message.
ENDLOOP.
APPEND t_return.
CLEAR: t_return.
CONTINUE.
ENDIF.
ENDIF.
*至此,无CONTINUE则代表入职成功,根据入职的性质,将数据放入内存,调用外部报表写其他信息类型数据,返回码如果有错,则为W,如果成功,则为S
*判断是否二次入职,二次入职需要把人员号也放入内存
FREE MEMORY ID 'ZHR_M_PERNR'.
FREE MEMORY ID 'ZHR_M_PERSON'.
FREE MEMORY ID 'ZHR_M_PA0021'.
FREE MEMORY ID 'ZHR_M_PA0023'.
FREE MEMORY ID 'ZHR_M_PA0022'.
FREE MEMORY ID 'ZHR_M_PA9107'.
FREE MEMORY ID 'ZHR_M_SEC'.
IF l_sec = 'X'.
EXPORT l_sec TO MEMORY ID 'ZHR_M_SEC'.
ENDIF.
EXPORT r_pernr TO MEMORY ID 'ZHR_M_PERNR'.
EXPORT t_person TO MEMORY ID 'ZHR_M_PERSON'.
EXPORT t_pa0021 TO MEMORY ID 'ZHR_M_PA0021'.
EXPORT t_pa0023 TO MEMORY ID 'ZHR_M_PA0023'.
EXPORT t_pa0022 TO MEMORY ID 'ZHR_M_PA0022'.
EXPORT t_pa9107 TO MEMORY ID 'ZHR_M_PA9107'.
*调用外部程序
SUBMIT zhrrzcx_tag AND RETURN.
*获取外部程序返回状态
IMPORT it_return TO t_return FROM MEMORY ID 'ZHR_M_RETURN'.
FREE MEMORY ID 'ZHR_M_RETURN'.
ENDLOOP.
CLEAR: ls_log.
DATA:l_flag(1).
READ TABLE t_return WITH KEY ifflg = 'E'.
IF sy-subrc = 0.
l_flag = 'E'.
ELSE.
l_flag = 'S'.
ENDIF.
READ TABLE lt_log INTO ls_log INDEX 1.
IF sy-subrc = 0.
ls_log-repde = sy-datum. "返回日期
ls_log-repte = sy-uzeit. "返回时间
ls_log-ifflg = l_flag. "执行状态
ls_log-ifmsg = t_return-ifmsg. "消息
MODIFY lt_log FROM ls_log INDEX 1.
ENDIF.
*///处理结束后更新日志
CALL FUNCTION 'ZZF_IF000_LOG_SAVE'
TABLES
t_log = lt_log.
zfmparavalsave2 'R' 'ZRFC_HR_EMPLOYEE_ENTRY_C' e_sendr 'ERP' lv_msgid.
COMMIT WORK.
ENDFUNCTION.
员工编号范围配置路径
SPRO→人事管理→人事管理→基本设置→维护职员的代码的数值范围间隔
就是这个外部给号
在QAS环境下 这个勾没有打上的问题
这个勾如何打上在表 NRIV 的EXTERNIND的勾打上就可以了