本文主要是介绍SAP ABAP 自定义弹窗文本长度函数,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
在使用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, "mkdecimals LIKE dfies-decimals, "mknovaluehlp LIKE sval-novaluehlp, "mkreftable LIKE dfies-reftable, "B20K058473reffield LIKE dfies-reffield, "B20K058473f4availabl LIKE dfies-f4availabl, "B20K081005END OF svali,* Interne Tabelle mit Feldern, die nicht anzuzeigen sindBEGIN 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. "B20K058473INCLUDE 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 ITABBEGIN 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 cplEND 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, "*053dfirst_line_100 TYPE i, "*053d"*059iindex_100 TYPE i,quan_entries_100 TYPE i,gv_use_paging type xfeld, "*059i
* quan_loops_100 TYPE i, "*053dnr_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 werdenBEGIN 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, "B20K062235ok_button_text LIKE smp_dyntxt,
* icon_okay(20) type c value 'ICON_CHECKED', "B20K062235
* 1st_button like svalbutton-buttontext, "B20K0622351st_button LIKE smp_dyntxt,
* 2nd_button like svalbutton-buttontext, "B20K0622352nd_button LIKE smp_dyntxt,g_no_check_for_fixed_values(1) TYPE c,
* Kennzeichen, dass Pruefung gegen Festwerte
* abgeschaltet werden sollg_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_HELPkind_of_popup TYPE c,* OK-Code Felderok_code(4) TYPE c,ok_code_save(4) TYPE c,* Interne Tabelle mit den unterschiedlichen Tabellennamen, für
* die Werte erfragt werden sollenBEGIN OF diff_tab OCCURS 10,tabname LIKE dfies-tabname,ref TYPE c,length TYPE i,END OF diff_tab,* Tabellen für NAMETAB-InformationenBEGIN 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 PopupsBEGIN 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, "*059dh_date TYPE d,h_date_c(8) TYPE c, "B20K052439h_time TYPE t,h_time_c(6) TYPE c, "B20K052439h_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 werdenmax_fields_in_loop TYPE i VALUE 10,max_lines_for_scroll TYPE i VALUE 200, "*059i
* Max. Ausgabelänge eines Feldesmax_field_allowed TYPE i VALUE 255, "cpl von 79 auf 132max_field_visible TYPE i VALUE 79, "cpl
* Typ des Funktionsbausteinsno_check TYPE c VALUE '1', "ohne Prüfungdb_check TYPE c VALUE '2', "mit Prüfung gegen DBitab_check TYPE c VALUE '3', "mit Prüfung gegen ITABuser_check TYPE c VALUE '4', "mit Userexit-Prüfunguser_help TYPE c VALUE '5', "mit Userexits und -helpuser_buttons TYPE c VALUE '6', "mit Userexits,-help,-but.
* Anzeigeattribute für Wertfeldernorm_inp(02) TYPE c VALUE ' ', "Normal, eingabebereitbright_inp(02) TYPE c VALUE '01', "Hell, eingabebereitnorm_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 anzeigenshow_2_dim(02) TYPE c VALUE '05', "normal, nicht eingabeber."2-dimensional
* Vergleichsoperatorencond_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üfencond_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 ersetztformconst_out(30) TYPE c VALUE 'CONVERSION_EXIT_XYZ_OUTPUT',formconst_inp(30) TYPE c VALUE 'CONVERSION_EXIT_XYZ_INPUT',
* Synonymec_true TYPE xfeld VALUE 'X', "049iyes 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. "B20K014551INCLUDE 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 "B20K043473VALUE 'SVALD-VALUE', "B20K043473BEGIN OF links OCCURS 0. "B20K043473INCLUDE STRUCTURE tline. "B20K043473
DATA: END OF links. "B20K043473
DATA: h_title LIKE dsyst-doktitle. "B20K043473DATA: update_flag(1) TYPE c. "B20K052439* Eclude-Tabelle für Status dynp_3_4 "B20K062235
DATA: BEGIN OF exclude OCCURS 10, "B20K062235func LIKE rsnewleng-fcode, "B20K062235END OF exclude. "B20K062235* Hilfsfelder, werden benötigt für F4-Hilfe nach Namensraumverlängerung
DATA: help_fieldname LIKE help_info-fieldname, "B20K069688help_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.
***Hilfeh_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. "*059iPERFORM determine_paging_mode. "*059i* Exclude Tabelle für Status füllen "B20K062235PERFORM fill_exclude. "B20K062235* Ok-Icon auf die Drucktaste bringen "B20K062235CLEAR ok_button_text. "B20K062235PERFORM append_icon_to_button USING icon_okay "B20K062235dummytext-100 "009u cplCHANGING ok_button_text. "B20K062235* Koordinaten des Popups berechnenPERFORM comp_coord USING start_column start_row.text_title = popup_title.index_100 = 1. "*053ufirst_line_100 = 1. "*059iPERFORM call_popup.IF ok_code_save = 'CANC'.returncode = 'A'.ELSE.
* übergebene Tabelle mit Werten füllenPERFORM 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_DATAFORM 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 svalisval_notifieldsdiff_tabstart_row_100start_column_100end_row_100end_column_100
* first_time_100 "*053d
* answer_100 "*053dfirst_line_100 "*053d"*059iindex_100quan_entries_100gv_use_paging "*059i
* quan_loops_100 "*053dnr_entries_to_showmax_field_lengthcur_fieldcur_linecur_offsetkind_of_popuptext_titleint_check_existenceprogram_namef1_program_namef4_program_nameform_namef1_form_namef4_form_nameok_button_text1st_button2nd_buttonok_code_saveg_no_check_for_fixed_values "mkg_no_alpha_exit_for_type_n "mkexclude "2075263TO 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_DATEFORM 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 SVALIDATA: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 wurdekey_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-tabnameRAISING error_in_fields.ENDIF.IF kind_of_popup = db_check ORkind_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 ANDfields-comp_code <> cond_ne ANDfields-comp_code <> cond_nc ANDfields-comp_code <> cond_lt ANDfields-comp_code <> cond_le ANDfields-comp_code <> cond_gt ANDfields-comp_code <> cond_ge.MESSAGE e109 WITH fields-comp_code fields-fieldnamefields-tabnameRAISING 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-fieldnameRAISING 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 gelesenDATA: l_tabname TYPE ddobjname.MOVE h_tabname TO l_tabname.CALL FUNCTION 'DDIF_FIELDINFO_GET'EXPORTINGtabname = l_tabname
* FIELDNAME = ' '
* LANGU = SY-LANGU
* LFIELDNAME = ' '
* ALL_TYPES = ' '
* IMPORTING
* X030L_WA =
* DDOBJTYPE =
* DFIES_WA =
* LINES_DESCR =TABLESdfies_tab = fieldtab
* FIXED_VALUES =EXCEPTIONSnot_found = 1internal_error = 2OTHERS = 3.IF sy-subrc = 0.
* 012+ cpl
* offset must be specified in characters but dfies returns bytes
* causes problems in UNICODE environmenth_offset = 0.SORT fieldtab BY position.LOOP AT fieldtab.fieldtab-offset = h_offset.ADD fieldtab-leng TO h_offset.MODIFY fieldtab.ENDLOOP.
* 012- cplh_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ändigenIF 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 TabelleMESSAGE e104 WITH svali-fieldname svali-tabnameRAISING 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 TypMESSAGE e105 WITH all_fields-inttypesvali-fieldname svali-tabnameRAISING error_in_fields.ENDIF.IF all_fields-outputlen > max_field_allowed ANDsvali-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 bestimmenIF max_field_length < all_fields-outputlen ANDsvali-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. "*016dsvali-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. "mksvali-decimals = all_fields-decimals. "mksvali-reftable = all_fields-reftable. "B20K058473svali-reffield = all_fields-reffield. "B20K058473svali-f4availabl = all_fields-f4availabl. "B20K081005IF 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 entfernenIF 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 istIF max_field_length > max_field_visible. "cplmax_field_length = max_field_visible. "cplENDIF. "cpl* prüfen, ob die Vergleichsfelder angegeben wurdenLOOP 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_fieldfields-tabname fields-fieldnameRAISING error_in_fields.ENDIF.ENDLOOP.DESCRIBE TABLE svali LINES quan_entries_100.IF quan_entries_100 = 0.
* keine Felder zum anzeigen vorhandenMESSAGE e107 RAISING error_in_fields.ENDIF.
ENDFORM. "prepare_and_checkFORM 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 "*059uOR quan_entries_100 <= max_fields_in_loop. "*059u
* ELSE. "*054i"*059dexclude = 'P--'.APPEND exclude.exclude = 'P-'.APPEND exclude.exclude = 'P+'.APPEND exclude.exclude = 'P++'.APPEND exclude.ENDIF. "*053d"*054iENDFORM. " FILL_EXCLUDEFORM append_icon_to_button USING p_button_iconp_button_textp_button_quickinfoCHANGING 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_BUTTONFORM 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 EndzeileIF 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 = LeerzeileELSE.end_row_100 = start_row_100+ quan_entries_100
* + 1. "B20K062235
* + 2. "letzte Zeile = Leerzeile.ENDIF.ENDFORM. "COMP_COORDFORM 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ättermodusCALL SCREEN 300 STARTING AT start_column_100 start_row_100ENDING AT end_column_100 end_row_100.ELSE.
* mit BlättermodusCALL SCREEN 400 STARTING AT start_column_100 start_row_100ENDING AT end_column_100 end_row_100.ENDIF. "*053u-"*054u-EXIT.ENDFORM. "CALL_POPUPFORM 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 SchnittstellenfelderDATA: 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 ANDfields-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_VALUESFORM 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
* aktuellenDELETE 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_DATAFORM 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ächtnisIMPORT svalisval_notifieldsdiff_tabstart_row_100start_column_100end_row_100end_column_100
* first_time_100 "*053d
* answer_100 "*053dfirst_line_100 "*053d"*059iindex_100quan_entries_100gv_use_paging "*059i
* quan_loops_100 "*053dnr_entries_to_showmax_field_lengthcur_fieldcur_linecur_offsetkind_of_popuptext_titleint_check_existenceprogram_namef1_program_namef4_program_nameform_namef1_form_namef4_form_nameok_button_text1st_button2nd_buttonok_code_saveg_no_check_for_fixed_values "mkg_no_alpha_exit_for_type_n "mkexclude "2075263FROM 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 OUTPUTMODULE p100_set_cursor OUTPUT.IF cur_field <> space.SET CURSOR FIELD cur_fieldLINE cur_lineOFFSET cur_offset.ENDIF.cur_field = space.cur_line = 0.cur_offset = 0.error_tab = space.error_field = space.
ENDMODULE. "P100_SET_CURSOR OUTPUTMODULE p100_leave.PERFORM p100_leave. "*053uENDMODULE. "P100_LEAVEMODULE clear_update_flag. "B20K052439CLEAR update_flag. "B20K052439
ENDMODULE. "B20K052439MODULE p100_get.PERFORM p100_get.update_flag = 'X'. "B20K052439
ENDMODULE. "P100_GETMODULE p100_get_new. "B20K052439IF update_flag = space. "B20K052439IF h_no_value_check = space. "B20K052439PERFORM p100_get. "B20K052439ENDIF. "B20K052439ENDIF. "B20K052439
ENDMODULE. "B20K052439MODULE p100_code.PERFORM p100_code. "*049iENDMODULE. "P100_CODE"*049iMODULE p100_value.PERFORM p100_value. "*059uENDMODULE. "p100_valueMODULE p100_help.PERFORM p100_help. "*059uENDMODULE. "P100_HELPMODULE 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. "*053dIF 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 immerh_formname = formconst_out.REPLACE 'XYZ' WITH svali-convexit INTO h_formname.CONDENSE h_formname NO-GAPS.
* falls der Name des Exits nicht 5-stellig istCASE svali-inttype. "B20K8A0A60WHEN 'P'. "B20K8A0A60ASSIGN p TO <h1> TYPE 'P' DECIMALS svali-decimals. "B20K8A0A60<h1> = svali-value. "B20K8A0A60WHEN 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- cplENDCASE. "B20K8A0A60ASSIGN zsvald-value(svali-outputlen) TO <h2>.CALL FUNCTION h_formnameEXPORTINGinput = <h1>IMPORTINGoutput = <h2>.ELSEIF svali-value <> space. "*028d"*035i
* ELSE. "*028i"*035dCASE svali-inttype. "#EC CI_UTCL_OKWHEN 'D'.CASE h_no_value_check. "B20K052439WHEN 'X'. "B20K052439h_date_c = svali-value. "B20K052439WRITE h_date_c TO zsvald-value. "B20K052439WHEN OTHERS. "B20K052439h_date = svali-value.WRITE h_date TO zsvald-value DD/MM/YYYY.ENDCASE. "B20K052439WHEN 'T'.CASE h_no_value_check. "B20K052439WHEN 'X'. "B20K052439h_time_c = svali-value. "B20K052439WRITE h_time_c TO zsvald-value. "B20K052439WHEN OTHERS. "B20K052439WRITE svali-value TO zsvald-value USING EDIT MASK '__:__:__'.ENDCASE. "B20K052439WHEN '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 "B20K058473ASSIGN p TO <p> TYPE 'P' DECIMALS svali-decimals.<p> = svali-value.CASE svali-datatype.WHEN 'CURR'.CLEAR wa_svali.READ TABLE svali WITH KEYtabname = svali-reftablefieldname = svali-reffieldINTO 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 "*001dELSE.CLEAR wa_svali.READ TABLE sval_not WITH KEYtabname = svali-reftablefieldname = svali-reffieldINTO 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"*001dELSE.svali-field_attr = norm_noinp. "*017iMODIFY svali INDEX index_100. "*028i"*053uWRITE <p> TO zsvald-value(svali-outputlen).ENDIF.ENDIF.WHEN 'QUAN'.CLEAR wa_svali.READ TABLE svali WITH KEYtabname = svali-reftablefieldname = svali-reffieldINTO 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 KEYtabname = svali-reftablefieldname = svali-reffieldINTO 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 EndeWHEN OTHERS. "B20K058473
* assign p to <p> type 'P' decimals svali-decimals.
* <p> = svali-value.WRITE <p> TO zsvald-value(svali-outputlen).ENDCASE. "B20K058473WHEN OTHERS.zsvald-value = svali-value.IF svali-inttype CA 'XIbs8'. "IntegerCONDENSE zsvald-value.ENDIF.ENDCASE.ELSEIF svali-inttype = 'P' "*035iAND 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. "*035iREAD TABLE svali WITH KEY "*035itabname = svali-reftable "*035ifieldname = svali-reffield "*035iTRANSPORTING NO FIELDS. "*035iIF sy-subrc <> 0. "*035iREAD TABLE sval_not WITH KEY "*035itabname = svali-reftable "*035ifieldname = svali-reffield "*035iTRANSPORTING NO FIELDS. "*035iIF sy-subrc <> 0. "*035isvali-field_attr = norm_noinp. "*035iMODIFY svali INDEX index_100. "*035i"*053uENDIF. "*035iENDIF. "*035iENDIF.* Mußfelder berücksichtigenIF svali-field_obl = 'X' AND zsvald-value = space.zsvald-value(1) = '?'.ENDIF.
* Cursorposition bestimmenIF error_tab = svali-tabname AND cur_line = 0 AND( error_field = svali-fieldname OR error_field = space ).IF ( svali-field_attr <> norm_noinp ANDsvali-field_attr <> bright_noinp ANDsvali-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. "*053dLOOP AT SCREEN.CASE screen-name.WHEN 'ZSVALD-VALUE'.IF h_no_value_check = 'X' "B20K052439AND svali-inttype = 'D'. "B20K052439screen-length = 8. "B20K052439screen-value_help = no. "B20K052439ELSEIF h_no_value_check = 'X' "B20K052439AND svali-inttype = 'T'. "B20K052439screen-length = 6. "B20K052439screen-value_help = no. "B20K052439ELSE. "B20K052439screen-length = svali-outputlen.ENDIF. "B20K052439CASE 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. "B20K081005IF ( kind_of_popup = user_help "B20K081005AND f4_program_name <> space ) "B20K081005OR ( kind_of_popup = user_buttons "B20K081005AND f4_program_name <> space ). "B20K081005ELSE. "B20K081005screen-value_help = no. "B20K081005ENDIF.ENDIF.WHEN 'SVALD-KEYTEXT'.IF svali-field_attr = bright_inp ORsvali-field_attr = bright_noinp.screen-intensified = yes.ENDIF.ENDCASE.MODIFY SCREEN.ENDLOOP.ENDFORM. "p100_showFORM 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. "*053dREAD 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. "*028iIF svali-field_attr = norm_noinp. "*028iEXIT. "*028iENDIF. "*028i
* ENDIF.
** Ende der Schleife
** B20K064644
*017d-* Coding steht jetzt im folgenden Unterprogramm 006 012 017 "*043dPERFORM convert_and_update_svali "*043iUSING zsvald-value. "*043i* ----- Festwerte pruefen -------------------------IF svali-valexi <> space AND svali-value <> spaceAND g_no_check_for_fixed_values = spaceAND h_no_value_check = space. "B20K068565
* Feld hat Festwerte, die überprüft werden müssenh_value_found = no.condense svali-value. "1052607h_domvalue = svali-value.SELECT * FROM dd07l WHERE domname = svali-domnameAND 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 ' anddd07l-domvalue_l co '0123456789 ' anddd07l-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 ANDh_domvalue <= dd07l-domvalue_h.h_value_found = yes.EXIT.ENDIF.ENDIF.ENDSELECT.IF h_value_found = no.
* Bitte einen gültigen Wert angebenMESSAGE e124.ENDIF.ENDIF.MODIFY svali INDEX index_100.ENDIF.ENDFORM. "p100_getFORM convert_and_update_svali "*043i+USING value(iv_value).IF iv_value <> space.IF g_no_alpha_exit_for_type_n IS INITIALOR svali-inttype <> 'N'.* IF h_no_value_check EQ space. "*017dIF h_no_value_check = space "*017iOR svali-datatype = 'CURR' "*017iOR 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- CPLPERFORM conversion_input_new "*006i CPLUSING iv_value. "*006i CPLELSEIF svali-convexit <> space.
* keine Prüfung, aber KonvertierungsexitCLEAR 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 istASSIGN 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 übergebenIF svali-leng > 132. "1048525 >>ASSIGN svali-value(132) TO <h2>.ELSE.ASSIGN svali-value(svali-leng) TO <h2>. "*044iENDIF. "1048525 <<CALL FUNCTION h_formnameEXPORTINGinput = <h1>IMPORTINGoutput = <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, "*017ilv_tcurx TYPE tcurx. "*017iCONCATENATE svali-tabnamesvali-fieldnameINTO 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 KEYtabname = svali-reftablefieldname = svali-reffieldINTO wa_svali.IF sy-subrc <> 0.READ TABLE sval_not WITH KEYtabname = svali-reftablefieldname = svali-reffieldINTO wa_svali.IF sy-subrc <> 0.CLEAR wa_svali.ENDIF.ENDIF.ENDIF.
*017i-CALL FUNCTION 'RS_CONV_EX_2_IN'EXPORTINGinput_external = <clow>table_field = table_fieldcurrency = wa_svali-value "*017iIMPORTINGoutput_internal = <f1>EXCEPTIONSinput_not_numerical = 1too_many_decimals = 2more_than_one_sign = 3ill_thousand_separator_dist = 4too_many_digits = 5sign_for_unsigned = 6too_large = 7too_small = 8invalid_date_format = 9invalid_date = 10invalid_time_format = 11invalid_time = 12invalid_hex_digit = 13unexpected_error = 14invalid_fieldname = 15field_and_descr_incompatible = 16input_too_long = 17no_decimals = 18invalid_float = 19conversion_exit_error = 20OTHERS = 21.IF sy-subrc <> 0.MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgnoWITH 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' ANDsvali-decimals <> 2.IF wa_svali-value IS INITIAL.<f1> = <f1> * 10 ** ( 2 - svali-decimals ).ELSE.SELECT SINGLE * FROM tcurxINTO lv_tcurxWHERE 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-valuelv_cuky.svali-value = lv_cuky.ELSE.
*017i-MOVE <f1> TO svali-value.ENDIF. "*017iENDFORM. "conversion_inputFORM adapt_currency_to_cukyUSING value(iv_cuky_old) TYPE zspo_valuevalue(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 svaliINTO lv_svaliWITH KEY reftable = svali-tabnamereffield = 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-tabnamelv_svali-fieldnameINTO 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'EXPORTINGinput_external = <lf_clow>table_field = lv_table_fieldcurrency = iv_cuky_newIMPORTINGoutput_internal = <lf_f1>EXCEPTIONSinput_not_numerical = 1too_many_decimals = 2more_than_one_sign = 3ill_thousand_separator_dist = 4too_many_digits = 5sign_for_unsigned = 6too_large = 7too_small = 8invalid_date_format = 9invalid_date = 10invalid_time_format = 11invalid_time = 12invalid_hex_digit = 13unexpected_error = 14invalid_fieldname = 15field_and_descr_incompatible = 16input_too_long = 17no_decimals = 18invalid_float = 19conversion_exit_error = 20OTHERS = 21.IF sy-subrc <> 0.MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgnoWITH 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 tcurxINTO lv_tcurxWHERE 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 svaliINDEX lv_sy_tabixFROM lv_svaliTRANSPORTING value.ENDFORM. " adapt_currency_to_cukeyFORM p100_code. "*049iDATA: lv_error_in_db_check TYPE xfeld, "*049ientries_found TYPE c, "*050inr_check_values TYPE i. "*050iok_code_save = ok_code.CLEAR ok_code.IF ok_code_save = 'FURT' ORok_code_save = 'COD1' ORok_code_save = 'COD2'.
* Prüfung auf Mußeingabefelder, die nicht auf dem POPUP erscheinenIF 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. "*049iLOOP AT diff_tab.PERFORM prepare_check_values USING diff_tab-tabname.DESCRIBE TABLE check_values LINES nr_check_values. "*050iCHECK nr_check_values <> 0.
* nur wenn etwas zum Prüfen da ist, geht es weiter
* PERFORM prepare_generic_key. "*050dIF diff_tab-tabname(1) = '*'.h_tabname = diff_tab-tabname+1.ELSE.h_tabname = diff_tab-tabname.ENDIF.PERFORM read_db "*050iUSING h_tabname "*050iCHANGING 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'. "B20K059470MESSAGE a124 RAISING error_in_fields. "B20K059470ELSE. "B20K059470MESSAGE i124.ENDIF. "B20K059470
* LEAVE SCREEN. "*047dlv_error_in_db_check = c_true. "*049iEXIT. "*049iENDIF.ELSEIF entries_found = no AND int_check_existence = spaceAND 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'. "B20K059470MESSAGE a120 RAISING error_in_fields. "B20K059470ELSE. "B20K059470MESSAGE i120.ENDIF. "B20K059470ELSE.IF sy-binpt = 'X'. "B20K059470MESSAGE a110 RAISING error_in_fields. "B20K059470ELSE. "B20K059470MESSAGE i110.ENDIF. "B20K059470ENDIF.
* LEAVE SCREEN. "*047dlv_error_in_db_check = c_true. "*049iEXIT. "*049iELSEIF 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'. "B20K059470MESSAGE a121 RAISING error_in_fields. "B20K059470ELSE. "B20K059470MESSAGE i121.ENDIF. "B20K059470ELSE.IF sy-binpt = 'X'. "B20K059470MESSAGE a111 RAISING error_in_fields. "B20K059470ELSE. "B20K059470MESSAGE i111.ENDIF. "B20K059470ENDIF.
* LEAVE SCREEN. "*047dlv_error_in_db_check = c_true. "*049iEXIT. "*049iELSEIF 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'. "B20K059470MESSAGE a120 RAISING error_in_fields. "B20K059470ELSE. "B20K059470MESSAGE i120.ENDIF. "B20K059470ELSE.IF sy-binpt = 'X'. "B20K059470MESSAGE a110 RAISING error_in_fields. "B20K059470ELSE. "B20K059470MESSAGE i110.ENDIF. "B20K059470ENDIF.
* LEAVE SCREEN. "*047dlv_error_in_db_check = c_true. "*049iEXIT. "*049iELSEIF entries_found = yes AND int_check_existence = spaceAND 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'. "B20K059470MESSAGE a121 RAISING error_in_fields. "B20K059470ELSE. "B20K059470MESSAGE i121.ENDIF. "B20K059470ELSE.IF sy-binpt = 'X'. "B20K059470MESSAGE a111 RAISING error_in_fields. "B20K059470ELSE. "B20K059470MESSAGE i111.ENDIF. "B20K059470ENDIF.
* LEAVE SCREEN. "*047dlv_error_in_db_check = c_true. "*049iEXIT. "*049iENDIF.ENDLOOP.
* Alles ok.IF lv_error_in_db_check IS INITIAL. "*049iSET SCREEN 0.LEAVE SCREEN.ENDIF. "*049iELSEIF 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 ifieldsUSING error.IF error-msgno IS INITIAL.
* Alles ok.SET SCREEN 0.LEAVE SCREEN.ELSE.
* FehlerPERFORM get_values TABLES ifields.error_tab = error-errortab.error_field = error-errorfield.IF error-msgty <> 'S'.IF sy-binpt = 'X'. "B20K077258error-msgty = 'A'. "B20K077258ELSE. "B20K077258error-msgty = 'I'.ENDIF. "B20K077258ENDIF.MESSAGE ID error-msgidTYPE error-msgtyNUMBER error-msgnoWITH error-msgv1 error-msgv2error-msgv3 error-msgv4.
* LEAVE SCREEN. "*047dENDIF.ELSEIF kind_of_popup = user_help AND form_name = space.PERFORM fill_values TABLES ifields.
* kein User-Exit angegebenSET 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 ifieldsUSING ok_code_save error h_show_popup.IF h_show_popup = space.
* Das Popup soll verlassen werdenSET SCREEN 0.LEAVE SCREEN.ELSEIF error-msgno IS INITIAL.
* Alles ok.PERFORM get_values TABLES ifields.
* LEAVE SCREEN. "*047dELSE.
* FehlerPERFORM get_values TABLES ifields.error_tab = error-errortab.error_field = error-errorfield.IF error-msgty <> 'S'.IF sy-binpt = 'X'. "B20K077258error-msgty = 'A'. "B20K077258ELSE. "B20K077258error-msgty = 'I'.ENDIF. "B20K077258ENDIF.MESSAGE ID error-msgidTYPE error-msgtyNUMBER error-msgnoWITH error-msgv1 error-msgv2error-msgv3 error-msgv4.
* LEAVE SCREEN. "*047dENDIF.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"*049uFORM 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_FIELDSFORM 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 sindLOOP AT svali WHERE tabname = tabnameAND comp_code <> cond_nc.IF NOT svali-value IS INITIAL "B20K013025OR svali-field_obl NE space. "B20K013025
* Initialwerte nur prüfen, wenn Felder obligatorisch "B20K013025check_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 cplAPPEND check_values.ENDIF. "B20K013025ENDLOOP.* übergebene Werte übernehmen, die nicht angeboten wurden aber zu
* verproben sindLOOP AT sval_not WHERE tabname = tabnameAND 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 "*031iAND svali-field_obl IS INITIAL. "*031i
* Initialwerte nur prüfen, wenn Felder obligatorisch sind "*031iCONTINUE. "*031iENDIF. "*031isval_not-value = svali-value.ELSE. "*031iCONTINUE. "*031iENDIF.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 cplAPPEND 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. "*050dENDFORM. "PREPARE_CHECK_VALUESFORM read_dbUSING 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, "*056uEND OF lt_where_clause,lv_value(160) TYPE c, "*056ulv_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_fieldsWHERE tabname = iv_tabnameAND datatype = 'CLNT'.LOOP AT check_valuesWHERE 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_commaIN lv_valueWITH c_double_inverted_comma.CONCATENATE c_inverted_commalv_valuec_inverted_commaINTO lv_value.CLEAR lt_where_clause.CONCATENATE check_values-fieldnamecheck_values-comp_codelv_valueINTO lt_where_clauseSEPARATED 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. "*052iIF lv_client_specified IS INITIAL.SELECT SINGLE *FROM (iv_tabname)INTO <ls_table>WHERE (lt_where_clause).ELSE.SELECT SINGLE *FROM (iv_tabname)CLIENT SPECIFIEDINTO <ls_table>WHERE (lt_where_clause).ENDIF.IF sy-subrc = 0.ev_entries_found = yes.
* ELSE. "*052d
* ev_entries_found = no. "*052dENDIF. "*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. "*052iENDTRY. "*052i-ENDFORM. "read_dbFORM 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 WertenDATA: 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 ANDfields-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_VALUESFORM 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 ZeileCALL FUNCTION 'SCROLLING_IN_TABLE'EXPORTINGentry_act = first_line_100entry_to = nr_entries_to_showloops = max_fields_in_loopok_code = codeIMPORTINGentry_new = first_line_100.ENDFORM. "PAGING "*059i-FORM p100_value. "*059i* Deklarieren und InitialisierenDATA: returntab LIKE ddshretval OCCURS 0 WITH HEADER LINE.DATA: lv_shlp_descr TYPE shlp_descr. "*005iDATA: sy_repid LIKE sy-repid,sy_dynnr LIKE sy-dynnr.DATA: h_i1 TYPE i. "*059iMOVE sy-repid TO sy_repid.MOVE sy-dynnr TO sy_dynnr.GET CURSOR FIELD cur_fieldLINE cur_lineOFFSET cur_offset.REFRESH dynpfields.IF cur_line > 0.dynpro_no = sy-dynnr.h_i1 = cur_line. "*053uIF NOT gv_use_paging IS INITIAL. "*059ih_i1 = h_i1 + first_line_100 - 1. "*059iENDIF. "*059iREAD TABLE svali INDEX h_i1.IF sy-subrc = 0.
* Anzeige der Eingabemöglichkeiten pro TabellenfeldIF cur_field = 'SVALD-KEYTEXT' ORsvali-field_attr = norm_noinp ORsvali-field_attr = bright_noinp ORsvali-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 wirdIF ( ( 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'exportingdyname = sy_repiddynumb = sy_dynnrtablesdynpfields = dynpfieldsexceptionsothers = 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_tabnamesvali-fieldnameh_flagh_returncodezsvald-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'exportingdyname = sy_repiddynumb = sy_dynnrtablesdynpfields = dynpfieldsexceptionsothers = 1.if sy-subrc <> 0.endif.endif. "1411262 <<ELSE.
* Programmdefinierte F4-HilfeIF h_no_value_check = 'X' "B20K052439AND svali-inttype = 'D'. "B20K052439MESSAGE i781. "B20K052439ELSEIF h_no_value_check = 'X' "B20K052439AND svali-inttype = 'T'. "B20K052439MESSAGE i781. "B20K052439ELSE. "B20K052439help_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. "*003ddynpfields-stepl = cur_line. "*003i"*059uAPPEND dynpfields.CALL FUNCTION 'DYNP_VALUES_READ'EXPORTINGdyname = sy_repiddynumb = sy_dynnr
* TRANSLATE_TO_UPPER = ' '
* REQUEST = ' '
* PERFORM_CONVERSION_EXITS = ' '
* PERFORM_INPUT_CONVERSION = ' '
* DETERMINE_LOOP_INDEX = ' 'TABLESdynpfields = dynpfieldsEXCEPTIONSinvalid_abapworkarea = 1invalid_dynprofield = 2invalid_dynproname = 3invalid_dynpronummer = 4invalid_request = 5no_fielddescription = 6invalid_parameter = 7undefind_error = 8double_conversion = 9stepl_not_found = 10OTHERS = 11.IF sy-subrc <> 0.ENDIF.READ TABLE dynpfieldsWITH 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 AnzeigeDATA: 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'EXPORTINGtabname = h_tabnamefieldname = help_fieldname
* SELECTION_SCREEN = ' 'IMPORTINGshlp = lv_shlp_descrEXCEPTIONSfield_not_found = 1no_help_for_field = 2inconsistent_help = 3OTHERS = 4.IF sy-subrc <> 0.MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgnoWITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.ENDIF.
*005i-CALL FUNCTION 'F4IF_FIELD_VALUE_REQUEST'EXPORTINGtabname = h_tabnamefieldname = help_fieldname
* SEARCHHELP = ' '
* SHLPPARAM = ' '
* dynpprog = sy_repid
* dynpnr = sy_dynnrdynprofield = 'ZSVALD-VALUE'stepl = cur_linevalue = value
* multiple_choice = ' 'display = displaycallback_program = sy_repidcallback_form = 'VALUE_HELP_CALLBACK'TABLESreturn_tab = returntabEXCEPTIONSfield_not_found = 1no_help_for_field = 2inconsistent_help = 3no_values_found = 4OTHERS = 5.IF sy-subrc = 0.IF NOT returntab[] IS INITIAL AND display IS INITIAL.PERFORM update_further_entriesTABLES returntabUSING sy_repidsy_dynnrlv_shlp_descr "*005ih_i1. "*059uENDIF.ELSE.MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgnoWITH 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. "B20K052439ENDIF.ENDIF.ENDIF.ENDIF.
* index_100 = first_line_100. "*053dENDFORM. "p100_value "*059iFORM p100_help. "*059iDATA: h_i1 TYPE i. "*059iGET CURSOR FIELD cur_fieldLINE cur_lineOFFSET cur_offset.IF cur_line > 0.h_i1 = cur_line. "*053uIF NOT gv_use_paging IS INITIAL. "*059ih_i1 = h_i1 + first_line_100 - 1. "*059iENDIF. "*059iREAD TABLE svali INDEX h_i1.IF sy-subrc = 0.
* F1-Hilfe für ein DatenbankfeldIF 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_tabnamesvali-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 ----------------------------------------------- "B20K043473CLEAR help_infos.
* HELP_INFOS-CALL = 'D'. "B20K014551
* HELP_INFOS-SPRAS = SY-LANGU. "B20K014551
* HELP_INFOS-DOCUID = 'FE'. "B20K014551
* help_infos-title = sy-title. "B20K014551help_infos-tabname = h_tabname. "B20K014551help_infos-fieldname = svali-fieldname. "B20K014551help_infos-program = sy-repid. "B20K014551help_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. "B20K014551h_title = sy-title.help_infos-pfkey = sy-pfkey.CALL FUNCTION 'HELP_OBJECT_SHOW_FOR_FIELD'EXPORTING
* doklangu = sy-langudoktitle = h_titlecalled_by_program = help_infos-programcalled_by_dynp = help_infos-dynprocalled_for_tab = help_infos-tabnamecalled_for_field = help_infos-fieldnamecalled_for_tab_fld_btch_input = batch_inputcalled_by_cuaprog = help_infos-programcalled_by_cuastat = help_infos-pfkey
* merge_dz_if_available =TABLESlinks = linksEXCEPTIONSobject_not_found = 1sapscript_error = 2OTHERS = 3.* mk end ------------------------------------------------- "B20K043473ENDIF.ENDIF.ENDIF.
* INDEX_100 = FIRST_LINE_100. "*053dENDFORM. "p100_help "*059iFORM update_further_entriesTABLES p_returntab STRUCTURE ddshretvalUSING p_sy_repidp_sy_dynnrp_shlp_descr TYPE shlp_descr"*005ip_tab_index TYPE i. "*059u* Deklarieren und InitialisierenDATA: p_dynpfields LIKE dynpread OCCURS 0 WITH HEADER LINE,tab_index LIKE sy-tabix,l_tabname LIKE svali-tabname, "*007i CPLl_tabfield LIKE svali-fieldname, "*007i CPLp_tabname LIKE svali-tabname,p_tabfield LIKE svali-fieldname.DATA: h_max_line TYPE i. "*059iDATA: wa_fieldprop TYPE ddshfprop. "*005iDATA: lv_stepl LIKE sy-stepl. "*059iIF 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öglichIF 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-fieldpropINTO wa_fieldpropWITH 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. "*053uREAD TABLE svaliINDEX tab_index.IF sy-subrc = 0.
* svali-value = p_returntab-fieldval. "*043dPERFORM convert_and_update_svali "*043iUSING p_returntab-fieldval. "*043iMODIFY svali INDEX tab_index.ENDIF.lv_stepl = tab_index - first_line_100 + 1. "*059ip_dynpfields-fieldname = 'ZSVALD-VALUE'.p_dynpfields-stepl = lv_stepl. "*059up_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 CPLAT '-' "*007u CPLINTO l_tabname "*007u CPLl_tabfield. "*007u CPL" in case of double usage of a field of the same table "2400592>>"with * the correct field should be updatedif help_fieldname = l_tabfield andhelp_field_star = 'X'.concatenate '*' l_tabname into l_tabname.endif. "2400592<<READ TABLE svaliWITH KEY tabname = l_tabname "*007u CPLfieldname = l_tabfield. "*007u CPLtab_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"*043dPERFORM convert_and_update_svali "*043iUSING p_returntab-fieldval. "*043iMODIFY svali INDEX tab_index. "*003iIF tab_index >= first_line_100 "*059iAND tab_index <= h_max_line. "*059ilv_stepl = tab_index - first_line_100 + 1. "*059ip_dynpfields-fieldname = 'ZSVALD-VALUE'.p_dynpfields-stepl = lv_stepl. "*059up_dynpfields-fieldvalue = p_returntab-fieldval.APPEND p_dynpfields.ENDIF. "*059iCONTINUE.ENDIF.ENDIF.* Dritter Versuch:
*
* Überprüfen, ob das Feld FIELDNAME auf dem Dynpro vorhanden
* ist.READ TABLE svali WITH KEY tabname = p_tabnamefieldname = p_returntab-fieldname.tab_index = sy-tabix.IF sy-subrc = 0.
* svali-value = p_returntab-fieldval. "*003i"*043dPERFORM convert_and_update_svali "*043iUSING p_returntab-fieldval. "*043iMODIFY svali INDEX tab_index. "*003iIF tab_index >= first_line_100 "*059iAND tab_index <= h_max_line. "*059ilv_stepl = tab_index - first_line_100 + 1. "*059ip_dynpfields-fieldname = 'ZSVALD-VALUE'.p_dynpfields-stepl = lv_stepl. "*059up_dynpfields-fieldvalue = p_returntab-fieldval.APPEND p_dynpfields.ENDIF. "*059iCONTINUE.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. "*059ip_dynpfields-fieldname = 'ZSVALD-VALUE'.p_dynpfields-stepl = lv_stepl.p_dynpfields-fieldvalue = p_returntab-fieldval.APPEND p_dynpfields.ENDIF.ENDIF.* Dynpro aktualisierenIF NOT p_dynpfields[] IS INITIAL.CALL FUNCTION 'DYNP_VALUES_UPDATE'EXPORTINGdyname = p_sy_repiddynumb = p_sy_dynnrTABLESdynpfields = p_dynpfieldsEXCEPTIONSinvalid_abapworkarea = 1invalid_dynprofield = 2invalid_dynproname = 3invalid_dynpronummer = 4invalid_request = 5no_fielddescription = 6undefind_error = 7OTHERS = 8.ENDIF.ENDFORM. " UPDATE_FURTHER_ENTRIES
步骤四: 修改0300屏幕和0400屏幕。
0300屏幕修改
用下面这段代码直接覆盖掉0300的逻辑流
如图:
代码如下:
PROCESS BEFORE OUTPUT.MODULE p300_init.LOOP AT svali CURSOR index_100. "*054uMODULE p100_show.ENDLOOP.MODULE p100_set_cursor.
*
PROCESS AFTER INPUT.MODULE p100_leave AT EXIT-COMMAND.LOOP AT svali. "*054uCHAIN. "B20K052439FIELD zsvald-value. "B20K052439MODULE clear_update_flag. "B20K052439MODULE p100_get ON CHAIN-REQUEST. "B20K052439MODULE p100_get_new. "B20K052439ENDCHAIN. "B20K052439ENDLOOP.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. "*059iLOOP 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. "B20K052439FIELD zsvald-value. "B20K052439MODULE clear_update_flag. "B20K052439MODULE p100_get ON CHAIN-REQUEST. "B20K052439MODULE p100_get_new. "B20K052439ENDCHAIN. "B20K052439ENDLOOP.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
这篇关于SAP ABAP 自定义弹窗文本长度函数的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!