外挂系统 -减少SAP用户许可数, 多点操作及时同步SAP

用过SAP 的人都知道SAP 是按照用户数来计算项目费用和年维护费的,所以很多公司设置了共同账号,外挂程序,WDA程序等,各种各样的规避方式。
当然SAP 标准的功能也相对简单化,要实现一些自定义的功能来满足各企业实际业务,那需要进行二次开发,有些顾问公司则通过在SAP 中开发ADDON来实现具体的功能需求,但是这个做法只是满足了业务功能,不能解决SAP 用户数量;
所以我想到了通过开发外挂系统独立于SAP 载体来实现,这样做的好处有:

1)减少SAP 用户数量,即减少SAP 上线费用和年维护费用

2)后期SAP 升级的话,不受SAP 版本的影响

3)外挂系统可以多点使用

4)支持手机端,电脑端,PAD (平板电脑)多终端使用

本方案已经成功用于多个生产企业使用,可以实现仓库部门的生产工单发料,生产工单的报工,生产汇报扣料(手动或先进先出反冲),仓库间库存移动,物料维护,财务凭证维护,仓库销售出货,生产工序转移,生产过程报废,仓库在库报废等等功能,

这里介绍一种:外挂程序

大概逻辑就是:通过外挂程序登录SAP, 用于工号去区分实际账号,登录的时候设置工号:SET PARAMETER ID 'ZLOGIN_USER' FIELD wa_login_user_c. 区分的地方获取工号:GET PARAMETER ID  'ZLOGIN_USER' FIELD wa_login_user_c.即可。

https://i-blog.csdnimg.cn/direct/a1d06f859e724e77a51c9207ea02bc59prd.png

上图可以看到登录操作了,我就不解释了,直接上代码:

*&---------------------------------------------------------------------*
*& Report  ZJPMF_LOGIN2
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*

REPORT zjpmf_login2.

DATA: wa_login_user_s TYPE string,
      wa_login_user_c(20) TYPE c.
*  ADD BY ROY.L @ 28-JUN-2020
DATA: LV_UCODE(32).
*  ADDED
DATA matcher TYPE REF TO cl_abap_matcher.

PARAMETER p_user TYPE zjpmf_user-user_code.

GET PARAMETER ID  'ZLOGIN_USER' FIELD wa_login_user_c.

IF wa_login_user_c IS INITIAL.

  wa_login_user_s = p_user.
*  ADD BY ROY.L @ 28-JUN-2020
  LV_UCODE = p_user.
*  ADDED

  TRANSLATE wa_login_user_s TO UPPER CASE.

  SELECT SINGLE emplyee_id INTO (wa_login_user_c)
  FROM zjpmf_user
  WHERE user_code = wa_login_user_s.

  IF  wa_login_user_c IS  INITIAL.
    MESSAGE i000(oo) WITH '找不到人员工号,请补帐号资料后,重新登陆!'.
    CALL 'SYST_LOGOFF'.
  ENDIF.

  SET PARAMETER ID 'ZLOGIN_USER' FIELD wa_login_user_c.
*  ADD BY ROY.L @ 28-JUN-2020
  SET PARAMETER ID 'ZLOGIN_CODE' FIELD LV_UCODE.
* ADDED


