前言:
在工作中有时候会遇到需要批量对比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 = '对象类型'.
%_p_same_%_app_%-text = '本地和远程相同'.
%_p_diff_%_app_%-text = '本地和远程不同'.
%_p_noex_%_app_%-text = '对象在远程不存在'.
%_p_unsu_%_app_%-text = '不支持对比的对象'.
START-OF-SELECTION.
PERFORM get_objects.
PERFORM expand_objects.
PERFORM check_objects.
PERFORM outdata.
*&---------------------------------------------------------------------*
*& get_objects
*&---------------------------------------------------------------------*
FORM get_objects.
DATA ls_tadir TYPE tadir.
DATA lt_progs LIKE gt_out.
DATA ls_progs LIKE gs_out.
DATA lt_incl TYPE TABLE OF sobj_name.
DATA lt_e070 TYPE TABLE OF e070.
DATA lt_e071 TYPE TABLE OF e071.
DATA ls_e071 TYPE e071.
IF s_prog[] IS NOT INITIAL.
SELECT pgmid object obj_name devclass author
INTO CORRESPONDING FIELDS OF TABLE lt_progs
FROM tadir INNER JOIN trdir ON obj_name = trdir~name
WHERE pgmid EQ 'R3TR' AND
object EQ 'PROG' AND
obj_name IN s_prog AND
author IN s_user AND
devclass NE '$TMP'.
LOOP AT lt_progs INTO ls_progs.
CLEAR lt_incl.
CALL FUNCTION 'GET_INCLUDETAB'
EXPORTING
progname = ls_progs-obj_name
TABLES
incltab = lt_incl.
CHECK lt_incl[] IS NOT INITIAL.
SELECT pgmid object obj_name devclass author
INTO CORRESPONDING FIELDS OF ls_progs
FROM tadir INNER JOIN trdir ON obj_name = trdir~name
FOR ALL ENTRIES IN lt_incl
WHERE pgmid EQ 'R3TR' AND
object EQ 'PROG' AND
obj_name EQ lt_incl-table_line AND
obj_name LIKE 'Z%' AND
devclass NE '$TMP'.
COLLECT ls_progs INTO lt_progs.
ENDSELECT.
ENDLOOP.
APPEND LINES OF lt_progs TO gt_out.
ENDIF.
IF s_fugr[] IS NOT INITIAL.
SELECT pgmid object obj_name devclass author
APPENDING CORRESPONDING FIELDS OF TABLE gt_out
FROM tadir
WHERE pgmid EQ 'R3TR' AND
object IN ('FUGR','FUGS','FUGX') AND
obj_name IN s_fugr AND
author IN s_user AND
devclass NE '$TMP'.
ENDIF.
IF s_clas[] IS NOT INITIAL.
SELECT pgmid object obj_name devclass author
APPENDING CORRESPONDING FIELDS OF TABLE gt_out
FROM tadir
WHERE pgmid EQ 'R3TR' AND
object IN ('CLAS','INTF') AND
obj_name IN s_clas AND
author IN s_user AND
devclass NE '$TMP'.
ENDIF.
IF s_ddic[] IS NOT INITIAL.
SELECT pgmid object obj_name devclass author
APPENDING CORRESPONDING FIELDS OF TABLE gt_out
FROM tadir
WHERE pgmid EQ 'R3TR' AND
object IN ('DTEL','TABL','VIEW','SQLT','DOMA',
'SHLP','ENQU','DDLS','TTYP') AND
obj_name IN s_ddic AND
author IN s_user AND
devclass NE '$TMP'.
ENDIF.
IF s_tran[] IS NOT INITIAL.
SELECT * INTO TABLE lt_e070 FROM e070
WHERE strkorr IN s_tran OR trkorr IN s_tran.
IF sy-subrc = 0.
SELECT pgmid object obj_name
INTO CORRESPONDING FIELDS OF TABLE lt_e071
FROM e071
FOR ALL ENTRIES IN lt_e070
WHERE trkorr EQ lt_e070-trkorr AND
pgmid IN ('LIMU','R3TR') AND
object IN gr_ext.
LOOP AT lt_e071 INTO ls_e071.
CALL FUNCTION 'TR_CHECK_TYPE'
EXPORTING
wi_e071 = ls_e071
IMPORTING
we_tadir = ls_tadir.
SELECT SINGLE * INTO ls_tadir FROM tadir
WHERE pgmid EQ ls_tadir-pgmid AND
object EQ ls_tadir-object AND
obj_name EQ ls_tadir-obj_name AND
author IN s_user AND
object IN gr_ext AND
devclass NE '$TMP'.
CHECK sy-subrc = 0.
gs_out-pgmid = ls_e071-pgmid.
gs_out-object = ls_e071-object.
gs_out-obj_name = ls_e071-obj_name.
gs_out-devclass = ls_tadir-devclass.
gs_out-author = ls_tadir-author.
APPEND gs_out TO gt_out.
ENDLOOP.
ENDIF.
ENDIF.
IF s_pckg[] IS NOT INITIAL.
SELECT pgmid object obj_name devclass author
APPENDING CORRESPONDING FIELDS OF TABLE gt_out
FROM tadir
WHERE devclass IN s_pckg AND
author IN s_user AND
object IN gr_ext AND
devclass NE '$TMP'.
ENDIF.
IF gt_out IS INITIAL.
MESSAGE s000(oo) WITH '无数据'.
ENDIF.
ENDFORM. "get_objects
*&---------------------------------------------------------------------*
*& expand_objects
*&---------------------------------------------------------------------*
FORM expand_objects.
DATA: ls_e071 TYPE e071,
ls_object LIKE gs_out,
lt_object LIKE gt_out,
ls_ver_obj TYPE svrs2_versionable_object,
ls_vrso TYPE vrso,
lt_vrso TYPE STANDARD TABLE OF vrso.
LOOP AT gt_out INTO gs_out.
ls_object-author = gs_out-author.
ls_object-devclass = gs_out-devclass.
CLEAR ls_e071.
ls_e071-pgmid = gs_out-pgmid.
ls_e071-object = gs_out-object.
ls_e071-obj_name = gs_out-obj_name.
CALL FUNCTION 'SVRS_RESOLVE_E071_OBJ'
EXPORTING
e071_obj = ls_e071
TABLES
obj_tab = lt_vrso
EXCEPTIONS
not_versionable = 1.
IF sy-subrc = 0.
LOOP AT lt_vrso INTO ls_vrso WHERE objtype NE 'DOCU'.
CLEAR ls_ver_obj.
ls_ver_obj-objtype = ls_vrso-objtype.
ls_ver_obj-objname = ls_vrso-objname.
ls_ver_obj-versno = '00000'.
CALL FUNCTION 'SVRS_GET_VERSION_LOCAL'
CHANGING
object = ls_ver_obj
EXCEPTIONS
no_version = 3
version_unreadable = 4
OTHERS = 5.
CHECK sy-subrc = 0.
CHECK ls_ver_obj-objtype IN s_otyp.
READ TABLE gt_ko100 INTO gs_ko100
WITH KEY object = ls_vrso-objtype BINARY SEARCH.
ls_object-objtxt = gs_ko100-text.
ls_object-pgmid = 'LIMU'.
ls_object-object = ls_vrso-objtype.
ls_object-obj_name = ls_vrso-objname.
APPEND ls_object TO lt_object.
ENDLOOP.
ELSE.
CHECK gs_out-object IN s_otyp.
READ TABLE gt_ko100 INTO gs_ko100
WITH KEY object = gs_out-object BINARY SEARCH.
ls_object-objtxt = gs_ko100-text.
ls_object-object = gs_out-object.
ls_object-obj_name = gs_out-obj_name.
ls_object-pgmid = gs_out-pgmid.
ls_object-result = '@BZ@类型不支持'.
APPEND ls_object TO lt_object.
CLEAR ls_object.
ENDIF.
ENDLOOP.
gt_out = lt_object.
SORT gt_out BY object obj_name.
DELETE ADJACENT DUPLICATES FROM gt_out COMPARING object obj_name.
ENDFORM. "expand_objects
*&---------------------------------------------------------------------*
*& check_objects
*&---------------------------------------------------------------------*
FORM check_objects.
DATA: lv_text TYPE char50,
lv_lines TYPE i,
lv_empty TYPE c,
ls_loc_obj TYPE svrs2_versionable_object,
ls_rem_obj TYPE svrs2_versionable_object,
ls_delta TYPE svrs2_xversionable_object.
lv_lines = lines( gt_out ).
LOOP AT gt_out INTO gs_out WHERE result = ''.
MESSAGE s000(oo) WITH sy-tabix '/' lv_lines gs_out-obj_name INTO lv_text.
CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
EXPORTING
percentage = 0
text = lv_text.
PERFORM read_object USING gs_out '' CHANGING ls_loc_obj.
PERFORM read_object USING gs_out p_dest CHANGING ls_rem_obj.
IF ls_rem_obj IS INITIAL.
gs_out-result = '@5C@不存在'.
ELSE.
PERFORM clear_data USING ls_loc_obj.
PERFORM clear_data USING ls_rem_obj.
CLEAR ls_delta.
CALL FUNCTION 'SVRS_MAKE_OBJECT_DELTA'
EXPORTING
obj_old = ls_loc_obj
obj_new = ls_rem_obj
CHANGING
delta = ls_delta
EXCEPTIONS
OTHERS = 2.
CALL FUNCTION 'SVRS_CHECK_DELTA_EMPTY'
EXPORTING
obj_new = ls_loc_obj
delta = ls_delta
IMPORTING
p_delta_empty = lv_empty.
IF lv_empty = 'X'.
gs_out-result = '@5B@相同'.
ELSE.
gs_out-result = '@5D@不同'.
ENDIF.
ENDIF.
PERFORM get_trkorr USING p_dest gs_out-object gs_out-obj_name
CHANGING gs_out-tract gs_out-trloc gs_out-trpre gs_out-trrem.
IF gs_out-trrem NE ''.
IF gs_out-trrem = gs_out-trloc.
gs_out-trsta = '最新请求'.
ELSEIF gs_out-trrem = gs_out-trpre.
gs_out-trsta = '次新请求'.
ELSE.
gs_out-trsta = '@5D@非最新/次新'.
ENDIF.
ENDIF.
MODIFY gt_out FROM gs_out.
ENDLOOP.
IF p_same = ''.
DELETE gt_out WHERE result = '@5B@相同'.
ENDIF.
IF p_diff = ''.
DELETE gt_out WHERE result = '@5D@不同'.
ENDIF.
IF p_noex = ''.
DELETE gt_out WHERE result = '@5C@不存在'.
ENDIF.
IF p_unsu = ''.
DELETE gt_out WHERE result = '@BZ@类型不支持'.
ENDIF.
ENDFORM. "check_objects
*&---------------------------------------------------------------------*
*& read_object
*&---------------------------------------------------------------------*
FORM read_object USING ps_object LIKE gs_out pv_dest
CHANGING cs_verobj TYPE svrs2_versionable_object.
CLEAR: cs_verobj.
cs_verobj-destination = pv_dest.
cs_verobj-objtype = ps_object-object.
cs_verobj-objname = ps_object-obj_name.
cs_verobj-versno = '00000'.
CALL FUNCTION 'SVRS_GET_VERSION'
CHANGING
object = cs_verobj
EXCEPTIONS
communication_error = 1
system_error = 2
no_version = 3
version_unreadable = 4
OTHERS = 5.
IF sy-subrc NE 0.
CLEAR: cs_verobj.
ENDIF.
ENDFORM. "read_object
*&---------------------------------------------------------------------*
*& clear_data
*&---------------------------------------------------------------------*
FORM clear_data USING ps_verobj TYPE svrs2_versionable_object.
DATA: lv_type TYPE c,
lv_count TYPE i.
FIELD-SYMBOLS: <ls_part> TYPE any,
<ls_row> TYPE any,
<lt_table> TYPE ANY TABLE.
IF ps_verobj-data_pointer IS INITIAL.
ps_verobj-data_pointer = ps_verobj-objtype.
ENDIF.
ASSIGN COMPONENT ps_verobj-data_pointer OF STRUCTURE ps_verobj TO <ls_part>.
CHECK sy-subrc = 0.
PERFORM clear_stru_field USING: <ls_part> 'MDLOG' ,
<ls_part> 'TRDIR' ,
<ls_part> 'TFDIR' ,
<ls_part> 'TRDIRT',
<ls_part> 'CLASS' ,
<ls_part> 'DD08TV'.
DESCRIBE FIELD <ls_part> TYPE lv_type COMPONENTS lv_count.
DO lv_count TIMES.
ASSIGN COMPONENT sy-index OF STRUCTURE <ls_part> TO <lt_table>.
CHECK sy-subrc = 0.
LOOP AT <lt_table> ASSIGNING <ls_row>.
PERFORM clear_stru_field USING: <ls_row> 'AUTHOR' ,
<ls_row> 'AUTH' ,
<ls_row> 'CREATEDON',
<ls_row> 'CHANGEDBY',
<ls_row> 'CHANGEDON',
<ls_row> 'UDATE' ,
<ls_row> 'UTIME' ,
<ls_row> 'AS4DATE' ,
<ls_row> 'AS4TIME' ,
<ls_row> 'AS4USER' ,
<ls_row> 'DESCRIPT' ,
<ls_row> 'EDITORDER',
<ls_row> 'R3RELEASE'.
ENDLOOP.
ENDDO.
ENDFORM. "clear_data
*&---------------------------------------------------------------------*
*& clear_stru_field
*&---------------------------------------------------------------------*
FORM clear_stru_field USING ps_stru pv_fldnam.
FIELD-SYMBOLS <lv_value> TYPE any.
ASSIGN COMPONENT pv_fldnam OF STRUCTURE ps_stru TO <lv_value>.
IF sy-subrc = 0.
CLEAR <lv_value>.
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& outdata
*&---------------------------------------------------------------------*
FORM outdata.
gs_slayt-zebra = 'X'.
PERFORM catset1 TABLES gt_fldct
USING: 'OBJ_NAME ' '' '' '对象名称',
'OBJECT ' '' '' '对象类型',
'OBJTXT ' '' '' '类型描述',
'AUTHOR ' '' '' '创建人',
'DEVCLASS ' '' '' '包',
'TRACT ' '' '' '本地活动TASK',
'TRLOC ' '' '' '本地最新请求号',
'TRPRE ' '' '' '本地次新请求号',
'TRREM ' '' '' '远程请求号',
'TRSTA ' '' '' '远程请求状态',
'RESULT ' '' '' '对比结果'.
CHECK gt_out IS NOT INITIAL.
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
EXPORTING
it_fieldcat_lvc = gt_fldct
is_layout_lvc = gs_slayt
i_callback_program = sy-repid
i_callback_user_command = 'USER_COMMAND'
TABLES
t_outtab = gt_out.
ENDFORM. " outdata
*---------------------------------------------------------------------*
* catset1
*---------------------------------------------------------------------*
FORM catset1 TABLES t_fldcat USING pv_field pv_reftab pv_reffld pv_text.
DATA: ls_fldcat TYPE lvc_s_fcat.
ls_fldcat-fieldname = pv_field.
ls_fldcat-scrtext_l = pv_text.
ls_fldcat-coltext = pv_text.
ls_fldcat-ref_table = pv_reftab.
ls_fldcat-ref_field = pv_reffld.
ls_fldcat-col_opt = 'A'.
APPEND ls_fldcat TO t_fldcat.
CLEAR ls_fldcat.
ENDFORM. "catset1
*&--------------------------------------------------------------------*
*& user_command
*&--------------------------------------------------------------------*
FORM user_command USING pv_ucomm TYPE sy-ucomm ##called
pv_field TYPE slis_selfield.
DATA: lv_repid TYPE sy-repid.
READ TABLE gt_out INTO gs_out INDEX pv_field-tabindex.
CASE pv_ucomm.
WHEN '&IC1'.
CASE pv_field-fieldname.
WHEN 'OBJ_NAME' OR 'OBJECT' OR 'OBJTXT'. "对象跳转
CALL FUNCTION 'TR_OBJECT_JUMP_TO_TOOL'
EXPORTING
iv_pgmid = gs_out-pgmid
iv_object = gs_out-object
iv_obj_name = gs_out-obj_name
iv_action = 'SHOW'
EXCEPTIONS
jump_not_possible = 1
OTHERS = 2.
WHEN 'AUTHOR'.
CALL FUNCTION 'SUSR_SHOW_USER_DETAILS'
EXPORTING
bname = gs_out-author.
WHEN 'TRACT'.
CALL FUNCTION 'SVRS_DISPLAY_DIRECTORY'
EXPORTING
object_name = gs_out-obj_name(110)
object_type = gs_out-object.
WHEN 'TRLOC'.
PERFORM display_request USING gs_out-trloc.
WHEN 'TRPRE'.
PERFORM display_request USING gs_out-trpre.
WHEN 'TRREM'.
PERFORM display_request USING gs_out-trrem.
WHEN 'TRSTA'.
CALL FUNCTION 'SVRS_DISPLAY_REMOTE_DIR'
EXPORTING
destination = p_dest
object_name = gs_out-obj_name(110)
object_type = gs_out-object
EXCEPTIONS
no_directory = 01
no_selection = 02.
WHEN 'RESULT'. "对比版本
SELECT SINGLE * FROM versobj_alias
WHERE objtype_appl = gs_out-object.
IF sy-subrc = 0.
lv_repid = 'RSVRS_TLOGO_COMPARE_VERSIONS'.
ELSE.
SELECT SINGLE rep_comp INTO lv_repid
FROM versobj
WHERE object = gs_out-object AND
versno = '99999' AND
actflag = 'A'.
IF sy-subrc NE 0.
MESSAGE s000(oo) WITH '未找到此对象类型的对比程序'.
RETURN.
ENDIF.
ENDIF.
SUBMIT (lv_repid)
WITH objname = gs_out-obj_name
WITH objnam2 = gs_out-obj_name
WITH objtyp1 = gs_out-object
WITH objtyp2 = gs_out-object
WITH versno1 = '00000'
WITH versno2 = '00000'
WITH log_dest = p_dest
WITH rem_syst = p_syst
AND RETURN.
ENDCASE.
ENDCASE.
ENDFORM. "user_command
*&--------------------------------------------------------------------*
*& 获取请求号
*&--------------------------------------------------------------------*
FORM get_trkorr USING pv_dest pv_objtype pv_objname
CHANGING cv_tract cv_trloc cv_trpre cv_trrem.
DATA: lt_vrsn TYPE vrsn_tab.
DATA: lt_vrsd TYPE STANDARD TABLE OF vrsd,
ls_vrsd TYPE vrsd.
CLEAR: cv_trloc,cv_trpre,cv_trrem.
CALL FUNCTION 'SVRS_GET_VERSION_DIRECTORY_46'
EXPORTING
destination = ''
objname = pv_objname(110)
objtype = pv_objtype
TABLES
lversno_list = lt_vrsn
version_list = lt_vrsd
EXCEPTIONS
no_entry = 1.
READ TABLE lt_vrsd INTO ls_vrsd WITH KEY versno = '00000'.
IF sy-subrc = 0.
cv_tract = ls_vrsd-korrnum.
ENDIF.
LOOP AT lt_vrsd INTO ls_vrsd WHERE korrnum NE ''.
IF cv_trloc IS INITIAL.
cv_trloc = ls_vrsd-korrnum.
ELSEIF ls_vrsd-korrnum NE cv_trloc.
cv_trpre = ls_vrsd-korrnum.
EXIT.
ENDIF.
ENDLOOP.
CALL FUNCTION 'SVRS_GET_VERSION_DIRECTORY_46'
EXPORTING
destination = pv_dest
objname = pv_objname(110)
objtype = pv_objtype
TABLES
lversno_list = lt_vrsn
version_list = lt_vrsd
EXCEPTIONS
no_entry = 1.
LOOP AT lt_vrsd INTO ls_vrsd WHERE korrnum NE ''.
cv_trrem = ls_vrsd-korrnum.
EXIT.
ENDLOOP.
ENDFORM. "get_trkorr
*&---------------------------------------------------------------------*
*& 显示请求
*&---------------------------------------------------------------------*
FORM display_request USING pv_request.
CHECK pv_request IS NOT INITIAL.
CALL FUNCTION 'TR_PRESENT_REQUEST'
EXPORTING
iv_trkorr = pv_request.
ENDFORM.