在使用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