DATA:LT_SELLIST LIKE TABLE OF VIMSELLIST WITH HEADER LINE.
CALL FUNCTION 'VIEW_MAINTENANCE_CALL'
EXPORTINGACTION = 'U'
VIEW_NAME = P_NAME
TABLES
DBA_SELLIST = LT_SELLIST.
源码:
FUNCTION view_maintenance_call.
*"----------------------------------------------------------------------
*"*"Lokale Schnittstelle:
*" IMPORTING
*" VALUE(ACTION)
*" VALUE(CORR_NUMBER) LIKE E070-TRKORR DEFAULT ' '
*" VALUE(GENERATE_MAINT_TOOL_IF_MISSING) DEFAULT ' '
*" VALUE(SHOW_SELECTION_POPUP) DEFAULT ' '
*" VALUE(VIEW_NAME) LIKE DD02V-TABNAME
*" VALUE(NO_WARNING_FOR_CLIENTINDEP) DEFAULT ' '
*" VALUE(RFC_DESTINATION_FOR_UPGRADE) LIKE RFCDES-RFCDEST DEFAULT
*" ' '
*" VALUE(CLIENT_FOR_UPGRADE) LIKE SY-MANDT DEFAULT ' '
*" VALUE(VARIANT_FOR_SELECTION) LIKE TVIMV-VARIANT DEFAULT ' '
*" VALUE(COMPLEX_SELCONDS_USED) LIKE TVDIR-FLAG DEFAULT ' '
*" VALUE(CHECK_DDIC_MAINFLAG) DEFAULT ' '
*" VALUE(SUPPRESS_WA_POPUP) TYPE XFELD DEFAULT SPACE
*" TABLES
*" DBA_SELLIST STRUCTURE VIMSELLIST OPTIONAL
*" EXCL_CUA_FUNCT STRUCTURE VIMEXCLFUN OPTIONAL
*" EXCEPTIONS
*" CLIENT_REFERENCE
*" FOREIGN_LOCK
*" INVALID_ACTION
*" NO_CLIENTINDEPENDENT_AUTH
*" NO_DATABASE_FUNCTION
*" NO_EDITOR_FUNCTION
*" NO_SHOW_AUTH
*" NO_TVDIR_ENTRY
*" NO_UPD_AUTH
*" ONLY_SHOW_ALLOWED
*" SYSTEM_FAILURE
*" UNKNOWN_FIELD_IN_DBA_SELLIST
*" VIEW_NOT_FOUND
*" MAINTENANCE_PROHIBITED
*"----------------------------------------------------------------------
*----------------------------------------------------------------------*
* Datenvereinbarungen *
*----------------------------------------------------------------------*
DATA: act_level LIKE authb-actvt, "Aktion zur Berecht.-prüfg.
oc_action TYPE xuval,
only_show_allowed TYPE c, "flag: only show allowed
countx TYPE i, "Zähler für Ankreuzfelder
u(1) TYPE c VALUE 'U', "Ändern
s(1) TYPE c VALUE 'S', "Anzeigen, Subset
t(1) TYPE c VALUE 'T', "Transport
x(1) TYPE c VALUE 'X', "gesetztes Flag
r(1) TYPE c VALUE 'R', "read-only
all_substflds_initial(1) TYPE c, "Flag: alle Subset-Felder leer
i_action(1) TYPE c, rc LIKE sy-subrc,
text(70) TYPE c, "#EC NEEDED "SW
msgv1 LIKE sy-msgv1, msgv2 LIKE sy-msgv2, msgv3 LIKE sy-msgv3,
msgv4 LIKE sy-msgv4, old_rc LIKE sy-subrc.
DATA: BEGIN OF header OCCURS 1.
INCLUDE STRUCTURE vimdesc.
DATA: END OF header.
DATA: BEGIN OF namtab OCCURS 50.
INCLUDE STRUCTURE vimnamtab.
DATA: END OF namtab.
DATA: rangetab TYPE TABLE OF vimsellist INITIAL SIZE 50
WITH HEADER LINE,
oc_rangetab TYPE TABLE OF vimsellist INITIAL SIZE 50.
DATA: org_crit_inst TYPE vimty_oc_type, lockuser TYPE sy-uname.
TRANSLATE: action TO UPPER CASE, "#EC SYNTCHAR
view_name TO UPPER CASE. "#EC SYNTCHAR
*----------------------------------------------------------------------*
* Prüfen, ob gültige Eingabe erfolgte und ACT_LEVEL setzen
*----------------------------------------------------------------------*
i_action = action.
CASE action.
WHEN u. MOVE '02' TO act_level.
WHEN vim_direct_upgrade. MOVE '02' TO act_level. i_action = u.
WHEN t. MOVE '02' TO act_level. "auth_check for corr_maint like upd
WHEN s. MOVE '03' TO act_level.
WHEN OTHERS. MESSAGE a001 RAISING invalid_action.
ENDCASE.
*---------------------------------------------------------------------*
* ggf. temporäre Pflegeobjekte erzeugen. *
*---------------------------------------------------------------------*
* IF GENERATE_MAINT_TOOL_IF_MISSING NE SPACE.
* PERFORM GENERATE_TEMPORAL_OBJECTS USING VIEW_NAME.
* ENDIF.
*----------------------------------------------------------------------*
* Funktionsbaustein zum Füllen der Kontrollblocktabellen rufen *
*----------------------------------------------------------------------*
REFRESH namtab.
CLEAR namtab.
REFRESH header.
CLEAR header.
REFRESH rangetab.
CLEAR rangetab.
CALL FUNCTION 'VIEW_GET_DDIC_INFO'
EXPORTING
viewname = view_name
variant_for_selection = variant_for_selection
TABLES
x_header = header
x_namtab = namtab
sellist = rangetab
EXCEPTIONS
no_tvdir_entry = 3
table_not_found = 5.
*----------------------------------------------------------------------*
* ggf. Ausnahmen behandeln *
*----------------------------------------------------------------------*
CASE sy-subrc.
WHEN 3.
MESSAGE e037 WITH view_name RAISING no_tvdir_entry.
* PERFORM MESS_NO_TVDIR_ENTRY USING VIEW_NAME.
WHEN 5.
MESSAGE e028 WITH view_name RAISING view_not_found.
ENDCASE.
READ TABLE header INDEX 1.
*---------------------------------------------------------------------*
* DDIC Pflegekennzeichen MF 2000-11-07 *
*---------------------------------------------------------------------*
IF check_ddic_mainflag = 'X'.
IF header-mainflag = ' '.
MESSAGE e792 WITH view_name RAISING maintenance_prohibited.
ELSEIF header-mainflag = 'N'.
MESSAGE e789 WITH view_name RAISING maintenance_prohibited.
ENDIF.
ENDIF.
*---------------------------------------------------------------------*
* Berechtigungsprüfung *
*---------------------------------------------------------------------*
IF header-newgener EQ space. "4.5A: support individual auth. check
CLEAR only_show_allowed.
CALL FUNCTION 'VIEW_AUTHORITY_CHECK'
EXPORTING
view_action = i_action
view_name = view_name
no_warning_for_clientindep = no_warning_for_clientindep
CHANGING
org_crit_inst = org_crit_inst
EXCEPTIONS
table_not_found = 5
no_authority = 8
no_clientindependent_authority = 9
no_linedependent_authority = 10.
CASE sy-subrc.
WHEN 0.
WHEN 5.
MESSAGE e028 WITH view_name RAISING view_not_found.
WHEN 9.
MOVE: s TO action, s TO i_action, "SW 1152640/1999
x TO only_show_allowed.
MESSAGE ID 'TB' TYPE 'I' NUMBER 109 "no cli-indep auth
RAISING no_clientindependent_auth.
WHEN 8 OR 10.
IF act_level EQ '02'. "no update authority
CALL FUNCTION 'VIEW_AUTHORITY_CHECK' "check show authority
EXPORTING
view_action = s
view_name = view_name
no_warning_for_clientindep = no_warning_for_clientindep
CHANGING
org_crit_inst = org_crit_inst
EXCEPTIONS
no_authority = 8
no_linedependent_authority = 10.
CASE sy-subrc.
WHEN 0. "only show allowed
MOVE: s TO action,
s TO i_action, "UF2136609/1998
'03' TO act_level, x TO only_show_allowed.
MESSAGE i051 RAISING only_show_allowed.
WHEN 8.
* no authority respecting to S_TABU_DIS
MESSAGE e052 RAISING no_upd_auth.
WHEN 10.
* no authority respecting to S_TABU_LIN
IF old_rc = 10.
* no authority respecting to S_TABU_LIN
MESSAGE e756 RAISING no_upd_auth
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
* Sie haben keine zeilenbezogene Pflegeeberechtigung für diese Tabelle
ELSE.
MESSAGE e755 RAISING no_upd_auth
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
* Sie haben keine zeilenbezogene Anzeigeberechtigung für die Daten.
ENDIF.
ENDCASE. "sy-subrc from 2nd auth_check
ELSE. "act_level <> 02
IF sy-subrc = 8.
* no authority respecting to S_TABU_DIS
MESSAGE e053 RAISING no_show_auth.
ELSE. "sy-subrc = 10
* no authority respecting to S_TABU_LIN
MESSAGE e755 RAISING no_show_auth
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
* Sie haben keine zeilenbezogene Anzeigeberechtigung für diese Tabelle
ENDIF.
ENDIF.
ENDCASE.
ENDIF.
*----------------------------------------------------------------------*
* Rangetab aus DDIC mit DBA_SELLIST aus Schnittstelle mischen
*----------------------------------------------------------------------*
PERFORM vim_merge_sellists USING dba_sellist[]
namtab[]
space
CHANGING header[]
rangetab[]
rc.
IF rc = 2.
RAISE unknown_field_in_dba_sellist.
ENDIF.
READ TABLE header INDEX 1.
*----------------------------------------------------------------------*
* check whether rangetab is in agreement with authority
*----------------------------------------------------------------------*
IF NOT org_crit_inst IS INITIAL AND NOT rangetab[] IS INITIAL.
IF complex_selconds_used = space.
oc_action = act_level.
CALL METHOD org_crit_inst->check_oc_auth_vim_sellist
EXPORTING
sellist = rangetab[]
action = oc_action
EXCEPTIONS
no_auth = 1.
IF sy-subrc <> 0.
IF act_level = '02'.
CALL METHOD org_crit_inst->check_oc_auth_vim_sellist
EXPORTING
sellist = rangetab[]
action = '03'
EXCEPTIONS
no_auth = 1.
CASE sy-subrc.
WHEN 0.
MOVE: s TO action,
s TO i_action, "UF2136609/1998
'03' TO oc_action,
'03' TO act_level, x TO only_show_allowed.
MESSAGE i051 RAISING only_show_allowed.
WHEN 1.
MOVE: sy-msgv1 TO msgv1, sy-msgv2 TO msgv2,
sy-msgv3 TO msgv3, sy-msgv4 TO sy-msgv4.
MESSAGE e761(sv) WITH msgv1 msgv2 msgv3 msgv4
RAISING no_upd_auth..
* Sie haben keine Pflegeberechtigung für diese Selektion.
ENDCASE.
ELSE.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4
RAISING no_show_auth.
ENDIF.
ENDIF.
ELSE.
CALL METHOD org_crit_inst->set_to_be_checked2.
ENDIF.
ENDIF.
*----------------------------------------------------------------------*
* fill subset selection in RANGETAB from authority
* (authority object S_TABU_LIN)
*----------------------------------------------------------------------*
IF NOT org_crit_inst IS INITIAL.
CALL METHOD org_crit_inst->convert_oc_selections
EXPORTING
activity = act_level
IMPORTING
oc_vimsell = oc_rangetab.
PERFORM vim_merge_sellists USING oc_rangetab
namtab[]
x
CHANGING header[]
rangetab[]
rc.
IF rc = 2.
RAISE unknown_field_in_dba_sellist.
ENDIF.
READ TABLE header INDEX 1.
ENDIF.
*----------------------------------------------------------------------*
* Datenbereichsgrenzen setzen *
*----------------------------------------------------------------------*
IF header-subsetflag EQ x.
*----------------------------------------------------------------------*
* prüfen, ob für alle Subsetfelder Werte fehlen *
*----------------------------------------------------------------------*
PERFORM check_all_substfields TABLES rangetab
CHANGING all_substflds_initial.
ENDIF.
IF all_substflds_initial EQ x OR show_selection_popup EQ x.
*----------------------------------------------------------------------*
* Funktionsbaustein zur Eingabe der Datenbereichsgrenzen rufen *
*----------------------------------------------------------------------*
DO.
CALL FUNCTION 'TABLE_RANGE_INPUT'
EXPORTING
table = view_name
oc_inst = org_crit_inst
suppress_wa_popup = suppress_wa_popup
show_selection_popup = show_selection_popup
TABLES
x_header = header
x_namtab = namtab
sellist = rangetab
EXCEPTIONS
no_input = 2
cancelled_by_user = 12.
IF sy-subrc EQ 0 OR header-subsetflag NE x.
EXIT.
ENDIF.
CASE sy-subrc.
WHEN 2.
IF header-subsetflag NE space.
PERFORM check_all_substfields TABLES rangetab
CHANGING all_substflds_initial.
IF all_substflds_initial EQ space. EXIT. ENDIF.
ELSE.
EXIT.
ENDIF.
WHEN 12.
CALL FUNCTION 'POPUP_TO_CONFIRM' "IG 962203
EXPORTING
titlebar = text-024
diagnose_object = 'SV_DIALOG_TEXT_2'
text_question = text-026
display_cancel_button = space
IMPORTING
answer = answer.
IF answer EQ '1'.
MOVE 12 TO sy-subrc.
EXIT.
ENDIF.
ENDCASE.
MESSAGE s038.
ENDDO.
IF sy-subrc NE 12 AND header-selection NE x.
DESCRIBE TABLE rangetab LINES countx.
IF countx GT 0.
MOVE x TO header-selection.
MODIFY header INDEX 1.
ENDIF.
ENDIF.
ENDIF.
IF sy-subrc NE 12.
*----------------------------------------------------------------------*
* View sperren *
*----------------------------------------------------------------------*
IF ( i_action EQ u OR i_action EQ t ) AND header-existency NE r.
CALL FUNCTION 'VIEW_ENQUEUE'
EXPORTING
view_name = view_name
action = 'E'
enqueue_mode = 'E'
enqueue_range = header-subsetflag
TABLES
sellist = rangetab
EXCEPTIONS
foreign_lock = 1
system_failure = 2
table_not_found = 5
client_reference = 7.
*----------------------------------------------------------------------*
* ggf. Ausnahmen behandeln *
*----------------------------------------------------------------------*
CASE sy-subrc.
WHEN 1.
*SW: interne Meldung 0000293299 1995
* message i049 with sy-msgv1 raising foreign_lock.
* move: s to action.
*XB: Change to new function moduls POPUP_TO_DECIDE_LOCKED_DATA -Begin
* text = text-101.
* REPLACE '&' WITH sy-msgv1(12) INTO text.
* CALL FUNCTION 'POPUP_TO_CONFIRM_WITH_MESSAGE'
* EXPORTING
* titel = text-100
* diagnosetext1 = text
* diagnosetext2 = text-102
* textline1 = text-103
* defaultoption = 'Y'
* cancel_display = space
* IMPORTING
* answer = answer.
* IF answer = 'A' OR answer = 'N'.
* MESSAGE e049 WITH sy-msgv1 RAISING foreign_lock.
* ELSEIF answer = 'J'.
* MOVE: s TO action.
* ENDIF.
lockuser = sy-msgv1(12). "HCG sy-msgv1 lost at popup call
CALL FUNCTION 'POPUP_TO_DECIDE_LOCKED_DATA'
EXPORTING
i_user = sy-msgv1(12)
* I_START_COLUMN = 9
* I_START_ROW = 9
IMPORTING
e_answer = answer.
IF answer = '2'.
*IG: internal message 305882 2005
* MESSAGE e049 WITH lockuser RAISING foreign_lock.
MESSAGE s049 WITH lockuser RAISING foreign_lock.
EXIT.
ELSEIF answer = '1'.
MOVE: s TO action.
ENDIF.
WHEN 2.
MESSAGE e050 WITH view_name RAISING system_failure.
WHEN 5.
MESSAGE e028 WITH view_name RAISING view_not_found.
WHEN 7.
MESSAGE e054 WITH sy-mandt RAISING client_reference.
ENDCASE.
ENDIF.
*----------------------------------------------------------------------*
* ggf. Funktionen ausschließen *
*----------------------------------------------------------------------*
IF only_show_allowed NE space.
MOVE 'AEND' TO excl_cua_funct-function. APPEND excl_cua_funct.
ENDIF.
*----------------------------------------------------------------------*
* Funktionsbaustein für View-Pflege rufen *
*----------------------------------------------------------------------*
CALL FUNCTION 'VIEW_MAINTENANCE'
EXPORTING
view_name = view_name
view_action = action
corr_number = corr_number
rfc_destination_for_upgrade = rfc_destination_for_upgrade
client_for_upgrade = client_for_upgrade
complex_selconds_used = complex_selconds_used
no_warning_for_clientindep = no_warning_for_clientindep
oc_inst = org_crit_inst
TABLES
x_header = header
x_namtab = namtab
dba_sellist = rangetab
excl_cua_funct = excl_cua_funct
EXCEPTIONS
no_database_function = 2
no_editor_function = 3
missing_corr_number = 4.
*----------------------------------------------------------------------*
* ggf. Ausnahmen behandeln *
*----------------------------------------------------------------------*
CASE sy-subrc.
WHEN 2.
MESSAGE e022 RAISING no_database_function.
WHEN 3.
MESSAGE e023 RAISING no_editor_function.
ENDCASE.
ENDIF. "sy-subrc 12.
*----------------------------------------------------------------------*
* View entsperren
*----------------------------------------------------------------------*
IF ( i_action EQ u OR i_action EQ t ) AND header-existency NE r.
CALL FUNCTION 'VIEW_ENQUEUE'
EXPORTING
view_name = view_name
action = 'D'
enqueue_mode = 'E'
enqueue_range = header-subsetflag
TABLES
sellist = rangetab
EXCEPTIONS
foreign_lock = 1
system_failure = 2
table_not_found = 5
client_reference = 7.
*----------------------------------------------------------------------*
* ggf. Ausnahmen behandeln *
*----------------------------------------------------------------------*
CASE sy-subrc.
WHEN 1.
MESSAGE e049 WITH sy-msgv1 RAISING foreign_lock.
WHEN 2.
MESSAGE e050 WITH view_name RAISING system_failure.
WHEN 5.
MESSAGE e028 WITH view_name RAISING view_not_found.
WHEN 7.
MESSAGE e054 WITH sy-mandt RAISING client_reference.
ENDCASE.
ENDIF.
ENDFUNCTION.