用过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.