前言:
在工作中有时候会遇到需要批量对比DEV和QAS/PRD甚至影子系统、预生产系统的开发对象是否相同;各个系统当前请求的版本各自是啥;函数组内的各个函数模块在两个系统间是否版本是一样的等等。
还有系统迁移的时候,如何批量比对迁移过去的程序是否跟原始系统有差异。
还有些安全性要求比较高的系统,PRD是 独立的系统, STMS的传输日志看不到是否已经传输到PRD ,也给 版本管理带来一些麻烦 。
本程序开发的初衷 就是 为了解决以上这些问题 。
功能:
批量对比两个系统间程序、函数、CLASS、表、视图、数据元素、域、搜索帮助、锁等等开发对象的差别。两个系统可以是在同一个传输域,也可以是能用RFC连接在一起的两个完全不相关的S4/ECC系统。
选择界面:
数据源可以选择指定的程序、DDIC内容、函数组等,也可以指定包、传输请求,比较包/请求内里面所有的内容。可以通过对象类型、作者做数据限制。对比完毕的结果,可以选择需要显示哪些内容。
运行结果显示界面:
在这个界面上可以看到有哪些对象两个系统之间是相同的,哪些是不同的,甚至在远程系统尚不存在。还可以看到本地系统的最新请求、次新请求,以及远程系统的当前请求号,然后根据这几个请求号判断远程系统的请求号和本地系统请求号是否漏传,如果远程系统不是最新请求也不是次新请求,就可能会有漏传请求的风险。
下面是双击ALV的列后,跳转到的一些有用的信息:
对象内容:
创建人账号信息:
本地请求清单:
请求内容:
远程请求信息:
系统间版本对比:
源码如下(写得比较用心,值得仔细看一遍):
*&---------------------------------------------------------------------**& Report ZVERCHECK*&---------------------------------------------------------------------**& Baitianzhen*& 系统间批量比对开发对象内容*&---------------------------------------------------------------------*REPORT zvercheck NO STANDARD PAGE HEADING.
TABLES: sci_dynp,versobj_alias.DATA: gt_fldct TYPE lvc_t_fcat, gs_slayt TYPE lvc_s_layo.DATA: gt_syst TYPE tmscsyslst_typ, gs_syst TYPE tmscsyslst, gt_vrmv TYPE vrm_values, gs_vrmv TYPE vrm_value.DATA: gt_ko100 TYPE TABLE OF ko100, gs_ko100 TYPE ko100.DATA: BEGIN OF gs_out, pgmid TYPE e071-pgmid, object TYPE e071-object, obj_name TYPE e071-obj_name, devclass TYPE tadir-devclass, author TYPE tadir-author, objtxt TYPE char40, result TYPE char20, tract TYPE trkorr, trloc TYPE trkorr, trpre TYPE trkorr, trrem TYPE trkorr, trsta TYPE char10, END OF gs_out.DATA: gt_out LIKE TABLE OF gs_out.DATA: gr_ext TYPE RANGE OF sci_dynp-i_obj_t. "排除类型
SELECTION-SCREEN BEGIN OF BLOCK b01 WITH FRAME TITLE btxt1. SELECT-OPTIONS: s_prog FOR sci_dynp-o_repo MEMORY ID prog, s_fugr FOR sci_dynp-o_fugr MEMORY ID fugr, s_clas FOR sci_dynp-o_clas MEMORY ID clas, s_ddic FOR sci_dynp-o_ddic MEMORY ID ddic. SELECT-OPTIONS: s_pckg FOR sci_dynp-f_devc MEMORY ID pckg, s_tran FOR sci_dynp-o_order MEMORY ID tran.SELECTION-SCREEN END OF BLOCK b01.SELECTION-SCREEN BEGIN OF BLOCK b02 WITH FRAME TITLE btxt2. SELECT-OPTIONS: s_user FOR sci_dynp-f_resp, s_otyp FOR sci_dynp-i_obj_t.SELECTION-SCREEN END OF BLOCK b02.SELECTION-SCREEN BEGIN OF BLOCK b03 WITH FRAME TITLE btxt3. PARAMETERS: p_dest TYPE versdest MEMORY ID rfc, p_syst TYPE verssysnam AS LISTBOX VISIBLE LENGTH 20 MEMORY ID verssysnam.SELECTION-SCREEN END OF BLOCK b03.
SELECTION-SCREEN BEGIN OF BLOCK b04 WITH FRAME TITLE btxt4. PARAMETERS: p_same AS CHECKBOX DEFAULT 'X', p_diff AS CHECKBOX DEFAULT 'X', p_noex AS CHECKBOX DEFAULT 'X', p_unsu AS CHECKBOX DEFAULT 'X'.SELECTION-SCREEN END OF BLOCK b04.INITIALIZATION. APPEND 'EEQAVAS' TO gr_ext. APPEND 'EEQTOBJ' TO gr_ext. APPEND 'EEQSTOB' TO gr_ext.
CALL FUNCTION 'TRINT_OBJECT_TABLE' EXPORTING iv_complete = 'X' TABLES tt_types_out = gt_ko100. SORT gt_ko100 BY object.
CALL FUNCTION 'TMS_CI_GET_SYSTEMLIST' EXPORTING iv_only_active = 'X' TABLES tt_syslst = gt_syst. LOOP AT gt_syst INTO gs_syst. gs_vrmv-key = gs_syst-sysnam. gs_vrmv-text = gs_syst-systxt. APPEND gs_vrmv TO gt_vrmv. ENDLOOP. CALL FUNCTION 'VRM_SET_VALUES' EXPORTING id = 'P_SYST' values = gt_vrmv.AT SELECTION-SCREEN ON VALUE-REQUEST FOR s_prog-low. CALL FUNCTION 'RS_HELP_HANDLING' EXPORTING dynpfield = 'S_PROG-LOW' dynpname = sy-dynnr object = 'PR' progname = sy-repid.AT SELECTION-SCREEN ON VALUE-REQUEST FOR s_fugr-low. CALL FUNCTION 'RS_HELP_HANDLING' EXPORTING dynpfield = 'S_FUGR-LOW' dynpname = sy-dynnr object = 'FG' progname = sy-repid.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR s_clas-low. CALL FUNCTION 'REPOSITORY_INFO_SYSTEM_F4' EXPORTING object_type = 'CLIF' IMPORTING object_name_selected = s_clas-low EXCEPTIONS OTHERS = 1.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR s_ddic-low. CALL FUNCTION 'F4_DD_ALLTYPES' IMPORTING result = s_ddic-low.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR s_tran-low. CALL FUNCTION 'TR_F4_REQUESTS' EXPORTING iv_trfunctions = 'K' iv_trstatus = 'RDL' IMPORTING ev_selected_request = s_tran-low.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR s_otyp-low. CALL FUNCTION 'TRINT_PGMID_OBJECT_SELECT_F4' IMPORTING we_object = s_otyp-low.
AT SELECTION-SCREEN. IF sy-ucomm = 'ONLI'. IF p_dest = '' AND p_syst = ''. MESSAGE e000(oo) WITH 'RFC目标和目标系统至少输入一个'. ELSEIF p_dest = ''. READ TABLE gt_syst INTO gs_syst WITH KEY sysnam = p_syst. CONCATENATE 'TMSADM@' gs_syst-sysnam '.' gs_syst-domnam INTO p_dest. ENDIF. ENDIF.
AT SELECTION-SCREEN OUTPUT. btxt1 = '数据来源'. btxt2 = '数据限制'. btxt3 = '远程系统'. btxt4 = '结果显示包括'. %_p_syst_%_app_%-text = '目标系统'. %_p_dest_%_app_%-text = 'RFC目标(优先)'. %_s_clas_%_app_%-text = '类/接口'. %_s_ddic_%_app_%-text = '表/视图/数据类型/域/搜索帮助/锁'. %_s_fugr_%_app_%-text = '函数组'. %_s_prog_%_app_%-text = '程序(包含Z开头INCLUDE)'. %_s_tran_%_app_%-text = '请求/任务号'. %_s_pckg_%_app_%-text = '包/开发类'. %_s_user_%_app_%-text = '创建者'. %_s_otyp_%_app_%-text = '对象
...