SAP创建员工的接口 外部给号

118 篇文章 9 订阅
25 篇文章 3 订阅

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的勾打上就可以了 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

gavin_gxh

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值