1.关于前几篇介绍的外挂程序,SAP中的业务单据还是要区分具体的操作人员。如建立财务凭证,工号A,B,C使用相同的SAP账号,那就没办法知道是谁操作的了啊,所以sap的业务单据需要细分到具体人员的都要增强实现以下:
如生产工单:
具体的增强点:
2.辅助程序:SAP账号自动锁定功能
*&---------------------------------------------------------------------*
*& Report ZBA001
*&---------------------------------------------------------------------*
*& 实现人员离职时,SAP账号与外挂账号自动锁定功能,减少手工锁定账号工作量
*&---------------------------------------------------------------------*
REPORT zba001.
TABLES:pa0000,usr02,zjpmf_user.
*PA0000-PERNR 工号
*PA0000-STAT2 人员状态 PA0000-STAT2=0代表:离职
*USR02-ACCNT SAP账号 SAP账号用来维护工号的字段,用PA0000-PERNR关联USR02-ACCNT,得到SAP账号(USR02-BNAME),
* 触发USR02-UFLAG:64=锁定
*zjpmf_user-EMPLYEE_ID SAP外挂表工号字段 SAP外挂账号对应工号字段,用PA0000-PERNR关联zjpmf_user-EMPLYEE_ID,
* 得到外挂账号(zjpmf_user-USER_CODE),触发zjpmf_user-ACTIVE_FLAG=空时为锁定
*
*逻辑:
*1.定期任务,每天执行一次,每天01:00定时执行;
*2.用USR02-ACCNT与zjpmf_user-EMPLYEE_ID分别关联PA0000-PERNR,查询PA0000-STAT2值是否为0
*3.若PA0000-STAT2值是否为0时,将USR02-UFLAG值变更为64与zjpmf_user-ACTIVE_FLAG值变为空
*4.第2点中,当USR02-ACCNT为空时,不进行关联,直接忽略此条数据
*5.第3点中,因账号有SAP账号与外挂账号,故两个表中的数据都要进行关联,程序直接将关联到的数据进行执行锁定操作,关联不到则直接跳过。
*6.BEGDA=前一天日期,ENDDA=当天日期 ,查PA0000,P0000-MASSN=Z9并且P0000-STAT2=0,外面需要增加两个日期begda和endda的查询条件,
* 查询里面要加P0000-MASSN=Z9 并且P0000-STAT2=0 的条件*BAPI_USER_LOCK
*BAPI_USER_UNLOCK
" DATA:gv_username TYPE bapibname-bapibname.
DATA:BEGIN OF gs_data,pernr TYPE pa0000-pernr,bname TYPE usr02-bname,END OF gs_data,gt_data LIKE TABLE OF gs_data.DATA:gs_return TYPE bapiret2,gt_return TYPE TABLE OF bapiret2.
DATA:lv_begda TYPE p0001-begda.
DATA:gv_user_code TYPE zjpmf_user-user_code.
DATA:gv_code TYPE zjpmf_user-user_code.
***Begin add by IT072 10.05.2021 18:49:24
DATA: gv_name TYPE BAPIBNAME-BAPIBNAME,gv_mesage TYPE string.
DATA: gt_group TYPE TABLE OF BAPIGROUPS,gt_returnd TYPE TABLE OF BAPIRET2,gs_returnd TYPE BAPIRET2.
DATA: lv_memo TYPE string .
***End add by IT072 10.05.2021 18:49:24
PARAMETERS:p_begda TYPE pa0000-begda ,p_endda TYPE pa0000-endda .INITIALIZATION.
lv_memo = '离职停用' && sy-datum.CALL FUNCTION 'RP_CALC_DATE_IN_INTERVAL'EXPORTINGdate = sy-datumdays = 7months = 0signum = '-'years = 0IMPORTINGcalc_date = lv_begda.IF p_begda IS INITIAL.p_begda = lv_begda .ENDIF.IF p_endda IS INITIAL.p_endda = sy-datum ."'99991231'ENDIF.
START-OF-SELECTION.*-- 取离职状态人员SELECT pernrbnameINTO CORRESPONDING FIELDS OF TABLE gt_data FROM pa0000 AS aLEFT JOIN usr02 AS b ON a~pernr = b~accntWHERE stat2 = 0AND massn = 'Z9'
* AND be