在使用POPUP_GET_VALUES函数获取用户输入值时,当用户输入超过132个字符时,函数只能接收前132个字符的数据。不满足现有需求。
在POPUP_GET_VALUES函数基础上进行改造,为不影响原有函数功能,将POPUP_GET_VALUES函数拷贝一份出来修改,改造过程如下(有需要可以跟着一起改造):
目标:让VALUE字段由132长度扩充至255长度
步骤一:将POPUP_GET_VALUES函数复制创建到事先准备好的函数组ZFUNCGOP重命名为ZPOPUP_GET_VALUES_LONG_TEXT,如下:
对结构参数进行修改:SVAL->ZSVAL,SVALD->ZSVALD
对于两个结构只需将VALUE字段改为255即可,其余保持不变:
做完这些修改后,将POPUP_GET_VALUES函数的屏幕、状态栏、标题栏拷贝至ZPOPUP_GET_VALUES_LONG_TEXT函数组下,效果如下:
步骤二:先将声明的参数结构等代码添加到全局变量包含文件中,如图:
代码如下(可直接复制粘贴)
FUNCTION-POOL ZFUNCGOP MESSAGE-ID s4. "MESSAGE-ID ..
INCLUDE <icon>.
TABLES: zsvald, dd07l.
TYPE-POOLS: shlp. "B40K011463
DATA:
BEGIN OF svali OCCURS 50,
tabname LIKE dfies-tabname,
fieldname LIKE dfies-fieldname,
value LIKE zsval-value,
field_attr LIKE sval-field_attr,
field_obl LIKE sval-field_obl,
comp_code LIKE sval-comp_code,
comp_tab LIKE dfies-tabname,
comp_field LIKE dfies-fieldname,
position LIKE dfies-position,
offset LIKE dfies-position,
keyflag LIKE dfies-keyflag,
checktable LIKE dfies-checktable,
inttype LIKE dfies-inttype,
intlen LIKE dfies-intlen,
scrlen1 LIKE dfies-scrlen1,
scrlen2 LIKE dfies-scrlen2,
scrlen3 LIKE dfies-scrlen3,
datatype LIKE dfies-datatype,
leng LIKE dfies-leng,
outputlen LIKE dfies-outputlen,
lowercase LIKE dfies-lowercase,
convexit LIKE dfies-convexit,
scrtext_s LIKE dfies-scrtext_s,
scrtext_m LIKE dfies-scrtext_m,
scrtext_l LIKE dfies-scrtext_l,
domname LIKE dfies-domname,
valexi LIKE dfies-valexi,
sign LIKE dfies-sign, "mk
decimals LIKE dfies-decimals, "mk
novaluehlp LIKE sval-novaluehlp, "mk
reftable LIKE dfies-reftable, "B20K058473
reffield LIKE dfies-reffield, "B20K058473
f4availabl LIKE dfies-f4availabl, "B20K081005
END OF svali,
* Interne Tabelle mit Feldern, die nicht anzuzeigen sind
BEGIN OF sval_not OCCURS 50.
INCLUDE STRUCTURE svali.
DATA: END OF sval_not.
* Arbeitsbereich für die Tabelle svali "B20K058473
DATA: BEGIN OF wa_svali. "B20K058473
INCLUDE STRUCTURE svali. "B20K058473
DATA: END OF wa_svali. "B20K058473
* Fehlerleiste für Userexit beim Fb POPUP_GET_VALUES_DB_CHECKED
DATA: BEGIN OF error.
INCLUDE STRUCTURE svale.
DATA: END OF error,
* Felder mit Werten zur Prüfung gegen die DB oder eine ITAB
BEGIN OF check_values OCCURS 50,
tabname LIKE dfies-tabname,
fieldname LIKE dfies-fieldname,
value LIKE zsval-value,
comp_code LIKE sval-comp_code,
position LIKE dfies-position,
offset LIKE dfies-position,
keyflag LIKE dfies-keyflag,
intlen LIKE dfies-intlen,
leng LIKE dfies-leng, "+012i cpl
END OF check_values,
** Felder zum Lesen der DB-Tabellen "*050d+
* nr_check_values TYPE i,
* entries_found TYPE c,
* genkeyl TYPE i,
* genkey(120) TYPE c,
** Tabelle für die DB-Zeilen, Very Long
* BEGIN OF db_tab_vl OCCURS 0,
* lines(4096),
* END OF db_tab_vl,
* tab_very_long TYPE i VALUE 4096,
** Tabelle für die DB-Zeilen, Long
* BEGIN OF db_tab_l OCCURS 0,
* lines(500),
* END OF db_tab_l,
* tab_long TYPE i VALUE 500,
** Tabelle für die DB-Zeilen, Middle
* BEGIN OF db_tab_m OCCURS 0,
* lines(100),
* END OF db_tab_m,
* tab_middle TYPE i VALUE 100,
** Tabelle für die DB-Zeilen, Short
* BEGIN OF db_tab_s OCCURS 0,
* lines(50),
* END OF db_tab_s,
* tab_short TYPE i VALUE 50, "*050d-
* Felder für Dynprogröße und -steuerung zum Blättern, Cursorpostion etc.
start_row_100 TYPE p,
start_column_100 TYPE p,
end_row_100 TYPE p,
end_column_100 TYPE p,
* first_time_100 TYPE c, "*053d
* answer_100 TYPE c, "*053d
first_line_100 TYPE i, "*053d"*059i
index_100 TYPE i,
quan_entries_100 TYPE i,
gv_use_paging type xfeld, "*059i
* quan_loops_100 TYPE i, "*053d
nr_entries_to_show TYPE i,
max_field_length TYPE i,
cur_field(20) TYPE c VALUE ' ',
cur_line TYPE i VALUE 0,
cur_offset TYPE i VALUE 0,
error_tab LIKE sval-tabname,
error_field LIKE sval-fieldname,
* Felder der Schnittstelle, die global genutzt werden
* Schnittstelle darf wg. Rekursion nicht globalisiert werden
BEGIN OF ifields OCCURS 20.
INCLUDE STRUCTURE zsval.
DATA: END OF ifields,
int_check_existence TYPE c,
program_name LIKE trdir-name,
f1_program_name LIKE trdir-name,
f4_program_name LIKE trdir-name,
form_name(50) TYPE c,
f1_form_name(50) TYPE c,
f4_form_name(50) TYPE c,
text_title LIKE rseu1-tit_text,
* text_title like rs37c-text_line,
* ok_button_text like svalbutton-buttontext, "B20K062235
ok_button_text LIKE smp_dyntxt,
* icon_okay(20) type c value 'ICON_CHECKED', "B20K062235
* 1st_button like svalbutton-buttontext, "B20K062235
1st_button LIKE smp_dyntxt,
* 2nd_button like svalbutton-buttontext, "B20K062235
2nd_button LIKE smp_dyntxt,
g_no_check_for_fixed_values(1) TYPE c,
* Kennzeichen, dass Pruefung gegen Festwerte
* abgeschaltet werden soll
g_no_alpha_exit_for_type_n(1) TYPE c,
* Kennzeichen, dass der alpha_exit fuer
* numc-Felder abgeschaltetn werden soll
* Feld gibt an, welcher Fb aktiv ist
* 1 = NO_CHECK
* 2 = DB_CHECK
* 3 = ITAB_CHECK
* 4 = USER_CHECK
* 5 = USER_HELP
kind_of_popup TYPE c,
* OK-Code Felder
ok_code(4) TYPE c,
ok_code_save(4) TYPE c,
* Interne Tabelle mit den unterschiedlichen Tabellennamen, für
* die Werte erfragt werden sollen
BEGIN OF diff_tab OCCURS 10,
tabname LIKE dfies-tabname,
ref TYPE c,
length TYPE i,
END OF diff_tab,
* Tabellen für NAMETAB-Informationen
BEGIN OF fieldtab OCCURS 100.
INCLUDE STRUCTURE dfies.
DATA: END OF fieldtab,
BEGIN OF all_fields OCCURS 300.
INCLUDE STRUCTURE dfies.
DATA: END OF all_fields,
BEGIN OF key_all_fields,
tabname LIKE dfies-tabname,
fieldname LIKE dfies-fieldname,
END OF key_all_fields,
* Felder mit Steuerungsinformation für rekursive Aufrufe der Popups
BEGIN OF swap OCCURS 10,
time LIKE sy-uzeit,
END OF swap,
swap_counter TYPE i,
* lokale Hilfsfelder, die aus Performance global definiert sind
* h_i1 TYPE i, "*059d
h_date TYPE d,
h_date_c(8) TYPE c, "B20K052439
h_time TYPE t,
h_time_c(6) TYPE c, "B20K052439
h_formname(30) TYPE c,
h_keyword LIKE help_info-keyword,
h_value1 LIKE zsval-value,
h_value2 LIKE zsval-value,
h_flag TYPE c,
h_client_dep TYPE c,
h_cur_line TYPE i VALUE 0,
h_tabname LIKE dfies-tabname,
h_returncode TYPE c,
h_domvalue LIKE dd07l-domvalue_l,
h_value_found TYPE c,
h_no_value_check TYPE c,
h_show_popup TYPE c,
* Konstante Größen
* Der konstante Teil der Popupbreite bestimmt sich aus der Länge des
* Schlüsselworts = 20 + erster freier Spalte = 1 + eine freie Spalte
* zwischen Schlüsselwort und Wert = 1 + letzte freie Spalte incl. Kombo-
* kz. für F4-Hilfe = 2, macht insgesamt 24. Zur Berechnung der
* tatsächlichen Breite kommt noch die Länge des längsten Ausgabefeldes
* hinzu.
* const_popup_width type i value 24,
const_popup_width TYPE i VALUE 31, "Platz fuer Icons
* Max. Anzahl von Feldern in einem Popup, wenn mehr Felder anzuzeigen
* sind, muß geblättert werden
max_fields_in_loop TYPE i VALUE 10,
max_lines_for_scroll TYPE i VALUE 200, "*059i
* Max. Ausgabelänge eines Feldes
max_field_allowed TYPE i VALUE 255, "cpl von 79 auf 132
max_field_visible TYPE i VALUE 79, "cpl
* Typ des Funktionsbausteins
no_check TYPE c VALUE '1', "ohne Prüfung
db_check TYPE c VALUE '2', "mit Prüfung gegen DB
itab_check TYPE c VALUE '3', "mit Prüfung gegen ITAB
user_check TYPE c VALUE '4', "mit Userexit-Prüfung
user_help TYPE c VALUE '5', "mit Userexits und -help
user_buttons TYPE c VALUE '6', "mit Userexits,-help,-but.
* Anzeigeattribute für Wertfelder
norm_inp(02) TYPE c VALUE ' ', "Normal, eingabebereit
bright_inp(02) TYPE c VALUE '01', "Hell, eingabebereit
norm_noinp(02) TYPE c VALUE '02', "Normal, nicht eingabeber.
bright_noinp(02) TYPE c VALUE '03', "Hell, nicht eingabeber.
do_not_show(02) TYPE c VALUE '04', "nicht anzeigen
show_2_dim(02) TYPE c VALUE '05', "normal, nicht eingabeber.
"2-dimensional
* Vergleichsoperatoren
cond_eq(02) TYPE c VALUE 'EQ', "Vgl.Operation =
cond_ne(02) TYPE c VALUE 'NE', "Vgl.Operation <>
cond_nc(02) TYPE c VALUE 'NC', "Vgl.Operation nicht prüfen
cond_lt(02) TYPE c VALUE 'LT', "Vgl.Operation <
cond_le(02) TYPE c VALUE 'LE', "Vgl.Operation <=
cond_gt(02) TYPE c VALUE 'GT', "Vgl.Operation >
cond_ge(02) TYPE c VALUE 'GE', "Vgl.Operation >=
* Routinennamenkonstanen für Exits, XYZ wird zur Laufzeit durch den
* Konvertierungsexitnamen ersetzt
formconst_out(30) TYPE c VALUE 'CONVERSION_EXIT_XYZ_OUTPUT',
formconst_inp(30) TYPE c VALUE 'CONVERSION_EXIT_XYZ_INPUT',
* Synonyme
c_true TYPE xfeld VALUE 'X', "049i
yes TYPE c VALUE '1',
no TYPE c VALUE '0'.
* Hilfspointer
FIELD-SYMBOLS: <h1>, <h2>.
* mk begin ----------------------------------------------- "B20K043473
** Strukturen/Tabellen fuer Schnittstelle HELP_START "B20K014551
DATA: BEGIN OF help_infos. "B20K014551
INCLUDE STRUCTURE help_info. "B20K014551
DATA: END OF help_infos. "B20K014551
*DATA: BEGIN OF DYNPSELECT OCCURS 0. "B20K014551
* INCLUDE STRUCTURE DSELC. "B20K014551
*DATA: END OF DYNPSELECT. "B20K014551
*DATA: BEGIN OF DYNPVALUETAB OCCURS 0. "B20K014551
* INCLUDE STRUCTURE DVAL. "B20K014551
*DATA: END OF DYNPVALUETAB. "B20K014551
* mk end ------------------------------------------------- "B20K043473
* Parameter fuer DYNP_VALUES_UPDATE
DATA: dyname LIKE d020s-prog VALUE 'SAPLSPO4',
dynpro_no LIKE d020s-dnum,
BEGIN OF dynpfields OCCURS 1.
INCLUDE STRUCTURE dynpread.
DATA: END OF dynpfields.
DATA: h_index LIKE sy-tabix.
* Parameter fuer HELP_OBJECT_SHOW_FOR_FIELD "B20K043473
DATA: batch_input LIKE help_info-dynprofld "B20K043473
VALUE 'SVALD-VALUE', "B20K043473
BEGIN OF links OCCURS 0. "B20K043473
INCLUDE STRUCTURE tline. "B20K043473
DATA: END OF links. "B20K043473
DATA: h_title LIKE dsyst-doktitle. "B20K043473
DATA: update_flag(1) TYPE c. "B20K052439
* Eclude-Tabelle für Status dynp_3_4 "B20K062235
DATA: BEGIN OF exclude OCCURS 10, "B20K062235
func LIKE rsnewleng-fcode, "B20K062235
END OF exclude. "B20K062235
* Hilfsfelder, werden benötigt für F4-Hilfe nach Namensraumverlängerung
DATA: help_fieldname LIKE help_info-fieldname, "B20K069688
help_field_star TYPE c,
help_type_single TYPE c.
* INCLUDE LZFUNCGOPD... " Local class definition
步骤三:将函数里缺失的FORM以及MODULE按照以下代码补全即可(以下代码均可直接复制粘贴,无需修改任何代码,简单快捷)
首先是ZPOPUP_GET_VALUES_LONG_TEXT函数的源码(可直接复制粘贴)
FUNCTION ZPOPUP_GET_VALUES_LONG_TEXT.
*"----------------------------------------------------------------------
*"*"本地接口:
*" IMPORTING
*" VALUE(NO_VALUE_CHECK) DEFAULT SPACE
*" VALUE(POPUP_TITLE)
*" VALUE(START_COLUMN) DEFAULT '5'
*" VALUE(START_ROW) DEFAULT '5'
*" EXPORTING
*" VALUE(RETURNCODE)
*" TABLES
*" FIELDS STRUCTURE ZSVAL
*" EXCEPTIONS
*" ERROR_IN_FIELDS
*"----------------------------------------------------------------------
DATA: dummy TYPE c.
***Hilfe
h_no_value_check = no_value_check.
* prüfen, ob lok. Ged. gesichert werden muß und Sicherungsparameter
* versorgen.
PERFORM handle_save_data.
kind_of_popup = no_check.
* DDIC-Informationen lesen, Ausgabelänge des längsten Feldes für die
* spätere Bestimmung der Größe des Popups berechnenen, FIELDS über-
* prüfen und ggf. Ausnahme erzeugen.
PERFORM prepare_and_check TABLES fields.
nr_entries_to_show = quan_entries_100.
* Determine whether we use scroll bars or paging mode in "*059i
* case too many entries are on the popup. "*059i
PERFORM determine_paging_mode. "*059i
* Exclude Tabelle für Status füllen "B20K062235
PERFORM fill_exclude. "B20K062235
* Ok-Icon auf die Drucktaste bringen "B20K062235
CLEAR ok_button_text. "B20K062235
PERFORM append_icon_to_button USING icon_okay "B20K062235
dummy
text-100 "009u cpl
CHANGING ok_button_text. "B20K062235
* Koordinaten des Popups berechnen
PERFORM comp_coord USING start_column start_row.
text_title = popup_title.
index_100 = 1. "*053u
first_line_100 = 1. "*059i
PERFORM call_popup.
IF ok_code_save = 'CANC'.
returncode = 'A'.
ELSE.
* übergebene Tabelle mit Werten füllen
PERFORM fill_values TABLES fields.
returncode = space.
ENDIF.
* prüfen, ob lok. Ged. geholte werden muß und Sicherungsparameter
* versorgen.
PERFORM handle_restore_data.
CLEAR h_no_value_check.
ENDFUNCTION.
FORM handle_save_data.
* Die Routine prüft, ob das lokale Gedächtnis zu sichern ist und ruft
* die Sicherung ggf. auf. Außerdem werden die Steuerinformationen zur
* Sicherung versorgt.
*
* INPUT SWAP_COUNTER Anzahl bisheriger Aufrufe
* SWAP Tab. mit Ids der bisherigen Aufrufe
* INPUT SWAP_COUNTER Anzahl aktueller Aufrufe
* SWAP Tab. mit Ids der aktuellen Aufrufe
*
IF swap_counter > 0.
READ TABLE swap INDEX 1.
PERFORM save_global_date USING swap-time.
ENDIF.
swap_counter = swap_counter + 1.
swap-time = sy-uzeit.
INSERT swap INDEX 1.
ENDFORM. "HANDLE_SAVE_DATA
FORM save_global_date USING id.
* Die Routine sichert das aktuelle lokale Gedächtnis
*
* INPUT ID Id unter der das lok. Ged. gesichert
* werden soll.
EXPORT svali
sval_not
ifields
diff_tab
start_row_100
start_column_100
end_row_100
end_column_100
* first_time_100 "*053d
* answer_100 "*053d
first_line_100 "*053d"*059i
index_100
quan_entries_100
gv_use_paging "*059i
* quan_loops_100 "*053d
nr_entries_to_show
max_field_length
cur_field
cur_line
cur_offset
kind_of_popup
text_title
int_check_existence
program_name
f1_program_name
f4_program_name
form_name
f1_form_name
f4_form_name
ok_button_text
1st_button
2nd_button
ok_code_save
g_no_check_for_fixed_values "mk
g_no_alpha_exit_for_type_n "mk
exclude "2075263
TO MEMORY ID id.
program_name = space.
f1_program_name = space.
f4_program_name = space.
form_name = space.
f1_form_name = space.
f4_form_name = space.
ok_button_text = space.
1st_button = space.
2nd_button = space.
ENDFORM. "SAVE_GLOBAL_DATE
FORM prepare_and_check TABLES fields STRUCTURE zsval.
* Die Routine bestimmt zu den übergebenen Feldern die DDIC-Informationen
* und bestimmt die Ausgabelänge des längsten Feldes für die spätere
* Bestimmung der Größe des Popups.
* Außerdem werden die übergebenen Felder geprüft und bei Fehlern die
* Ausnahme ERROR_IN_FIELDS mit MESSAGE E... RAISING ... erzeugt.
* Die Prüfung kann aus Performancegründen nicht von der Übernahme der
* Schnittstellenfelder und dem Lesen der DDIC-Information getrennt
* werden.
*
* INPUT FIELDS Schnittstellenfelder
* OUTPUT SVALI Steploopzeilen und zus. Infos
* SVAL_NOT nicht anzuzeigende Felder
* DIFF_TAB unterschiedliche Tabellen in Fields
* QUAN_ENTRIES_100 Anz. Zeilen in SVALI
DATA:
tabname_old LIKE dfies-tabname,
h_intlen TYPE i,
h_offset TYPE i,
h_i TYPE i.
REFRESH diff_tab.
REFRESH svali.
tabname_old = space.
LOOP AT fields.
IF fields-tabname <> tabname_old.
tabname_old = fields-tabname.
READ TABLE diff_tab WITH KEY fields-tabname.
IF sy-subrc <> 0.
CLEAR diff_tab.
diff_tab-tabname = fields-tabname.
IF fields-comp_tab <> space AND
( fields-comp_code = space OR fields-comp_code = 'EQ' ).
diff_tab-ref = 'X'.
ENDIF.
APPEND diff_tab.
ENDIF.
ENDIF.
* prüfen, ob Feld mehrfach angegeben wurde
key_all_fields-tabname = fields-tabname.
key_all_fields-fieldname = fields-fieldname.
READ TABLE svali WITH KEY key_all_fields.
IF sy-subrc = 0.
MESSAGE e108 WITH fields-fieldname fields-tabname
RAISING error_in_fields.
ENDIF.
IF kind_of_popup = db_check OR
kind_of_popup = itab_check.
* prüfen, ob Vergleichsoperator zulässig.
IF fields-comp_code = space.
fields-comp_code = cond_eq.
ELSEIF fields-comp_code <> cond_eq AND
fields-comp_code <> cond_ne AND
fields-comp_code <> cond_nc AND
fields-comp_code <> cond_lt AND
fields-comp_code <> cond_le AND
fields-comp_code <> cond_gt AND
fields-comp_code <> cond_ge.
MESSAGE e109 WITH fields-comp_code fields-fieldname
fields-tabname
RAISING error_in_fields.
ENDIF.
* Wenn ein Referenzfeld angegeben wird, dann darf dieses Feld
* nicht angezeigt werden.
IF fields-comp_tab <> space AND fields-field_attr <> do_not_show.
MESSAGE e112 WITH fields-tabname fields-fieldname
RAISING error_in_fields.
ENDIF.
ENDIF.
CLEAR svali.
svali-tabname = fields-tabname.
svali-fieldname = fields-fieldname.
svali-value = fields-value.
IF fields-fieldtext <> space.
svali-scrtext_m = fields-fieldtext.
ENDIF.
svali-field_attr = fields-field_attr.
IF fields-field_obl <> space.
svali-field_obl = 'X'.
ELSE.
svali-field_obl = space.
ENDIF.
svali-comp_code = fields-comp_code.
svali-comp_tab = fields-comp_tab.
svali-comp_field = fields-comp_field.
svali-novaluehlp = fields-novaluehlp.
APPEND svali.
ENDLOOP.
LOOP AT diff_tab.
IF diff_tab-tabname(1) = '*'.
h_tabname = diff_tab-tabname+1.
ELSE.
h_tabname = diff_tab-tabname.
ENDIF.
READ TABLE all_fields WITH KEY h_tabname BINARY SEARCH.
IF sy-subrc NE 0.
* NAMETAB für Felder wurde noch nicht gelesen
DATA: l_tabname TYPE ddobjname.
MOVE h_tabname TO l_tabname.
CALL FUNCTION 'DDIF_FIELDINFO_GET'
EXPORTING
tabname = l_tabname
* FIELDNAME = ' '
* LANGU = SY-LANGU
* LFIELDNAME = ' '
* ALL_TYPES = ' '
* IMPORTING
* X030L_WA =
* DDOBJTYPE =
* DFIES_WA =
* LINES_DESCR =
TABLES
dfies_tab = fieldtab
* FIXED_VALUES =
EXCEPTIONS
not_found = 1
internal_error = 2
OTHERS = 3.
IF sy-subrc = 0.
* 012+ cpl
* offset must be specified in characters but dfies returns bytes
* causes problems in UNICODE environment
h_offset = 0.
SORT fieldtab BY position.
LOOP AT fieldtab.
fieldtab-offset = h_offset.
ADD fieldtab-leng TO h_offset.
MODIFY fieldtab.
ENDLOOP.
* 012- cpl
h_offset = 0.
LOOP AT fieldtab.
all_fields = fieldtab.
APPEND all_fields.
IF kind_of_popup = db_check.
IF h_offset < fieldtab-offset.
h_offset = fieldtab-offset.
h_intlen = fieldtab-intlen.
ENDIF.
ENDIF.
ENDLOOP.
IF kind_of_popup = db_check.
diff_tab-length = h_offset + h_intlen + 8.
MODIFY diff_tab.
ENDIF.
ELSE.
EXIT.
ENDIF.
ELSE.
IF kind_of_popup = db_check.
h_offset = 0.
LOOP AT all_fields WHERE tabname = h_tabname.
IF h_offset < all_fields-offset.
h_offset = all_fields-offset.
h_intlen = all_fields-intlen.
ENDIF.
ENDLOOP.
diff_tab-length = h_offset + h_intlen + 8.
MODIFY diff_tab.
ENDIF.
ENDIF.
ENDLOOP.
CASE sy-subrc.
WHEN 6.
MESSAGE e100 WITH diff_tab-tabname RAISING error_in_fields.
WHEN 8.
MESSAGE e102 WITH diff_tab-tabname RAISING error_in_fields.
WHEN 9.
MESSAGE e103 WITH diff_tab-tabname RAISING error_in_fields.
ENDCASE.
SORT all_fields BY tabname fieldname.
max_field_length = 0.
REFRESH sval_not.
LOOP AT svali.
* SVALI-Zeilen vervollständigen
IF svali-tabname(1) = '*'.
h_tabname = svali-tabname+1.
ELSE.
h_tabname = svali-tabname.
ENDIF.
key_all_fields-tabname = h_tabname.
key_all_fields-fieldname = svali-fieldname.
READ TABLE all_fields WITH KEY key_all_fields BINARY SEARCH.
IF sy-subrc NE 0.
* Feld gehört nicht zur Tabelle
MESSAGE e104 WITH svali-fieldname svali-tabname
RAISING error_in_fields.
ENDIF.
* if all_fields-inttype cn 'CNTD'. "mk
* Typ F ist zwar im Prinzip unterstützt, wird aber abgeklemmt,
* weil nur 15 Nachkommastellen unterstützt werden,
* der ABAP aber inzwischen bis zu 17 Stellen unterstützt
* (je nach Bedarf...)
IF all_fields-inttype CN 'CNTDIXPbs8'
OR all_fields-datatype = 'RAW'.
* ungültiger Typ
MESSAGE e105 WITH all_fields-inttype
svali-fieldname svali-tabname
RAISING error_in_fields.
ENDIF.
IF all_fields-outputlen > max_field_allowed AND
svali-field_attr <> do_not_show.
* Ausgabelänge ist größer als vorgesehen
*016d+
* message e106 with svali-fieldname svali-tabname max_field_allowed
* raising error_in_fields.
*016d-
*016i+
svali-outputlen = max_field_allowed.
ELSE.
svali-outputlen = all_fields-outputlen.
*016i-
ENDIF.
* Länge des längsten anzuzeigenden Feldes bestimmen
IF max_field_length < all_fields-outputlen AND
svali-field_attr <> do_not_show.
max_field_length = all_fields-outputlen.
ENDIF.
svali-position = all_fields-position.
svali-offset = all_fields-offset.
svali-keyflag = all_fields-keyflag.
svali-checktable = all_fields-checktable.
svali-inttype = all_fields-inttype.
* Unter UNICODE enthält 'intlen' die Länge in bytes
* benötigt wird aber (z.B. für Konvertierungsexit) die interne Länge *
* in Zeichen
* if all_fields-datatype = 'CHAR'. "*012d
*012i+
svali-leng = all_fields-leng.
*012i-
svali-intlen = all_fields-intlen.
svali-scrlen1 = all_fields-scrlen1.
svali-scrlen2 = all_fields-scrlen2.
svali-scrlen3 = all_fields-scrlen3.
svali-datatype = all_fields-datatype.
svali-leng = all_fields-leng.
* svali-outputlen = all_fields-outputlen. "*016d
svali-lowercase = all_fields-lowercase.
svali-convexit = all_fields-convexit.
svali-scrtext_s = all_fields-scrtext_s.
svali-domname = all_fields-domname.
svali-valexi = all_fields-valexi.
svali-sign = all_fields-sign. "mk
svali-decimals = all_fields-decimals. "mk
svali-reftable = all_fields-reftable. "B20K058473
svali-reffield = all_fields-reffield. "B20K058473
svali-f4availabl = all_fields-f4availabl. "B20K081005
IF svali-scrtext_m = space.
IF all_fields-scrtext_m <> space.
svali-scrtext_m = all_fields-scrtext_m.
ELSEIF all_fields-scrtext_s <> space.
svali-scrtext_m = all_fields-scrtext_s.
ELSEIF all_fields-scrtext_l <> space.
svali-scrtext_m = all_fields-scrtext_l.
ELSE.
svali-scrtext_m = all_fields-fieldname.
ENDIF.
ENDIF.
svali-scrtext_l = all_fields-scrtext_l.
* ggf. SVAL_NOT ergänzen und Feld aus SVALI entfernen
IF svali-field_attr = do_not_show.
CLEAR sval_not.
sval_not = svali.
APPEND sval_not.
DELETE svali.
ELSE.
MODIFY svali.
ENDIF.
ENDLOOP.
* Prüfen, ob Eingabefeld größer als sichtbare Schablone ist
IF max_field_length > max_field_visible. "cpl
max_field_length = max_field_visible. "cpl
ENDIF. "cpl
* prüfen, ob die Vergleichsfelder angegeben wurden
LOOP AT sval_not WHERE comp_tab <> space.
key_all_fields-tabname = sval_not-comp_tab.
key_all_fields-fieldname = sval_not-comp_field.
READ TABLE svali WITH KEY key_all_fields.
IF sy-subrc <> 0.
MESSAGE e113 WITH sval_not-comp_tab sval_not-comp_field
fields-tabname fields-fieldname
RAISING error_in_fields.
ENDIF.
ENDLOOP.
DESCRIBE TABLE svali LINES quan_entries_100.
IF quan_entries_100 = 0.
* keine Felder zum anzeigen vorhanden
MESSAGE e107 RAISING error_in_fields.
ENDIF.
ENDFORM. "prepare_and_check
FORM determine_paging_mode. "*059i+
IF quan_entries_100 > max_lines_for_scroll
* In case we have too many lines for the scrollbars
* to handle we need to switch to the old paging mode.
OR NOT sy-binpt IS INITIAL.
* In the batch-input scenario we always want the old
* behaviour.
gv_use_paging = c_true.
ELSE.
CLEAR gv_use_paging.
ENDIF.
ENDFORM. "determine_paging_mode "*059i-
FORM fill_exclude.
CLEAR exclude.
REFRESH exclude.
IF NOT kind_of_popup EQ user_buttons.
exclude = 'COD1'.
APPEND exclude.
exclude = 'COD2'.
APPEND exclude.
ELSE.
IF 1st_button = space.
exclude = 'COD1'.
APPEND exclude.
ENDIF.
IF 2nd_button = space.
exclude = 'COD2'.
APPEND exclude.
ENDIF.
ENDIF.
IF gv_use_paging IS INITIAL "*059u
OR quan_entries_100 <= max_fields_in_loop. "*059u
* ELSE. "*054i"*059d
exclude = 'P--'.
APPEND exclude.
exclude = 'P-'.
APPEND exclude.
exclude = 'P+'.
APPEND exclude.
exclude = 'P++'.
APPEND exclude.
ENDIF. "*053d"*054i
ENDFORM. " FILL_EXCLUDE
FORM append_icon_to_button USING p_button_icon
p_button_text
p_button_quickinfo
CHANGING p_button STRUCTURE smp_dyntxt.
CLEAR p_button.
IF p_button_icon IS INITIAL.
MOVE p_button_text TO p_button-text.
IF NOT p_button_quickinfo IS INITIAL.
MOVE p_button_quickinfo TO p_button-quickinfo.
ENDIF.
ELSE.
MOVE p_button_icon TO p_button-icon_id.
MOVE p_button_text TO p_button-icon_text.
IF NOT p_button_quickinfo IS INITIAL.
MOVE p_button_quickinfo TO p_button-text.
ENDIF.
ENDIF.
ENDFORM. " APPEND_ICON_TO_BUTTON
FORM comp_coord USING start_column start_row.
* Die Routine berechnet die Koordinaten des Popups.
*
* INPUT START_COLUMN Startspalte
* START_ROW Startzeile
* OUTPUT START_COLUMN_100 Startspalte
* START_ROW_100 Startzeile
* END_COLUMN_100 Endspalte
* END_ROW_100 Endzeile
IF 1st_button = space AND 2nd_button = space.
IF max_field_length < 3.
max_field_length = 3.
ENDIF.
ELSEIF 1st_button <> space AND 2nd_button = space.
IF max_field_length < 13.
max_field_length = 13.
ENDIF.
ELSEIF 1st_button <> space AND 2nd_button <> space.
IF max_field_length < 28.
max_field_length = 28.
ENDIF.
ENDIF.
start_row_100 = start_row.
start_column_100 = start_column.
end_column_100 = start_column_100
+ max_field_length
+ const_popup_width.
IF quan_entries_100 > max_fields_in_loop.
end_row_100 = start_row_100
* + 2
* + 1 "B20K062235
+ max_fields_in_loop. "letzte Zeile = Leerzeile
ELSE.
end_row_100 = start_row_100
+ quan_entries_100
* + 1. "B20K062235
* + 2. "letzte Zeile = Leerzeile
.
ENDIF.
ENDFORM. "COMP_COORD
FORM call_popup.
cur_field = space.
IF quan_entries_100 <= max_fields_in_loop. "*053u+"*054u+
* In Batch-Input the old screen 300 still has to be called.
* ohne Blättermodus
CALL SCREEN 300 STARTING AT start_column_100 start_row_100
ENDING AT end_column_100 end_row_100.
ELSE.
* mit Blättermodus
CALL SCREEN 400 STARTING AT start_column_100 start_row_100
ENDING AT end_column_100 end_row_100.
ENDIF. "*053u-"*054u-
EXIT.
ENDFORM. "CALL_POPUP
FORM fill_values TABLES fields STRUCTURE zsval.
* Die Routine übernimmt die Werte aus der internen Tabelle SVALI und
* übergibt diese an die Tabelle FIELDS.
*
* INPUT SVALI Steploopzeilen mit angegebenen Werten
* OUTPUT FIELDS Schnittstellenfelder
DATA: BEGIN OF key_svali,
tabname LIKE dfies-tabname,
fieldname LIKE dfies-fieldname,
END OF key_svali.
LOOP AT fields.
IF fields-field_attr = do_not_show AND
fields-comp_tab <> space.
key_svali-tabname = fields-comp_tab.
key_svali-fieldname = fields-comp_field.
ELSE.
key_svali-tabname = fields-tabname.
key_svali-fieldname = fields-fieldname.
ENDIF.
READ TABLE svali WITH KEY key_svali.
IF sy-subrc = 0.
IF fields-value <> svali-value.
fields-value = svali-value.
MODIFY fields.
ENDIF.
ENDIF.
ENDLOOP.
ENDFORM. "FILL_VALUES
FORM handle_restore_data.
* Die Routine bereinigt die Steuerinformationen zur Sicherung des
* lokalen Gedächtnis und ruft ggf. die Restore-Routine auf.
*
* INPUT SWAP_COUNTER Anzahl aktueller Aufrufe
* SWAP Tab. mit Ids der aktuellen Aufrufe
* INPUT SWAP_COUNTER Anzahl Aufrufe ohne den aktuellen
* SWAP Tab. mit Ids der Aufrufe ohne den
* aktuellen
DELETE swap INDEX 1.
IF swap_counter > 1.
READ TABLE swap INDEX 1.
PERFORM restore_global_date USING swap-time.
ENDIF.
swap_counter = swap_counter - 1.
ENDFORM. "HANDLE_RESTORE_DATA
FORM restore_global_date USING id.
* Die Routine holt das letzte lokale Gedächtnis zurück.
*
* INPUT ID Id unter der das lok. Ged. gesichert
* wurde
* OUTPUT lokales Gedächtnis
IMPORT svali
sval_not
ifields
diff_tab
start_row_100
start_column_100
end_row_100
end_column_100
* first_time_100 "*053d
* answer_100 "*053d
first_line_100 "*053d"*059i
index_100
quan_entries_100
gv_use_paging "*059i
* quan_loops_100 "*053d
nr_entries_to_show
max_field_length
cur_field
cur_line
cur_offset
kind_of_popup
text_title
int_check_existence
program_name
f1_program_name
f4_program_name
form_name
f1_form_name
f4_form_name
ok_button_text
1st_button
2nd_button
ok_code_save
g_no_check_for_fixed_values "mk
g_no_alpha_exit_for_type_n "mk
exclude "2075263
FROM MEMORY ID id.
ENDFORM. "RESTORE_GLOBAL_DATE
接下来是补全屏幕0300和屏幕0400的代码:
先是MODULE(此处我将屏幕用到的所有MODULE放在一个包含文件下了,我不在乎结构,只在乎函数实现的功能,有需要的可以按照规定分类存放。)
*----------------------------------------------------------------------*
***INCLUDE LZFUNCGOPO01.
*----------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*& Module P300_INIT OUTPUT
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
MODULE P300_INIT OUTPUT.
PERFORM p300_init.
ENDMODULE.
MODULE p100_show OUTPUT.
PERFORM p100_show.
ENDMODULE. "P100_SHOW OUTPUT
MODULE p100_set_cursor OUTPUT.
IF cur_field <> space.
SET CURSOR FIELD cur_field
LINE cur_line
OFFSET cur_offset.
ENDIF.
cur_field = space.
cur_line = 0.
cur_offset = 0.
error_tab = space.
error_field = space.
ENDMODULE. "P100_SET_CURSOR OUTPUT
MODULE p100_leave.
PERFORM p100_leave. "*053u
ENDMODULE. "P100_LEAVE
MODULE clear_update_flag. "B20K052439
CLEAR update_flag. "B20K052439
ENDMODULE. "B20K052439
MODULE p100_get.
PERFORM p100_get.
update_flag = 'X'. "B20K052439
ENDMODULE. "P100_GET
MODULE p100_get_new. "B20K052439
IF update_flag = space. "B20K052439
IF h_no_value_check = space. "B20K052439
PERFORM p100_get. "B20K052439
ENDIF. "B20K052439
ENDIF. "B20K052439
ENDMODULE. "B20K052439
MODULE p100_code.
PERFORM p100_code. "*049i
ENDMODULE. "P100_CODE"*049i
MODULE p100_value.
PERFORM p100_value. "*059u
ENDMODULE. "p100_value
MODULE p100_help.
PERFORM p100_help. "*059u
ENDMODULE. "P100_HELP
MODULE d400_list_param OUTPUT. "*059i-
PERFORM d400_list_param.
ENDMODULE. "d400_list_param OUTPUT "*059i+
*&--------------------------------------------------------------------*
*& Form d400_list_param
*&--------------------------------------------------------------------*
* text
*---------------------------------------------------------------------*
FORM d400_list_param. "*059i+
index_100 = first_line_100.
ENDFORM. "d400_list_param "*059i-
可以看到上面的MODULE缺了很多FORM,在此处我也把这些FORM补全在一个包含文件下了,目的同上
*----------------------------------------------------------------------*
***INCLUDE LZFUNCGOPF01.
*----------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*& Form p300_init
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM P300_INIT .
SET TITLEBAR '100' WITH TEXT_TITLE.
SET PF-STATUS 'DYNP_3_4' EXCLUDING EXCLUDE.
ENDFORM.
FORM p100_show.
DATA: f TYPE f.
DATA: p(16) TYPE p.
FIELD-SYMBOLS <p>.
* READ TABLE svali INDEX index_100. "*053u
* IF sy-subrc = 0. "*053d
IF NOT gv_use_paging IS INITIAL. "*059i+
IF sy-stepl > max_fields_in_loop.
EXIT FROM STEP-LOOP.
ENDIF.
ENDIF. "*059i-
zsvald-keytext = svali-scrtext_m.
CLEAR zsvald-value.
IF svali-convexit <> space.
* Konvertierungsexit zieht immer
h_formname = formconst_out.
REPLACE 'XYZ' WITH svali-convexit INTO h_formname.
CONDENSE h_formname NO-GAPS.
* falls der Name des Exits nicht 5-stellig ist
CASE svali-inttype. "B20K8A0A60
WHEN 'P'. "B20K8A0A60
ASSIGN p TO <h1> TYPE 'P' DECIMALS svali-decimals. "B20K8A0A60
<h1> = svali-value. "B20K8A0A60
WHEN OTHERS. "B20K8A0A60
* 012+ cpl
* assign svali-value(svali-intlen) to <h1>.
DATA len type i. "*067i+
DESCRIBE FIELD svali-value LENGTH len IN CHARACTER MODE.
IF svali-leng > len.
svali-leng = len.
ENDIF. "*067i-
ASSIGN svali-value(svali-leng) TO <h1>.
* 012- cpl
ENDCASE. "B20K8A0A60
ASSIGN zsvald-value(svali-outputlen) TO <h2>.
CALL FUNCTION h_formname
EXPORTING
input = <h1>
IMPORTING
output = <h2>.
ELSEIF svali-value <> space. "*028d"*035i
* ELSE. "*028i"*035d
CASE svali-inttype. "#EC CI_UTCL_OK
WHEN 'D'.
CASE h_no_value_check. "B20K052439
WHEN 'X'. "B20K052439
h_date_c = svali-value. "B20K052439
WRITE h_date_c TO zsvald-value. "B20K052439
WHEN OTHERS. "B20K052439
h_date = svali-value.
WRITE h_date TO zsvald-value DD/MM/YYYY.
ENDCASE. "B20K052439
WHEN 'T'.
CASE h_no_value_check. "B20K052439
WHEN 'X'. "B20K052439
h_time_c = svali-value. "B20K052439
WRITE h_time_c TO zsvald-value. "B20K052439
WHEN OTHERS. "B20K052439
WRITE svali-value TO zsvald-value USING EDIT MASK '__:__:__'.
ENDCASE. "B20K052439
WHEN 'F'.
f = svali-value.
WRITE f TO zsvald-value(svali-outputlen) DECIMALS 15.
WHEN 'P'.
* cpl. Korrekte Anzahl von Nachkommastellen für
* Währungs- und Mengenfelder
* Korrektur "B20K058473
ASSIGN p TO <p> TYPE 'P' DECIMALS svali-decimals.
<p> = svali-value.
CASE svali-datatype.
WHEN 'CURR'.
CLEAR wa_svali.
READ TABLE svali WITH KEY
tabname = svali-reftable
fieldname = svali-reffield
INTO wa_svali.
IF sy-subrc = 0.
WRITE <p> TO zsvald-value(svali-outputlen)
CURRENCY wa_svali-value.
*017d+
* Mittlerweile ist bei Währungen eine Rückkonvertierung möglich.
** Wenn Währungskonvertierung, dann nicht eingabebereit!
** Währungskonvertierung rückwärts nicht möglich!
** Funktionsbausteine und Tabellen im Basissystem nicht vorhanden!
* svali-field_attr = norm_noinp. "B20K064644
*017d-
* modify svali index index_100. "B20K064644 "*001d
ELSE.
CLEAR wa_svali.
READ TABLE sval_not WITH KEY
tabname = svali-reftable
fieldname = svali-reffield
INTO wa_svali.
IF sy-subrc = 0.
WRITE <p> TO zsvald-value(svali-outputlen)
CURRENCY wa_svali-value.
* svali-field_attr = norm_noinp. "B20K064644"*017d
* modify svali index index_100. "B20K064644"*001d
ELSE.
svali-field_attr = norm_noinp. "*017i
MODIFY svali INDEX index_100. "*028i"*053u
WRITE <p> TO zsvald-value(svali-outputlen).
ENDIF.
ENDIF.
WHEN 'QUAN'.
CLEAR wa_svali.
READ TABLE svali WITH KEY
tabname = svali-reftable
fieldname = svali-reffield
INTO wa_svali.
IF sy-subrc = 0.
WRITE <p> TO zsvald-value(svali-outputlen)
UNIT wa_svali-value.
ELSE.
CLEAR wa_svali.
READ TABLE sval_not WITH KEY
tabname = svali-reftable
fieldname = svali-reffield
INTO wa_svali.
IF sy-subrc = 0.
WRITE <p> TO zsvald-value(svali-outputlen)
UNIT wa_svali-value.
ELSE.
WRITE <p> TO zsvald-value(svali-outputlen).
ENDIF.
ENDIF.
* Einschub Ende
WHEN OTHERS. "B20K058473
* assign p to <p> type 'P' decimals svali-decimals.
* <p> = svali-value.
WRITE <p> TO zsvald-value(svali-outputlen).
ENDCASE. "B20K058473
WHEN OTHERS.
zsvald-value = svali-value.
IF svali-inttype CA 'XIbs8'. "Integer
CONDENSE zsvald-value.
ENDIF.
ENDCASE.
ELSEIF svali-inttype = 'P' "*035i
AND svali-datatype = 'CURR'. "*035i
* Wenn zu einem (auch leeren) Währungsfeld kein "*035i
* Währungsschlüssel angegeben wird, darf dieses "*035i
* Feld nicht eingabebereit sein, da dann keine "*035i
* Rückkonvertierung möglich ist. "*035i
READ TABLE svali WITH KEY "*035i
tabname = svali-reftable "*035i
fieldname = svali-reffield "*035i
TRANSPORTING NO FIELDS. "*035i
IF sy-subrc <> 0. "*035i
READ TABLE sval_not WITH KEY "*035i
tabname = svali-reftable "*035i
fieldname = svali-reffield "*035i
TRANSPORTING NO FIELDS. "*035i
IF sy-subrc <> 0. "*035i
svali-field_attr = norm_noinp. "*035i
MODIFY svali INDEX index_100. "*035i"*053u
ENDIF. "*035i
ENDIF. "*035i
ENDIF.
* Mußfelder berücksichtigen
IF svali-field_obl = 'X' AND zsvald-value = space.
zsvald-value(1) = '?'.
ENDIF.
* Cursorposition bestimmen
IF error_tab = svali-tabname AND cur_line = 0 AND
( error_field = svali-fieldname OR error_field = space ).
IF ( svali-field_attr <> norm_noinp AND
svali-field_attr <> bright_noinp AND
svali-field_attr <> show_2_dim ) OR error_field <> space.
cur_field = 'ZSVALD-VALUE'.
cur_line = sy-stepl.
error_tab = space.
error_field = space.
ENDIF.
ENDIF.
* index_100 = index_100 + 1. "*053d
* ELSE. "*053d
* EXIT FROM STEP-LOOP. "*053d
* ENDIF. "*053d
LOOP AT SCREEN.
CASE screen-name.
WHEN 'ZSVALD-VALUE'.
IF h_no_value_check = 'X' "B20K052439
AND svali-inttype = 'D'. "B20K052439
screen-length = 8. "B20K052439
screen-value_help = no. "B20K052439
ELSEIF h_no_value_check = 'X' "B20K052439
AND svali-inttype = 'T'. "B20K052439
screen-length = 6. "B20K052439
screen-value_help = no. "B20K052439
ELSE. "B20K052439
screen-length = svali-outputlen.
ENDIF. "B20K052439
CASE svali-field_attr.
WHEN norm_inp.
WHEN bright_inp.
screen-intensified = yes.
WHEN norm_noinp.
screen-input = no.
WHEN bright_noinp.
screen-intensified = yes.
screen-input = no.
WHEN show_2_dim.
screen-input = no.
screen-display_3d = no.
screen-value_help = no.
ENDCASE.
IF svali-field_obl = 'X'.
screen-required = yes.
ENDIF.
IF svali-novaluehlp = 'X'.
screen-value_help = no.
ELSEIF svali-f4availabl IS INITIAL. "B20K081005
IF ( kind_of_popup = user_help "B20K081005
AND f4_program_name <> space ) "B20K081005
OR ( kind_of_popup = user_buttons "B20K081005
AND f4_program_name <> space ). "B20K081005
ELSE. "B20K081005
screen-value_help = no. "B20K081005
ENDIF.
ENDIF.
WHEN 'SVALD-KEYTEXT'.
IF svali-field_attr = bright_inp OR
svali-field_attr = bright_noinp.
screen-intensified = yes.
ENDIF.
ENDCASE.
MODIFY SCREEN.
ENDLOOP.
ENDFORM. "p100_show
FORM p100_leave. "*053i+
IF ok_code = 'CANC'.
ok_code_save = ok_code.
CLEAR ok_code.
SET SCREEN 0.
LEAVE SCREEN.
ENDIF.
ENDFORM. "p100_leave "*053i-
FORM p100_get.
* kein Blättermodus
* index_100 = first_line_100 + sy-stepl - 1. "*053d
READ TABLE svali INDEX index_100.
IF sy-subrc = 0.
*017d+
** B20K064644
** Extraschleife für das Einlesen von Währungsfeldern.
** Wenn Währungsfeld und nicht eingabebereit, dann keine Konvertierung
** der Ausgabe, sondern alten Wert vor Ausgabe nehmen.
*
* IF svali-datatype = 'CURR'.
* Wenn ein Feld nicht eingabebereit ist, können wir den "*028i
* alten Stand lassen wie er ist. "*028i
IF svali-field_attr = norm_noinp. "*028i
EXIT. "*028i
ENDIF. "*028i
* ENDIF.
** Ende der Schleife
** B20K064644
*017d-
* Coding steht jetzt im folgenden Unterprogramm 006 012 017 "*043d
PERFORM convert_and_update_svali "*043i
USING zsvald-value. "*043i
* ----- Festwerte pruefen -------------------------
IF svali-valexi <> space AND svali-value <> space
AND g_no_check_for_fixed_values = space
AND h_no_value_check = space. "B20K068565
* Feld hat Festwerte, die überprüft werden müssen
h_value_found = no.
condense svali-value. "1052607
h_domvalue = svali-value.
SELECT * FROM dd07l WHERE domname = svali-domname
AND as4local = 'A'.
IF dd07l-domvalue_h = space.
IF h_domvalue = dd07l-domvalue_l.
h_value_found = yes.
EXIT.
ENDIF.
ELSE.
data lv_num type n length 10. "1408734 >>
if h_domvalue co '0123456789 ' and
dd07l-domvalue_l co '0123456789 ' and
dd07l-domvalue_h co '0123456789 '.
h_domvalue = lv_num = h_domvalue.
dd07l-domvalue_l = lv_num = dd07l-domvalue_l.
dd07l-domvalue_h = lv_num = dd07l-domvalue_h.
endif. "1408734 <<
IF h_domvalue >= dd07l-domvalue_l AND
h_domvalue <= dd07l-domvalue_h.
h_value_found = yes.
EXIT.
ENDIF.
ENDIF.
ENDSELECT.
IF h_value_found = no.
* Bitte einen gültigen Wert angeben
MESSAGE e124.
ENDIF.
ENDIF.
MODIFY svali INDEX index_100.
ENDIF.
ENDFORM. "p100_get
FORM convert_and_update_svali "*043i+
USING value(iv_value).
IF iv_value <> space.
IF g_no_alpha_exit_for_type_n IS INITIAL
OR svali-inttype <> 'N'.
* IF h_no_value_check EQ space. "*017d
IF h_no_value_check = space "*017i
OR svali-datatype = 'CURR' "*017i
OR svali-datatype = 'CUKY'. "*017i
* Währungsbeträge und Währungsschlüssel müssen immer "*017i
* rückkonvertiert werden. "*017i
* Ist veraltet "*006d+ CPL
* perform conversion_input using svald-value
* svali-inttype
* svali-datatype
* svali-decimals
* svali-convexit
* svali-sign
* svali-outputlen
* svali-intlen
* svali-lowercase
* changing svali-value."*006d- CPL
PERFORM conversion_input_new "*006i CPL
USING iv_value. "*006i CPL
ELSEIF svali-convexit <> space.
* keine Prüfung, aber Konvertierungsexit
CLEAR svali-value.
h_formname = formconst_inp.
REPLACE 'XYZ' WITH svali-convexit INTO h_formname.
CONDENSE h_formname NO-GAPS.
* falls der Name des Exits nicht 5-stellig ist
ASSIGN iv_value(svali-outputlen) TO <h1>.
* assign svali-value(svali-intlen) to <h2>. "*012d CPL
* ASSIGN iv_value(svali-leng) TO <h2>. "*012i CPL"*044d
* dynpro technik erlaubt nur eine Feldlänge von 132 Zeichen
* Zeichenkette wird abgeschnitten und an Konvertierungsexit übergeben
IF svali-leng > 132. "1048525 >>
ASSIGN svali-value(132) TO <h2>.
ELSE.
ASSIGN svali-value(svali-leng) TO <h2>. "*044i
ENDIF. "1048525 <<
CALL FUNCTION h_formname
EXPORTING
input = <h1>
IMPORTING
output = <h2>.
ELSE. " svali-convexit <> space.
svali-value = iv_value.
ENDIF. "h_no_value_check eq space.
ELSE. "g_no_alpha_exit_for_type_n = space.
IF iv_value CN' 0123456789'.
MESSAGE e123.
ELSE.
svali-value = iv_value.
ENDIF.
ENDIF. "g_no_alpha_exit_for_type_n = space.
ELSE. "iv_value <> space.
CLEAR svali-value.
ENDIF. "iv_value <> space.
ENDFORM. " convert_and_update_svali "*043i-
FORM conversion_input_new USING value_extern LIKE zsvald-value.
FIELD-SYMBOLS: <f1> TYPE ANY,
<clow> TYPE c.
DATA: table_field TYPE tabfield,
fieldname(255) TYPE c,
data_ref TYPE REF TO data.
DATA: lv_cuky TYPE zspo_value, "*017i
lv_tcurx TYPE tcurx. "*017i
CONCATENATE svali-tabname
svali-fieldname
INTO fieldname SEPARATED BY '-'.
SHIFT fieldname LEFT DELETING LEADING '*'.
CREATE DATA data_ref TYPE (fieldname).
ASSIGN data_ref->* TO <f1>.
ASSIGN value_extern(svali-outputlen) TO <clow>.
table_field-tabname = svali-tabname.
table_field-fieldname = svali-fieldname.
table_field-lfieldname = svali-fieldname.
SHIFT table_field-tabname LEFT DELETING LEADING '*'.
*017i+
* Für Währungsfelder muß noch die Währung ermittelt werden.
CLEAR wa_svali.
IF svali-datatype = 'CURR'.
READ TABLE svali WITH KEY
tabname = svali-reftable
fieldname = svali-reffield
INTO wa_svali.
IF sy-subrc <> 0.
READ TABLE sval_not WITH KEY
tabname = svali-reftable
fieldname = svali-reffield
INTO wa_svali.
IF sy-subrc <> 0.
CLEAR wa_svali.
ENDIF.
ENDIF.
ENDIF.
*017i-
CALL FUNCTION 'RS_CONV_EX_2_IN'
EXPORTING
input_external = <clow>
table_field = table_field
currency = wa_svali-value "*017i
IMPORTING
output_internal = <f1>
EXCEPTIONS
input_not_numerical = 1
too_many_decimals = 2
more_than_one_sign = 3
ill_thousand_separator_dist = 4
too_many_digits = 5
sign_for_unsigned = 6
too_large = 7
too_small = 8
invalid_date_format = 9
invalid_date = 10
invalid_time_format = 11
invalid_time = 12
invalid_hex_digit = 13
unexpected_error = 14
invalid_fieldname = 15
field_and_descr_incompatible = 16
input_too_long = 17
no_decimals = 18
invalid_float = 19
conversion_exit_error = 20
OTHERS = 21.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
*017i+
* Ist das Feld ein Währungsfeld, das nicht genau zwei
* Dezimalstellen hat, so ist die Rückkonvertierung
* eventuell nicht korrekt. In diesem pathologischen
* Fall muß von and nachgebessert werden.
IF svali-datatype = 'CURR' AND
svali-decimals <> 2.
IF wa_svali-value IS INITIAL.
<f1> = <f1> * 10 ** ( 2 - svali-decimals ).
ELSE.
SELECT SINGLE * FROM tcurx
INTO lv_tcurx
WHERE currkey = wa_svali-value.
IF sy-subrc = 0.
* Die Währung hat Dezimalstellen <> 2. In dem Fall funktioniert
* der Konvertierungsbaustein korrekt.
ELSE.
<f1> = <f1> * 10 ** ( 2 - svali-decimals ).
ENDIF.
ENDIF.
ENDIF.
* Ist das Feld ein Währungsschlüssel, so muß eventuell
* das zugehörige Währungsfeld nochmal nachkonvertiert
* werden.
IF svali-datatype = 'CUKY'.
MOVE <f1> TO lv_cuky.
PERFORM adapt_currency_to_cuky USING svali-value
lv_cuky.
svali-value = lv_cuky.
ELSE.
*017i-
MOVE <f1> TO svali-value.
ENDIF. "*017i
ENDFORM. "conversion_input
FORM adapt_currency_to_cuky
USING value(iv_cuky_old) TYPE zspo_value
value(iv_cuky_new) TYPE zspo_value.
FIELD-SYMBOLS: <lf_f1> TYPE ANY,
<lf_clow> TYPE c.
DATA: lv_table_field TYPE tabfield,
lv_fieldname(255) TYPE c,
lv_data_ref TYPE REF TO data,
lv_svali LIKE svali,
lv_sy_tabix LIKE sy-tabix,
lv_curr(15) TYPE p DECIMALS 2,
lv_value TYPE spo_value,
lv_value_temp TYPE spo_value,
lv_factor(15) TYPE p,
lv_tcurx TYPE tcurx.
* Wenn sich der Währungsschlüssel nicht geändert hat, besteht kein
* Handlungsbedarf.
CONDENSE iv_cuky_old.
CONDENSE iv_cuky_new.
IF iv_cuky_old = iv_cuky_new.
EXIT.
ENDIF.
* Jetzt muß das Zugehörige Währungsfeld ermittelt werden.
READ TABLE svali
INTO lv_svali
WITH KEY reftable = svali-tabname
reffield = svali-fieldname.
IF sy-subrc = 0.
lv_sy_tabix = sy-tabix.
IF lv_sy_tabix > index_100.
* Das Feld mit dem Währungsbetrag wurde noch nicht verarbeitet.
* Alles o.k.
EXIT.
ENDIF.
ELSE.
* Wenn das Währungsfeld zu keinem Betragsfeld gehört, dann
* besteht auch kein Handlungsbedarf.
EXIT.
ENDIF.
* Wenn wir jetzt das Unterprogramm noch nicht verlassen haben, besteht
* Handlungsbedarf.
* Zunächst muß der Währungsbetrag in der alten Währung wieder
* "ausgegeben" werden.
* Auch dabei muß darauf geachtet werden, wieviele Dezimalstellen
* das Währungsfeld hat.
IF lv_svali-decimals = 2.
lv_curr = lv_svali-value.
ELSEIF lv_svali-decimals > 2.
lv_factor = 10 ** ( lv_svali-decimals - 2 ).
lv_value_temp = lv_svali-value.
lv_value_temp = lv_value_temp * lv_factor.
lv_curr = lv_value_temp.
ELSEIF lv_svali-decimals < 2.
lv_factor = 10 ** ( 2 - lv_svali-decimals ).
lv_curr = lv_svali-value.
lv_curr = lv_curr / lv_factor.
ENDIF.
WRITE lv_curr CURRENCY iv_cuky_old TO lv_value.
CONDENSE lv_value.
CONCATENATE lv_svali-tabname
lv_svali-fieldname
INTO lv_fieldname SEPARATED BY '-'.
SHIFT lv_fieldname LEFT DELETING LEADING '*'.
CREATE DATA lv_data_ref TYPE (lv_fieldname).
ASSIGN lv_data_ref->* TO <lf_f1>.
ASSIGN lv_value(lv_svali-outputlen) TO <lf_clow>.
lv_table_field-tabname = lv_svali-tabname.
lv_table_field-fieldname = lv_svali-fieldname.
lv_table_field-lfieldname = lv_svali-fieldname.
SHIFT lv_table_field-tabname LEFT DELETING LEADING '*'.
CALL FUNCTION 'RS_CONV_EX_2_IN'
EXPORTING
input_external = <lf_clow>
table_field = lv_table_field
currency = iv_cuky_new
IMPORTING
output_internal = <lf_f1>
EXCEPTIONS
input_not_numerical = 1
too_many_decimals = 2
more_than_one_sign = 3
ill_thousand_separator_dist = 4
too_many_digits = 5
sign_for_unsigned = 6
too_large = 7
too_small = 8
invalid_date_format = 9
invalid_date = 10
invalid_time_format = 11
invalid_time = 12
invalid_hex_digit = 13
unexpected_error = 14
invalid_fieldname = 15
field_and_descr_incompatible = 16
input_too_long = 17
no_decimals = 18
invalid_float = 19
conversion_exit_error = 20
OTHERS = 21.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
* Ist das Feld ein Währungsfeld, das nicht genau zwei
* Dezimalstellen hat, so ist die Rückkonvertierung
* eventuell nicht korrekt. In diesem pathologischen
* Fall muß von and nachgebessert werden.
IF lv_svali-decimals <> 2.
SELECT SINGLE * FROM tcurx
INTO lv_tcurx
WHERE currkey = iv_cuky_new.
IF sy-subrc = 0.
* Die Währung hat Dezimalstellen <> 2. In dem Fall funktioniert
* der Konvertierungsbaustein korrekt.
ELSE.
<lf_f1> = <lf_f1> * 10 ** ( 2 - lv_svali-decimals ).
ENDIF.
ENDIF.
MOVE <lf_f1> TO lv_svali-value.
MODIFY svali
INDEX lv_sy_tabix
FROM lv_svali
TRANSPORTING value.
ENDFORM. " adapt_currency_to_cukey
FORM p100_code. "*049i
DATA: lv_error_in_db_check TYPE xfeld, "*049i
entries_found TYPE c, "*050i
nr_check_values TYPE i. "*050i
ok_code_save = ok_code.
CLEAR ok_code.
IF ok_code_save = 'FURT' OR
ok_code_save = 'COD1' OR
ok_code_save = 'COD2'.
* Prüfung auf Mußeingabefelder, die nicht auf dem POPUP erscheinen
IF nr_entries_to_show > max_fields_in_loop.
PERFORM check_obligatory_fields.
ENDIF.
* Die Funktionscodes COD1 und COD2 können nur im Fall
* KIND_OF_POPUP = USER_BUTTONS auftreten.
IF kind_of_popup = no_check.
SET SCREEN 0.
LEAVE SCREEN.
ELSEIF kind_of_popup = db_check.
CLEAR lv_error_in_db_check. "*049i
LOOP AT diff_tab.
PERFORM prepare_check_values USING diff_tab-tabname.
DESCRIBE TABLE check_values LINES nr_check_values. "*050i
CHECK nr_check_values <> 0.
* nur wenn etwas zum Prüfen da ist, geht es weiter
* PERFORM prepare_generic_key. "*050d
IF diff_tab-tabname(1) = '*'.
h_tabname = diff_tab-tabname+1.
ELSE.
h_tabname = diff_tab-tabname.
ENDIF.
PERFORM read_db "*050i
USING h_tabname "*050i
CHANGING entries_found. "*050i
* IF diff_tab-length <= tab_short. "*050d+
* PERFORM read_db TABLES db_tab_s
* USING h_tabname entries_found.
* ELSEIF diff_tab-length <= tab_middle.
* PERFORM read_db TABLES db_tab_m
* USING h_tabname entries_found.
* ELSEIF diff_tab-length <= tab_long.
* PERFORM read_db TABLES db_tab_l
* USING h_tabname entries_found.
* ELSE.
* PERFORM read_db TABLES db_tab_vl
* USING h_tabname entries_found.
* ENDIF. "*050d-
IF diff_tab-ref = 'X'.
IF entries_found = no.
error_tab = diff_tab-tabname.
IF sy-binpt = 'X'. "B20K059470
MESSAGE a124 RAISING error_in_fields. "B20K059470
ELSE. "B20K059470
MESSAGE i124.
ENDIF. "B20K059470
* LEAVE SCREEN. "*047d
lv_error_in_db_check = c_true. "*049i
EXIT. "*049i
ENDIF.
ELSEIF entries_found = no AND int_check_existence = space
AND diff_tab-tabname(1) = '*'.
* Es wurde ein Eintrag gefunden, es darf aber kein
* Eintrag vorhanden sein, da es sich um eine *-Tabellen-
* angabe handelt.
error_tab = diff_tab-tabname.
IF nr_entries_to_show = 1.
IF sy-binpt = 'X'. "B20K059470
MESSAGE a120 RAISING error_in_fields. "B20K059470
ELSE. "B20K059470
MESSAGE i120.
ENDIF. "B20K059470
ELSE.
IF sy-binpt = 'X'. "B20K059470
MESSAGE a110 RAISING error_in_fields. "B20K059470
ELSE. "B20K059470
MESSAGE i110.
ENDIF. "B20K059470
ENDIF.
* LEAVE SCREEN. "*047d
lv_error_in_db_check = c_true. "*049i
EXIT. "*049i
ELSEIF entries_found = yes AND int_check_existence = 'X'
AND diff_tab-tabname(1) = '*'.
* Es wurde kein Eintrag gefunden, es soll aber ein
* Eintrag vorhanden sein, da es sich um eine *-Tabellen-
* angabe handelt.
error_tab = diff_tab-tabname.
IF nr_entries_to_show = 1.
IF sy-binpt = 'X'. "B20K059470
MESSAGE a121 RAISING error_in_fields. "B20K059470
ELSE. "B20K059470
MESSAGE i121.
ENDIF. "B20K059470
ELSE.
IF sy-binpt = 'X'. "B20K059470
MESSAGE a111 RAISING error_in_fields. "B20K059470
ELSE. "B20K059470
MESSAGE i111.
ENDIF. "B20K059470
ENDIF.
* LEAVE SCREEN. "*047d
lv_error_in_db_check = c_true. "*049i
EXIT. "*049i
ELSEIF entries_found = no AND int_check_existence = 'X'
AND diff_tab-tabname(1) <> '*'.
* Es wurde kein Eintrag gefunden, es soll aber ein
* Eintrag vorhanden sein.
error_tab = diff_tab-tabname.
IF nr_entries_to_show = 1.
IF sy-binpt = 'X'. "B20K059470
MESSAGE a120 RAISING error_in_fields. "B20K059470
ELSE. "B20K059470
MESSAGE i120.
ENDIF. "B20K059470
ELSE.
IF sy-binpt = 'X'. "B20K059470
MESSAGE a110 RAISING error_in_fields. "B20K059470
ELSE. "B20K059470
MESSAGE i110.
ENDIF. "B20K059470
ENDIF.
* LEAVE SCREEN. "*047d
lv_error_in_db_check = c_true. "*049i
EXIT. "*049i
ELSEIF entries_found = yes AND int_check_existence = space
AND diff_tab-tabname(1) <> '*'.
* Es wurde ein Eintrag gefunden, es darf aber kein
* Eintrag vorhanden sein.
error_tab = diff_tab-tabname.
IF nr_entries_to_show = 1.
IF sy-binpt = 'X'. "B20K059470
MESSAGE a121 RAISING error_in_fields. "B20K059470
ELSE. "B20K059470
MESSAGE i121.
ENDIF. "B20K059470
ELSE.
IF sy-binpt = 'X'. "B20K059470
MESSAGE a111 RAISING error_in_fields. "B20K059470
ELSE. "B20K059470
MESSAGE i111.
ENDIF. "B20K059470
ENDIF.
* LEAVE SCREEN. "*047d
lv_error_in_db_check = c_true. "*049i
EXIT. "*049i
ENDIF.
ENDLOOP.
* Alles ok.
IF lv_error_in_db_check IS INITIAL. "*049i
SET SCREEN 0.
LEAVE SCREEN.
ENDIF. "*049i
ELSEIF kind_of_popup = itab_check.
ELSEIF kind_of_popup = user_check OR
( kind_of_popup = user_help AND form_name <> space ).
PERFORM fill_values TABLES ifields.
CLEAR error.
PERFORM (form_name) IN PROGRAM (program_name)
TABLES ifields
USING error.
IF error-msgno IS INITIAL.
* Alles ok.
SET SCREEN 0.
LEAVE SCREEN.
ELSE.
* Fehler
PERFORM get_values TABLES ifields.
error_tab = error-errortab.
error_field = error-errorfield.
IF error-msgty <> 'S'.
IF sy-binpt = 'X'. "B20K077258
error-msgty = 'A'. "B20K077258
ELSE. "B20K077258
error-msgty = 'I'.
ENDIF. "B20K077258
ENDIF.
MESSAGE ID error-msgid
TYPE error-msgty
NUMBER error-msgno
WITH error-msgv1 error-msgv2
error-msgv3 error-msgv4.
* LEAVE SCREEN. "*047d
ENDIF.
ELSEIF kind_of_popup = user_help AND form_name = space.
PERFORM fill_values TABLES ifields.
* kein User-Exit angegeben
SET SCREEN 0.
LEAVE SCREEN.
ELSEIF kind_of_popup = user_buttons.
PERFORM fill_values TABLES ifields.
CLEAR error.
CLEAR h_show_popup.
PERFORM (form_name) IN PROGRAM (program_name)
TABLES ifields
USING ok_code_save error h_show_popup.
IF h_show_popup = space.
* Das Popup soll verlassen werden
SET SCREEN 0.
LEAVE SCREEN.
ELSEIF error-msgno IS INITIAL.
* Alles ok.
PERFORM get_values TABLES ifields.
* LEAVE SCREEN. "*047d
ELSE.
* Fehler
PERFORM get_values TABLES ifields.
error_tab = error-errortab.
error_field = error-errorfield.
IF error-msgty <> 'S'.
IF sy-binpt = 'X'. "B20K077258
error-msgty = 'A'. "B20K077258
ELSE. "B20K077258
error-msgty = 'I'.
ENDIF. "B20K077258
ENDIF.
MESSAGE ID error-msgid
TYPE error-msgty
NUMBER error-msgno
WITH error-msgv1 error-msgv2
error-msgv3 error-msgv4.
* LEAVE SCREEN. "*047d
ENDIF.
ENDIF.
ELSEIF ok_code_save = 'P--' "*059i+
OR ok_code_save = 'P-'
OR ok_code_save = 'P+'
OR ok_code_save = 'P++'.
PERFORM paging USING ok_code_save. "*059i-
ENDIF.
ENDFORM. "P100_CODE"*049u
FORM check_obligatory_fields.
LOOP AT svali.
CHECK NOT svali-field_obl IS INITIAL.
CHECK svali-value IS INITIAL.
MOVE svali-tabname TO error_tab.
MOVE svali-fieldname TO error_field.
IF sy-binpt = 'X'.
MESSAGE ID '00' TYPE 'A' NUMBER '055'.
ELSE.
MESSAGE ID '00' TYPE 'I' NUMBER '055'.
ENDIF.
LEAVE SCREEN.
ENDLOOP.
ENDFORM. " CHECK_OBLIGATORY_FIELDS
FORM prepare_check_values USING tabname.
* Die Routine extrahiert aus SVALI und SVAL_NOT die Felder und Werte,
* die gegen die DB-Tabellen zu verproben sind. Das Mandantenfeld wird
* automatisch berücksichtigt, wenn die Tabelle mandantenabh. ist und
* das Mandantenfeld in der Schnittstelle nicht angegeben wurde.
*
* INPUT TABNAME Tabellenname
* SVALI Stepllopzeilen mit Werten
* SVAL_NOT nicht anzuzeigende, aber ggf. zu ver-
* probende Felder
* OUTPUT CHECK_VALUES Prüffelder und -werte
* NR_CHECK_VALUES Anzahl Einträge in CHECK_VALUES
*
REFRESH check_values.
* übergebene bzw. eingegebene Werte übernehmen, die zu verproben sind
LOOP AT svali WHERE tabname = tabname
AND comp_code <> cond_nc.
IF NOT svali-value IS INITIAL "B20K013025
OR svali-field_obl NE space. "B20K013025
* Initialwerte nur prüfen, wenn Felder obligatorisch "B20K013025
check_values-tabname = svali-tabname.
check_values-fieldname = svali-fieldname.
check_values-value = svali-value.
check_values-comp_code = svali-comp_code.
check_values-position = svali-position.
check_values-offset = svali-offset.
check_values-keyflag = svali-keyflag.
check_values-intlen = svali-intlen.
check_values-leng = svali-leng. "+012i cpl
APPEND check_values.
ENDIF. "B20K013025
ENDLOOP.
* übergebene Werte übernehmen, die nicht angeboten wurden aber zu
* verproben sind
LOOP AT sval_not WHERE tabname = tabname
AND comp_code <> cond_nc.
check_values-tabname = sval_not-tabname.
check_values-fieldname = sval_not-fieldname.
IF sval_not-comp_tab <> space.
key_all_fields-tabname = sval_not-comp_tab.
key_all_fields-fieldname = sval_not-comp_field.
READ TABLE svali WITH KEY key_all_fields.
IF sy-subrc = 0.
IF svali-value IS INITIAL "*031i
AND svali-field_obl IS INITIAL. "*031i
* Initialwerte nur prüfen, wenn Felder obligatorisch sind "*031i
CONTINUE. "*031i
ENDIF. "*031i
sval_not-value = svali-value.
ELSE. "*031i
CONTINUE. "*031i
ENDIF.
ENDIF.
check_values-value = sval_not-value.
check_values-comp_code = sval_not-comp_code.
check_values-position = sval_not-position.
check_values-offset = sval_not-offset.
check_values-keyflag = sval_not-keyflag.
check_values-intlen = sval_not-intlen.
check_values-leng = sval_not-leng. "+012i cpl
APPEND check_values.
ENDLOOP.
* DESCRIBE TABLE check_values LINES nr_check_values. "*050d+
* IF nr_check_values = 0.
** für diese Tabelle müssen keine DB-Prüfungen durchgeführt werden
* EXIT.
* ENDIF.
*
** mandantenabhängigkeit beachten
* h_tabname = tabname.
* IF h_tabname(1) = '*'.
* SHIFT h_tabname.
* ENDIF.
* LOOP AT all_fields WHERE tabname = h_tabname
* AND datatype = 'CLNT'.
* LOOP AT check_values WHERE position = all_fields-position.
* EXIT.
* ENDLOOP.
* IF sy-subrc <> 0.
** Mandant wurde nicht übergeben
* check_values-tabname = tabname.
* check_values-fieldname = all_fields-fieldname.
* check_values-value = sy-mandt.
* check_values-comp_code = cond_eq.
* check_values-position = all_fields-position.
* check_values-offset = all_fields-offset.
* check_values-keyflag = all_fields-keyflag.
* check_values-intlen = all_fields-intlen.
* check_values-leng = all_fields-leng. "+012i cpl
* APPEND check_values.
* ENDIF.
* EXIT.
* ENDLOOP. "*050d-
SORT check_values BY position.
* DESCRIBE TABLE check_values LINES nr_check_values. "*050d
ENDFORM. "PREPARE_CHECK_VALUES
FORM read_db
USING iv_tabname LIKE dfies-tabname "*050u+
CHANGING ev_entries_found TYPE c.
CONSTANTS: c_inverted_comma(1) TYPE c VALUE '''',
c_double_inverted_comma(2) TYPE c VALUE ''''''.
DATA: BEGIN OF lt_where_clause OCCURS 0,
line(200) TYPE c, "*056u
END OF lt_where_clause,
lv_value(160) TYPE c, "*056u
lv_first_processed TYPE xfeld,
lv_client_specified TYPE xfeld,
sr_table TYPE REF TO data.
FIELD-SYMBOLS: <ls_table>.
ev_entries_found = no. "*052i
* Zunächst bestimmen wir, ob mit CLIENT SPECIFIED
* selektiert werden muss.
CLEAR lv_client_specified.
LOOP AT all_fields
WHERE tabname = iv_tabname
AND datatype = 'CLNT'.
LOOP AT check_values
WHERE position = all_fields-position.
EXIT.
ENDLOOP.
IF sy-subrc = 0.
* Mandant wurde übergeben, wir müssen CLIENT SPECIFIED
* selektieren.
lv_client_specified = c_true.
ENDIF.
ENDLOOP.
CLEAR lv_first_processed.
* Jetzt kann die WHERE-Bedingung formuliert werden.
LOOP AT check_values.
IF lv_first_processed IS INITIAL.
lv_first_processed = c_true.
ELSE.
CLEAR lt_where_clause.
lt_where_clause = 'AND'.
APPEND lt_where_clause.
ENDIF.
lv_value = check_values-value.
REPLACE ALL OCCURRENCES OF c_inverted_comma
IN lv_value
WITH c_double_inverted_comma.
CONCATENATE c_inverted_comma
lv_value
c_inverted_comma
INTO lv_value.
CLEAR lt_where_clause.
CONCATENATE check_values-fieldname
check_values-comp_code
lv_value
INTO lt_where_clause
SEPARATED BY space.
APPEND lt_where_clause.
ENDLOOP.
* Jetzt wird auf der Datenbank nachgesehen.
* Wir brauchen leider eine INTO-Tabelle,
* TRANSPORTING NO FIELDS geht bei der SELECT-Anweisung nicht.
*
* Also müssen wir uns dynamisch eine Zeile der Zieltabelle
* erzeugen.
CREATE DATA sr_table TYPE (iv_tabname).
ASSIGN sr_table->* TO <ls_table>.
TRY. "*052i
IF lv_client_specified IS INITIAL.
SELECT SINGLE *
FROM (iv_tabname)
INTO <ls_table>
WHERE (lt_where_clause).
ELSE.
SELECT SINGLE *
FROM (iv_tabname)
CLIENT SPECIFIED
INTO <ls_table>
WHERE (lt_where_clause).
ENDIF.
IF sy-subrc = 0.
ev_entries_found = yes.
* ELSE. "*052d
* ev_entries_found = no. "*052d
ENDIF. "*050u-
CATCH cx_root. "*052i
* Aus Gründen der Abwärtskompatibilität dürfen wir auch "*052i
* dann nicht abbrechen, wenn der Aufrufer echten Blödsinn "*052i
* eingegeben hat, z.B. einen Tabellennamen der gar keine "*052i
* Datenbanktabelle ist. Daher fangen wir alle Ausnahmen "*052i
* ab und tun einfach so, als wäre der SELECT leer "*052i
* ausgegangen. "*052i
ENDTRY. "*052i-
ENDFORM. "read_db
FORM get_values TABLES fields STRUCTURE zsval.
* Die Routine übernimmt die Werte aus der Tabelle FIELDS und
* übergibt sie an die Tabelle SVALI.
*
* INPUT FIELDS Schnittstellenfelder
* OUTPUT SVALI Steploopzeilen mit angegebenen Werten
DATA: BEGIN OF key_svali,
tabname LIKE dfies-tabname,
fieldname LIKE dfies-fieldname,
END OF key_svali.
LOOP AT fields.
IF fields-field_attr = do_not_show AND
fields-comp_tab <> space.
key_svali-tabname = fields-comp_tab.
key_svali-fieldname = fields-comp_field.
ELSE.
key_svali-tabname = fields-tabname.
key_svali-fieldname = fields-fieldname.
ENDIF.
READ TABLE svali WITH KEY key_svali.
IF sy-subrc = 0.
IF fields-value <> svali-value.
svali-value = fields-value.
MODIFY svali INDEX sy-tabix.
ENDIF.
ENDIF.
ENDLOOP.
ENDFORM. "GET_VALUES
*FORM fill_values TABLES fields STRUCTURE zsval.
** Die Routine übernimmt die Werte aus der internen Tabelle SVALI und
** übergibt diese an die Tabelle FIELDS.
**
** INPUT SVALI Steploopzeilen mit angegebenen Werten
** OUTPUT FIELDS Schnittstellenfelder
*
* DATA: BEGIN OF key_svali,
* tabname LIKE dfies-tabname,
* fieldname LIKE dfies-fieldname,
* END OF key_svali.
*
*
* LOOP AT fields.
* IF fields-field_attr = do_not_show AND
* fields-comp_tab <> space.
* key_svali-tabname = fields-comp_tab.
* key_svali-fieldname = fields-comp_field.
* ELSE.
* key_svali-tabname = fields-tabname.
* key_svali-fieldname = fields-fieldname.
* ENDIF.
* READ TABLE svali WITH KEY key_svali.
*
* IF sy-subrc = 0.
* IF fields-value <> svali-value.
* fields-value = svali-value.
* MODIFY fields.
* ENDIF.
* ENDIF.
* ENDLOOP.
*ENDFORM. "FILL_VALUES
FORM paging "*059i+
USING code.
* Blättern
*
* INPUT FIRST_LINE aktuelle erste Zeile
* ENTRIES Anzahl Einträge
* LOOPS Anzahl Steploopzeilen
* CODE P , P-, P+ oder P++
* OUTPUT ENTRY_NEW neue erste Zeile
CALL FUNCTION 'SCROLLING_IN_TABLE'
EXPORTING
entry_act = first_line_100
entry_to = nr_entries_to_show
loops = max_fields_in_loop
ok_code = code
IMPORTING
entry_new = first_line_100.
ENDFORM. "PAGING "*059i-
FORM p100_value. "*059i
* Deklarieren und Initialisieren
DATA: returntab LIKE ddshretval OCCURS 0 WITH HEADER LINE.
DATA: lv_shlp_descr TYPE shlp_descr. "*005i
DATA: sy_repid LIKE sy-repid,
sy_dynnr LIKE sy-dynnr.
DATA: h_i1 TYPE i. "*059i
MOVE sy-repid TO sy_repid.
MOVE sy-dynnr TO sy_dynnr.
GET CURSOR FIELD cur_field
LINE cur_line
OFFSET cur_offset.
REFRESH dynpfields.
IF cur_line > 0.
dynpro_no = sy-dynnr.
h_i1 = cur_line. "*053u
IF NOT gv_use_paging IS INITIAL. "*059i
h_i1 = h_i1 + first_line_100 - 1. "*059i
ENDIF. "*059i
READ TABLE svali INDEX h_i1.
IF sy-subrc = 0.
* Anzeige der Eingabemöglichkeiten pro Tabellenfeld
IF cur_field = 'SVALD-KEYTEXT' OR
svali-field_attr = norm_noinp OR
svali-field_attr = bright_noinp OR
svali-field_attr = show_2_dim.
h_flag = 'X'.
ELSE.
h_flag = space.
ENDIF.
IF svali-tabname(1) = '*'.
h_tabname = svali-tabname+1.
help_field_star = 'X'.
ELSE.
h_tabname = svali-tabname.
CLEAR help_field_star.
ENDIF.
* Benutzerdefinierte F4-Hilfe
* if ( kind_of_popup = user_help and f4_program_name <> space ) or
* ( kind_of_popup = user_buttons and f4_program_name <> space )
* B40K011463 --------------------------------------------------------- *
* Benutzerdefinierte Hilfe nur, wenn keine Systemhilfe verlangt wird
IF ( ( kind_of_popup = user_help AND f4_program_name <> space ) OR
( kind_of_popup = user_buttons AND f4_program_name <> space ) )
AND svali-novaluehlp NE 'S' .
* -------------------------------------------------------------------- *
move 'ZSVALD-VALUE' to dynpfields-fieldname. "1411262 >>
dynpfields-stepl = cur_line.
append dynpfields.
call function 'DYNP_VALUES_READ'
exporting
dyname = sy_repid
dynumb = sy_dynnr
tables
dynpfields = dynpfields
exceptions
others = 1.
if sy-subrc <> 0.
endif.
read table dynpfields with key fieldname = 'ZSVALD-VALUE'
stepl = cur_line.
if sy-subrc = 0.
move dynpfields-fieldvalue to zsvald-value.
endif. "1411262 <<
PERFORM (f4_form_name) IN PROGRAM (f4_program_name)
USING h_tabname
svali-fieldname
h_flag
h_returncode
zsvald-value.
if h_returncode = 'F'. "FORCE_UPDATE "1411262 >>
read table dynpfields with key fieldname = 'ZSVALD-VALUE'
stepl = cur_line.
move zsvald-value to dynpfields-fieldvalue.
modify dynpfields index sy-tabix.
call function 'DYNP_VALUES_UPDATE'
exporting
dyname = sy_repid
dynumb = sy_dynnr
tables
dynpfields = dynpfields
exceptions
others = 1.
if sy-subrc <> 0.
endif.
endif. "1411262 <<
ELSE.
* Programmdefinierte F4-Hilfe
IF h_no_value_check = 'X' "B20K052439
AND svali-inttype = 'D'. "B20K052439
MESSAGE i781. "B20K052439
ELSEIF h_no_value_check = 'X' "B20K052439
AND svali-inttype = 'T'. "B20K052439
MESSAGE i781. "B20K052439
ELSE. "B20K052439
help_fieldname = svali-fieldname. "B20K069688
* Neue F4-Hilfe zu Release 4.0C -------------------------------*
DATA: value LIKE help_info-fldvalue.
MOVE 'ZSVALD-VALUE' TO dynpfields-fieldname.
* move cur_line to dynpfields-stepl. "*003d
dynpfields-stepl = cur_line. "*003i"*059u
APPEND dynpfields.
CALL FUNCTION 'DYNP_VALUES_READ'
EXPORTING
dyname = sy_repid
dynumb = sy_dynnr
* TRANSLATE_TO_UPPER = ' '
* REQUEST = ' '
* PERFORM_CONVERSION_EXITS = ' '
* PERFORM_INPUT_CONVERSION = ' '
* DETERMINE_LOOP_INDEX = ' '
TABLES
dynpfields = dynpfields
EXCEPTIONS
invalid_abapworkarea = 1
invalid_dynprofield = 2
invalid_dynproname = 3
invalid_dynpronummer = 4
invalid_request = 5
no_fielddescription = 6
invalid_parameter = 7
undefind_error = 8
double_conversion = 9
stepl_not_found = 10
OTHERS = 11.
IF sy-subrc <> 0.
ENDIF.
READ TABLE dynpfields
WITH KEY fieldname = 'ZSVALD-VALUE'
stepl = cur_line.
IF sy-subrc = 0.
MOVE dynpfields-fieldvalue TO value.
ELSE.
CLEAR value.
ENDIF.
REFRESH dynpfields.
* in nicht eingabebereiten Feldern nur Anzeige
DATA: display TYPE ddbool_d.
IF svali-field_attr = '02'
OR svali-field_attr = '03'
OR svali-field_attr = '05'.
MOVE 'X' TO display.
ELSE.
CLEAR display.
ENDIF.
*005i+
* Zunächst müssen die Eigenschaften der Suchhilfe gelesen werden,
* damit später bestimmt werden kann was die Export-Parameter sind.
CALL FUNCTION 'F4IF_DETERMINE_SEARCHHELP'
EXPORTING
tabname = h_tabname
fieldname = help_fieldname
* SELECTION_SCREEN = ' '
IMPORTING
shlp = lv_shlp_descr
EXCEPTIONS
field_not_found = 1
no_help_for_field = 2
inconsistent_help = 3
OTHERS = 4.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
*005i-
CALL FUNCTION 'F4IF_FIELD_VALUE_REQUEST'
EXPORTING
tabname = h_tabname
fieldname = help_fieldname
* SEARCHHELP = ' '
* SHLPPARAM = ' '
* dynpprog = sy_repid
* dynpnr = sy_dynnr
dynprofield = 'ZSVALD-VALUE'
stepl = cur_line
value = value
* multiple_choice = ' '
display = display
callback_program = sy_repid
callback_form = 'VALUE_HELP_CALLBACK'
TABLES
return_tab = returntab
EXCEPTIONS
field_not_found = 1
no_help_for_field = 2
inconsistent_help = 3
no_values_found = 4
OTHERS = 5.
IF sy-subrc = 0.
IF NOT returntab[] IS INITIAL AND display IS INITIAL.
PERFORM update_further_entries
TABLES returntab
USING sy_repid
sy_dynnr
lv_shlp_descr "*005i
h_i1. "*059u
ENDIF.
ELSE.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
* call function 'HELP_VALUES_GET'
* exporting
* display = h_flag
* fieldname = help_fieldname "B20K069688
* tabname = h_tabname
* importing
* select_value = svald-value
* select_index = h_index.
*
* if svald-value is initial
* and h_index > 0.
* dynpfields-fieldname = 'SVALD-VALUE'.
* dynpfields-stepl = cur_line.
* dynpfields-fieldvalue = svald-value.
* append dynpfields.
* call function 'DYNP_VALUES_UPDATE'
* exporting
* dyname = dyname
* dynumb = dynpro_no
* tables
* dynpfields = dynpfields
* exceptions
* invalid_abapworkarea = 1
* invalid_dynprofield = 2
* invalid_dynproname = 3
* invalid_dynpronummer = 4
* invalid_request = 5
* no_fielddescription = 6
* undefind_error = 7
* others = 8.
* endif.
ENDIF. "B20K052439
ENDIF.
ENDIF.
ENDIF.
ENDIF.
* index_100 = first_line_100. "*053d
ENDFORM. "p100_value "*059i
FORM p100_help. "*059i
DATA: h_i1 TYPE i. "*059i
GET CURSOR FIELD cur_field
LINE cur_line
OFFSET cur_offset.
IF cur_line > 0.
h_i1 = cur_line. "*053u
IF NOT gv_use_paging IS INITIAL. "*059i
h_i1 = h_i1 + first_line_100 - 1. "*059i
ENDIF. "*059i
READ TABLE svali INDEX h_i1.
IF sy-subrc = 0.
* F1-Hilfe für ein Datenbankfeld
IF svali-tabname(1) = '*'.
h_tabname = svali-tabname+1.
ELSE.
h_tabname = svali-tabname.
ENDIF.
IF ( kind_of_popup = user_help AND f1_program_name <> space ) OR
( kind_of_popup = user_buttons AND f1_program_name <> space ).
PERFORM (f1_form_name) IN PROGRAM (f1_program_name)
USING h_tabname
svali-fieldname.
ELSE.
*** CALL FUNCTION 'HELP_DOCU_SHOW_FOR_FIELD' "B20K014551*
*** EXPORTING "B20K014551*
*** FIELDNAME = SVALI-FIELDNAME "B20K014551*
* KEYWORD = SVALD-KEYTEXT
*** TABNAME = H_TABNAME. "B20K014551*
* mk begin ----------------------------------------------- "B20K043473
CLEAR help_infos.
* HELP_INFOS-CALL = 'D'. "B20K014551
* HELP_INFOS-SPRAS = SY-LANGU. "B20K014551
* HELP_INFOS-DOCUID = 'FE'. "B20K014551
* help_infos-title = sy-title. "B20K014551
help_infos-tabname = h_tabname. "B20K014551
help_infos-fieldname = svali-fieldname. "B20K014551
help_infos-program = sy-repid. "B20K014551
help_infos-dynpro = sy-dynnr. "B20K014551
* HELP_INFOS-REPORT = SY-REPID. "B20K014551
* HELP_INFOS-DYNPPROG = SY-REPID. "B20K014551
* CALL FUNCTION 'HELP_START' "B20K014551
* EXPORTING "B20K014551
* HELP_INFOS = HELP_INFOS "B20K014551
* TABLES "B20K014551
* DYNPSELECT = DYNPSELECT "B20K014551
* DYNPVALUETAB = DYNPVALUETAB. "B20K014551
h_title = sy-title.
help_infos-pfkey = sy-pfkey.
CALL FUNCTION 'HELP_OBJECT_SHOW_FOR_FIELD'
EXPORTING
* doklangu = sy-langu
doktitle = h_title
called_by_program = help_infos-program
called_by_dynp = help_infos-dynpro
called_for_tab = help_infos-tabname
called_for_field = help_infos-fieldname
called_for_tab_fld_btch_input = batch_input
called_by_cuaprog = help_infos-program
called_by_cuastat = help_infos-pfkey
* merge_dz_if_available =
TABLES
links = links
EXCEPTIONS
object_not_found = 1
sapscript_error = 2
OTHERS = 3.
* mk end ------------------------------------------------- "B20K043473
ENDIF.
ENDIF.
ENDIF.
* INDEX_100 = FIRST_LINE_100. "*053d
ENDFORM. "p100_help "*059i
FORM update_further_entries
TABLES p_returntab STRUCTURE ddshretval
USING p_sy_repid
p_sy_dynnr
p_shlp_descr TYPE shlp_descr"*005i
p_tab_index TYPE i. "*059u
* Deklarieren und Initialisieren
DATA: p_dynpfields LIKE dynpread OCCURS 0 WITH HEADER LINE,
tab_index LIKE sy-tabix,
l_tabname LIKE svali-tabname, "*007i CPL
l_tabfield LIKE svali-fieldname, "*007i CPL
p_tabname LIKE svali-tabname,
p_tabfield LIKE svali-fieldname.
DATA: h_max_line TYPE i. "*059i
DATA: wa_fieldprop TYPE ddshfprop. "*005i
DATA: lv_stepl LIKE sy-stepl. "*059i
IF gv_use_paging IS INITIAL. "*059i+
h_max_line = quan_entries_100.
ELSE.
h_max_line = first_line_100 + max_fields_in_loop - 1.
ENDIF. "*059i-
MOVE svali-tabname TO p_tabname.
* Returntab abarbeiten
* Mehrere Rückgabewerte möglich
IF help_type_single IS INITIAL.
LOOP AT p_returntab.
*005i+
* Zunächst sehen wir nach, ob der entsprechende Parameter auch ein
* Export-Parameter ist.
READ TABLE p_shlp_descr-fieldprop
INTO wa_fieldprop
WITH KEY fieldname = p_returntab-fieldname.
IF sy-subrc = 0.
IF wa_fieldprop-shlpoutput IS INITIAL.
CONTINUE.
ENDIF.
ENDIF.
* Im Zweifelsfall lieber übernehmen, also kein CONTINUE.
*005i-
* Die Abfragereihenfolge muß umgestellt werden. "*042i+
* Die alte Logik wurde komplett ersetzt.
* Erster Versuch:
*
* Wenn RETFIELD = 'SVALD-VALUE', dann ist das zu
* befüllende Feld auf jeden Fall das Feld, für das die
* Suchhilfe aufgerufen wurde.
IF p_returntab-retfield = 'ZSVALD-VALUE'.
tab_index = p_tab_index. "*053u
READ TABLE svali
INDEX tab_index.
IF sy-subrc = 0.
* svali-value = p_returntab-fieldval. "*043d
PERFORM convert_and_update_svali "*043i
USING p_returntab-fieldval. "*043i
MODIFY svali INDEX tab_index.
ENDIF.
lv_stepl = tab_index - first_line_100 + 1. "*059i
p_dynpfields-fieldname = 'ZSVALD-VALUE'.
p_dynpfields-stepl = lv_stepl. "*059u
p_dynpfields-fieldvalue = p_returntab-fieldval.
APPEND p_dynpfields.
CONTINUE.
ENDIF.
* Zweiter Versuch:
*
* Überprüfen, ob das in RETFIELD angegebene Feld
* auf dem Dynpro ist.
IF NOT p_returntab-retfield IS INITIAL.
SPLIT p_returntab-retfield "*007u CPL
AT '-' "*007u CPL
INTO l_tabname "*007u CPL
l_tabfield. "*007u CPL
" in case of double usage of a field of the same table "2400592>>
"with * the correct field should be updated
if help_fieldname = l_tabfield and
help_field_star = 'X'.
concatenate '*' l_tabname into l_tabname.
endif. "2400592<<
READ TABLE svali
WITH KEY tabname = l_tabname "*007u CPL
fieldname = l_tabfield. "*007u CPL
tab_index = sy-tabix.
IF sy-subrc = 0.
* Es ist durchaus möglich, daß eine erfolgreiche Suchhilfe "*003i
* mehrere Felder füllt. Insbesondere kann es passieren, daß "*003i
* im Blättermodus einige dieser Felder momentan nicht "*003i
* angezeigt werden. Daher muß sichergestellt werden, daß "*003i
* diese Felder auch gefüllt werden, aber die Felder "*003i
* außerhalb des momentanen Sichtbereiches nicht in die "*003i
* Tabelle P_DYNPFIELDS eingefügt werden. "*003i
*
* svali-value = p_returntab-fieldval. "*003i"*043d
PERFORM convert_and_update_svali "*043i
USING p_returntab-fieldval. "*043i
MODIFY svali INDEX tab_index. "*003i
IF tab_index >= first_line_100 "*059i
AND tab_index <= h_max_line. "*059i
lv_stepl = tab_index - first_line_100 + 1. "*059i
p_dynpfields-fieldname = 'ZSVALD-VALUE'.
p_dynpfields-stepl = lv_stepl. "*059u
p_dynpfields-fieldvalue = p_returntab-fieldval.
APPEND p_dynpfields.
ENDIF. "*059i
CONTINUE.
ENDIF.
ENDIF.
* Dritter Versuch:
*
* Überprüfen, ob das Feld FIELDNAME auf dem Dynpro vorhanden
* ist.
READ TABLE svali WITH KEY tabname = p_tabname
fieldname = p_returntab-fieldname.
tab_index = sy-tabix.
IF sy-subrc = 0.
* svali-value = p_returntab-fieldval. "*003i"*043d
PERFORM convert_and_update_svali "*043i
USING p_returntab-fieldval. "*043i
MODIFY svali INDEX tab_index. "*003i
IF tab_index >= first_line_100 "*059i
AND tab_index <= h_max_line. "*059i
lv_stepl = tab_index - first_line_100 + 1. "*059i
p_dynpfields-fieldname = 'ZSVALD-VALUE'.
p_dynpfields-stepl = lv_stepl. "*059u
p_dynpfields-fieldvalue = p_returntab-fieldval.
APPEND p_dynpfields.
ENDIF. "*059i
CONTINUE.
ENDIF. "*042i-
ENDLOOP.
* Suchhilfe hängt an Domäne. Nur ein Rückgabeparameter möglich.
ELSE.
READ TABLE p_returntab INDEX 1.
IF sy-subrc = 0.
lv_stepl = p_tab_index - first_line_100 + 1. "*059i
p_dynpfields-fieldname = 'ZSVALD-VALUE'.
p_dynpfields-stepl = lv_stepl.
p_dynpfields-fieldvalue = p_returntab-fieldval.
APPEND p_dynpfields.
ENDIF.
ENDIF.
* Dynpro aktualisieren
IF NOT p_dynpfields[] IS INITIAL.
CALL FUNCTION 'DYNP_VALUES_UPDATE'
EXPORTING
dyname = p_sy_repid
dynumb = p_sy_dynnr
TABLES
dynpfields = p_dynpfields
EXCEPTIONS
invalid_abapworkarea = 1
invalid_dynprofield = 2
invalid_dynproname = 3
invalid_dynpronummer = 4
invalid_request = 5
no_fielddescription = 6
undefind_error = 7
OTHERS = 8.
ENDIF.
ENDFORM. " UPDATE_FURTHER_ENTRIES
步骤四: 修改0300屏幕和0400屏幕。
0300屏幕修改
用下面这段代码直接覆盖掉0300的逻辑流
如图:
代码如下:
PROCESS BEFORE OUTPUT.
MODULE p300_init.
LOOP AT svali CURSOR index_100. "*054u
MODULE p100_show.
ENDLOOP.
MODULE p100_set_cursor.
*
PROCESS AFTER INPUT.
MODULE p100_leave AT EXIT-COMMAND.
LOOP AT svali. "*054u
CHAIN. "B20K052439
FIELD zsvald-value. "B20K052439
MODULE clear_update_flag. "B20K052439
MODULE p100_get ON CHAIN-REQUEST. "B20K052439
MODULE p100_get_new. "B20K052439
ENDCHAIN. "B20K052439
ENDLOOP.
MODULE p100_code.
*
PROCESS ON VALUE-REQUEST.
FIELD zsvald-value MODULE p100_value.
* FIELD SVALD-KEYTEXT MODULE P100_VALUE.
*
PROCESS ON HELP-REQUEST.
FIELD zsvald-value MODULE p100_help.
FIELD zsvald-keytext MODULE p100_help.
同理,0400屏幕也需要如此修改:
代码如下:
PROCESS BEFORE OUTPUT.
MODULE p300_init.
MODULE d400_list_param. "*059i
LOOP AT svali CURSOR index_100. "*053u
* LOOP.
MODULE p100_show.
ENDLOOP.
MODULE p100_set_cursor.
*
PROCESS AFTER INPUT.
MODULE p100_leave AT EXIT-COMMAND.
LOOP AT svali.
CHAIN. "B20K052439
FIELD zsvald-value. "B20K052439
MODULE clear_update_flag. "B20K052439
MODULE p100_get ON CHAIN-REQUEST. "B20K052439
MODULE p100_get_new. "B20K052439
ENDCHAIN. "B20K052439
ENDLOOP.
MODULE p100_code.
*
PROCESS ON VALUE-REQUEST.
FIELD zsvald-value MODULE p100_value.
* FIELD SVALD-KEYTEXT MODULE P100_VALUE.
*
PROCESS ON HELP-REQUEST.
FIELD zsvald-value MODULE p100_help.
FIELD zsvald-keytext MODULE p100_help.
到此结束。。。。
按照以上操作即可将POPUP_GET_VALUES函数的VALUE字段由132变为255