1. 简单介绍
SAP本身有很多日志处理模式, 在定制开发的程序中, 可以非常方便的调用SAP标准日志处理流程. 但是其也有缺点, 例如archive有点麻烦, 还有就是不够灵活的处理客户的各种需求. 为了能够更好的满足客户的需求, 我开发了一个小且简单的日志处理程序, 简单的流程, 对客户的一般需求也能够给予满足.
2. 业务背景
在SAP项目实施中, 会有很多客制化开发程序, 客户希望这些程序都能够有统一的log处理机制. 每个程序的处理结果可以单独查询, 每隔一段时间(3~5个月)可以archive这些程序处理日志. 并且在需要的时候可以恢复这些archive数据回到SAP系统当中.
程序日志要求保存程序的名称, 事务代码的名称, 处理用户,程序处理的详细结果(最多900个字节长度)等. 用户可以通过某个事务代码查询日志. Basis顾问可以archive或者恢复archive的数据.
3. 程序设计
因为整个要求全部围绕处理日志, 我们可以把日志处理当作一个对象, 这个对象有内容, 时间, 创建人等属性. 有显示, 存档, 删除, 添加, 恢复等方法. 因为整个处理过程只有一个对象(没有考虑很多), 所以程序基本没有什么设计而言, 就是简单的实现这个对象的各种方法.
对这个对象, 我画了一个类图, 简单的写出了主要的方法和属性:
4. 程序逻辑
4.1从最终用户角度考虑:
他只要知道用哪个事务代码可以显示自己的操作结果, 而不需要关心日志是怎样写入日志表中. 也就是说, 我们只需要给最终用户提供一个显示处理日志的接口即可.
4.2从开发人员考虑:
他需要知道自己开发的程序中, 哪些需要写入日志处理, 怎样加入日志表中. 所以, 需要给开发人员提供一个插入日志的接口, 一个显示日志输出的接口.
4.3从Basis人员考虑:
需要对日志做定期或者不定期的存档. 所以, 需要为Basis人员提供操作存档的接口.
5. 程序实现
5.1 从最终用户出发需要的程序实现:
1). 开发人员需要在对象中实现方法: DISPLAY_LOG
接口设计: 需要传入输入条件, 以及一个被创建的container对象
程序流程:
程序代码行:
| 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从开发人员出发:
需要实现插入日志的方法:
具体流程如下:
如何调用接口:
ZSIH_LOG_PRO=>INSERT_LOG
接口: IM_TLOG 关联表结构: ZSIH_LOG
接口: IM_PROG 关联所需要添加日志的程序名称
接口: RET 返回值,具体含义如下
0: 成功插入数据到日志表中
1: 锁表失败
2: 传入的日志内表为空
3: 插入表失败
5.2从Basis人员出发:
整个过程需要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 ret = ref_log->ARCHIVE( |
程序: ZDEL_SIH_LOG
| data: ref_log type REF TO ZSIH_LOG_PRO.
* Create log object * Delete archive |
程序: ZRIC_SIH_LOG
| data: ref_log type REF TO ZSIH_LOG_PRO.
* Create log object * Reload |
4). Basis人员使用指南
Ø 事务代码: SARA
Ø 输入归档对象: ZSIH_LOG
Ø 下面有三个选项:
归档: 将数据Archive到系统中,同时删除表中记录
删除: 如果archive设置中没有选中自动删除,则需要手动删除记录. 我们这里不需要.
分析: 可以将archive的数据恢复
6. 附录
6.1 最终用户报表格式图示
输入界面
显示界面
详细信息界面
6.2 程序的saplink包
0 Comments.