SAP ABAP 自定义弹窗文本长度函数

2024-06-19 06:12

本文主要是介绍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 自定义弹窗文本长度函数的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1074227

相关文章

RedHat运维-Linux文本操作基础-AWK进阶

你不用整理,跟着敲一遍,有个印象,然后把它保存到本地,以后要用再去看,如果有了新东西,你自个再添加。这是我参考牛客上的shell编程专项题,只不过换成了问答的方式而已。不用背,就算是我自己亲自敲,我现在好多也记不住。 1. 输出nowcoder.txt文件第5行的内容 2. 输出nowcoder.txt文件第6行的内容 3. 输出nowcoder.txt文件第7行的内容 4. 输出nowcode

【操作系统】信号Signal超详解|捕捉函数

🔥博客主页: 我要成为C++领域大神🎥系列专栏:【C++核心编程】 【计算机网络】 【Linux编程】 【操作系统】 ❤️感谢大家点赞👍收藏⭐评论✍️ 本博客致力于知识分享,与更多的人进行学习交流 ​ 如何触发信号 信号是Linux下的经典技术,一般操作系统利用信号杀死违规进程,典型进程干预手段,信号除了杀死进程外也可以挂起进程 kill -l 查看系统支持的信号

ABAP怎么把传入的参数刷新到内表里面呢?

1.在执行相关的功能操作之前,优先执行这一段代码,把输入的数据更新入内表里面 DATA: lo_guid TYPE REF TO cl_gui_alv_grid.CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'IMPORTINGe_grid = lo_guid.CALL METHOD lo_guid->check_changed_data.CALL M

ROS话题通信流程自定义数据格式

ROS话题通信流程自定义数据格式 需求流程实现步骤定义msg文件编辑配置文件编译 在 ROS 通信协议中,数据载体是一个较为重要组成部分,ROS 中通过 std_msgs 封装了一些原生的数据类型,比如:String、Int32、Int64、Char、Bool、Empty… 但是,这些数据一般只包含一个 data 字段,结构的单一意味着功能上的局限性,当传输一些复杂的数据,比如:

java中查看函数运行时间和cpu运行时间

android开发调查性能问题中有一个现象,函数的运行时间远低于cpu执行时间,因为函数运行期间线程可能包含等待操作。native层可以查看实际的cpu执行时间和函数执行时间。在java中如何实现? 借助AI得到了答案 import java.lang.management.ManagementFactory;import java.lang.management.Threa

SQL Server中,isnull()函数以及null的用法

SQL Serve中的isnull()函数:          isnull(value1,value2)         1、value1与value2的数据类型必须一致。         2、如果value1的值不为null,结果返回value1。         3、如果value1为null,结果返回vaule2的值。vaule2是你设定的值。        如

tf.split()函数解析

API原型(TensorFlow 1.8.0): tf.split(     value,     num_or_size_splits,     axis=0,     num=None,     name='split' ) 这个函数是用来切割张量的。输入切割的张量和参数,返回切割的结果。  value传入的就是需要切割的张量。  这个函数有两种切割的方式: 以三个维度的张量为例,比如说一

基于CTPN(tensorflow)+CRNN(pytorch)+CTC的不定长文本检测和识别

转发来源:https://swift.ctolib.com/ooooverflow-chinese-ocr.html chinese-ocr 基于CTPN(tensorflow)+CRNN(pytorch)+CTC的不定长文本检测和识别 环境部署 sh setup.sh 使用环境: python 3.6 + tensorflow 1.10 +pytorch 0.4.1 注:CPU环境

Linux文本三剑客sed

sed和awk grep就是查找文本当中的内容,最强大的功能就是使用扩展正则表达式 sed sed是一种流编辑器,一次处理一行内容。 如果只是展示,会放在缓冲区(模式空间),展示结束后,会从模式空间把结果删除 一行行处理,处理完当前行,才会处理下一行。直到文件的末尾。 sed的命令格式和操作选项: sed -e '操作符 ' -e '操作符' 文件1 文件2 -e表示可以跟多个操作

神经网络第三篇:输出层及softmax函数

在上一篇专题中,我们以三层神经网络的实现为例,介绍了如何利用Python和Numpy编程实现神经网络的计算。其中,中间(隐藏)层和输出层的激活函数分别选择了 sigmoid函数和恒等函数。此刻,我们心中不难发问:为什么要花一个专题来介绍输出层及其激活函数?它和中间层又有什么区别?softmax函数何来何去?下面我们带着这些疑问进入本专题的知识点: 1 输出层概述 2 回归问题及恒等函数 3