*&---------------------------------------------------------------------*
*&  包含                ZXUSRU01
*&---------------------------------------------------------------------*
  TABLES:zlogoninfo, zlogoninfo_ER.
  DATA hostadr LIKE uinfo-hostadr.
  DATA hostaddr(8).
  DATA term LIKE uinfo-term.
  DATA xhcount TYPE i.
  DATA: iptxt(15),itimes TYPE i,itimes1 TYPE i,hx(2).
  DATA: result TYPE i,resulttxt(3).
  DATA: wa_zlogoninfo LIKE zlogoninfo.
  CALL FUNCTION 'TH_USER_INFO'
    IMPORTING
      hostaddr = hostadr   "like UINFO-HOSTADR (hex)
      terminal = term.  "like UINFO-TERM

  hostaddr = hostadr.
  DO 4 TIMES.
    hx = hostaddr+itimes1(2).
    itimes = 0.
    result = 0.
    DO 2 TIMES.
      CASE hx+itimes(1).
        WHEN 'A'.
          IF itimes = 0.
            result = result + 10 * 16.
          ELSE.
            result = result + 10.
          ENDIF.
        WHEN 'B'.
          IF itimes = 0.
            result = result + 11 * 16.
          ELSE.
            result = result + 11.
          ENDIF.
        WHEN 'C'.
          IF itimes = 0.
            result = result + 12 * 16.
          ELSE.
            result = result + 12.
          ENDIF.
        WHEN 'D'.
          IF itimes = 0.
            result = result + 13 * 16.
          ELSE.
            result = result + 13.
          ENDIF.
        WHEN 'E'.
          IF itimes = 0.
            result = result + 14 * 16.
          ELSE.
            result = result + 14.
          ENDIF.
        WHEN 'F'.
          IF itimes = 0.
            result = result + 15 * 16.
          ELSE.
            result = result + 15.
          ENDIF.
        WHEN OTHERS.
          IF itimes = 0.
            result = result + hx+itimes(1) * 16.
          ELSE.
            result = result + hx+itimes(1).
          ENDIF.
      ENDCASE.
      itimes = itimes + 1.
    ENDDO.
    resulttxt = result.
    CONDENSE resulttxt.
    IF iptxt <> ''.
      CONCATENATE iptxt '.' resulttxt INTO iptxt.
    ELSE.
      iptxt = resulttxt.
    ENDIF.
    itimes1 = itimes1 + 2.
  ENDDO.


  IF sy-uname+0(4) EQ 'DFLC' .  "1.检查是不是DFLC开头的账号
    TABLES:zjpmf_user_ip.
    SELECT SINGLE * FROM zjpmf_user_ip WHERE user_code = p_user. "2.检查外挂账号是不是在zjpmf_user_ip维护了(如维护了 则执行下面检查)
    IF sy-subrc EQ 0.
*     3.根据外挂账号+登陆的IP+登陆的终端名 检查是否在表 zjpmf_user_ip 中维护了(若维护了 则允许登陆)
      SELECT SINGLE * FROM zjpmf_user_ip WHERE user_code = p_user AND ip = iptxt AND terminal = term.
      IF sy-subrc NE 0.
*        4.根据外挂账号+登陆的IP 检查是否在表 zjpmf_user_ip 中维护了终端名是空的数据(若维护了 则允许登陆)
        SELECT SINGLE * FROM zjpmf_user_ip WHERE user_code = p_user AND ip = iptxt AND terminal = space.
        IF sy-subrc NE 0.
*          5.根据外挂账号+登陆的终端名 检查是否在表 zjpmf_user_ip 中维护了IP是空的数据(若维护了 则允许登陆)
          SELECT SINGLE * FROM zjpmf_user_ip WHERE user_code = p_user AND ip = space AND terminal = term.
          IF sy-subrc NE 0.
*------------------------------------------------------------------------------

            CONCATENATE sy-uname sy-datum sy-uzeit INTO zlogonINFO_ER-xh.
            zlogonINFO_ER-user_code = p_user.
            zlogonINFO_ER-bname      = sy-uname.
            zlogonINFO_ER-mandt      = sy-mandt.
            zlogonINFO_ER-ip         = iptxt.
            zlogonINFO_ER-terminal   = term.
            zlogonINFO_ER-logon_date = sy-datum.
            zlogonINFO_ER-logon_time = sy-uzeit.
            zlogonINFO_ER-remark   =  '此账号非法登录,未成功!'.

            INSERT INTO zlogonINFO_ER CLIENT SPECIFIED VALUES zlogonINFO_ER.
            COMMIT WORK AND WAIT.
