公告: 腾讯微博开通,欢迎跟听!SAP酒吧上线, 欢迎加入!

SAP中自定义日志处理

1. 简单介绍

SAP本身有很多日志处理模式, 在定制开发的程序中, 可以非常方便的调用SAP标准日志处理流程. 但是其也有缺点, 例如archive有点麻烦, 还有就是不够灵活的处理客户的各种需求. 为了能够更好的满足客户的需求, 我开发了一个小且简单的日志处理程序, 简单的流程, 对客户的一般需求也能够给予满足.

2. 业务背景 

在SAP项目实施中, 会有很多客制化开发程序, 客户希望这些程序都能够有统一的log处理机制. 每个程序的处理结果可以单独查询, 每隔一段时间(3~5个月)可以archive这些程序处理日志. 并且在需要的时候可以恢复这些archive数据回到SAP系统当中.

程序日志要求保存程序的名称, 事务代码的名称, 处理用户,程序处理的详细结果(最多900个字节长度)等. 用户可以通过某个事务代码查询日志. Basis顾问可以archive或者恢复archive的数据.

3. 程序设计 

因为整个要求全部围绕处理日志, 我们可以把日志处理当作一个对象, 这个对象有内容, 时间, 创建人等属性. 有显示, 存档, 删除, 添加, 恢复等方法. 因为整个处理过程只有一个对象(没有考虑很多), 所以程序基本没有什么设计而言, 就是简单的实现这个对象的各种方法.

对这个对象, 我画了一个类图, 简单的写出了主要的方法和属性:

clip_image002

4. 程序逻辑
4.1从最终用户角度考虑:

他只要知道用哪个事务代码可以显示自己的操作结果, 而不需要关心日志是怎样写入日志表中. 也就是说, 我们只需要给最终用户提供一个显示处理日志的接口即可.

4.2从开发人员考虑:

他需要知道自己开发的程序中, 哪些需要写入日志处理, 怎样加入日志表中. 所以, 需要给开发人员提供一个插入日志的接口, 一个显示日志输出的接口.

4.3Basis人员考虑:

需要对日志做定期或者不定期的存档. 所以, 需要为Basis人员提供操作存档的接口.

5. 程序实现

5.1 从最终用户出发需要的程序实现:

1). 开发人员需要在对象中实现方法: DISPLAY_LOG

接口设计: 需要传入输入条件, 以及一个被创建的container对象

程序流程:

clip_image004

程序代码行:

method DISPLAY_LOG.
* local data definition
data: wa type ty_tab.
data: log type ref to ty_tab.
* Selection data
  SELECT_DATA( im_prog = im_prog
                      im_tod = im_tod im_date = im_date im_usr = im_usr im_typ = im_typ ).
check tb_log[] is not INITIAL.
loop at tb_log into wa.
*   Edit data
append wa to alv_tab.
endloop.
* Edit the record
loop at alv_tab REFERENCE INTO log.
case log->ZTYPE.
when ‘E’.
log->excp =  1.
when ‘S’.
log->excp =  3.
when ‘W’.
log->excp =  2.
ENDCASE.
endloop.
* Prepare layout
call method prepare_layout.
* Prepare fieldcat
call method prepare_fieldcat.
* Show data
call method show_alv EXPORTING container = im_container.
* Get original split container
  split_con = im_container.
endmethod.

2). 需要创建报表: ZSIH_BC_LOG_DISPLAY

Ø 定义日志对象的引用:

data: ref type ref to ZSIH_LOG_PRO.

Ø 创建日志对象:

create object ref.

Ø 调用显示方法显示日志:

*     Show log
call method ref->DISPLAY_LOG
EXPORTING
              IM_PROG = prog
              IM_TOD  = tod
              IM_DATE = zdate
              IM_USR  = usr
              IM_TYP  = typ
CHANGING
          im_container = ref_con .

5.2从开发人员出发:

需要实现插入日志的方法:

具体流程如下:

clip_image006

如何调用接口:

ZSIH_LOG_PRO=>INSERT_LOG

接口: IM_TLOG 关联表结构: ZSIH_LOG

接口: IM_PROG 关联所需要添加日志的程序名称

接口: RET 返回值,具体含义如下

0: 成功插入数据到日志表中

1: 锁表失败

2: 传入的日志内表为空

3: 插入表失败

5.2Basis人员出发:

整个过程需要Basis人员和开发人员相互协作, 定义, 开发.

1). Basis人员需要做归档的基本配置(事务代码: AOBJ)

Ø 创建新的归档对象: ZSIH_LOG

Ø 分配归档对象的操作对应程序:

创建(写)操作: ZARCH_SIH_LOG

删除操作: ZDEL_SIH_LOG

恢复操作: ZRIC_SIH_LOG

