文章经作者同意转载
原文链接:https://blog.csdn.net/u010195563/article/details/128711590
欢迎访问原文
*&---------------------------------------------------------------------*
包含 ZXSEUU01
*&---------------------------------------------------------------------*
if objectname <> 'ZXSEUU01'.
break jordan.
只要编辑就检查一下
CHECK sy-uname = 'JORDAN'.
check operation eq 'MODIFY'.
check sy-tcode = 'SE37'.
data:lv_object type tadir-object.
case sy-tcode.
when 'SE38'.
lv_object = 'PROG'.
when 'SE37'.
lv_object = 'FUNC'.
when others.
endcase.
data ls_yabap_check_001 type yabap_check_001.
select single * from yabap_check_001
into ls_yabap_check_001 where bname eq sy-uname and object = '' and objname = ''.
if sy-subrc is initial.
if ls_yabap_check_001-datum is initial.
exit.
elseif ls_yabap_check_001-datum >= sy-datum.
exit.
endif.
else.
select single * from yabap_check_001
into ls_yabap_check_001
where bname eq sy-uname and object = lv_object
and objname = objectname and datum = sy-datum
and disregard = abap_true "空为已激活
.
if sy-subrc is initial.
exit.
endif.
endif.
clear lw_yabap_check_002.
perform get_version using objectname lv_object changing lw_yabap_check_002.
clear lw_yabap_check_002.
data:lt_tfdir type table of tfdir,
lw_tfdir type tfdir.
step1 获取主函数
select single * from tfdir
into lw_tfdir where funcname = objectname.
check sy-subrc is initial.
select * from tfdir
into table lt_tfdir where pname = lw_tfdir-pname.
if sy-subrc is initial.
loop at lt_tfdir assigning field-symbol(<fs_tfdir>).
限制输出条目数,以免返回的过数过大,使人无法评估
describe table lt_yabap_check_002 lines data(lv_lines).
if lv_lines > 50.
exit.
endif.
IF lw_wbcrossi-include IS NOT INITIAL. 标准函数出口,这个include是没有版本的
if <fs_tfdir>-funcname is not initial.
read table lt_yabap_check_002 with key objname = <fs_tfdir>-funcname transporting no fields.
if sy-subrc is initial.
已经在的情况焉,那么不需要再列出来,以免无限循环
continue.
endif.
clear lw_yabap_check_002.
objectname. =
perform get_version using <fs_tfdir>-funcname lv_object changing lw_yabap_check_002.
endif.
endloop.
endif.
step2 获取函数外的子例程
f02这种
data:lt_wbcrossi type table of wbcrossi,
lw_wbcrossi type wbcrossi.
data:lv_object_prog type tadir-object value 'PROG'.
select * from wbcrossi
into table lt_wbcrossi
where otype = 'IC' and master = lw_tfdir-pname and include = lw_tfdir-pname .
if sy-subrc is initial.
loop at lt_wbcrossi into lw_wbcrossi.
describe table lt_yabap_check_002 lines lv_lines.
if lv_lines > 50.
exit.
endif.
if lw_wbcrossi-name is not initial.
read table lt_yabap_check_002 with key objname = lw_wbcrossi-name transporting no fields.
if sy-subrc is initial.
已经在的情况焉,那么不需要再列出来,以免无限循环
continue.
endif.
clear lw_yabap_check_002.
lw_tfdir-pname. =
perform get_version using lw_wbcrossi-name lv_object_prog changing lw_yabap_check_002.
endif.
endloop.
endif.
gv_object = lv_object.
gv_objectname = objectname.
sort lt_yabap_check_002 by suggest descending.
perform show_alv.
endif.
另外有表如下,这个表主要是记录检查的日志
其他include如下
ZXSEUF01 获取对象相关
ZXSEUF02 alv显示相关
ZXSEUF03 代码比较相关
lsvrif18 标准代码的一些inculde (都在 ZXSEUZZZ中添加)
ZXSEUTOP 变量定义及声明
放同一个include也没事
*----------------------------------------------------------------------*
ZXSEUF01.
*----------------------------------------------------------------------*
*&---------------------------------------------------------------------*
Form GET_VERSION_LIST_REMOTE
*&---------------------------------------------------------------------*
text
*----------------------------------------------------------------------*
-->P_DIR_OBJTYPE text
-->P_DIR_OBJNAME text
<--P_NO_ENTRY text
*----------------------------------------------------------------------*
form get_version_list_remote tables to_vrs_dir_vrs structure vrsd
using pi_objtype pi_objname pi_dir_destination
changing po_no_entry
.
data: old_state type bool.
refresh: vrs_dir_vrs, logvers_dir.
perform check_vc_state_remote using pi_dir_destination changing old_state.
if old_state = true.
perform get_old_fashioned_versdir using pi_objtype pi_objname pi_dir_destination
changing po_no_entry.
else.
call function 'SVRS_GET_VERSION_DIRECTORY_46'
exporting
destination = pi_dir_destination
objname = pi_objname
objtype = pi_objtype
tables
version_list = vrs_dir_vrs
lversno_list = logvers_dir
exceptions
no_entry = 1
system_failure = 2
communication_failure_ = 3.
case sy-subrc.
when 0.
po_no_entry = false.
when 1.
po_no_entry = true.
when 2.
'Fehler im Zielsytem'.
MESSAGE w123.
leave.
when 3.
'Keine Verbindung zum Zielsystem'.
MESSAGE w124.
leave.
endcase.
endif.
vrs_dir_vrs[]. =
" GET_VERSION_LIST_REMOTE
form check_vc_state_remote using pi_dir_destination changing po_old_state.
data: head_entry like vrsd.
perform get_vrsd_entry_remote
using head_type head_objname head_versno pi_dir_destination
changing head_entry po_old_state.
"check_vc_state_remote
form get_vrsd_entry_remote using pi_objtype pi_objname pi_versno pi_dir_destination
changing vrsd_entry po_no_entry.
call function 'GET_VRSD_ENTRY_46'
exporting
destination = pi_dir_destination
objname = pi_objname
objtype = pi_objtype
versno = pi_versno
importing
vrsd_entry = vrsd_entry
exceptions
no_entry_found = 1
system_failure = 2
communication_failure = 3.
case sy-subrc.
when 0.
po_no_entry = false.
when 1.
po_no_entry = true.
when 2.
'Fehler im Zielsytem'.
message w123.
leave.
when 3.
'Keine Verbindung zum Zielsystem'.
message w124.
leave.
endcase.
"get_vrsd_entry_remote
form get_old_fashioned_versdir using pi_objtype pi_objname pi_dir_destination
changing po_no_entry.
data: vrsd_entry like vrsd.
data: object_not_found like bool.
perform get_vrsd_entry_remote
using pi_objtype pi_objname null_versno pi_dir_destination
changing buffer0 po_no_entry.
if po_no_entry = false.
call function 'GET_VERSION_LIST_46'
exporting
destination = pi_dir_destination
objname = pi_objname
objtype = pi_objtype
tables
version_list = vrs_dir_vrs
exceptions
system_failure = 1
communication_failure = 2.
case sy-subrc.
when 1.
'Fehler im Zielsytem'.
message w123.
leave.
when 2.
'Keine Verbindung zum Zielsystem'.
message w124.
leave.
endcase.
sort vrs_dir_vrs descending by versno.
loop at vrs_dir_vrs.
vrs_dir_vrs-versno. =
append logvers_dir.
endloop.
read table vrs_dir_vrs index 1.
if vrs_dir_vrs-versmode = impt_mode.
Es gibt einen offenen Import, setze Flag zurück:
corr_mode. =
endif.
0. =
modify vrs_dir_vrs index 1.
endif.
vrsd_entry = buffer0.
perform add_active_version_remote using pi_dir_destination
changing vrsd_entry object_not_found.
if object_not_found = false.
po_no_entry = false.
endif.
Möglicherweise gibt es eine überarbeitete Version.
perform add_modif_version_remote using pi_dir_destination
changing vrsd_entry object_not_found.
if object_not_found = false.
po_no_entry = false.
endif.
endform.
form add_active_version_remote using pi_dir_destination changing vrsd_info structure vrsd
po_not_found.
data: object_not_found like vrsd-versmode.
data: nplus1 like vrsd-versno.
data: retcode like bool.
call function 'FIND_OBJECT_40'
exporting
destination = pi_dir_destination
objname = vrsd_info-objname
objtype = vrsd_info-objtype
importing
object_not_found = object_not_found
exceptions
system_failure = 1
communication_failure = 2.
case sy-subrc.
when 1.
'Fehler im Zielsytem'.
message w123.
leave.
when 2.
'Keine Verbindung zum Zielsystem'.
message w124.
leave.
" SY-SUBRC.
if object_not_found = space.
po_not_found = false.
else.
po_not_found = true.
endif.
clear: vrsd_info-korrnum, vrsd_info-author,
vrsd_info-zeit.
if po_not_found = false.
if vrsd_info-versmode = impt_mode.
Es gibt einen offenen Import, und einen Satz n+1 der
uns verschwiegen wurde. Er beschreibt die aktive Version
nplus1 = vrsd_info-lastversno + 1.
perform get_vrsd_entry_remote
using vrsd_info-objtype vrsd_info-objname nplus1 pi_dir_destination
changing vrsd_info retcode.
else.
perform get_korrinfo_remote using pi_dir_destination changing vrsd_info.
endif.
vrsd_info to vrs_dir_vrs.
null_versno. =
acti_versno. =
insert vrs_dir_vrs index 1.
insert logvers_dir index 1.
endif.
endform.
form add_modif_version_remote using pi_dir_destination changing vrsd_info structure vrsd
po_not_found.
data: mod_dd_exists like vrsd-versmode.
call function 'TEST_MOD_DD_40'
exporting
destination = pi_dir_destination
objname = vrsd_info-objname
objtype = vrsd_info-objtype
importing
mod_dd_exists = mod_dd_exists
exceptions
system_failure = 1
communication_failure = 2.
case sy-subrc.
when 1.
'Fehler im Zielsytem'.
message w123.
leave.
when 2.
'Keine Verbindung zum Zielsystem'.
message w124.
leave.
endcase.
if mod_dd_exists <> space.
po_not_found = false.
perform get_korrinfo_remote using pi_dir_destination changing vrsd_info.
vrsd_info to vrs_dir_vrs.
modi_versno. =
modi_versno. =
insert vrs_dir_vrs index 1.
insert logvers_dir index 1.
else.
po_not_found = true.
endif.
"add_modif_version_remote
form get_korrinfo_remote using pi_dir_destination changing vrsd_info structure vrsd.
call function 'GET_KORRNUM_AUTHOR_DATUM_40'
exporting
destination = pi_dir_destination
objname = vrsd_info-objname
objtype = vrsd_info-objtype
importing
author = vrsd_info-author
datum = vrsd_info-datum
korrnum = vrsd_info-korrnum
zeit = vrsd_info-zeit
exceptions
system_failure = 1
communication_failure = 2.
case sy-subrc.
when 1.
'Fehler im Zielsytem'.
message w123.
leave.
when 2.
'Keine Verbindung zum Zielsystem'.
message w124.
leave.
endcase.
if vrsd_info-korrnum <> space.
Korrektur ist offen, Zeitstempel korrigieren:
sy-datum. =
sy-uzeit. =
endif.
endform.
*&---------------------------------------------------------------------*
Form GET_VERSION
*&---------------------------------------------------------------------*
text
*----------------------------------------------------------------------*
-->P_PROGRAM text
<--P_LW_YABAP_CHECK_002 text
*----------------------------------------------------------------------*
form get_version using p_program p_object type tadir-object
changing pw_yabap_check_002 type ty_yabap_check_002_mix .
data:lv_mtext_qas type string.
data:lv_mtext_prd type string.
PROGRAM Version management: Directory table
data:ls_vrsd type vrsd.
取当前对象已经释放的请求里面最新的激活版本
select single * from vrsd
into ls_vrsd
where objname = p_program
and versno = 0
防止是第一次修改,并没有释放的情况
and korrnum is not null .
AND korrnum eq abap_false.
if sy-subrc is initial.
ls_vrsd. =
else.
p_program. =
sy-datum. =
sy-uzeit. =
p_program. =
REPOSRC 是报表的情况下,查这个表
data:ls_reposrc type reposrc.
这里如果是函数的话,需要改一下取数逻辑
select single * from reposrc into ls_reposrc
where progname = p_program.
if sy-subrc is initial.
ls_reposrc-cnam. =
pw_yabap_check_002-dev_author = ls_reposrc-cnam.
ls_reposrc-vern. =
endif.
'无版本信息,无法比较'. =
append pw_yabap_check_002 to lt_yabap_check_002.
exit.
endif.
TMSMCONF
检查本系统是有传输请求配置的
data:ls_tmsmconf type tmsmconf.
select single * from tmsmconf into ls_tmsmconf .
check sy-subrc is initial.
TMSCSYS
查到本系统内的传输请求 这里可以区分 Q*与T*
data:lt_tmscsys type table of tmscsys.
select * from tmscsys into table lt_tmscsys
where extsys <> 'X'
or extsys is null
and nfsgrp eq ls_tmsmconf-nfsgrp.
check sy-subrc is initial.
检查是se38的程序
IF p_object = 'PROG'.
排除SAP的程序 ?LYFG_TEST01F01
TRDIR
select
DATA:ls_tadir TYPE tadir.
SELECT SINGLE * FROM tadir INTO ls_tadir
WHERE pgmid = 'R3TR'
AND object = p_object
AND obj_name = p_program.
CHECK sy-subrc IS INITIAL.
ENDIF.
*TMSADM@TPV.DOMAIN_DEV
*ZXF05U01
*REPS
函数模块 SVRS_DISPLAY_REMOTE_DIR
* Lies die Versionsliste des REMOTE-Systems
data: dir_objtype like vrsd-objtype.
data: dir_objname like vrsd-objname.
data: no_entry type bool.
dir_objtype = ls_vrsd-objtype.
dir_objname = ls_vrsd-objname.
************************************************************************
获取当前对象的测试环境的版本信息 *
************************************************************************
data: lt_vrs_dir_vrs_qas like table of vrsd ,
lw_vrs_dir_vrs_qas type vrsd.
dir_destination_qas = 'TMSADM@QA1.DOMAIN_DEV'.
Prüfe, ob Objekt im Zielsystem existiert und Versionen hat
data: returncode_qas like sy-subrc,
returncode_prd like sy-subrc.
perform ck_check_remote_object
using dir_destination_qas dir_objname
changing dir_objtype
returncode_qas.
case returncode_qas.
when 0 or 1.
when 2.
'Fehler im Zielsystem'
message id 'SB' type 'I' number 123 into lv_mtext_qas.
when 3.
'Keine Verbindung zum Zielsystem oder fehlerhafte Kommunikation'
message id 'SB' type 'I' number 124 into lv_mtext_qas.
when 4.
'Das Objekt existiert nicht im Zielsystem'.
message id 'SB' type 'I' number 131 into lv_mtext_qas.
endcase.
if returncode_qas eq 0 or returncode_qas eq 1.
perform get_version_list_remote tables lt_vrs_dir_vrs_qas
using dir_objtype dir_objname dir_destination_qas
changing no_entry.
else.
dir_objname. =
dir_objtype. =
append lw_vrs_dir_vrs_qas to lt_vrs_dir_vrs_qas.
endif.
************************************************************************
获取当前对象的生产的版本信息 *
************************************************************************
dir_destination_prd = 'TMSADM@TPV.DOMAIN_DEV'.
perform ck_check_remote_object
using dir_destination_prd dir_objname
changing dir_objtype
returncode_prd.
case returncode_prd.
when 0 or 1.
when 2.
'Fehler im Zielsystem'
message id 'SB' type 'I' number 123 into lv_mtext_prd.
when 3.
'Keine Verbindung zum Zielsystem oder fehlerhafte Kommunikation'
message id 'SB' type 'I' number 124 into lv_mtext_prd.
when 4.
'Das Objekt existiert nicht im Zielsystem'.
message id 'SB' type 'I' number 131 into lv_mtext_prd.
endcase.
if returncode_prd eq 0 or returncode_prd eq 1.
data: lt_vrs_dir_vrs_prd like table of vrsd ,lw_vrs_dir_vrs_prd type vrsd.
perform get_version_list_remote tables lt_vrs_dir_vrs_prd
using dir_objtype dir_objname dir_destination_prd
changing no_entry.
else.
dir_objname. =
dir_objtype. =
append lw_vrs_dir_vrs_prd to lt_vrs_dir_vrs_prd.
endif.
check no_entry ne true.
if no_entry eq true.
exit.
endif.
check no_entry ne true.
sy-datum. =
sy-uzeit. =
p_program. =
ls_vrsd-korrnum. =
if lt_vrs_dir_vrs_prd[] is not initial.
read table lt_vrs_dir_vrs_prd index 1 into lw_vrs_dir_vrs_prd.
if sy-subrc is initial.
if lw_vrs_dir_vrs_prd-korrnum is initial.
lv_mtext_prd. =
else.
lw_vrs_dir_vrs_prd-korrnum. =
endif.
lw_vrs_dir_vrs_prd. =
endif.
endif.
if lt_vrs_dir_vrs_qas[] is not initial.
read table lt_vrs_dir_vrs_qas index 1 into lw_vrs_dir_vrs_qas.
if sy-subrc is initial.
if lw_vrs_dir_vrs_qas-korrnum is initial.
lv_mtext_qas. =
else.
lw_vrs_dir_vrs_qas-korrnum. =
endif.
lw_vrs_dir_vrs_qas. =
endif.
endif.
请求描述 后面还要加开发人员
if pw_yabap_check_002-dev_versno eq pw_yabap_check_002-qas_versno
and pw_yabap_check_002-qas_versno eq pw_yabap_check_002-prd_versno
and pw_yabap_check_002-dev_versno is not initial
and pw_yabap_check_002-qas_versno is not initial
and pw_yabap_check_002-prd_versno is not initial.
'放心修改。'(011). =
else.
增加代码自动比较
perform get_version_description using pw_yabap_check_002.
perform auto_compare_versions using pw_yabap_check_002.
endif.
append pw_yabap_check_002 to lt_yabap_check_002.
" GET_VERSION
form ck_check_remote_object using pi_logdest like rfcdes-rfcdest
pi_objname like vrsd-objname
changing pi_objtype like vrsd-objtype
retcode like sy-subrc.
************************************************************************
FUNKTION:
Prüft nach, ob das angegebene System mittels REMOTE-Function-Call
angesprochen werden kann.
----------------------------------------------------------------------
PARAMETER:
PI_LOGDEST: Name der logischen Destination
*
PI_OBJTYPE: Name des Objekts ('REPO', 'DYNP', ETC.)
*
PI_OBJNAME: Name des Objekts
*
RETCODE: = 0 versions exist
1 active object exists =
2/3 communication failures =
4 object does not exist at all =
5 object exists, but incompatible releases =
************************************************************************
data: object_not_found like vrsd-versmode value ' '.
data: vrsd_entry like vrsd.
clear: retcode, object_not_found.
Überprüfe, ob das Fremdsystem angesprochen werden kann und
ob es dort Versionen dieses Objekts gibt.
perform ck_check_remote_versions
using pi_logdest pi_objname
changing pi_objtype
retcode.
if retcode = 1.
Keine Versionen im Fremdsystem gefunden. Prüfe, ob das Objekt
überhaupt im Zielsystem existiert.
call function 'FIND_OBJECT_40'
exporting
destination = pi_logdest
objname = pi_objname
objtype = pi_objtype
importing
object_not_found = object_not_found
exceptions
system_failure = 2
communication_failure = 3.
if sy-subrc <> 0.
retcode = sy-subrc.
else.
if object_not_found <> space.
retcode = 4.
else.
retcode = 1.
endif.
endif.
elseif retcode = 0.
Versionen im Fremdsystem vorhanden, prüfen ob Vergleich
überhaupt möglich ist, oder nur Anzeige.
Bis jetzt gibt es bei fast allen Objekttypen Probleme
if pi_objtype = 'DYNP' or
pi_objtype = 'CUAD' or
pi_objtype = 'TABD' or
pi_objtype = 'VIED' or
pi_objtype = 'MCID' or
pi_objtype = 'MCOD' or
pi_objtype = 'ENQD' or
pi_objtype = 'TABT'.
Wir prüfen den Release-Stand anhand des Header Eintrages
call function 'GET_VRSD_ENTRY_46'
exporting
destination = pi_logdest
objname = head_objname
objtype = head_type
versno = head_versno
importing
vrsd_entry = vrsd_entry
exceptions
no_entry_found = 1
system_failure = 2
communication_failure = 3.
retcode = sy-subrc.
if retcode = 1.
Wenn kein Header Eintrag vorhanden ist, dann handelt es
sich um einen älteren Releasestand (< 30A).
retcode = 5.
elseif retcode = 0.
Es gibt einen Header Eintrag, aber ist es ein richtiger?
if vrsd_entry-rels < '30A '. "#EC PORTABLE
retcode = 5.
endif.
endif.
endif.
endif.
endform.
form ck_check_remote_versions using pi_logdest like rfcdes-rfcdest
pi_objname like vrsd-objname
changing pi_objtype like vrsd-objtype
po_retcode like sy-subrc.
************************************************************************
FUNKTION:
Prüft nach, ob es in dem angegebenen System Versionen (in VRSD) des
angegebenen Objektes gibt.
----------------------------------------------------------------------
PARAMETER:
PI_LOGDEST: Name der logischen Destination
*
PI_OBJTYPE: Name des Objekts ('REPO', 'DYNP', ETC.)
*
PI_OBJNAME: Name des Objekts
*
PO_RETCODE: = 0 versions exist
1 no versions =
2/3 communication failures =
************************************************************************
tables tfdir.
data: versno like vrsd-versno value 0.
data: iname like vrsd-objname.
data: iobjtype like vrsd-objtype.
data: vrsd_entry like vrsd.
clear: po_retcode.
Überprüfe, ob das Fremdsystem angesprochen werden kann und
ob es dort Versionen dieses Objekts gibt.
call function 'GET_VRSD_ENTRY_46'
exporting
destination = pi_logdest
objname = pi_objname
objtype = pi_objtype
versno = versno
importing
vrsd_entry = vrsd_entry
exceptions
no_entry_found = 1
system_failure = 2
communication_failure = 3.
po_retcode = sy-subrc.
if po_retcode <> 1.
exit.
endif.
if pi_objtype = rept_type or pi_objtype = reps_type or
pi_objtype = func_type.
Für einige Objekttypen werden noch alte LIMU REPOs gesucht,
in denen Versionen der ABAP-Source stehen könnten
if pi_objtype = func_type.
wir brauchen zuerst den Include-Namen
clear: iname.
select single * from tfdir where funcname = pi_objname.
'L'. =
tfdir-pname+4(4). "'4' ist OK, da REPOs nicht mehr =
werden.
'U'. =
tfdir-include. =
Nun können wir die Versionen suchen
iobjtype = repo_type.
call function 'GET_VRSD_ENTRY_46'
exporting
destination = pi_logdest
objname = iname
objtype = iobjtype
versno = versno
importing
vrsd_entry = vrsd_entry
exceptions
no_entry_found = 1
system_failure = 2
communication_failure = 3.
po_retcode = sy-subrc.
elseif pi_objtype = reps_type.
iobjtype = repo_type.
call function 'GET_VRSD_ENTRY_46'
exporting
destination = pi_logdest
objname = pi_objname
objtype = iobjtype
versno = versno
importing
vrsd_entry = vrsd_entry
exceptions
no_entry_found = 1
system_failure = 2
communication_failure = 3.
po_retcode = sy-subrc.
Der Anzeigereport RSVRSTCO kann keine REPOs anzeigen
elseif pi_objtype = rept_type.
pi_objtype = repo_type.
call function 'GET_VRSD_ENTRY_40'
exporting
destination = pi_logdest
objname = pi_objname
objtype = pi_objtype
versno = versno
importing
vrsd_entry = vrsd_entry
exceptions
no_entry_found = 1
system_failure = 2
communication_failure = 3.
po_retcode = sy-subrc.
endif.
endif.
endform.
*&---------------------------------------------------------------------*
Form GET_VERSION_DESCRIPTION
*&---------------------------------------------------------------------*
text
*----------------------------------------------------------------------*
-->P_PW_YABAP_CHECK_002 text
*----------------------------------------------------------------------*
form get_version_description using piw_yabap_check_002 type ty_yabap_check_002_mix.
data:lw_e07t type e07t.
if piw_yabap_check_002-dev_versno is not initial.
select single as4text
from e07t
into piw_yabap_check_002-dev_as4text
where trkorr eq piw_yabap_check_002-dev_versno.
piw_yabap_check_002-dev-author. =
endif.
if piw_yabap_check_002-qas_versno is not initial.
select single as4text
from e07t
into piw_yabap_check_002-qas_as4text
where trkorr eq piw_yabap_check_002-qas_versno.
piw_yabap_check_002-qas-author. =
endif.
if piw_yabap_check_002-prd_versno is not initial.
select single as4text
from e07t
into piw_yabap_check_002-prd_as4text
where trkorr eq piw_yabap_check_002-prd_versno.
piw_yabap_check_002-prd-author. =
endif.
" GET_VERSION_DESCRIPTION
form auto_compare_versions using piw_yabap_check_002 type ty_yabap_check_002_mix.
/ LSVRLF04
COMPARE_VERSIONS 与 ZLOCAL_CL_SALV_BS_RUNTIME_INFO
这些版本的源没有区别。需要考虑多语言
data:lv_object like piw_yabap_check_002-objname,
ls_vrsd1 like piw_yabap_check_002-dev,
ls_vrsd2 like piw_yabap_check_002-qas,
lv_result like piw_yabap_check_002-DEV_QAS_COMPARE.
DEV_QAS_COMPARE
if '对象在目标系统内不存在'(003) ne piw_yabap_check_002-dev_qas_compare.
perform auto_compare_versions_sub using piw_yabap_check_002-objname piw_yabap_check_002-dev piw_yabap_check_002-qas changing piw_yabap_check_002-dev_qas_compare.
endif.
DEV_PRD_COMPARE
if '对象在目标系统内不存在'(003) ne piw_yabap_check_002-dev_prd_compare.
perform auto_compare_versions_sub using piw_yabap_check_002-objname piw_yabap_check_002-dev piw_yabap_check_002-prd changing piw_yabap_check_002-dev_prd_compare.
endif.
SUGGEST
data:
lv_string_no_diff type string,
lv_string_no_exit type string.
lv_string_no_diff = '这些版本的源没有区别。'(001).
lv_string_no_exit = '对象在目标系统内不存在'(003).
if piw_yabap_check_002-dev_qas_compare eq piw_yabap_check_002-dev_prd_compare and piw_yabap_check_002-dev_prd_compare eq lv_string_no_diff.
'放心修改。'(011). =
elseif piw_yabap_check_002-dev_qas_compare eq piw_yabap_check_002-dev_prd_compare and piw_yabap_check_002-dev_prd_compare eq lv_string_no_exit.
'放心修改。'(011). =
elseif piw_yabap_check_002-dev_qas_compare eq lv_string_no_diff and piw_yabap_check_002-dev_prd_compare eq lv_string_no_exit.
'放心修改。'(011). =
else.
'请确认后再修改。'(012). =
endif.
endform.
form auto_compare_versions_sub using pv_objname type ty_yabap_check_002_mix-objname
ps_vrsd1 type ty_yabap_check_002_mix-dev
ps_vrsd2 type ty_yabap_check_002_mix-qas
changing pv_result type ty_yabap_check_002_mix-dev_qas_compare.
check ps_vrsd2-korrnum is not initial.
data: lt_sel_versions like vrsd occurs 0,
lv_selnumber type i,
ls_vers_1 like vrsd,
ls_vers_2 like vrsd,
ls_infoline1a like vrsinfolna,
ls_infoline1b like vrsinfolnb,
ls_infoline2a like vrsinfolna,
ls_infoline2b like vrsinfolnb,
lv_objname1_l like vrsd-objname,
lv_objname2_l like vrsd-objname.
DEV_QAS_COMPARE
pv_objname. =
pv_objname. =
ps_vrsd1 to ls_infoline1b.
ps_vrsd1 to ls_vers_1.
ps_vrsd2 to ls_infoline2b.
ps_vrsd2 to ls_vers_2 .
call function 'SVRS_SHORT2LONG_NAME'
exporting
objtype = ls_vers_1-objtype
objname_short = ls_vers_1-objname
importing
objname_long = lv_objname1_l.
call function 'SVRS_SHORT2LONG_NAME'
exporting
objtype = ls_vers_2-objtype
objname_short = ls_vers_2-objname
importing
objname_long = lv_objname2_l.
submit rsvrsrs3 and return
with objname = lv_objname1_l
with objnam2 = lv_objname2_l
with versno1 = ls_vers_1-versno
with versno2 = ls_vers_2-versno
with objtyp1 = ls_vers_1-objtype
with objtyp2 = ls_vers_2-objtype
with infoln1a = ls_infoline1a
with infoln1b = ls_infoline1b
with infoln2a = ls_infoline2a
with infoln2b = ls_infoline2b
exporting list to memory.
data begin of itab_list occurs 0.
include structure abaplist.
data end of itab_list.
data: begin of vlist occurs 0, "这个调用程序ALV输出的长度要根据实际长度来确认
line type c length 300,
end of vlist.
call function 'LIST_FROM_MEMORY'
tables
listobject = itab_list
exceptions
not_found = 4
others = 8.
free memory .
call function 'LIST_TO_ASCI'
exporting
list_index = -1
tables
listasci = vlist
listobject = itab_list
exceptions
empty_list = 1
list_index_invalid = 2
others = 3.
if sy-subrc = 0 and vlist[] is not initial.
describe table vlist[] lines data(lv_lines).
read table vlist index lv_lines.
pv_result = vlist-line.
endif.
endform.
*----------------------------------------------------------------------*
ZXSEUF02.
*----------------------------------------------------------------------*
*&---------------------------------------------------------------------*
Form SHOW_ALV
*&---------------------------------------------------------------------*
text
*----------------------------------------------------------------------*
--> p1 text
<-- p2 text
*----------------------------------------------------------------------*
****DEFINITION
class lcl_event_receiver definition.
public section.
methods:
handle_double_click
for event double_click of cl_gui_alv_grid
importing e_row e_column.
private section.
endclass.
data: ok_code like sy-ucomm,
gt_sflight type table of sflight,
gt_sbook type table of sbook,
g_max type i value 100,
g_repid like sy-repid,
gs_layout type lvc_s_layo,
gt_fieldcat type lvc_t_fcat with header line,
cont_on_main type scrfname value 'BCALVC_EVENT2_D100_C1',
cont_on_dialog type scrfname value 'BCALVC_EVENT2_D101_C1',
grid1 type ref to cl_gui_alv_grid,
grid2 type ref to cl_gui_alv_grid,
references to custom container: neccessary to bind ALV Control
custom_container1 type ref to cl_gui_custom_container,
custom_container2 type ref to cl_gui_custom_container,
event_receiver type ref to lcl_event_receiver.
****************************************************************
LOCAL CLASSES: Implementation
****************************************************************
============================================================== =
class lcl_event_receiver (Implementation)
*
In this example, only event DOUBLE_CLICK is caught
*
class lcl_event_receiver implementation.
method handle_double_click.
data: ls_sflight like line of gt_sflight.
§ 4.The event DOUBLE_CLICK provides parameters for row and column
of the click. Use row parameter to select a line of the
corresponding internal table.
read selected row from internal table gt_sflight
read table gt_sflight index e_row-index into ls_sflight.
§ 5.Select data and call the second dynpro.
select corresponding lines of table sbook
PERFORM select_table_sbook USING ls_sflight
CHANGING gt_sbook.
call dialog screen and display new alv control
call screen 101 starting at 10 5.
"handle_double_click
endclass.
module pbo_0101 output.
§ 6.The first time dynpro 101 is called:
Create a second ALV Control for table SBOOK. This example
uses default lifetime (IMode), i.e, although you leave dynpro 101
the Control is still alive. This makes sense if it is expected
that the user wants to see different selections of table SBOOK
(the controls needs only be created once).
set pf-status 'STANDARD'.
if custom_container2 is initial.
(the data from sbook is already selected)
create a custom container control for our ALV Control
create object custom_container2
exporting
container_name = cont_on_dialog
exceptions
cntl_error = 1
cntl_system_error = 2
create_error = 3
lifetime_error = 4
lifetime_dynpro_dynpro_link = 5.
if sy-subrc ne 0.
add your handling, for example
call function 'POPUP_TO_INFORM'
exporting
titel = g_repid
txt2 = sy-subrc
txt1 = 'The control could not be created'(510).
endif.
create an instance of alv control
create object grid2
exporting
i_parent = custom_container2.
*
change title
*
'对象版本差异提示'(101). =
abap_true. =
*
adjust field catalog
to suppress the output of already displayed key fields of sflight
*
perform mask_columns tables gt_fieldcat.
call method grid2->set_table_for_first_display
exporting
is_layout = gs_layout
changing
it_fieldcatalog = gt_fieldcat[]
it_outtab = lt_yabap_check_002[].
else.
§ 7.The next time dynpro 101 is called you use method
'refresh_table_display' to display newly selected data
in the instance of ALV Control that 'belongs' to dynpro 101.
call method grid2->set_frontend_fieldcatalog exporting it_fieldcatalog = gt_fieldcat[].
call method grid2->set_frontend_layout exporting is_layout = gs_layout.
call method grid2->refresh_table_display.
"IF grid2 IS INITIAL.
call method cl_gui_control=>set_focus exporting control = grid2.
call method cl_gui_cfw=>flush.
CREATE OBJECT event_receiver.
SET HANDLER event_receiver->handle_double_click FOR grid2.
if sy-subrc ne 0.
add your handling, for example
call function 'POPUP_TO_INFORM'
exporting
titel = g_repid
txt2 = sy-subrc
txt1 = 'Error in FLush'(500).
endif.
" PBO_0101 OUTPUT
*&---------------------------------------------------------------------*
*----------------------------------------------------------------------*
form mask_columns tables p_gt_fieldcat type lvc_t_fcat.
Build the fieldcat according to DDIC structure SBOOK:
call function 'LVC_FIELDCATALOG_MERGE'
exporting
i_structure_name = 'YABAP_CHECK_002'
changing
ct_fieldcat = p_gt_fieldcat[].
suppress key fields CARRID, CONNID and FLDATE
LOOP AT p_gt_fieldcat.
IF p_gt_fieldcat-fieldname = 'CARRID'
OR p_gt_fieldcat-fieldname = 'CONNID'
OR p_gt_fieldcat-fieldname = 'FLDATE'.
p_gt_fieldcat-key_sel = 'X'.
p_gt_fieldcat-no_out = 'X'.
MODIFY p_gt_fieldcat.
set left alignment for the two key fields left...
ELSEIF p_gt_fieldcat-fieldname = 'BOOKID'
OR p_gt_fieldcat-fieldname = 'CUSTOMID'.
p_gt_fieldcat-just = 'L'.
MODIFY p_gt_fieldcat.
ENDIF.
ENDLOOP.
" MASK_COLUMNS
module pai_0101 input.
break jordan.
case ok_code.
when 'RETURN' or 'WB_BACK' or 'WB_END' or 'WB_CANCEL' or 'BACK' or 'RW' or '%EX'.
perform skip_today using ok_code.
perform leave_screen_101.
when 'DEV2QAS'.
需要检查,两个版本得有效,比如生产的版本,如果在本地不存在的情况下,提示需要远程比较
perform compare_versions using ok_code .
when 'DEV2PRD'.
需要检查,两个版本得有效,比如生产的版本,如果在本地不存在的情况下,提示需要远程比较
perform compare_versions using ok_code.
when 'QAS2PRD'.
需要检查,两个版本得有效,比如生产的版本,如果在本地不存在的情况下,提示需要远程比较
perform compare_versions using ok_code.
when 'SKIP_TODAY'.
perform skip_today using ok_code.
perform leave_screen_101.
endcase.
clear ok_code.
endmodule.
SELECT_TABLE_SBOOK
SELECT_TABLE_SFLIGHT
form show_alv .
check lt_yabap_check_002[] is not initial.
call dialog screen and display new alv control
call screen 101
STARTING AT 10 20
.
" SHOW_ALV
————————————————
*----------------------------------------------------------------------*
ZXSEUF03.
*----------------------------------------------------------------------*
*&---------------------------------------------------------------------*
Form COMPARE_VERSIONS
*&---------------------------------------------------------------------*
text
*----------------------------------------------------------------------*
--> p1 text
<-- p2 text
*----------------------------------------------------------------------*
form compare_versions using ok_code like sy-ucomm .
data:
lt_sel_versions like vrsd occurs 0,
lv_selnumber type i,
ls_vers_1 like vrsd,
ls_vers_2 like vrsd,
ls_infoline1a like vrsinfolna,
ls_infoline1b like vrsinfolnb,
ls_infoline2a like vrsinfolna,
ls_infoline2b like vrsinfolnb,
lv_objname1_l like vrsd-objname,
lv_objname2_l like vrsd-objname.
lv_selnumber = 2.
***这里是从屏幕上面勾选的两条并显示代码差异,我们这里不需要选的这段逻辑
PERFORM check_vers_selection TABLES lt_sel_versions
CHANGING lv_selnumber
ls_infoline1a
ls_infoline1b
ls_infoline2a
ls_infoline2b.
check grid2 is not initial.
data :lv_index_rows type lvc_t_row,
lv_row_no type lvc_t_roid.
call method grid2->get_selected_rows
importing
et_index_rows = lv_index_rows
et_row_no = lv_row_no.
if lv_row_no[] is initial.
add your handling, for example
call function 'POPUP_TO_INFORM'
exporting
titel = g_repid
txt2 = sy-subrc
txt1 = '比较时需要选中清单中任意一条'(500).
exit.
endif.
break jordan.
data:ls_row_no type lvc_s_roid.
read table lv_row_no index 1 into ls_row_no.
check sy-subrc is initial.
data:lw_sel_versions type vrsd.
data:lw_yabap_check_002 like line of lt_yabap_check_002[].
check lt_yabap_check_002[] is not initial.
read table lt_yabap_check_002[] index ls_row_no-row_id into lw_yabap_check_002.
check sy-subrc is initial.
data:lv_korrnum_is_not_initail type bool.
case ok_code.
when 'DEV2QAS'.
perform check_korrnum_is_not_initail using lw_yabap_check_002-dev-korrnum lw_yabap_check_002-qas-korrnum changing lv_korrnum_is_not_initail.
if lv_korrnum_is_not_initail eq abap_true.
exit.
endif.
lw_sel_versions = lw_yabap_check_002-dev .
lw_yabap_check_002-dev-objname. =
lw_yabap_check_002-dev-korrnum. =
lw_yabap_check_002-dev-author. =
lw_yabap_check_002-dev-datum. =
append lw_sel_versions to lt_sel_versions.
lw_yabap_check_002-qas-objname. =
lw_yabap_check_002-qas-korrnum. =
lw_yabap_check_002-qas-author. =
lw_yabap_check_002-qas-datum. =
lw_sel_versions = lw_yabap_check_002-qas .
append lw_sel_versions to lt_sel_versions.
when 'DEV2PRD'.
perform check_korrnum_is_not_initail using lw_yabap_check_002-dev-korrnum lw_yabap_check_002-prd-korrnum changing lv_korrnum_is_not_initail.
if lv_korrnum_is_not_initail eq abap_true.
exit.
endif.
lw_sel_versions = lw_yabap_check_002-dev .
lw_yabap_check_002-dev-objname. =
lw_yabap_check_002-dev-korrnum. =
lw_yabap_check_002-dev-author. =
lw_yabap_check_002-dev-datum. =
append lw_sel_versions to lt_sel_versions.
lw_sel_versions = lw_yabap_check_002-prd .
lw_yabap_check_002-prd-objname. =
lw_yabap_check_002-prd-korrnum. =
lw_yabap_check_002-prd-author. =
lw_yabap_check_002-prd-datum. =
append lw_sel_versions to lt_sel_versions.
when 'QAS2PRD'.
perform check_korrnum_is_not_initail using lw_yabap_check_002-qas-korrnum lw_yabap_check_002-prd-korrnum changing lv_korrnum_is_not_initail.
if lv_korrnum_is_not_initail eq abap_true.
exit.
endif.
lw_sel_versions = lw_yabap_check_002-qas .
lw_yabap_check_002-qas-objname. =
lw_yabap_check_002-qas-korrnum. =
lw_yabap_check_002-qas-author. =
lw_yabap_check_002-qas-datum. =
append lw_sel_versions to lt_sel_versions.
lw_yabap_check_002-prd-objname. =
lw_yabap_check_002-prd-korrnum. =
lw_yabap_check_002-prd-author. =
lw_yabap_check_002-prd-datum. =
lw_sel_versions = lw_yabap_check_002-prd .
append lw_sel_versions to lt_sel_versions.
when others.
exit.
endcase.
case lv_selnumber.
when 0.
MESSAGE e102. "Bitte eine Version auswählen
when 2.
read table lt_sel_versions index 1 into ls_vers_1.
read table lt_sel_versions index 2 into ls_vers_2.
call function 'SVRS_SHORT2LONG_NAME'
exporting
objtype = ls_vers_1-objtype
objname_short = ls_vers_1-objname
importing
objname_long = lv_objname1_l.
call function 'SVRS_SHORT2LONG_NAME'
exporting
objtype = ls_vers_2-objtype
objname_short = ls_vers_2-objname
importing
objname_long = lv_objname2_l.
dir_f5_report = 'RSVRSRS3'.
compare report
submit (dir_f5_report) and return
with objname = lv_objname1_l
with objnam2 = lv_objname2_l
with versno1 = ls_vers_1-versno
with versno2 = ls_vers_2-versno
with objtyp1 = ls_vers_1-objtype
with objtyp2 = ls_vers_2-objtype
with infoln1a = ls_infoline1a
with infoln1b = ls_infoline1b
with infoln2a = ls_infoline2a
with infoln2b = ls_infoline2b.
when others.
MESSAGE e103.
nur zwei Versionen miteinander vergleichen
endcase.
break jordan.
" COMPARE_VERSIONS
*---------------------------------------------------------------------*
FORM CHECK_VERS_SELECTION_NEW *
*---------------------------------------------------------------------*
........ *
*---------------------------------------------------------------------*
--> PT_SEL_REQUESTS *
--> PO_SEL_NUMBER *
--> PS_VERS_1 *
--> PS_VERS_2 *
--> PS_INFOLINE1A *
--> PS_INFOLINE1B *
--> PS_INFOLINE2A *
--> PS_INFOLINE2B *
*---------------------------------------------------------------------*
form check_vers_selection tables pt_sel_versions structure vrsd
changing po_sel_number
ps_infoline1a like vrsinfolna
ps_infoline1b like vrsinfolnb
ps_infoline2a like vrsinfolna
ps_infoline2b like vrsinfolnb.
************************************************************************
FUNKTION:
Auswahl im Verzeichnis auswerten.
Es werden die ausgewählten Versionen gelesen und in
DIR_VERSNO_1 und DIR_VERSNO_2 abgelegt.
PO_SEL_NUMBER gibt die Anzahl der ausgewählten Versionen an.
PO_SEL_NUMBER = 3 falls mehr als zwei Versionen ausgewählt wurden.
************************************************************************
data: ls_vrs_dir_vrs like vrs_dir_vrs,
lv_markfield like vrsdynpro-x.
refresh pt_sel_versions.
po_sel_number = 0.
do.
clear: vrsdynpro-x, vrs_dir_vrs.
read line sy-index field value vrsdynpro-x.
ls_vrs_dir_vrs = vrs_dir_vrs.
lv_markfield = vrsdynpro-x.
clear: vrs_dir_vrs, vrsdynpro-x.
if sy-subrc <> 0.
end of list reached
exit.
endif.
if ( lv_markfield = 'x' ) or ( lv_markfield = 'X' ).
marked lie found
store request number
append ls_vrs_dir_vrs to pt_sel_versions.
po_sel_number = po_sel_number + 1.
if po_sel_number = 1.
neues make_info_line
perform make_info_line_new
using ls_vrs_dir_vrs-objname ls_vrs_dir_vrs-korrnum
ls_vrs_dir_vrs-author
changing ps_infoline1a
ps_infoline1b.
elseif po_sel_number = 2.
neues make_info_line
perform make_info_line_new
using ls_vrs_dir_vrs-objname ls_vrs_dir_vrs-korrnum
ls_vrs_dir_vrs-author
changing ps_infoline2a
ps_infoline2b.
endif.
endif.
enddo.
endform.
*---------------------------------------------------------------------*
FORM SELECT_OBJECT *
*&---------------------------------------------------------------------*
Form CHECK_KORRNUM_IS_NOT_INITAIL
*&---------------------------------------------------------------------*
text
*----------------------------------------------------------------------*
-->P_LW_YABAP_CHECK_002_DEV_KORRNUM text
-->P_LW_YABAP_CHECK_002_QAS_KORRNUM text
*----------------------------------------------------------------------*
form check_korrnum_is_not_initail using p_korrnum_left type verskorrno
p_korrnum_right type verskorrno
changing pv_korrnum_is_not_initail type bool.
if p_korrnum_left is initial or p_korrnum_right is initial.
call function 'POPUP_TO_INFORM'
exporting
titel = g_repid
txt2 = sy-subrc
txt1 = '比较的版本不允许为空'(501).
pv_korrnum_is_not_initail = abap_true.
endif.
" CHECK_KORRNUM_IS_NOT_INITAIL
*&---------------------------------------------------------------------*
Form SKIP_TODAY
*&---------------------------------------------------------------------*
text
*----------------------------------------------------------------------*
-->P_OK_CODE text
*----------------------------------------------------------------------*
form skip_today using p_ok_code.
data ls_yabap_check_001 type yabap_check_001.
sy-uname. =
sy-datum. =
gv_object. =
gv_objectname. =
if p_ok_code = 'SKIP_TODAY'.
abap_true. =
endif.
modify yabap_check_001 from ls_yabap_check_001.
" SKIP_TODAY
*&---------------------------------------------------------------------*
Form LEAVE_SCREEN_101
*&---------------------------------------------------------------------*
text
*----------------------------------------------------------------------*
--> p1 text
<-- p2 text
*----------------------------------------------------------------------*
form leave_screen_101 .
if grid2 is not initial.
CALL METHOD grid2->free.
clear lt_yabap_check_002[].
endif.
leave to screen 0.
" LEAVE_SCREEN_101
注意, 这两个变量,依各公司中的配置而定。具体看tmsmconf这个表中的配置
dir_destination_qas = ‘TMSADM@QA1.DOMAIN_DEV’.
dir_destination_prd = ‘TMSADM@TPV.DOMAIN_DEV’.
还有问题请留言
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/u010195563/article/details/128711590