*------------------------------------------------------------------------------
            MESSAGE i000(oo) WITH '此账号非法登录!'.
            CALL 'SYST_LOGOFF'.
          ENDIF.
        ENDIF.
      ENDIF.
    ENDIF.
  ENDIF.

  CONCATENATE sy-uname sy-datum sy-uzeit INTO zlogoninfo-xh.
  zlogoninfo-user_code = p_user.
  zlogoninfo-bname      = sy-uname.
  zlogoninfo-mandt      = sy-mandt.
  zlogoninfo-ip         = iptxt.
  zlogoninfo-terminal   = term.
  zlogoninfo-logon_date = sy-datum.
  zlogoninfo-logon_time = sy-uzeit.

  DO 100 TIMES.
    INSERT INTO zlogoninfo CLIENT SPECIFIED VALUES zlogoninfo.
    COMMIT WORK AND WAIT.
    CLEAR:wa_zlogoninfo.
    SELECT SINGLE * FROM zlogoninfo INTO wa_zlogoninfo WHERE xh = zlogoninfo-xh.
    IF wa_zlogoninfo-xh NE space.
      SET PARAMETER ID 'ZLOGONINFOXH' FIELD wa_zlogoninfo-xh.
      EXIT.
    ELSE.
      CONCATENATE sy-uname sy-datum sy-uzeit INTO zlogoninfo-xh.
    ENDIF.
  ENDDO.




*二.登陆时候与用户ip地址绑定登陆
*首先在系统里建立r/3用户和ip地址的对应的关系表userlogon,包括信息(r/3用户名/ip地址),然
*后通过批导入的方式将对应关系数据导入系统表里.
*其次在r/3用户登陆增强(susr0001)写代码验证用户登陆时候的r/3用户名和ip地址在系统对应关
*系表里是否有,通过则允许登陆,未通过则不允许登陆.
*增强代码如下:

*SELECT COUNT(*) INTO xhcount FROM userlogon WHERE bname = sy-uname AND ip = iptxt.
*IF xhcount < 0.
*  MESSAGE i003(ztxbhb).
*  CALL 'SYST_LOGOFF'."退出SAP系统
*ELSE.
*  MESSAGE i002(ztxbhb)."登陆
*ENDIF.



ENDIF.
LEAVE PROGRAM.

不用上面程序的话可以用增强点:ZXUSRU01

同步的用户信息表:

维护用户信息程序:ZJPMF_USER

*&---------------------------------------------------------------------*
*& Report  ZJPMF_USER
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*

REPORT ZJPMF_USER.

INCLUDE ZJPMF_USER_TOP.
INCLUDE ZJPMF_USER_FORM.



START-OF-SELECTION.
*  DATA l_flag(1).

*  UPDATE adcp SET  department = '1100' WHERE addrnumber NE 0.
*  COMMIT WORK AND WAIT.
*  UPDATE zjpmf_user SET  company_code = '1100' WHERE user_code NE space.
*  COMMIT WORK AND WAIT.

*--------------------------------------------------------------------*
*获取当前公司代码
*  current_user = sy-uname.
*  SELECT SINGLE * INTO CORRESPONDING FIELDS OF wa_usr21 FROM  usr21 WHERE bname EQ current_user.
*  SELECT SINGLE department INTO current_companycode FROM adcp WHERE addrnumber = wa_usr21-addrnumber AND persnumber = wa_usr21-persnumber.

*  IF current_companycode IS INITIAL.
*    MESSAGE s000(oo) WITH '当前登陆账户的公司代码有误,请检查!' DISPLAY   LIKE 'E'.
*    STOP.
*  ENDIF.

*  BREAK-POINT.

*--------------------------------------------------------------------*
  "初始化工作
  IF CURRENT_COMPANYCODE EQ '1307'.
    PERFORM INITIAL_USER_DATA.
    PERFORM INITIAL_SYSTEM_DATA.
  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值