Ø 结构定义: ZSIH_LOG(结构)

Ø 维护变式(需要在程序完成之后做)

2). 开发人员需要实现存档的创建接口, 删除接口, 以及恢复存档接口

Ø 创建归档接口实现:

主要程序实现代码:

1. 根据basis定义的归档对象, 打开写操作

CALL FUNCTION ‘ARCHIVE_OPEN_FOR_WRITE’

2. 取得归档对象信息

CALL FUNCTION ‘ARCHIVE_GET_INFORMATION’

3. 根据传入参数, 取得需要存档的数据

SELECT_DATA( im_prog = im_prog im_tod = im_tod im_date = im_date im_usr = im_usr im_typ = im_typ )

4. 创建新的归档

CALL FUNCTION ‘ARCHIVE_NEW_OBJECT’

5. 存入归档数据

CALL FUNCTION ‘ARCHIVE_PUT_RECORD’

6. 保存存入的记录

CALL FUNCTION ‘ARCHIVE_SAVE_OBJECT’

7. 更新归档状态

CALL FUNCTION ‘ARCHIVE_WRITE_STATISTICS’

8. 关闭归档

CALL FUNCTION ‘ARCHIVE_CLOSE_FILE’

Ø 删除存档接口实现:

1. 打开归档, 准备删除

CALL FUNCTION ‘ARCHIVE_OPEN_FOR_DELETE’

2. 取得归档信息, 以备使用

CALL FUNCTION ‘ARCHIVE_GET_INFORMATION’

3. 取得归档定制信息

CALL FUNCTION ‘ARCHIVE_GET_CUSTOMIZING_DATA’

4. 加入循环, 逐条取得归档记录

DO.

CALL FUNCTION ‘ARCHIVE_GET_NEXT_RECORD’

ENDDO.

5. 删除归档

CALL FUNCTION ‘ARCHIVE_DELETE_OBJECT_DATA’

6. 关闭归档

CALL FUNCTION ‘ARCHIVE_CLOSE_FILE’

Ø 恢复存档接口实现:

1. 打开归档

CALL FUNCTION ‘ARCHIVE_OPEN_FOR_MOVE’

2. 取得归档信息

CALL FUNCTION ‘ARCHIVE_GET_INFORMATION’

3. 逐条取得归档记录

CALL FUNCTION ‘ARCHIVE_GET_NEXT_RECORD’

4. 对每条记录恢复

CALL FUNCTION ‘ARCHIVE_RELOAD_OBJECT_DATA’

5. 保存归档

CALL FUNCTION ‘ARCHIVE_SAVE_OBJECT’

6. 关闭归档

CALL FUNCTION ‘ARCHIVE_CLOSE_FILE’

3). 创建三个程序, 分别调用三个接口

根据Basis配置的三个程序名称, 分别创建三个程序, 调用相应的归档对象 的方法.

程序: ZARCH_SIH_LOG

data: ref_log type REF TO ZSIH_LOG_PRO.

* Create log object
create object ref_log
EXPORTING TYPE = ‘A’ TEST = testrun REM = admi_rem.

ret = ref_log->ARCHIVE(
              IM_PROG = prog
              IM_TOD  = tod
              IM_DATE = zdate
              IM_USR  = usr
              IM_TYP  = typ
              ).

程序: ZDEL_SIH_LOG

data:  ref_log type REF TO ZSIH_LOG_PRO.

* Create log object
create object ref_log
EXPORTING TYPE = ‘D’.

* Delete archive
call method ref_log->DEL_FILE.

程序: ZRIC_SIH_LOG

data:  ref_log type REF TO ZSIH_LOG_PRO.

* Create log object
create object ref_log
EXPORTING TYPE = ‘R’ TEST = testrun.

* Reload
call method ref_log->ric_arch.

4). Basis人员使用指南

Ø 事务代码: SARA

Ø 输入归档对象: ZSIH_LOG

Ø 下面有三个选项:

归档: 将数据Archive到系统中,同时删除表中记录

删除: 如果archive设置中没有选中自动删除,则需要手动删除记录. 我们这里不需要.

分析: 可以将archive的数据恢复

6. 附录

6.1 最终用户报表格式图示

输入界面

clip_image008

显示界面

clip_image010

详细信息界面

clip_image012

6.2 程序的saplink

相关文章列表

  • 暂无相关日志
Leave a comment

0 Comments.

Leave a Reply


[ Ctrl + Enter ]

注意: 评论者允许使用'@user空格'的方式将自己的评论通知另外评论者。例如, ABC是本文的评论者之一,则使用'@ABC '(不包括单引号)将会自动将您的评论发送给ABC。使用'@all ',将会将评论发送给之前所有其它评论者。请务必注意user必须和评论者名相匹配(大小写一致)。