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,                             "mk
    decimals       LIKE dfies-decimals,                         "mk
    novaluehlp     LIKE sval-novaluehlp,                        "mk
    reftable       LIKE dfies-reftable,                     "B20K058473
    reffield       LIKE dfies-reffield,                     "B20K058473
    f4availabl     LIKE dfies-f4availabl,                   "B20K081005
  END OF svali,

* Interne Tabelle mit Feldern, die nicht anzuzeigen sind
  BEGIN OF sval_not OCCURS 50.
        INCLUDE STRUCTURE svali.
DATA: END OF sval_not.

* Arbeitsbereich für die Tabelle svali                    "B20K058473
DATA:   BEGIN OF wa_svali.                                  "B20K058473
        INCLUDE STRUCTURE svali.                            "B20K058473
DATA:   END OF wa_svali.                                    "B20K058473

* Fehlerleiste für Userexit beim Fb POPUP_GET_VALUES_DB_CHECKED
DATA: BEGIN OF error.
        INCLUDE STRUCTURE svale.
DATA: END OF error,

* Felder mit Werten zur Prüfung gegen die DB oder eine ITAB
  BEGIN OF check_values OCCURS 50,
    tabname        LIKE dfies-tabname,
    fieldname      LIKE dfies-fieldname,
    value          LIKE zsval-value,
    comp_code      LIKE sval-comp_code,
    position       LIKE dfies-position,
    offset         LIKE dfies-position,
    keyflag        LIKE dfies-keyflag,
    intlen         LIKE dfies-intlen,
    leng           LIKE dfies-leng,                         "+012i cpl
  END OF check_values,
** Felder zum Lesen der DB-Tabellen                         "*050d+
*  nr_check_values  TYPE i,
*  entries_found    TYPE c,
*  genkeyl          TYPE i,
*  genkey(120)      TYPE c,
** Tabelle für die DB-Zeilen, Very Long
*  BEGIN OF db_tab_vl OCCURS 0,
*        lines(4096),
*      END OF db_tab_vl,
*  tab_very_long    TYPE i VALUE 4096,
** Tabelle für die DB-Zeilen, Long
*  BEGIN OF db_tab_l OCCURS 0,
*        lines(500),
*      END OF db_tab_l,
*  tab_long         TYPE i VALUE 500,
** Tabelle für die DB-Zeilen, Middle
*  BEGIN OF db_tab_m OCCURS 0,
*        lines(100),
*      END OF db_tab_m,
*  tab_middle       TYPE i VALUE 100,
** Tabelle für die DB-Zeilen, Short
*  BEGIN OF db_tab_s OCCURS 0,
*        lines(50),
*      END OF db_tab_s,
*  tab_short        TYPE i VALUE 50,                        "*050d-


* Felder für Dynprogröße und -steuerung zum Blättern, Cursorpostion etc.
  start_row_100          TYPE p,
  start_column_100       TYPE p,
  end_row_100            TYPE p,
  end_column_100         TYPE p,
* first_time_100         TYPE c,                            "*053d
* answer_100             TYPE c,                            "*053d
  first_line_100         TYPE i,                      "*053d"*059i
  index_100              TYPE i,
  quan_entries_100       TYPE i,
  gv_use_paging          type xfeld,                        "*059i
* quan_loops_100         TYPE i,                            "*053d
  nr_entries_to_show     TYPE i,
  max_field_length       TYPE i,
  cur_field(20)          TYPE c VALUE ' ',
  cur_line               TYPE i VALUE 0,
  cur_offset             TYPE i VALUE 0,
  error_tab              LIKE sval-tabname,
  error_field            LIKE sval-fieldname,

* Felder der Schnittstelle, die global genutzt werden
* Schnittstelle darf wg. Rekursion nicht globalisiert werden
  BEGIN OF ifields OCCURS 20.
        INCLUDE STRUCTURE zsval.
DATA: END OF ifields,
  int_check_existence    TYPE c,
  program_name           LIKE trdir-name,
  f1_program_name        LIKE trdir-name,
  f4_program_name        LIKE trdir-name,
  form_name(50)          TYPE c,
  f1_form_name(50)       TYPE c,
  f4_form_name(50)       TYPE c,
  text_title             LIKE rseu1-tit_text,
* text_title             like rs37c-text_line,
* ok_button_text         like svalbutton-buttontext,        "B20K062235
  ok_button_text         LIKE smp_dyntxt,
* icon_okay(20)          type c value 'ICON_CHECKED',       "B20K062235
* 1st_button             like svalbutton-buttontext,        "B20K062235
  1st_button             LIKE smp_dyntxt,
* 2nd_button             like svalbutton-buttontext,        "B20K062235
  2nd_button             LIKE smp_dyntxt,

  g_no_check_for_fixed_values(1)  TYPE c,
*                        Kennzeichen, dass Pruefung gegen Festwerte
*                        abgeschaltet werden soll
  g_no_alpha_exit_for_type_n(1)   TYPE c,
*                        Kennzeichen, dass der alpha_exit fuer
*                        numc-Felder abgeschaltetn werden soll

* Feld gibt an, welcher Fb aktiv ist
* 1 = NO_CHECK
* 2 = DB_CHECK
* 3 = ITAB_CHECK
* 4 = USER_CHECK
* 5 = USER_HELP
  kind_of_popup          TYPE c,

* OK-Code Felder
  ok_code(4)             TYPE c,
  ok_code_save(4)        TYPE c,


* Interne Tabelle mit den unterschiedlichen Tabellennamen, für
* die Werte erfragt werden sollen
  BEGIN OF diff_tab OCCURS 10,
    tabname              LIKE dfies-tabname,
    ref                  TYPE c,
    length               TYPE i,
  END OF diff_tab,

* Tabellen für NAMETAB-Informationen
      BEGIN OF fieldtab OCCURS 100.
        INCLUDE STRUCTURE dfies.
DATA: END OF fieldtab,

      BEGIN OF all_fields OCCURS 300.
        INCLUDE STRUCTURE dfies.
DATA: END OF all_fields,

      BEGIN OF key_all_fields,
        tabname   LIKE dfies-tabname,
        fieldname LIKE dfies-fieldname,
      END OF key_all_fields,

* Felder mit Steuerungsinformation für rekursive Aufrufe der Popups
      BEGIN OF swap OCCURS 10,
        time LIKE sy-uzeit,
      END OF swap,
  swap_counter           TYPE i,

* lokale Hilfsfelder, die aus Performance global definiert sind
* h_i1                   TYPE i,                            "*059d
  h_date                 TYPE d,
  h_date_c(8)            TYPE c,                            "B20K052439
  h_time                 TYPE t,
  h_time_c(6)            TYPE c,                            "B20K052439
  h_formname(30)         TYPE c,
  h_keyword              LIKE help_info-keyword,
  h_value1               LIKE zsval-value,
  h_value2               LIKE zsval-value,
  h_flag                 TYPE c,
  h_client_dep           TYPE c,
  h_cur_line             TYPE i VALUE 0,
  h_tabname              LIKE dfies-tabname,
  h_returncode           TYPE c,
  h_domvalue             LIKE dd07l-domvalue_l,
  h_value_found          TYPE c,
  h_no_value_check       TYPE c,
  h_show_popup           TYPE c,

* Konstante Größen
* Der konstante Teil der Popupbreite bestimmt sich aus der Länge des
* Schlüsselworts = 20 + erster freier Spalte = 1 + eine freie Spalte
* zwischen Schlüsselwort und Wert = 1 + letzte freie Spalte incl. Kombo-
* kz. für F4-Hilfe = 2,  macht insgesamt 24. Zur Berechnung der
* tatsächlichen Breite kommt noch die Länge des längsten Ausgabefeldes
* hinzu.
* const_popup_width      type i value 24,
  const_popup_width      TYPE i VALUE 31,  "Platz fuer Icons
* Max. Anzahl von Feldern in einem Popup, wenn mehr Felder anzuzeigen
* sind, muß geblättert werden
  max_fields_in_loop     TYPE i VALUE 10,
  max_lines_for_scroll   TYPE i VALUE 200,                  "*059i
* Max. Ausgabelänge eines Feldes
  max_field_allowed      TYPE i VALUE 255,       "cpl von 79 auf 132
  max_field_visible      TYPE i VALUE 79,        "cpl
* Typ des Funktionsbausteins
  no_check               TYPE c VALUE '1',   "ohne Prüfung
  db_check               TYPE c VALUE '2',   "mit Prüfung gegen DB
  itab_check             TYPE c VALUE '3',   "mit Prüfung gegen ITAB
  user_check             TYPE c VALUE '4',   "mit Userexit-Prüfung
  user_help              TYPE c VALUE '5',   "mit Userexits und -help
  user_buttons           TYPE c VALUE '6',   "mit Userexits,-help,-but.
* Anzeigeattribute für Wertfelder
  norm_inp(02)           TYPE c VALUE ' ',   "Normal, eingabebereit
  bright_inp(02)         TYPE c VALUE '01',  "Hell, eingabebereit
  norm_noinp(02)         TYPE c VALUE '02',  "Normal, nicht eingabeber.
  bright_noinp(02)       TYPE c VALUE '03',  "Hell, nicht eingabeber.
  do_not_show(02)        TYPE c VALUE '04',  "nicht anzeigen
  show_2_dim(02)         TYPE c VALUE '05',  "normal, nicht eingabeber.
                                             "2-dimensional
* Vergleichsoperatoren
  cond_eq(02)            TYPE c VALUE 'EQ',  "Vgl.Operation =
  cond_ne(02)            TYPE c VALUE 'NE',  "Vgl.Operation <>
  cond_nc(02)            TYPE c VALUE 'NC',  "Vgl.Operation nicht prüfen
  cond_lt(02)            TYPE c VALUE 'LT',  "Vgl.Operation <
  cond_le(02)            TYPE c VALUE 'LE',  "Vgl.Operation <=
  cond_gt(02)            TYPE c VALUE 'GT',  "Vgl.Operation >
  cond_ge(02)            TYPE c VALUE 'GE',  "Vgl.Operation >=
* Routinennamenkonstanen für Exits, XYZ wird zur Laufzeit durch den
* Konvertierungsexitnamen ersetzt
  formconst_out(30)      TYPE c VALUE 'CONVERSION_EXIT_XYZ_OUTPUT',
  formconst_inp(30)      TYPE c VALUE 'CONVERSION_EXIT_XYZ_INPUT',
* Synonyme
  c_true                 TYPE xfeld VALUE 'X',              "049i
  yes                    TYPE c     VALUE '1',
  no                     TYPE c     VALUE '0'.

* Hilfspointer
FIELD-SYMBOLS: <h1>, <h2>.



* mk begin  ----------------------------------------------- "B20K043473
** Strukturen/Tabellen fuer Schnittstelle HELP_START         "B20K014551
DATA: BEGIN OF help_infos.                                  "B20K014551
        INCLUDE STRUCTURE help_info.                        "B20K014551
DATA: END OF help_infos.                                    "B20K014551
*DATA: BEGIN OF DYNPSELECT OCCURS 0.                         "B20K014551
*        INCLUDE STRUCTURE DSELC.                            "B20K014551
*DATA: END OF DYNPSELECT.                                    "B20K014551
*DATA: BEGIN OF DYNPVALUETAB OCCURS 0.                       "B20K014551
*        INCLUDE STRUCTURE DVAL.                             "B20K014551
*DATA: END OF DYNPVALUETAB.                                  "B20K014551
* mk end  ------------------------------------------------- "B20K043473

* Parameter fuer DYNP_VALUES_UPDATE
DATA: dyname      LIKE d020s-prog  VALUE 'SAPLSPO4',
      dynpro_no   LIKE d020s-dnum,
      BEGIN OF  dynpfields  OCCURS 1.
        INCLUDE STRUCTURE dynpread.
DATA: END OF dynpfields.

DATA: h_index LIKE sy-tabix.

* Parameter fuer HELP_OBJECT_SHOW_FOR_FIELD                 "B20K043473
DATA: batch_input LIKE help_info-dynprofld                  "B20K043473
                  VALUE 'SVALD-VALUE',                      "B20K043473
      BEGIN OF links OCCURS 0.                              "B20K043473
        INCLUDE STRUCTURE tline.                            "B20K043473
DATA: END OF links.                                         "B20K043473
DATA: h_title LIKE dsyst-doktitle.                          "B20K043473

DATA: update_flag(1) TYPE c.                                "B20K052439

* Eclude-Tabelle für Status dynp_3_4                        "B20K062235
DATA: BEGIN OF exclude OCCURS 10,                           "B20K062235
        func LIKE rsnewleng-fcode,                          "B20K062235
      END OF exclude.                                       "B20K062235

* Hilfsfelder, werden benötigt für F4-Hilfe nach Namensraumverlängerung
DATA: help_fieldname   LIKE help_info-fieldname,            "B20K069688
      help_field_star  TYPE c,
      help_type_single TYPE c.


* INCLUDE LZFUNCGOPD...                      " Local class definition

步骤三:将函数里缺失的FORM以及MODULE按照以下代码补全即可(以下代码均可直接复制粘贴,无需修改任何代码,简单快捷)

首先是ZPOPUP_GET_VALUES_LONG_TEXT函数的源码(可直接复制粘贴)

FUNCTION ZPOPUP_GET_VALUES_LONG_TEXT.
*"----------------------------------------------------------------------
*"*"本地接口:
*"  IMPORTING
*"     VALUE(NO_VALUE_CHECK) DEFAULT SPACE
*"     VALUE(POPUP_TITLE)
*"     VALUE(START_COLUMN) DEFAULT '5'
*"     VALUE(START_ROW) DEFAULT '5'
*"  EXPORTING
*"     VALUE(RETURNCODE)
*"  TABLES
*"      FIELDS STRUCTURE  ZSVAL
*"  EXCEPTIONS
*"      ERROR_IN_FIELDS
*"----------------------------------------------------------------------

  DATA: dummy TYPE c.
***Hilfe
  h_no_value_check = no_value_check.

* prüfen, ob lok. Ged. gesichert werden muß und Sicherungsparameter
* versorgen.
  PERFORM handle_save_data.

  kind_of_popup      = no_check.

* DDIC-Informationen lesen, Ausgabelänge des längsten Feldes für die
* spätere Bestimmung der Größe des Popups berechnenen, FIELDS über-
* prüfen und ggf. Ausnahme erzeugen.
  PERFORM prepare_and_check TABLES fields.

  nr_entries_to_show = quan_entries_100.

* Determine whether we use scroll bars or paging mode in    "*059i
* case too many entries are on the popup.                   "*059i
  PERFORM determine_paging_mode.                            "*059i

* Exclude Tabelle für Status füllen                        "B20K062235
  PERFORM fill_exclude.                                     "B20K062235

* Ok-Icon auf die Drucktaste bringen                       "B20K062235
  CLEAR ok_button_text.                                     "B20K062235
  PERFORM append_icon_to_button USING    icon_okay          "B20K062235
                                         dummy
                                         text-100           "009u cpl
                                CHANGING ok_button_text.    "B20K062235

* Koordinaten des Popups berechnen
  PERFORM comp_coord USING start_column start_row.

  text_title = popup_title.
  index_100  = 1.                                           "*053u
  first_line_100 = 1.                                       "*059i
  PERFORM call_popup.
  IF ok_code_save = 'CANC'.
    returncode = 'A'.
  ELSE.
*    übergebene Tabelle mit Werten füllen
    PERFORM fill_values TABLES fields.
    returncode = space.
  ENDIF.

* prüfen, ob lok. Ged. geholte werden muß und Sicherungsparameter
* versorgen.
  PERFORM handle_restore_data.
  CLEAR h_no_value_check.

ENDFUNCTION.

FORM handle_save_data.
* Die Routine prüft, ob das lokale Gedächtnis zu sichern ist und ruft
* die Sicherung ggf. auf. Außerdem werden die Steuerinformationen zur
* Sicherung versorgt.
*
* INPUT  SWAP_COUNTER             Anzahl bisheriger Aufrufe
*        SWAP                     Tab. mit Ids der bisherigen Aufrufe
* INPUT  SWAP_COUNTER             Anzahl aktueller Aufrufe
*        SWAP                     Tab. mit Ids der aktuellen Aufrufe
*
  IF swap_counter > 0.
    READ TABLE swap INDEX 1.
    PERFORM save_global_date USING swap-time.
  ENDIF.
  swap_counter = swap_counter + 1.
  swap-time    = sy-uzeit.
  INSERT swap INDEX 1.
ENDFORM.                    "HANDLE_SAVE_DATA

FORM save_global_date USING id.
* Die Routine sichert das aktuelle lokale Gedächtnis
*
* INPUT  ID                       Id unter der das lok. Ged. gesichert
*                                 werden soll.
  EXPORT svali
         sval_not
         ifields
         diff_tab
         start_row_100
         start_column_100
         end_row_100
         end_column_100
*        first_time_100                                     "*053d
*        answer_100                                         "*053d
         first_line_100                               "*053d"*059i
         index_100
         quan_entries_100
         gv_use_paging                                      "*059i
*        quan_loops_100                                     "*053d
         nr_entries_to_show
         max_field_length
         cur_field
         cur_line
         cur_offset
         kind_of_popup
         text_title
         int_check_existence
         program_name
         f1_program_name
         f4_program_name
         form_name
         f1_form_name
         f4_form_name
         ok_button_text
         1st_button
         2nd_button
         ok_code_save
         g_no_check_for_fixed_values                              "mk
         g_no_alpha_exit_for_type_n                               "mk
         exclude "2075263

         TO MEMORY ID id.

  program_name    = space.
  f1_program_name = space.
  f4_program_name = space.
  form_name       = space.
  f1_form_name    = space.
  f4_form_name    = space.
  ok_button_text  = space.
  1st_button      = space.
  2nd_button      = space.

ENDFORM.                    "SAVE_GLOBAL_DATE

FORM prepare_and_check TABLES fields STRUCTURE zsval.
* Die Routine bestimmt zu den übergebenen Feldern die DDIC-Informationen
* und bestimmt die Ausgabelänge des längsten Feldes für die spätere
* Bestimmung der Größe des Popups.
* Außerdem werden die übergebenen Felder geprüft und bei Fehlern die
* Ausnahme ERROR_IN_FIELDS mit MESSAGE E... RAISING ... erzeugt.
* Die Prüfung kann aus Performancegründen nicht von der Übernahme der
* Schnittstellenfelder und dem Lesen der DDIC-Information getrennt
* werden.
*
* INPUT  FIELDS                   Schnittstellenfelder
* OUTPUT SVALI                    Steploopzeilen und zus. Infos
*        SVAL_NOT                 nicht anzuzeigende Felder
*        DIFF_TAB                 unterschiedliche Tabellen in Fields
*        QUAN_ENTRIES_100         Anz. Zeilen in SVALI

  DATA:
    tabname_old LIKE dfies-tabname,
    h_intlen    TYPE i,
    h_offset    TYPE i,
    h_i         TYPE i.

  REFRESH diff_tab.
  REFRESH svali.
  tabname_old = space.
  LOOP AT fields.
    IF fields-tabname <> tabname_old.
      tabname_old = fields-tabname.
      READ TABLE diff_tab WITH KEY fields-tabname.
      IF sy-subrc <> 0.
        CLEAR diff_tab.
        diff_tab-tabname = fields-tabname.
        IF fields-comp_tab <> space AND
           ( fields-comp_code = space OR fields-comp_code = 'EQ' ).
          diff_tab-ref = 'X'.
        ENDIF.
        APPEND diff_tab.
      ENDIF.
    ENDIF.

*   prüfen, ob Feld mehrfach angegeben wurde
    key_all_fields-tabname     = fields-tabname.
    key_all_fields-fieldname   = fields-fieldname.
    READ TABLE svali WITH KEY key_all_fields.
    IF sy-subrc = 0.
      MESSAGE e108 WITH fields-fieldname fields-tabname
                        RAISING error_in_fields.
    ENDIF.

    IF kind_of_popup =  db_check OR
       kind_of_popup =  itab_check.
*      prüfen, ob Vergleichsoperator zulässig.
      IF fields-comp_code = space.
        fields-comp_code = cond_eq.
      ELSEIF  fields-comp_code <> cond_eq AND
              fields-comp_code <> cond_ne AND
              fields-comp_code <> cond_nc AND
              fields-comp_code <> cond_lt AND
              fields-comp_code <> cond_le AND
              fields-comp_code <> cond_gt AND
              fields-comp_code <> cond_ge.
        MESSAGE e109 WITH fields-comp_code fields-fieldname
                          fields-tabname
                          RAISING error_in_fields.
      ENDIF.
*      Wenn ein Referenzfeld angegeben wird, dann darf dieses Feld
*      nicht angezeigt werden.
      IF fields-comp_tab <> space AND fields-field_attr <> do_not_show.
        MESSAGE e112 WITH fields-tabname fields-fieldname
                          RAISING error_in_fields.
      ENDIF.
    ENDIF.

    CLEAR svali.
    svali-tabname      =  fields-tabname.
    svali-fieldname    =  fields-fieldname.
    svali-value        =  fields-value.
    IF fields-fieldtext <> space.
      svali-scrtext_m    =  fields-fieldtext.
    ENDIF.

    svali-field_attr   =  fields-field_attr.
    IF fields-field_obl <> space.
      svali-field_obl = 'X'.
    ELSE.
      svali-field_obl = space.
    ENDIF.
    svali-comp_code    =  fields-comp_code.
    svali-comp_tab     =  fields-comp_tab.
    svali-comp_field   =  fields-comp_field.
    svali-novaluehlp   =  fields-novaluehlp.
    APPEND svali.
  ENDLOOP.

  LOOP AT diff_tab.
    IF diff_tab-tabname(1) = '*'.
      h_tabname = diff_tab-tabname+1.
    ELSE.
      h_tabname = diff_tab-tabname.
    ENDIF.
    READ TABLE all_fields WITH KEY h_tabname BINARY SEARCH.
    IF sy-subrc NE 0.
*     NAMETAB für Felder wurde noch nicht gelesen
      DATA: l_tabname TYPE ddobjname.
      MOVE h_tabname TO l_tabname.
      CALL FUNCTION 'DDIF_FIELDINFO_GET'
        EXPORTING
          tabname              = l_tabname
*         FIELDNAME            = ' '
*         LANGU                = SY-LANGU
*         LFIELDNAME           = ' '
*         ALL_TYPES            = ' '
*       IMPORTING
*         X030L_WA             =
*         DDOBJTYPE            =
*         DFIES_WA             =
*         LINES_DESCR          =
        TABLES
          dfies_tab            = fieldtab
*         FIXED_VALUES         =
        EXCEPTIONS
          not_found            = 1
          internal_error       = 2
          OTHERS               = 3.
      IF sy-subrc = 0.
* 012+ cpl
* offset must be specified in characters but dfies returns bytes
* causes problems in UNICODE environment
        h_offset = 0.
        SORT fieldtab BY position.
        LOOP AT fieldtab.
          fieldtab-offset = h_offset.
          ADD fieldtab-leng TO h_offset.
          MODIFY fieldtab.
        ENDLOOP.
* 012- cpl
        h_offset = 0.
        LOOP AT fieldtab.
          all_fields = fieldtab.
          APPEND all_fields.
          IF kind_of_popup = db_check.
            IF h_offset < fieldtab-offset.
              h_offset = fieldtab-offset.
              h_intlen = fieldtab-intlen.
            ENDIF.
          ENDIF.
        ENDLOOP.
        IF kind_of_popup = db_check.
          diff_tab-length = h_offset + h_intlen + 8.
          MODIFY diff_tab.
        ENDIF.
      ELSE.
        EXIT.
      ENDIF.
    ELSE.
      IF kind_of_popup = db_check.
        h_offset = 0.
        LOOP AT all_fields WHERE tabname = h_tabname.
          IF h_offset < all_fields-offset.
            h_offset = all_fields-offset.
            h_intlen = all_fields-intlen.
          ENDIF.
        ENDLOOP.
        diff_tab-length = h_offset + h_intlen + 8.
        MODIFY diff_tab.
      ENDIF.
    ENDIF.
  ENDLOOP.
  CASE sy-subrc.
    WHEN 6.
      MESSAGE e100 WITH diff_tab-tabname RAISING error_in_fields.
    WHEN 8.
      MESSAGE e102 WITH diff_tab-tabname RAISING error_in_fields.
    WHEN 9.
      MESSAGE e103 WITH diff_tab-tabname RAISING error_in_fields.
  ENDCASE.

  SORT all_fields BY tabname fieldname.
  max_field_length = 0.
  REFRESH sval_not.

  LOOP AT svali.
*   SVALI-Zeilen vervollständigen
    IF svali-tabname(1) = '*'.
      h_tabname = svali-tabname+1.
    ELSE.
      h_tabname = svali-tabname.
    ENDIF.
    key_all_fields-tabname     = h_tabname.
    key_all_fields-fieldname   = svali-fieldname.
    READ TABLE all_fields WITH KEY key_all_fields BINARY SEARCH.
    IF sy-subrc NE 0.
*      Feld gehört nicht zur Tabelle
      MESSAGE e104 WITH svali-fieldname svali-tabname
                   RAISING error_in_fields.
    ENDIF.

*   if all_fields-inttype cn 'CNTD'.                              "mk
*   Typ F ist zwar im Prinzip unterstützt, wird aber abgeklemmt,
*   weil nur 15 Nachkommastellen unterstützt werden,
*   der ABAP aber inzwischen bis zu 17 Stellen unterstützt
*   (je nach Bedarf...)
    IF all_fields-inttype CN 'CNTDIXPbs8'
    OR all_fields-datatype = 'RAW'.
*      ungültiger Typ
      MESSAGE e105 WITH all_fields-inttype
                        svali-fieldname svali-tabname
                   RAISING error_in_fields.
    ENDIF.

    IF all_fields-outputlen > max_field_allowed AND
       svali-field_attr    <> do_not_show.
*      Ausgabelänge ist größer als vorgesehen
*016d+
*      message e106 with svali-fieldname svali-tabname max_field_allowed
*                   raising error_in_fields.
*016d-
*016i+
      svali-outputlen  = max_field_allowed.
    ELSE.
      svali-outputlen  = all_fields-outputlen.
*016i-
    ENDIF.

*   Länge des längsten anzuzeigenden Feldes bestimmen
    IF max_field_length < all_fields-outputlen AND
       svali-field_attr <> do_not_show.
      max_field_length = all_fields-outputlen.
    ENDIF.

    svali-position   = all_fields-position.
    svali-offset     = all_fields-offset.
    svali-keyflag    = all_fields-keyflag.
    svali-checktable = all_fields-checktable.
    svali-inttype    = all_fields-inttype.
*   Unter UNICODE enthält 'intlen' die Länge in bytes
*   benötigt wird aber (z.B. für Konvertierungsexit) die interne Länge *
*   in Zeichen
*   if all_fields-datatype = 'CHAR'.                        "*012d
*012i+
    svali-leng       = all_fields-leng.
*012i-
    svali-intlen     = all_fields-intlen.
    svali-scrlen1    = all_fields-scrlen1.
    svali-scrlen2    = all_fields-scrlen2.
    svali-scrlen3    = all_fields-scrlen3.
    svali-datatype   = all_fields-datatype.
    svali-leng       = all_fields-leng.
*   svali-outputlen  = all_fields-outputlen.               "*016d
    svali-lowercase  = all_fields-lowercase.
    svali-convexit   = all_fields-convexit.
    svali-scrtext_s  = all_fields-scrtext_s.
    svali-domname    = all_fields-domname.
    svali-valexi     = all_fields-valexi.
    svali-sign       = all_fields-sign.                     "mk
    svali-decimals   = all_fields-decimals.                 "mk
    svali-reftable   = all_fields-reftable.                 "B20K058473
    svali-reffield   = all_fields-reffield.                 "B20K058473
    svali-f4availabl = all_fields-f4availabl.               "B20K081005
    IF svali-scrtext_m = space.
      IF all_fields-scrtext_m <> space.
        svali-scrtext_m  = all_fields-scrtext_m.
      ELSEIF all_fields-scrtext_s <> space.
        svali-scrtext_m  = all_fields-scrtext_s.
      ELSEIF all_fields-scrtext_l <> space.
        svali-scrtext_m  = all_fields-scrtext_l.
      ELSE.
        svali-scrtext_m  = all_fields-fieldname.
      ENDIF.
    ENDIF.
    svali-scrtext_l  = all_fields-scrtext_l.
*   ggf. SVAL_NOT ergänzen und Feld aus SVALI entfernen
    IF svali-field_attr = do_not_show.
      CLEAR sval_not.
      sval_not = svali.
      APPEND sval_not.
      DELETE svali.
    ELSE.
      MODIFY svali.
    ENDIF.
  ENDLOOP.

* Prüfen, ob Eingabefeld größer als sichtbare Schablone ist

  IF max_field_length > max_field_visible.                  "cpl
    max_field_length = max_field_visible.                   "cpl
  ENDIF.                                                    "cpl


* prüfen, ob die Vergleichsfelder angegeben wurden
  LOOP AT sval_not WHERE comp_tab <> space.
    key_all_fields-tabname     = sval_not-comp_tab.
    key_all_fields-fieldname   = sval_not-comp_field.
    READ TABLE svali WITH KEY key_all_fields.
    IF sy-subrc <> 0.
      MESSAGE e113 WITH sval_not-comp_tab sval_not-comp_field
                        fields-tabname fields-fieldname
                        RAISING error_in_fields.
    ENDIF.
  ENDLOOP.

  DESCRIBE TABLE svali LINES quan_entries_100.
  IF quan_entries_100 = 0.
*    keine Felder zum anzeigen vorhanden
    MESSAGE e107 RAISING error_in_fields.
  ENDIF.
ENDFORM.                    "prepare_and_check

FORM determine_paging_mode.                                 "*059i+

  IF quan_entries_100 > max_lines_for_scroll
* In case we have too many lines for the scrollbars
* to handle we need to switch to the old paging mode.
  OR NOT sy-binpt IS INITIAL.
* In the batch-input scenario we always want the old
* behaviour.
    gv_use_paging = c_true.
  ELSE.
    CLEAR gv_use_paging.
  ENDIF.

ENDFORM.                    "determine_paging_mode          "*059i-

FORM fill_exclude.

  CLEAR exclude.
  REFRESH exclude.

  IF NOT kind_of_popup EQ user_buttons.
    exclude                   = 'COD1'.
    APPEND exclude.
    exclude                   = 'COD2'.
    APPEND exclude.
  ELSE.
    IF 1st_button = space.
      exclude                   = 'COD1'.
      APPEND exclude.
    ENDIF.
    IF 2nd_button = space.
      exclude                   = 'COD2'.
      APPEND exclude.
    ENDIF.
  ENDIF.

  IF gv_use_paging IS INITIAL                               "*059u
  OR quan_entries_100 <= max_fields_in_loop.                "*059u
*  ELSE.                                              "*054i"*059d
    exclude                   = 'P--'.
    APPEND exclude.
    exclude                   = 'P-'.
    APPEND exclude.
    exclude                   = 'P+'.
    APPEND exclude.
    exclude                   = 'P++'.
    APPEND exclude.
  ENDIF.                                              "*053d"*054i

ENDFORM.                               " FILL_EXCLUDE

FORM append_icon_to_button USING    p_button_icon
                                    p_button_text
                                    p_button_quickinfo
                           CHANGING p_button STRUCTURE smp_dyntxt.
  CLEAR p_button.
  IF p_button_icon IS INITIAL.
    MOVE p_button_text TO p_button-text.
    IF NOT p_button_quickinfo IS INITIAL.
      MOVE p_button_quickinfo TO p_button-quickinfo.
    ENDIF.
  ELSE.
    MOVE p_button_icon TO p_button-icon_id.
    MOVE p_button_text TO p_button-icon_text.
    IF NOT p_button_quickinfo IS INITIAL.
      MOVE p_button_quickinfo TO p_button-text.
    ENDIF.
  ENDIF.

ENDFORM.                               " APPEND_ICON_TO_BUTTON

FORM comp_coord USING start_column start_row.
* Die Routine berechnet die Koordinaten des Popups.
*
* INPUT  START_COLUMN             Startspalte
*        START_ROW                Startzeile
* OUTPUT START_COLUMN_100         Startspalte
*        START_ROW_100            Startzeile
*        END_COLUMN_100           Endspalte
*        END_ROW_100              Endzeile

  IF 1st_button = space AND 2nd_button = space.
    IF max_field_length < 3.
      max_field_length = 3.
    ENDIF.
  ELSEIF 1st_button <> space AND 2nd_button = space.
    IF max_field_length < 13.
      max_field_length = 13.
    ENDIF.
  ELSEIF 1st_button <> space AND 2nd_button <> space.
    IF max_field_length < 28.
      max_field_length = 28.
    ENDIF.
  ENDIF.

  start_row_100    = start_row.
  start_column_100 = start_column.

  end_column_100   =   start_column_100
                     + max_field_length
                     + const_popup_width.

  IF quan_entries_100 > max_fields_in_loop.
    end_row_100    =  start_row_100
*                    + 2
*                    + 1                                   "B20K062235
                    + max_fields_in_loop. "letzte Zeile = Leerzeile
  ELSE.
    end_row_100    =  start_row_100
                    + quan_entries_100
*                    + 1.                                  "B20K062235
*                    + 2.                  "letzte Zeile = Leerzeile
                       .
  ENDIF.

ENDFORM.                    "COMP_COORD

FORM call_popup.
  cur_field = space.

  IF  quan_entries_100 <= max_fields_in_loop.        "*053u+"*054u+
* In Batch-Input the old screen 300 still has to be called.
*       ohne Blättermodus
    CALL SCREEN 300 STARTING AT start_column_100 start_row_100
                    ENDING   AT end_column_100   end_row_100.
  ELSE.
*       mit Blättermodus
    CALL SCREEN 400 STARTING AT start_column_100 start_row_100
                    ENDING   AT end_column_100   end_row_100.
  ENDIF.                                             "*053u-"*054u-
  EXIT.

ENDFORM.                    "CALL_POPUP


FORM fill_values TABLES fields STRUCTURE zsval.
* Die Routine übernimmt die Werte aus der internen Tabelle SVALI und
* übergibt diese an die Tabelle FIELDS.
*
* INPUT  SVALI                    Steploopzeilen mit angegebenen Werten
* OUTPUT FIELDS                   Schnittstellenfelder

  DATA: BEGIN OF key_svali,
          tabname   LIKE dfies-tabname,
          fieldname LIKE dfies-fieldname,
        END OF key_svali.


  LOOP AT fields.
    IF fields-field_attr = do_not_show AND
       fields-comp_tab  <> space.
      key_svali-tabname   = fields-comp_tab.
      key_svali-fieldname = fields-comp_field.
    ELSE.
      key_svali-tabname   = fields-tabname.
      key_svali-fieldname = fields-fieldname.
    ENDIF.
    READ TABLE svali WITH KEY key_svali.

    IF sy-subrc = 0.
      IF fields-value <> svali-value.
        fields-value = svali-value.
        MODIFY fields.
      ENDIF.
    ENDIF.
  ENDLOOP.
ENDFORM.                    "FILL_VALUES

FORM handle_restore_data.
* Die Routine bereinigt die Steuerinformationen zur Sicherung des
* lokalen Gedächtnis und ruft ggf. die Restore-Routine auf.
*
* INPUT  SWAP_COUNTER             Anzahl aktueller Aufrufe
*        SWAP                     Tab. mit Ids der aktuellen Aufrufe
* INPUT  SWAP_COUNTER             Anzahl Aufrufe ohne den aktuellen
*        SWAP                     Tab. mit Ids der Aufrufe ohne den
*                                 aktuellen
  DELETE swap INDEX 1.
  IF swap_counter > 1.
    READ TABLE swap INDEX 1.
    PERFORM restore_global_date USING swap-time.
  ENDIF.
  swap_counter = swap_counter - 1.
ENDFORM.                    "HANDLE_RESTORE_DATA

FORM restore_global_date USING id.
* Die Routine holt das letzte lokale Gedächtnis zurück.
*
* INPUT  ID                       Id unter der das lok. Ged. gesichert
*                                 wurde
* OUTPUT lokales Gedächtnis
  IMPORT svali
         sval_not
         ifields
         diff_tab
         start_row_100
         start_column_100
         end_row_100
         end_column_100
*        first_time_100                                     "*053d
*        answer_100                                         "*053d
         first_line_100                               "*053d"*059i
         index_100
         quan_entries_100
         gv_use_paging                                      "*059i
*        quan_loops_100                                     "*053d
         nr_entries_to_show
         max_field_length
         cur_field
         cur_line
         cur_offset
         kind_of_popup
         text_title
         int_check_existence
         program_name
         f1_program_name
         f4_program_name
         form_name
         f1_form_name
         f4_form_name
         ok_button_text
         1st_button
         2nd_button
         ok_code_save
         g_no_check_for_fixed_values                              "mk
         g_no_alpha_exit_for_type_n                               "mk
         exclude "2075263

         FROM MEMORY ID id.
ENDFORM.                    "RESTORE_GLOBAL_DATE

接下来是补全屏幕0300和屏幕0400的代码:

先是MODULE(此处我将屏幕用到的所有MODULE放在一个包含文件下了,我不在乎结构,只在乎函数实现的功能,有需要的可以按照规定分类存放。)

*----------------------------------------------------------------------*
***INCLUDE LZFUNCGOPO01.
*----------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*& Module P300_INIT OUTPUT
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
MODULE P300_INIT OUTPUT.
  PERFORM p300_init.
ENDMODULE.

MODULE p100_show OUTPUT.
  PERFORM p100_show.
ENDMODULE.                    "P100_SHOW OUTPUT

MODULE p100_set_cursor OUTPUT.
  IF cur_field <> space.
    SET CURSOR FIELD  cur_field
               LINE   cur_line
               OFFSET cur_offset.
  ENDIF.
  cur_field   = space.
  cur_line    = 0.
  cur_offset  = 0.
  error_tab   = space.
  error_field = space.
ENDMODULE.                    "P100_SET_CURSOR OUTPUT

MODULE p100_leave.

  PERFORM p100_leave.                                       "*053u

ENDMODULE.                                                  "P100_LEAVE

MODULE clear_update_flag.                                   "B20K052439
  CLEAR update_flag.                                        "B20K052439
ENDMODULE.                                                  "B20K052439

MODULE p100_get.
  PERFORM p100_get.
  update_flag = 'X'.                                        "B20K052439
ENDMODULE.                                                  "P100_GET

MODULE p100_get_new.                                        "B20K052439
  IF update_flag = space.                                   "B20K052439
    IF h_no_value_check = space.                            "B20K052439
      PERFORM p100_get.                                     "B20K052439
    ENDIF.                                                  "B20K052439
  ENDIF.                                                    "B20K052439
ENDMODULE.                                                  "B20K052439

MODULE p100_code.

  PERFORM p100_code.                                        "*049i

ENDMODULE.                                        "P100_CODE"*049i

MODULE p100_value.

  PERFORM p100_value.                                       "*059u

ENDMODULE.                                                  "p100_value

MODULE p100_help.

  PERFORM p100_help.                                        "*059u

ENDMODULE.                                                  "P100_HELP

MODULE d400_list_param OUTPUT.                              "*059i-

  PERFORM d400_list_param.

ENDMODULE.                    "d400_list_param OUTPUT       "*059i+

*&--------------------------------------------------------------------*
*&      Form  d400_list_param
*&--------------------------------------------------------------------*
*       text
*---------------------------------------------------------------------*
FORM d400_list_param.                                       "*059i+

  index_100 = first_line_100.

ENDFORM.                    "d400_list_param                "*059i-

可以看到上面的MODULE缺了很多FORM,在此处我也把这些FORM补全在一个包含文件下了,目的同上

*----------------------------------------------------------------------*
***INCLUDE LZFUNCGOPF01.
*----------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*& Form p300_init
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM P300_INIT .
  SET TITLEBAR '100' WITH TEXT_TITLE.
  SET PF-STATUS 'DYNP_3_4' EXCLUDING EXCLUDE.
ENDFORM.

FORM p100_show.
  DATA: f TYPE f.
  DATA: p(16) TYPE p.
  FIELD-SYMBOLS <p>.

* READ TABLE svali INDEX index_100.                         "*053u
* IF sy-subrc = 0.                                          "*053d

  IF NOT gv_use_paging IS INITIAL.                          "*059i+
    IF sy-stepl > max_fields_in_loop.
      EXIT FROM STEP-LOOP.
    ENDIF.
  ENDIF.                                                    "*059i-

  zsvald-keytext = svali-scrtext_m.
  CLEAR zsvald-value.
  IF svali-convexit <> space.
*      Konvertierungsexit zieht immer
    h_formname = formconst_out.
    REPLACE 'XYZ' WITH svali-convexit INTO h_formname.
    CONDENSE h_formname NO-GAPS.
*      falls der Name des Exits nicht 5-stellig ist
    CASE svali-inttype.                                     "B20K8A0A60
      WHEN 'P'.                                             "B20K8A0A60
        ASSIGN p TO <h1> TYPE 'P' DECIMALS svali-decimals.  "B20K8A0A60
        <h1> = svali-value.                                 "B20K8A0A60
      WHEN OTHERS.                                          "B20K8A0A60
* 012+ cpl
*           assign svali-value(svali-intlen) to <h1>.
          DATA len type i.                                    "*067i+
          DESCRIBE FIELD svali-value LENGTH len IN CHARACTER MODE.
          IF svali-leng > len.
            svali-leng = len.
          ENDIF.                                              "*067i-
          ASSIGN svali-value(svali-leng) TO <h1>.
* 012- cpl
    ENDCASE.                                                "B20K8A0A60
    ASSIGN zsvald-value(svali-outputlen) TO <h2>.
    CALL FUNCTION h_formname
      EXPORTING
        input  = <h1>
      IMPORTING
        output = <h2>.
  ELSEIF svali-value <> space.                      "*028d"*035i
*   ELSE.                                             "*028i"*035d
    CASE svali-inttype. "#EC CI_UTCL_OK
      WHEN 'D'.
        CASE h_no_value_check.                              "B20K052439
          WHEN 'X'.                                         "B20K052439
            h_date_c = svali-value.                         "B20K052439
            WRITE h_date_c TO zsvald-value.                  "B20K052439
          WHEN OTHERS.                                      "B20K052439
            h_date = svali-value.
            WRITE h_date TO zsvald-value DD/MM/YYYY.
        ENDCASE.                                            "B20K052439
      WHEN 'T'.
        CASE h_no_value_check.                              "B20K052439
          WHEN 'X'.                                         "B20K052439
            h_time_c = svali-value.                         "B20K052439
            WRITE h_time_c TO zsvald-value.                  "B20K052439
          WHEN OTHERS.                                      "B20K052439
            WRITE svali-value TO zsvald-value USING EDIT MASK '__:__:__'.
        ENDCASE.                                            "B20K052439
      WHEN 'F'.
        f = svali-value.
        WRITE f TO zsvald-value(svali-outputlen) DECIMALS 15.
      WHEN 'P'.

* cpl. Korrekte Anzahl von Nachkommastellen für
*      Währungs- und Mengenfelder
* Korrektur "B20K058473

        ASSIGN p TO <p> TYPE 'P' DECIMALS svali-decimals.
        <p> = svali-value.

        CASE svali-datatype.
          WHEN 'CURR'.
            CLEAR wa_svali.
            READ TABLE svali WITH KEY
                  tabname   = svali-reftable
                  fieldname = svali-reffield
                  INTO wa_svali.
            IF sy-subrc = 0.
              WRITE <p> TO zsvald-value(svali-outputlen)
                           CURRENCY wa_svali-value.
*017d+
* Mittlerweile ist bei Währungen eine Rückkonvertierung möglich.
** Wenn Währungskonvertierung, dann nicht eingabebereit!
** Währungskonvertierung rückwärts nicht möglich!
** Funktionsbausteine und Tabellen im Basissystem nicht vorhanden!
*                svali-field_attr = norm_noinp.              "B20K064644
*017d-
*               modify svali index index_100.    "B20K064644 "*001d
            ELSE.
              CLEAR wa_svali.
              READ TABLE sval_not WITH KEY
                    tabname   = svali-reftable
                    fieldname = svali-reffield
                    INTO wa_svali.
              IF sy-subrc = 0.
                WRITE <p> TO zsvald-value(svali-outputlen)
                             CURRENCY wa_svali-value.
*                 svali-field_attr = norm_noinp. "B20K064644"*017d
*                 modify svali index index_100.  "B20K064644"*001d
              ELSE.
                svali-field_attr = norm_noinp.              "*017i
                MODIFY svali INDEX index_100.       "*028i"*053u
                WRITE <p> TO zsvald-value(svali-outputlen).
              ENDIF.
            ENDIF.

          WHEN 'QUAN'.
            CLEAR wa_svali.
            READ TABLE svali WITH KEY
                  tabname   = svali-reftable
                  fieldname = svali-reffield
                  INTO wa_svali.
            IF sy-subrc = 0.
              WRITE <p> TO zsvald-value(svali-outputlen)
                           UNIT wa_svali-value.
            ELSE.
              CLEAR wa_svali.
              READ TABLE sval_not WITH KEY
                    tabname   = svali-reftable
                    fieldname = svali-reffield
                    INTO wa_svali.
              IF sy-subrc = 0.
                WRITE <p> TO zsvald-value(svali-outputlen)
                             UNIT wa_svali-value.
              ELSE.
                WRITE <p> TO zsvald-value(svali-outputlen).
              ENDIF.
            ENDIF.

* Einschub Ende

          WHEN OTHERS.                                      "B20K058473
*           assign p to <p> type 'P' decimals svali-decimals.
*           <p> = svali-value.
            WRITE <p> TO zsvald-value(svali-outputlen).
        ENDCASE.                                            "B20K058473
      WHEN OTHERS.
        zsvald-value = svali-value.
        IF svali-inttype CA 'XIbs8'.                       "Integer
          CONDENSE zsvald-value.
        ENDIF.
    ENDCASE.
  ELSEIF svali-inttype  = 'P'                               "*035i
  AND    svali-datatype = 'CURR'.                           "*035i
* Wenn zu einem (auch leeren) Währungsfeld kein             "*035i
* Währungsschlüssel angegeben wird, darf dieses             "*035i
* Feld nicht eingabebereit sein, da dann keine              "*035i
* Rückkonvertierung möglich ist.                            "*035i
    READ TABLE svali WITH KEY                               "*035i
         tabname   = svali-reftable                         "*035i
         fieldname = svali-reffield                         "*035i
         TRANSPORTING NO FIELDS.                            "*035i
    IF sy-subrc <> 0.                                       "*035i
      READ TABLE sval_not WITH KEY                          "*035i
           tabname   = svali-reftable                       "*035i
           fieldname = svali-reffield                       "*035i
           TRANSPORTING NO FIELDS.                          "*035i
      IF sy-subrc <> 0.                                     "*035i
        svali-field_attr = norm_noinp.                      "*035i
        MODIFY svali INDEX index_100.                 "*035i"*053u
      ENDIF.                                                "*035i
    ENDIF.                                                  "*035i
  ENDIF.

*    Mußfelder berücksichtigen
  IF svali-field_obl = 'X' AND zsvald-value = space.
    zsvald-value(1) = '?'.
  ENDIF.
*    Cursorposition bestimmen
  IF error_tab = svali-tabname AND cur_line = 0 AND
     ( error_field = svali-fieldname OR error_field = space ).
    IF ( svali-field_attr <> norm_noinp   AND
         svali-field_attr <> bright_noinp AND
         svali-field_attr <> show_2_dim  ) OR error_field <> space.
      cur_field   = 'ZSVALD-VALUE'.
      cur_line    = sy-stepl.
      error_tab   = space.
      error_field = space.
    ENDIF.
  ENDIF.
*   index_100     = index_100 + 1.                          "*053d
* ELSE.                                                     "*053d
*   EXIT FROM STEP-LOOP.                                    "*053d
* ENDIF.                                                    "*053d

  LOOP AT SCREEN.
    CASE screen-name.
      WHEN 'ZSVALD-VALUE'.
        IF h_no_value_check = 'X'                           "B20K052439
           AND svali-inttype = 'D'.                         "B20K052439
          screen-length = 8.                                "B20K052439
          screen-value_help = no.                           "B20K052439
        ELSEIF h_no_value_check = 'X'                       "B20K052439
           AND svali-inttype = 'T'.                         "B20K052439
          screen-length = 6.                                "B20K052439
          screen-value_help = no.                           "B20K052439
        ELSE.                                               "B20K052439
          screen-length = svali-outputlen.
        ENDIF.                                              "B20K052439
        CASE svali-field_attr.
          WHEN norm_inp.
          WHEN bright_inp.
            screen-intensified = yes.
          WHEN norm_noinp.
            screen-input       = no.
          WHEN bright_noinp.
            screen-intensified = yes.
            screen-input       = no.
          WHEN show_2_dim.
            screen-input       = no.
            screen-display_3d  = no.
            screen-value_help  = no.
        ENDCASE.
        IF svali-field_obl = 'X'.
          screen-required = yes.
        ENDIF.
        IF svali-novaluehlp = 'X'.
          screen-value_help = no.
        ELSEIF svali-f4availabl IS INITIAL.                 "B20K081005
          IF     (   kind_of_popup    = user_help           "B20K081005
                 AND f4_program_name <> space )             "B20K081005
              OR (   kind_of_popup    = user_buttons        "B20K081005
                 AND f4_program_name <> space ).            "B20K081005
          ELSE.                                             "B20K081005
            screen-value_help = no.                         "B20K081005
          ENDIF.
        ENDIF.
      WHEN 'SVALD-KEYTEXT'.
        IF svali-field_attr  = bright_inp   OR
           svali-field_attr  = bright_noinp.
          screen-intensified = yes.
        ENDIF.
    ENDCASE.
    MODIFY SCREEN.
  ENDLOOP.

ENDFORM.                                                    "p100_show

FORM p100_leave.                                            "*053i+

  IF ok_code = 'CANC'.
    ok_code_save = ok_code.
    CLEAR ok_code.
    SET SCREEN 0.
    LEAVE SCREEN.
  ENDIF.

ENDFORM.                               "p100_leave          "*053i-

FORM p100_get.

*    kein Blättermodus
* index_100 = first_line_100 + sy-stepl - 1.                "*053d
  READ TABLE svali INDEX index_100.
  IF sy-subrc = 0.

*017d+
** B20K064644
** Extraschleife für das Einlesen von Währungsfeldern.
** Wenn Währungsfeld und nicht eingabebereit, dann keine Konvertierung
** der Ausgabe, sondern alten Wert vor Ausgabe nehmen.
*
*   IF svali-datatype = 'CURR'.
* Wenn ein Feld nicht eingabebereit ist, können wir den     "*028i
* alten Stand lassen wie er ist.                            "*028i
    IF svali-field_attr = norm_noinp.                       "*028i
      EXIT.                                                 "*028i
    ENDIF.                                                  "*028i
*   ENDIF.
** Ende der Schleife
** B20K064644
*017d-

* Coding steht jetzt im folgenden Unterprogramm 006 012 017 "*043d
    PERFORM convert_and_update_svali                        "*043i
            USING zsvald-value.                              "*043i

*    ----- Festwerte pruefen -------------------------
    IF svali-valexi <> space AND svali-value <> space
    AND g_no_check_for_fixed_values = space
    AND h_no_value_check = space.                           "B20K068565
*       Feld hat Festwerte, die überprüft werden müssen
      h_value_found = no.
      condense svali-value.                                 "1052607
      h_domvalue = svali-value.
      SELECT * FROM dd07l WHERE domname  = svali-domname
                            AND as4local = 'A'.
        IF dd07l-domvalue_h = space.
          IF h_domvalue = dd07l-domvalue_l.
            h_value_found = yes.
            EXIT.
          ENDIF.
        ELSE.
          data lv_num type n length 10.                    "1408734 >>
          if h_domvalue       co '0123456789 ' and
             dd07l-domvalue_l co '0123456789 ' and
             dd07l-domvalue_h co '0123456789 '.
            h_domvalue       = lv_num = h_domvalue.
            dd07l-domvalue_l = lv_num = dd07l-domvalue_l.
            dd07l-domvalue_h = lv_num = dd07l-domvalue_h.
          endif.                                        "1408734 <<
          IF h_domvalue >= dd07l-domvalue_l AND
             h_domvalue <= dd07l-domvalue_h.
            h_value_found = yes.
            EXIT.
          ENDIF.
        ENDIF.
      ENDSELECT.
      IF h_value_found = no.
*          Bitte einen gültigen Wert angeben
        MESSAGE e124.
      ENDIF.
    ENDIF.

    MODIFY svali INDEX index_100.
  ENDIF.

ENDFORM.                                                    "p100_get

FORM convert_and_update_svali                               "*043i+
     USING value(iv_value).

  IF iv_value <> space.

    IF g_no_alpha_exit_for_type_n IS INITIAL
    OR svali-inttype <> 'N'.

*     IF h_no_value_check EQ space.                         "*017d
      IF h_no_value_check = space                           "*017i
      OR svali-datatype   = 'CURR'                          "*017i
      OR svali-datatype   = 'CUKY'.                         "*017i
* Währungsbeträge und Währungsschlüssel müssen immer        "*017i
* rückkonvertiert werden.                                   "*017i
*         Ist veraltet                                      "*006d+ CPL
*            perform conversion_input using     svald-value
*                                               svali-inttype
*                                               svali-datatype
*                                               svali-decimals
*                                               svali-convexit
*                                               svali-sign
*                                               svali-outputlen
*                                               svali-intlen
*                                               svali-lowercase
*                                     changing  svali-value."*006d- CPL
        PERFORM conversion_input_new                        "*006i CPL
                USING iv_value.                             "*006i CPL
      ELSEIF svali-convexit <> space.
*       keine Prüfung, aber Konvertierungsexit
        CLEAR svali-value.
        h_formname = formconst_inp.
        REPLACE 'XYZ' WITH svali-convexit INTO h_formname.
        CONDENSE h_formname NO-GAPS.
* falls der Name des Exits nicht 5-stellig ist
        ASSIGN iv_value(svali-outputlen) TO <h1>.
*       assign svali-value(svali-intlen) to <h2>.           "*012d CPL
*       ASSIGN iv_value(svali-leng) TO <h2>.      "*012i CPL"*044d
*       dynpro technik erlaubt nur eine Feldlänge von 132 Zeichen
*       Zeichenkette wird abgeschnitten und an Konvertierungsexit übergeben
        IF svali-leng > 132.                                  "1048525 >>
          ASSIGN svali-value(132) TO <h2>.
        ELSE.
          ASSIGN svali-value(svali-leng) TO <h2>.             "*044i
        ENDIF.                                                "1048525 <<
        CALL FUNCTION h_formname
          EXPORTING
            input  = <h1>
          IMPORTING
            output = <h2>.
      ELSE.                          " svali-convexit <> space.
        svali-value = iv_value.
      ENDIF.                         "h_no_value_check eq space.

    ELSE.    "g_no_alpha_exit_for_type_n = space.

      IF iv_value CN' 0123456789'.
        MESSAGE e123.
      ELSE.
        svali-value = iv_value.
      ENDIF.

    ENDIF.   "g_no_alpha_exit_for_type_n = space.

  ELSE.                              "iv_value <> space.

    CLEAR svali-value.

  ENDIF.                             "iv_value <> space.

ENDFORM.                    " convert_and_update_svali      "*043i-

FORM conversion_input_new USING     value_extern  LIKE zsvald-value.

  FIELD-SYMBOLS: <f1>           TYPE ANY,
                 <clow>         TYPE c.

  DATA:          table_field    TYPE tabfield,
                 fieldname(255) TYPE c,
                 data_ref       TYPE REF TO data.

  DATA:          lv_cuky        TYPE zspo_value,             "*017i
                 lv_tcurx       TYPE tcurx.                 "*017i

  CONCATENATE svali-tabname
              svali-fieldname
              INTO fieldname SEPARATED BY '-'.
  SHIFT fieldname LEFT DELETING LEADING '*'.

  CREATE DATA data_ref TYPE (fieldname).

  ASSIGN data_ref->* TO <f1>.
  ASSIGN value_extern(svali-outputlen) TO <clow>.

  table_field-tabname    = svali-tabname.
  table_field-fieldname  = svali-fieldname.
  table_field-lfieldname = svali-fieldname.
  SHIFT table_field-tabname LEFT DELETING LEADING '*'.

*017i+
* Für Währungsfelder muß noch die Währung ermittelt werden.
  CLEAR wa_svali.
  IF svali-datatype = 'CURR'.
    READ TABLE svali WITH KEY
          tabname   = svali-reftable
          fieldname = svali-reffield
          INTO wa_svali.
    IF sy-subrc <> 0.
      READ TABLE sval_not WITH KEY
             tabname   = svali-reftable
             fieldname = svali-reffield
             INTO wa_svali.
      IF sy-subrc <> 0.
        CLEAR wa_svali.
      ENDIF.
    ENDIF.
  ENDIF.
*017i-

  CALL FUNCTION 'RS_CONV_EX_2_IN'
    EXPORTING
      input_external               = <clow>
      table_field                  = table_field
      currency                     = wa_svali-value         "*017i
    IMPORTING
      output_internal              = <f1>
    EXCEPTIONS
      input_not_numerical          = 1
      too_many_decimals            = 2
      more_than_one_sign           = 3
      ill_thousand_separator_dist  = 4
      too_many_digits              = 5
      sign_for_unsigned            = 6
      too_large                    = 7
      too_small                    = 8
      invalid_date_format          = 9
      invalid_date                 = 10
      invalid_time_format          = 11
      invalid_time                 = 12
      invalid_hex_digit            = 13
      unexpected_error             = 14
      invalid_fieldname            = 15
      field_and_descr_incompatible = 16
      input_too_long               = 17
      no_decimals                  = 18
      invalid_float                = 19
      conversion_exit_error        = 20
      OTHERS                       = 21.
  IF sy-subrc <> 0.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
            WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ENDIF.

*017i+
* Ist das Feld ein Währungsfeld, das nicht genau zwei
* Dezimalstellen hat, so ist die Rückkonvertierung
* eventuell nicht korrekt. In diesem pathologischen
* Fall muß von and nachgebessert werden.
  IF svali-datatype = 'CURR' AND
     svali-decimals <> 2.

    IF wa_svali-value IS INITIAL.
      <f1> = <f1> * 10 ** ( 2 - svali-decimals ).
    ELSE.
      SELECT SINGLE * FROM tcurx
             INTO lv_tcurx
             WHERE currkey = wa_svali-value.
      IF sy-subrc = 0.
* Die Währung hat Dezimalstellen <> 2. In dem Fall funktioniert
* der Konvertierungsbaustein korrekt.
      ELSE.
        <f1> = <f1> * 10 ** ( 2 - svali-decimals ).
      ENDIF.
    ENDIF.

  ENDIF.

* Ist das Feld ein Währungsschlüssel, so muß eventuell
* das zugehörige Währungsfeld nochmal nachkonvertiert
* werden.
  IF svali-datatype = 'CUKY'.
    MOVE <f1> TO lv_cuky.
    PERFORM adapt_currency_to_cuky USING svali-value
                                         lv_cuky.
    svali-value = lv_cuky.
  ELSE.
*017i-
    MOVE <f1> TO svali-value.
  ENDIF.                                                    "*017i

ENDFORM.                               "conversion_input


FORM adapt_currency_to_cuky
     USING value(iv_cuky_old) TYPE zspo_value
           value(iv_cuky_new) TYPE zspo_value.

  FIELD-SYMBOLS: <lf_f1>           TYPE ANY,
                 <lf_clow>         TYPE c.

  DATA:          lv_table_field    TYPE tabfield,
                 lv_fieldname(255) TYPE c,
                 lv_data_ref       TYPE REF TO data,
                 lv_svali          LIKE svali,
                 lv_sy_tabix       LIKE sy-tabix,
                 lv_curr(15)       TYPE p DECIMALS 2,
                 lv_value          TYPE spo_value,
                 lv_value_temp     TYPE spo_value,
                 lv_factor(15)     TYPE p,
                 lv_tcurx          TYPE tcurx.

* Wenn sich der Währungsschlüssel nicht geändert hat, besteht kein
* Handlungsbedarf.
  CONDENSE iv_cuky_old.
  CONDENSE iv_cuky_new.

  IF iv_cuky_old = iv_cuky_new.
    EXIT.
  ENDIF.

* Jetzt muß das Zugehörige Währungsfeld ermittelt werden.
  READ TABLE svali
       INTO lv_svali
       WITH KEY reftable = svali-tabname
                reffield = svali-fieldname.
  IF sy-subrc = 0.
    lv_sy_tabix = sy-tabix.
    IF lv_sy_tabix > index_100.
* Das Feld mit dem Währungsbetrag wurde noch nicht verarbeitet.
* Alles o.k.
      EXIT.
    ENDIF.
  ELSE.
* Wenn das Währungsfeld zu keinem Betragsfeld gehört, dann
* besteht auch kein Handlungsbedarf.
    EXIT.
  ENDIF.

* Wenn wir jetzt das Unterprogramm noch nicht verlassen haben, besteht
* Handlungsbedarf.

* Zunächst muß der Währungsbetrag in der alten Währung wieder
* "ausgegeben" werden.
* Auch dabei muß darauf geachtet werden, wieviele Dezimalstellen
* das Währungsfeld hat.
  IF lv_svali-decimals = 2.
    lv_curr = lv_svali-value.
  ELSEIF lv_svali-decimals > 2.
    lv_factor = 10 ** ( lv_svali-decimals - 2 ).
    lv_value_temp = lv_svali-value.
    lv_value_temp = lv_value_temp * lv_factor.
    lv_curr = lv_value_temp.
  ELSEIF lv_svali-decimals < 2.
    lv_factor = 10 ** ( 2 - lv_svali-decimals ).
    lv_curr = lv_svali-value.
    lv_curr = lv_curr / lv_factor.
  ENDIF.

  WRITE lv_curr CURRENCY iv_cuky_old TO lv_value.
  CONDENSE lv_value.

  CONCATENATE lv_svali-tabname
              lv_svali-fieldname
              INTO lv_fieldname SEPARATED BY '-'.
  SHIFT lv_fieldname LEFT DELETING LEADING '*'.

  CREATE DATA lv_data_ref TYPE (lv_fieldname).

  ASSIGN lv_data_ref->* TO <lf_f1>.
  ASSIGN lv_value(lv_svali-outputlen) TO <lf_clow>.

  lv_table_field-tabname    = lv_svali-tabname.
  lv_table_field-fieldname  = lv_svali-fieldname.
  lv_table_field-lfieldname = lv_svali-fieldname.
  SHIFT lv_table_field-tabname LEFT DELETING LEADING '*'.

  CALL FUNCTION 'RS_CONV_EX_2_IN'
    EXPORTING
      input_external               = <lf_clow>
      table_field                  = lv_table_field
      currency                     = iv_cuky_new
    IMPORTING
      output_internal              = <lf_f1>
    EXCEPTIONS
      input_not_numerical          = 1
      too_many_decimals            = 2
      more_than_one_sign           = 3
      ill_thousand_separator_dist  = 4
      too_many_digits              = 5
      sign_for_unsigned            = 6
      too_large                    = 7
      too_small                    = 8
      invalid_date_format          = 9
      invalid_date                 = 10
      invalid_time_format          = 11
      invalid_time                 = 12
      invalid_hex_digit            = 13
      unexpected_error             = 14
      invalid_fieldname            = 15
      field_and_descr_incompatible = 16
      input_too_long               = 17
      no_decimals                  = 18
      invalid_float                = 19
      conversion_exit_error        = 20
      OTHERS                       = 21.
  IF sy-subrc <> 0.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
            WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ENDIF.

* Ist das Feld ein Währungsfeld, das nicht genau zwei
* Dezimalstellen hat, so ist die Rückkonvertierung
* eventuell nicht korrekt. In diesem pathologischen
* Fall muß von and nachgebessert werden.
  IF lv_svali-decimals <> 2.

    SELECT SINGLE * FROM tcurx
           INTO lv_tcurx
           WHERE currkey = iv_cuky_new.
    IF sy-subrc = 0.
* Die Währung hat Dezimalstellen <> 2. In dem Fall funktioniert
* der Konvertierungsbaustein korrekt.
    ELSE.
      <lf_f1> = <lf_f1> * 10 ** ( 2 - lv_svali-decimals ).
    ENDIF.

  ENDIF.


  MOVE <lf_f1> TO lv_svali-value.
  MODIFY svali
         INDEX lv_sy_tabix
         FROM lv_svali
         TRANSPORTING value.

ENDFORM.                    " adapt_currency_to_cukey

FORM p100_code.                                             "*049i

  DATA: lv_error_in_db_check TYPE xfeld,                    "*049i
        entries_found        TYPE c,                        "*050i
        nr_check_values      TYPE i.                        "*050i

  ok_code_save = ok_code.
  CLEAR ok_code.
  IF ok_code_save = 'FURT' OR
     ok_code_save = 'COD1' OR
     ok_code_save = 'COD2'.
*   Prüfung auf Mußeingabefelder, die nicht auf dem POPUP erscheinen
    IF nr_entries_to_show > max_fields_in_loop.
      PERFORM check_obligatory_fields.
    ENDIF.
*   Die Funktionscodes COD1 und COD2 können nur im Fall
*   KIND_OF_POPUP = USER_BUTTONS auftreten.
    IF kind_of_popup = no_check.
      SET SCREEN 0.
      LEAVE SCREEN.
    ELSEIF kind_of_popup = db_check.
      CLEAR lv_error_in_db_check.                           "*049i
      LOOP AT diff_tab.
        PERFORM prepare_check_values USING diff_tab-tabname.
        DESCRIBE TABLE check_values LINES nr_check_values.  "*050i
        CHECK nr_check_values <> 0.
*         nur wenn etwas zum Prüfen da ist, geht es weiter
*       PERFORM prepare_generic_key.                        "*050d
        IF diff_tab-tabname(1) = '*'.
          h_tabname = diff_tab-tabname+1.
        ELSE.
          h_tabname = diff_tab-tabname.
        ENDIF.
        PERFORM read_db                                     "*050i
                USING    h_tabname                          "*050i
                CHANGING entries_found.                     "*050i
*       IF diff_tab-length <= tab_short.                    "*050d+
*         PERFORM read_db TABLES db_tab_s
*                         USING h_tabname entries_found.
*       ELSEIF diff_tab-length <= tab_middle.
*         PERFORM read_db TABLES db_tab_m
*                         USING h_tabname entries_found.
*       ELSEIF diff_tab-length <= tab_long.
*         PERFORM read_db TABLES db_tab_l
*                         USING h_tabname entries_found.
*       ELSE.
*         PERFORM read_db TABLES db_tab_vl
*                         USING h_tabname entries_found.
*       ENDIF.                                              "*050d-
        IF diff_tab-ref = 'X'.
          IF entries_found = no.
            error_tab = diff_tab-tabname.
            IF sy-binpt = 'X'.                              "B20K059470
              MESSAGE a124 RAISING error_in_fields.         "B20K059470
            ELSE.                                           "B20K059470
              MESSAGE i124.
            ENDIF.                                          "B20K059470
*           LEAVE SCREEN.                                   "*047d
            lv_error_in_db_check = c_true.                  "*049i
            EXIT.                                           "*049i
          ENDIF.
        ELSEIF entries_found = no AND int_check_existence = space
                                  AND diff_tab-tabname(1) = '*'.
*             Es wurde ein Eintrag gefunden, es darf aber kein
*             Eintrag vorhanden sein, da es sich um eine *-Tabellen-
*             angabe handelt.
          error_tab = diff_tab-tabname.
          IF nr_entries_to_show = 1.
            IF sy-binpt = 'X'.                              "B20K059470
              MESSAGE a120 RAISING error_in_fields.         "B20K059470
            ELSE.                                           "B20K059470
              MESSAGE i120.
            ENDIF.                                          "B20K059470
          ELSE.
            IF sy-binpt = 'X'.                              "B20K059470
              MESSAGE a110 RAISING error_in_fields.         "B20K059470
            ELSE.                                           "B20K059470
              MESSAGE i110.
            ENDIF.                                          "B20K059470
          ENDIF.
*         LEAVE SCREEN.                                     "*047d
          lv_error_in_db_check = c_true.                    "*049i
          EXIT.                                             "*049i
        ELSEIF entries_found = yes AND int_check_existence = 'X'
                                    AND diff_tab-tabname(1) = '*'.
*             Es wurde kein Eintrag gefunden, es soll aber ein
*             Eintrag vorhanden sein, da es sich um eine *-Tabellen-
*             angabe handelt.
          error_tab = diff_tab-tabname.
          IF nr_entries_to_show = 1.
            IF sy-binpt = 'X'.                              "B20K059470
              MESSAGE a121 RAISING error_in_fields.         "B20K059470
            ELSE.                                           "B20K059470
              MESSAGE i121.
            ENDIF.                                          "B20K059470
          ELSE.
            IF sy-binpt = 'X'.                              "B20K059470
              MESSAGE a111 RAISING error_in_fields.         "B20K059470
            ELSE.                                           "B20K059470
              MESSAGE i111.
            ENDIF.                                          "B20K059470
          ENDIF.
*         LEAVE SCREEN.                                     "*047d
          lv_error_in_db_check = c_true.                    "*049i
          EXIT.                                             "*049i
        ELSEIF entries_found = no AND int_check_existence = 'X'
                                  AND diff_tab-tabname(1) <> '*'.
*             Es wurde kein Eintrag gefunden, es soll aber ein
*             Eintrag vorhanden sein.
          error_tab = diff_tab-tabname.
          IF nr_entries_to_show = 1.
            IF sy-binpt = 'X'.                              "B20K059470
              MESSAGE a120 RAISING error_in_fields.         "B20K059470
            ELSE.                                           "B20K059470
              MESSAGE i120.
            ENDIF.                                          "B20K059470
          ELSE.
            IF sy-binpt = 'X'.                              "B20K059470
              MESSAGE a110 RAISING error_in_fields.         "B20K059470
            ELSE.                                           "B20K059470
              MESSAGE i110.
            ENDIF.                                          "B20K059470
          ENDIF.
*         LEAVE SCREEN.                                     "*047d
          lv_error_in_db_check = c_true.                    "*049i
          EXIT.                                             "*049i
        ELSEIF entries_found = yes AND int_check_existence = space
                                   AND diff_tab-tabname(1) <> '*'.
*             Es wurde ein Eintrag gefunden, es darf aber kein
*             Eintrag vorhanden sein.
          error_tab = diff_tab-tabname.
          IF nr_entries_to_show = 1.
            IF sy-binpt = 'X'.                              "B20K059470
              MESSAGE a121 RAISING error_in_fields.         "B20K059470
            ELSE.                                           "B20K059470
              MESSAGE i121.
            ENDIF.                                          "B20K059470
          ELSE.
            IF sy-binpt = 'X'.                              "B20K059470
              MESSAGE a111 RAISING error_in_fields.         "B20K059470
            ELSE.                                           "B20K059470
              MESSAGE i111.
            ENDIF.                                          "B20K059470
          ENDIF.
*         LEAVE SCREEN.                                     "*047d
          lv_error_in_db_check = c_true.                    "*049i
          EXIT.                                             "*049i
        ENDIF.
      ENDLOOP.
*       Alles ok.
      IF lv_error_in_db_check IS INITIAL.                   "*049i
        SET SCREEN 0.
        LEAVE SCREEN.
      ENDIF.                                                "*049i
    ELSEIF kind_of_popup = itab_check.
    ELSEIF kind_of_popup = user_check OR
         ( kind_of_popup = user_help AND form_name <> space ).
      PERFORM fill_values TABLES ifields.
      CLEAR error.
      PERFORM (form_name) IN PROGRAM (program_name)
                             TABLES ifields
                             USING  error.
      IF error-msgno IS INITIAL.
*          Alles ok.
        SET SCREEN 0.
        LEAVE SCREEN.
      ELSE.
*          Fehler
        PERFORM get_values TABLES ifields.
        error_tab   = error-errortab.
        error_field = error-errorfield.
        IF error-msgty <> 'S'.
          IF sy-binpt = 'X'.                                "B20K077258
            error-msgty =  'A'.                             "B20K077258
          ELSE.                                             "B20K077258
            error-msgty =  'I'.
          ENDIF.                                            "B20K077258
        ENDIF.
        MESSAGE ID     error-msgid
                TYPE   error-msgty
                NUMBER error-msgno
                WITH   error-msgv1 error-msgv2
                       error-msgv3 error-msgv4.
*       LEAVE SCREEN.                                       "*047d
      ENDIF.
    ELSEIF kind_of_popup = user_help AND form_name = space.
      PERFORM fill_values TABLES ifields.
*       kein User-Exit angegeben
      SET SCREEN 0.
      LEAVE SCREEN.
    ELSEIF kind_of_popup = user_buttons.
      PERFORM fill_values TABLES ifields.
      CLEAR error.
      CLEAR h_show_popup.
      PERFORM (form_name) IN PROGRAM (program_name)
                             TABLES ifields
                             USING  ok_code_save error h_show_popup.
      IF h_show_popup = space.
*          Das Popup soll verlassen werden
        SET SCREEN 0.
        LEAVE SCREEN.
      ELSEIF error-msgno IS INITIAL.
*          Alles ok.
        PERFORM get_values TABLES ifields.
*       LEAVE SCREEN.                                       "*047d
      ELSE.
*          Fehler
        PERFORM get_values TABLES ifields.
        error_tab   = error-errortab.
        error_field = error-errorfield.
        IF error-msgty <> 'S'.
          IF sy-binpt = 'X'.                                "B20K077258
            error-msgty =  'A'.                             "B20K077258
          ELSE.                                             "B20K077258
            error-msgty =  'I'.
          ENDIF.                                            "B20K077258
        ENDIF.
        MESSAGE ID     error-msgid
                TYPE   error-msgty
                NUMBER error-msgno
                WITH   error-msgv1 error-msgv2
                       error-msgv3 error-msgv4.
*       LEAVE SCREEN.                                       "*047d
      ENDIF.
    ENDIF.
  ELSEIF ok_code_save = 'P--'                               "*059i+
  OR     ok_code_save = 'P-'
  OR     ok_code_save = 'P+'
  OR     ok_code_save = 'P++'.
    PERFORM paging USING ok_code_save.                      "*059i-
  ENDIF.

ENDFORM.                                          "P100_CODE"*049u

FORM check_obligatory_fields.
  LOOP AT svali.
    CHECK NOT svali-field_obl IS INITIAL.
    CHECK svali-value IS INITIAL.
    MOVE svali-tabname   TO error_tab.
    MOVE svali-fieldname TO error_field.
    IF sy-binpt = 'X'.
      MESSAGE ID '00' TYPE 'A' NUMBER '055'.
    ELSE.
      MESSAGE ID '00' TYPE 'I' NUMBER '055'.
    ENDIF.
    LEAVE SCREEN.
  ENDLOOP.
ENDFORM.                               " CHECK_OBLIGATORY_FIELDS

FORM prepare_check_values USING tabname.
* Die Routine extrahiert aus SVALI und SVAL_NOT die Felder und Werte,
* die gegen die DB-Tabellen zu verproben sind. Das Mandantenfeld wird
* automatisch berücksichtigt, wenn die Tabelle mandantenabh. ist und
* das Mandantenfeld in der Schnittstelle nicht angegeben wurde.
*
* INPUT  TABNAME                  Tabellenname
*        SVALI                    Stepllopzeilen mit Werten
*        SVAL_NOT                 nicht anzuzeigende, aber ggf. zu ver-
*                                 probende Felder
* OUTPUT CHECK_VALUES             Prüffelder und -werte
*        NR_CHECK_VALUES          Anzahl Einträge in CHECK_VALUES
*
  REFRESH check_values.
* übergebene bzw. eingegebene Werte übernehmen, die zu verproben sind
  LOOP AT svali WHERE tabname   =  tabname
                  AND comp_code <> cond_nc.
    IF NOT svali-value IS INITIAL                           "B20K013025
    OR svali-field_obl NE space.                            "B20K013025
*   Initialwerte nur prüfen, wenn Felder obligatorisch     "B20K013025
      check_values-tabname   = svali-tabname.
      check_values-fieldname = svali-fieldname.
      check_values-value     = svali-value.
      check_values-comp_code = svali-comp_code.
      check_values-position  = svali-position.
      check_values-offset    = svali-offset.
      check_values-keyflag   = svali-keyflag.
      check_values-intlen    = svali-intlen.
      check_values-leng      = svali-leng.                  "+012i cpl
      APPEND check_values.
    ENDIF.                                                  "B20K013025
  ENDLOOP.

* übergebene Werte übernehmen, die nicht angeboten wurden aber zu
* verproben sind
  LOOP AT sval_not WHERE tabname   =  tabname
                  AND comp_code <> cond_nc.
    check_values-tabname   = sval_not-tabname.
    check_values-fieldname = sval_not-fieldname.
    IF sval_not-comp_tab <> space.
      key_all_fields-tabname     = sval_not-comp_tab.
      key_all_fields-fieldname   = sval_not-comp_field.
      READ TABLE svali WITH KEY key_all_fields.
      IF sy-subrc = 0.
        IF  svali-value     IS INITIAL                      "*031i
        AND svali-field_obl IS INITIAL.                     "*031i
*   Initialwerte nur prüfen, wenn Felder obligatorisch sind "*031i
          CONTINUE.                                         "*031i
        ENDIF.                                              "*031i
        sval_not-value = svali-value.
      ELSE.                                                 "*031i
        CONTINUE.                                           "*031i
      ENDIF.
    ENDIF.
    check_values-value     = sval_not-value.
    check_values-comp_code = sval_not-comp_code.
    check_values-position  = sval_not-position.
    check_values-offset    = sval_not-offset.
    check_values-keyflag   = sval_not-keyflag.
    check_values-intlen    = sval_not-intlen.
    check_values-leng      = sval_not-leng.                 "+012i cpl
    APPEND check_values.
  ENDLOOP.

*  DESCRIBE TABLE check_values LINES nr_check_values.       "*050d+
*  IF nr_check_values = 0.
**    für diese Tabelle müssen keine DB-Prüfungen durchgeführt werden
*    EXIT.
*  ENDIF.
*
** mandantenabhängigkeit beachten
*  h_tabname = tabname.
*  IF h_tabname(1) = '*'.
*    SHIFT h_tabname.
*  ENDIF.
*  LOOP AT all_fields WHERE tabname  = h_tabname
*                       AND datatype = 'CLNT'.
*    LOOP AT check_values WHERE position = all_fields-position.
*      EXIT.
*    ENDLOOP.
*    IF sy-subrc <> 0.
**      Mandant wurde nicht übergeben
*      check_values-tabname   = tabname.
*      check_values-fieldname = all_fields-fieldname.
*      check_values-value     = sy-mandt.
*      check_values-comp_code = cond_eq.
*      check_values-position  = all_fields-position.
*      check_values-offset    = all_fields-offset.
*      check_values-keyflag   = all_fields-keyflag.
*      check_values-intlen    = all_fields-intlen.
*      check_values-leng      = all_fields-leng.             "+012i cpl
*      APPEND check_values.
*    ENDIF.
*    EXIT.
*  ENDLOOP.                                                 "*050d-

  SORT check_values BY position.

* DESCRIBE TABLE check_values LINES nr_check_values.        "*050d

ENDFORM.                    "PREPARE_CHECK_VALUES

FORM read_db
     USING    iv_tabname       LIKE dfies-tabname           "*050u+
     CHANGING ev_entries_found TYPE c.

  CONSTANTS: c_inverted_comma(1)        TYPE c VALUE '''',
             c_double_inverted_comma(2) TYPE c VALUE ''''''.

  DATA: BEGIN OF lt_where_clause OCCURS 0,
          line(200) TYPE c,                                 "*056u
        END OF lt_where_clause,
        lv_value(160)       TYPE c,                         "*056u
        lv_first_processed  TYPE xfeld,
        lv_client_specified TYPE xfeld,
        sr_table            TYPE REF TO data.

  FIELD-SYMBOLS: <ls_table>.

  ev_entries_found = no.                                    "*052i

* Zunächst bestimmen wir, ob mit CLIENT SPECIFIED
* selektiert werden muss.
  CLEAR lv_client_specified.
  LOOP AT all_fields
       WHERE tabname  = iv_tabname
       AND   datatype = 'CLNT'.

    LOOP AT check_values
         WHERE position = all_fields-position.
      EXIT.
    ENDLOOP.
    IF sy-subrc = 0.
* Mandant wurde übergeben, wir müssen CLIENT SPECIFIED
* selektieren.
      lv_client_specified = c_true.
    ENDIF.
  ENDLOOP.

  CLEAR lv_first_processed.
* Jetzt kann die WHERE-Bedingung formuliert werden.
  LOOP AT check_values.

    IF lv_first_processed IS INITIAL.
      lv_first_processed = c_true.
    ELSE.
      CLEAR lt_where_clause.
      lt_where_clause = 'AND'.
      APPEND lt_where_clause.
    ENDIF.

    lv_value = check_values-value.
    REPLACE ALL OCCURRENCES OF c_inverted_comma
            IN lv_value
            WITH c_double_inverted_comma.
    CONCATENATE c_inverted_comma
                lv_value
                c_inverted_comma
           INTO lv_value.

    CLEAR lt_where_clause.
    CONCATENATE check_values-fieldname
                check_values-comp_code
                lv_value
           INTO lt_where_clause
           SEPARATED BY space.
    APPEND lt_where_clause.

  ENDLOOP.

* Jetzt wird auf der Datenbank nachgesehen.

* Wir brauchen leider eine INTO-Tabelle,
* TRANSPORTING NO FIELDS geht bei der SELECT-Anweisung nicht.
*
* Also müssen wir uns dynamisch eine Zeile der Zieltabelle
* erzeugen.

  CREATE DATA sr_table TYPE (iv_tabname).
  ASSIGN sr_table->* TO <ls_table>.

  TRY.                                                      "*052i

      IF lv_client_specified IS INITIAL.

        SELECT SINGLE *
               FROM (iv_tabname)
               INTO <ls_table>
               WHERE (lt_where_clause).

      ELSE.

        SELECT SINGLE *
               FROM (iv_tabname)
               CLIENT SPECIFIED
               INTO <ls_table>
               WHERE (lt_where_clause).

      ENDIF.

      IF sy-subrc = 0.
        ev_entries_found = yes.
*     ELSE.                                                 "*052d
*       ev_entries_found = no.                              "*052d
      ENDIF.                                                "*050u-

    CATCH cx_root.                                          "*052i
* Aus Gründen der Abwärtskompatibilität dürfen wir auch     "*052i
* dann nicht abbrechen, wenn der Aufrufer echten Blödsinn   "*052i
* eingegeben hat, z.B. einen Tabellennamen der gar keine    "*052i
* Datenbanktabelle ist. Daher fangen wir alle Ausnahmen     "*052i
* ab und tun einfach so, als wäre der SELECT leer           "*052i
* ausgegangen.                                              "*052i

  ENDTRY.                                                   "*052i-

ENDFORM.                    "read_db

FORM get_values TABLES fields STRUCTURE zsval.
* Die Routine übernimmt die Werte aus der Tabelle FIELDS und
* übergibt sie an die Tabelle SVALI.
*
* INPUT  FIELDS                   Schnittstellenfelder
* OUTPUT SVALI                    Steploopzeilen mit angegebenen Werten

  DATA: BEGIN OF key_svali,
          tabname   LIKE dfies-tabname,
          fieldname LIKE dfies-fieldname,
        END OF key_svali.


  LOOP AT fields.
    IF fields-field_attr = do_not_show AND
       fields-comp_tab  <> space.
      key_svali-tabname   = fields-comp_tab.
      key_svali-fieldname = fields-comp_field.
    ELSE.
      key_svali-tabname   = fields-tabname.
      key_svali-fieldname = fields-fieldname.
    ENDIF.
    READ TABLE svali WITH KEY key_svali.

    IF sy-subrc = 0.
      IF fields-value <> svali-value.
        svali-value = fields-value.
        MODIFY svali INDEX sy-tabix.
      ENDIF.
    ENDIF.
  ENDLOOP.
ENDFORM.                    "GET_VALUES

*FORM fill_values TABLES fields STRUCTURE zsval.
** Die Routine übernimmt die Werte aus der internen Tabelle SVALI und
** übergibt diese an die Tabelle FIELDS.
**
** INPUT  SVALI                    Steploopzeilen mit angegebenen Werten
** OUTPUT FIELDS                   Schnittstellenfelder
*
*  DATA: BEGIN OF key_svali,
*          tabname   LIKE dfies-tabname,
*          fieldname LIKE dfies-fieldname,
*        END OF key_svali.
*
*
*  LOOP AT fields.
*    IF fields-field_attr = do_not_show AND
*       fields-comp_tab  <> space.
*      key_svali-tabname   = fields-comp_tab.
*      key_svali-fieldname = fields-comp_field.
*    ELSE.
*      key_svali-tabname   = fields-tabname.
*      key_svali-fieldname = fields-fieldname.
*    ENDIF.
*    READ TABLE svali WITH KEY key_svali.
*
*    IF sy-subrc = 0.
*      IF fields-value <> svali-value.
*        fields-value = svali-value.
*        MODIFY fields.
*      ENDIF.
*    ENDIF.
*  ENDLOOP.
*ENDFORM.                    "FILL_VALUES

FORM paging                                                 "*059i+
     USING code.
* Blättern
*
* INPUT  FIRST_LINE               aktuelle erste Zeile
*        ENTRIES                  Anzahl Einträge
*        LOOPS                    Anzahl Steploopzeilen
*        CODE                     P  , P-, P+ oder P++
* OUTPUT ENTRY_NEW                neue erste Zeile

  CALL FUNCTION 'SCROLLING_IN_TABLE'
    EXPORTING
      entry_act = first_line_100
      entry_to  = nr_entries_to_show
      loops     = max_fields_in_loop
      ok_code   = code
    IMPORTING
      entry_new = first_line_100.

ENDFORM.                    "PAGING                         "*059i-

FORM p100_value.                                            "*059i

* Deklarieren und Initialisieren
  DATA: returntab LIKE ddshretval OCCURS 0 WITH HEADER LINE.
  DATA: lv_shlp_descr TYPE shlp_descr.                      "*005i

  DATA: sy_repid LIKE sy-repid,
        sy_dynnr LIKE sy-dynnr.
  DATA: h_i1     TYPE i.                                    "*059i

  MOVE sy-repid TO sy_repid.
  MOVE sy-dynnr TO sy_dynnr.


  GET CURSOR FIELD   cur_field
             LINE    cur_line
             OFFSET  cur_offset.

  REFRESH dynpfields.

  IF cur_line > 0.
    dynpro_no = sy-dynnr.
    h_i1 = cur_line.                                        "*053u
    IF NOT gv_use_paging IS INITIAL.                        "*059i
      h_i1 = h_i1 + first_line_100 - 1.                     "*059i
    ENDIF.                                                  "*059i
    READ TABLE svali INDEX h_i1.
    IF sy-subrc = 0.
*     Anzeige der Eingabemöglichkeiten pro Tabellenfeld
      IF cur_field        = 'SVALD-KEYTEXT' OR
         svali-field_attr = norm_noinp      OR
         svali-field_attr = bright_noinp    OR
         svali-field_attr = show_2_dim.
        h_flag = 'X'.
      ELSE.
        h_flag = space.
      ENDIF.
      IF svali-tabname(1) = '*'.
        h_tabname = svali-tabname+1.
        help_field_star = 'X'.
      ELSE.
        h_tabname = svali-tabname.
        CLEAR help_field_star.
      ENDIF.
*     Benutzerdefinierte F4-Hilfe
*      if ( kind_of_popup = user_help and f4_program_name <> space ) or
*        ( kind_of_popup = user_buttons and f4_program_name <> space )

* B40K011463 --------------------------------------------------------- *
* Benutzerdefinierte Hilfe nur, wenn keine Systemhilfe verlangt wird
     IF ( ( kind_of_popup = user_help AND f4_program_name <> space ) OR
        ( kind_of_popup = user_buttons AND f4_program_name <> space ) )
            AND svali-novaluehlp NE 'S'        .
* -------------------------------------------------------------------- *

        move 'ZSVALD-VALUE' to dynpfields-fieldname.        "1411262 >>
        dynpfields-stepl = cur_line.
        append dynpfields.
        call function 'DYNP_VALUES_READ'
          exporting
            dyname     = sy_repid
            dynumb     = sy_dynnr
          tables
            dynpfields = dynpfields
         exceptions
            others     = 1.
        if sy-subrc <> 0.
        endif.
        read table dynpfields with key fieldname = 'ZSVALD-VALUE'
                                       stepl     = cur_line.
        if sy-subrc = 0.
          move dynpfields-fieldvalue to zsvald-value.
        endif.                                             "1411262 <<

        PERFORM (f4_form_name) IN PROGRAM (f4_program_name)
                               USING  h_tabname
                                      svali-fieldname
                                      h_flag
                                      h_returncode
                                      zsvald-value.

        if h_returncode = 'F'. "FORCE_UPDATE               "1411262 >>
          read table dynpfields with key fieldname = 'ZSVALD-VALUE'
                                      stepl     = cur_line.
          move zsvald-value to dynpfields-fieldvalue.
          modify dynpfields index sy-tabix.
          call function 'DYNP_VALUES_UPDATE'
            exporting
              dyname     = sy_repid
              dynumb     = sy_dynnr
            tables
              dynpfields = dynpfields
            exceptions
              others     = 1.
          if sy-subrc <> 0.
          endif.
        endif.                                            "1411262 <<

      ELSE.
*       Programmdefinierte F4-Hilfe
        IF h_no_value_check = 'X'                           "B20K052439
          AND svali-inttype = 'D'.                          "B20K052439
          MESSAGE i781.                                     "B20K052439
        ELSEIF h_no_value_check = 'X'                       "B20K052439
          AND svali-inttype = 'T'.                          "B20K052439
          MESSAGE i781.                                     "B20K052439
        ELSE.                                               "B20K052439

          help_fieldname = svali-fieldname.                 "B20K069688

*         Neue F4-Hilfe zu Release 4.0C -------------------------------*
          DATA: value LIKE help_info-fldvalue.
          MOVE 'ZSVALD-VALUE' TO dynpfields-fieldname.
*         move cur_line      to dynpfields-stepl.           "*003d
          dynpfields-stepl = cur_line.                "*003i"*059u
          APPEND dynpfields.
          CALL FUNCTION 'DYNP_VALUES_READ'
            EXPORTING
              dyname                         = sy_repid
              dynumb                         = sy_dynnr
*             TRANSLATE_TO_UPPER             = ' '
*             REQUEST                        = ' '
*             PERFORM_CONVERSION_EXITS       = ' '
*             PERFORM_INPUT_CONVERSION       = ' '
*             DETERMINE_LOOP_INDEX           = ' '
            TABLES
              dynpfields                     = dynpfields
           EXCEPTIONS
              invalid_abapworkarea           = 1
              invalid_dynprofield            = 2
              invalid_dynproname             = 3
              invalid_dynpronummer           = 4
              invalid_request                = 5
              no_fielddescription            = 6
              invalid_parameter              = 7
              undefind_error                 = 8
              double_conversion              = 9
              stepl_not_found                = 10
              OTHERS                         = 11.
          IF sy-subrc <> 0.
          ENDIF.
          READ TABLE dynpfields
                  WITH KEY fieldname = 'ZSVALD-VALUE'
                           stepl     = cur_line.
          IF sy-subrc = 0.
            MOVE dynpfields-fieldvalue TO value.
          ELSE.
            CLEAR value.
          ENDIF.
          REFRESH dynpfields.
*         in nicht eingabebereiten Feldern nur Anzeige
          DATA: display TYPE ddbool_d.
          IF   svali-field_attr = '02'
            OR svali-field_attr = '03'
            OR svali-field_attr = '05'.
            MOVE 'X' TO display.
          ELSE.
            CLEAR display.
          ENDIF.

*005i+
* Zunächst müssen die Eigenschaften der Suchhilfe gelesen werden,
* damit später bestimmt werden kann was die Export-Parameter sind.
          CALL FUNCTION 'F4IF_DETERMINE_SEARCHHELP'
            EXPORTING
              tabname                 = h_tabname
              fieldname               = help_fieldname
*             SELECTION_SCREEN        = ' '
            IMPORTING
              shlp                    = lv_shlp_descr
            EXCEPTIONS
              field_not_found         = 1
              no_help_for_field       = 2
              inconsistent_help       = 3
              OTHERS                  = 4.
          IF sy-subrc <> 0.
            MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
                    WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
          ENDIF.
*005i-

          CALL FUNCTION 'F4IF_FIELD_VALUE_REQUEST'
               EXPORTING
                    tabname           = h_tabname
                    fieldname         = help_fieldname
*                   SEARCHHELP        = ' '
*                   SHLPPARAM         = ' '
*                    dynpprog          = sy_repid
*                    dynpnr            = sy_dynnr
                    dynprofield       = 'ZSVALD-VALUE'
                    stepl             = cur_line
                    value             = value
*                   multiple_choice   = ' '
                    display           = display
                    callback_program  = sy_repid
                    callback_form     = 'VALUE_HELP_CALLBACK'
              TABLES
                    return_tab        = returntab
               EXCEPTIONS
                    field_not_found   = 1
                    no_help_for_field = 2
                    inconsistent_help = 3
                    no_values_found   = 4
                    OTHERS            = 5.
          IF sy-subrc = 0.
            IF NOT returntab[] IS INITIAL AND display IS INITIAL.
              PERFORM update_further_entries
                      TABLES returntab
                      USING  sy_repid
                             sy_dynnr
                             lv_shlp_descr                  "*005i
                             h_i1.                          "*059u

            ENDIF.
          ELSE.
            MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
            WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.

*           call function 'HELP_VALUES_GET'
*                exporting
*                    display      = h_flag
*                    fieldname    = help_fieldname         "B20K069688
*                    tabname      = h_tabname
*               importing
*                    select_value = svald-value
*                    select_index = h_index.
*
*          if svald-value is initial
*          and h_index > 0.
*            dynpfields-fieldname  = 'SVALD-VALUE'.
*            dynpfields-stepl      = cur_line.
*            dynpfields-fieldvalue = svald-value.
*            append dynpfields.
*            call function 'DYNP_VALUES_UPDATE'
*                 exporting
*                      dyname               = dyname
*                      dynumb               = dynpro_no
*                 tables
*                      dynpfields           = dynpfields
*                 exceptions
*                      invalid_abapworkarea = 1
*                      invalid_dynprofield  = 2
*                      invalid_dynproname   = 3
*                      invalid_dynpronummer = 4
*                      invalid_request      = 5
*                      no_fielddescription  = 6
*                      undefind_error       = 7
*                      others               = 8.
*          endif.
          ENDIF.                                            "B20K052439
        ENDIF.
      ENDIF.
    ENDIF.
  ENDIF.
* index_100   = first_line_100.                             "*053d

ENDFORM.                     "p100_value                    "*059i

FORM p100_help.                                             "*059i

  DATA: h_i1 TYPE i.                                        "*059i

  GET CURSOR FIELD   cur_field
             LINE    cur_line
             OFFSET  cur_offset.

  IF cur_line > 0.
    h_i1 = cur_line.                                        "*053u
    IF NOT gv_use_paging IS INITIAL.                        "*059i
      h_i1 = h_i1 + first_line_100 - 1.                     "*059i
    ENDIF.                                                  "*059i
    READ TABLE svali INDEX h_i1.
    IF sy-subrc = 0.
*       F1-Hilfe für ein Datenbankfeld
      IF svali-tabname(1) = '*'.
        h_tabname = svali-tabname+1.
      ELSE.
        h_tabname = svali-tabname.
      ENDIF.
      IF ( kind_of_popup = user_help AND f1_program_name <> space ) OR
        ( kind_of_popup = user_buttons AND f1_program_name <> space ).
        PERFORM (f1_form_name) IN PROGRAM (f1_program_name)
                               USING  h_tabname
                                      svali-fieldname.
      ELSE.
***        CALL FUNCTION 'HELP_DOCU_SHOW_FOR_FIELD'         "B20K014551*
***             EXPORTING                                   "B20K014551*
***                  FIELDNAME = SVALI-FIELDNAME            "B20K014551*
*                    KEYWORD   = SVALD-KEYTEXT
***                  TABNAME   = H_TABNAME.                 "B20K014551*
* mk begin  ----------------------------------------------- "B20K043473
        CLEAR help_infos.
*            HELP_INFOS-CALL      = 'D'.                     "B20K014551
*            HELP_INFOS-SPRAS     = SY-LANGU.                "B20K014551
*            HELP_INFOS-DOCUID    = 'FE'.                    "B20K014551
*            help_infos-title     = sy-title.                "B20K014551
        help_infos-tabname   = h_tabname.                   "B20K014551
        help_infos-fieldname = svali-fieldname.             "B20K014551
        help_infos-program   = sy-repid.                    "B20K014551
        help_infos-dynpro    = sy-dynnr.                    "B20K014551
*            HELP_INFOS-REPORT    = SY-REPID.                "B20K014551
*            HELP_INFOS-DYNPPROG  = SY-REPID.                "B20K014551
*            CALL FUNCTION 'HELP_START'                      "B20K014551
*                 EXPORTING                                  "B20K014551
*                      HELP_INFOS   = HELP_INFOS             "B20K014551
*                 TABLES                                     "B20K014551
*                      DYNPSELECT   = DYNPSELECT             "B20K014551
*                      DYNPVALUETAB = DYNPVALUETAB.          "B20K014551
        h_title     = sy-title.
        help_infos-pfkey = sy-pfkey.
        CALL FUNCTION 'HELP_OBJECT_SHOW_FOR_FIELD'
             EXPORTING
*                    doklangu                = sy-langu
                  doktitle                = h_title
                  called_by_program       = help_infos-program
                  called_by_dynp          = help_infos-dynpro
                  called_for_tab          = help_infos-tabname
                  called_for_field        = help_infos-fieldname
                  called_for_tab_fld_btch_input = batch_input
                  called_by_cuaprog       = help_infos-program
                  called_by_cuastat       = help_infos-pfkey
*                    merge_dz_if_available   =
             TABLES
                  links                         = links
             EXCEPTIONS
                  object_not_found              = 1
                  sapscript_error               = 2
                  OTHERS                        = 3.

* mk end ------------------------------------------------- "B20K043473

      ENDIF.
    ENDIF.
  ENDIF.
* INDEX_100   = FIRST_LINE_100.                             "*053d

ENDFORM.                "p100_help                          "*059i


FORM update_further_entries
     TABLES   p_returntab STRUCTURE ddshretval
                            USING    p_sy_repid
                                     p_sy_dynnr
                                     p_shlp_descr TYPE shlp_descr"*005i
              p_tab_index  TYPE i.                          "*059u

* Deklarieren und Initialisieren
  DATA: p_dynpfields LIKE dynpread OCCURS 0 WITH HEADER LINE,
        tab_index    LIKE sy-tabix,
        l_tabname    LIKE svali-tabname,                    "*007i CPL
        l_tabfield   LIKE svali-fieldname,                  "*007i CPL
        p_tabname    LIKE svali-tabname,
        p_tabfield   LIKE svali-fieldname.
  DATA: h_max_line   TYPE i.                                "*059i
  DATA: wa_fieldprop TYPE ddshfprop.                        "*005i
  DATA: lv_stepl     LIKE sy-stepl.                         "*059i


  IF gv_use_paging IS INITIAL.                              "*059i+
    h_max_line = quan_entries_100.
  ELSE.
    h_max_line = first_line_100 + max_fields_in_loop - 1.
  ENDIF.                                                    "*059i-

  MOVE svali-tabname TO p_tabname.

* Returntab abarbeiten
* Mehrere Rückgabewerte möglich
  IF help_type_single IS INITIAL.
    LOOP AT p_returntab.

*005i+
* Zunächst sehen wir nach, ob der entsprechende Parameter auch ein
* Export-Parameter ist.
      READ TABLE p_shlp_descr-fieldprop
           INTO wa_fieldprop
           WITH KEY fieldname  = p_returntab-fieldname.
      IF sy-subrc = 0.
        IF wa_fieldprop-shlpoutput IS INITIAL.
          CONTINUE.
        ENDIF.
      ENDIF.
* Im Zweifelsfall lieber übernehmen, also kein CONTINUE.
*005i-

* Die Abfragereihenfolge muß umgestellt werden.             "*042i+
* Die alte Logik wurde komplett ersetzt.

* Erster Versuch:
*
* Wenn RETFIELD = 'SVALD-VALUE', dann ist das zu
* befüllende Feld auf jeden Fall das Feld, für das die
* Suchhilfe aufgerufen wurde.
      IF  p_returntab-retfield = 'ZSVALD-VALUE'.
        tab_index = p_tab_index.                            "*053u
        READ TABLE svali
             INDEX tab_index.
        IF sy-subrc = 0.
*         svali-value = p_returntab-fieldval.               "*043d
          PERFORM convert_and_update_svali                  "*043i
                  USING p_returntab-fieldval.               "*043i
          MODIFY svali INDEX tab_index.
        ENDIF.
        lv_stepl = tab_index - first_line_100 + 1.          "*059i
        p_dynpfields-fieldname  = 'ZSVALD-VALUE'.
        p_dynpfields-stepl      = lv_stepl.                 "*059u
        p_dynpfields-fieldvalue = p_returntab-fieldval.
        APPEND p_dynpfields.
        CONTINUE.
      ENDIF.

* Zweiter Versuch:
*
* Überprüfen, ob das in RETFIELD angegebene Feld
* auf dem Dynpro ist.

      IF NOT p_returntab-retfield IS INITIAL.
        SPLIT p_returntab-retfield                          "*007u CPL
              AT '-'                                        "*007u CPL
              INTO l_tabname                                "*007u CPL
                   l_tabfield.                              "*007u CPL
        " in case of double usage of a field of the same table  "2400592>>
        "with * the correct field should be updated
        if help_fieldname = l_tabfield and
           help_field_star = 'X'.
          concatenate '*' l_tabname into l_tabname.
        endif.                                                  "2400592<<
        READ TABLE svali
             WITH KEY tabname   = l_tabname                 "*007u CPL
                      fieldname = l_tabfield.               "*007u CPL
        tab_index = sy-tabix.
        IF sy-subrc = 0.
* Es ist durchaus möglich, daß eine erfolgreiche Suchhilfe  "*003i
* mehrere Felder füllt. Insbesondere kann es passieren, daß "*003i
* im Blättermodus einige dieser Felder momentan nicht       "*003i
* angezeigt werden. Daher muß sichergestellt werden, daß    "*003i
* diese Felder auch gefüllt werden, aber die Felder         "*003i
* außerhalb des momentanen Sichtbereiches nicht in die      "*003i
* Tabelle P_DYNPFIELDS eingefügt werden.                    "*003i
*
*         svali-value = p_returntab-fieldval.         "*003i"*043d
          PERFORM convert_and_update_svali                  "*043i
                  USING p_returntab-fieldval.               "*043i
          MODIFY svali INDEX tab_index.                     "*003i
          IF  tab_index >= first_line_100                   "*059i
          AND tab_index <= h_max_line.                      "*059i
            lv_stepl = tab_index - first_line_100 + 1.      "*059i
            p_dynpfields-fieldname  = 'ZSVALD-VALUE'.
            p_dynpfields-stepl      = lv_stepl.             "*059u
            p_dynpfields-fieldvalue = p_returntab-fieldval.
            APPEND p_dynpfields.
          ENDIF.                                            "*059i
          CONTINUE.
        ENDIF.
      ENDIF.

* Dritter Versuch:
*
* Überprüfen, ob das Feld FIELDNAME auf dem Dynpro vorhanden
* ist.

      READ TABLE svali WITH KEY tabname   = p_tabname
                                fieldname = p_returntab-fieldname.
      tab_index = sy-tabix.
      IF sy-subrc = 0.
*       svali-value = p_returntab-fieldval.           "*003i"*043d
        PERFORM convert_and_update_svali                    "*043i
                USING p_returntab-fieldval.                 "*043i
        MODIFY svali INDEX tab_index.                       "*003i
        IF  tab_index >= first_line_100                     "*059i
        AND tab_index <= h_max_line.                        "*059i
          lv_stepl = tab_index - first_line_100 + 1.        "*059i
          p_dynpfields-fieldname  = 'ZSVALD-VALUE'.
          p_dynpfields-stepl      = lv_stepl.               "*059u
          p_dynpfields-fieldvalue = p_returntab-fieldval.
          APPEND p_dynpfields.
        ENDIF.                                              "*059i
        CONTINUE.
      ENDIF.                                                "*042i-

    ENDLOOP.
* Suchhilfe hängt an Domäne. Nur ein Rückgabeparameter möglich.
  ELSE.
    READ TABLE p_returntab INDEX 1.
    IF sy-subrc = 0.
      lv_stepl = p_tab_index - first_line_100 + 1.          "*059i
      p_dynpfields-fieldname  = 'ZSVALD-VALUE'.
      p_dynpfields-stepl      = lv_stepl.
      p_dynpfields-fieldvalue = p_returntab-fieldval.
      APPEND p_dynpfields.
    ENDIF.
  ENDIF.

* Dynpro aktualisieren
  IF NOT p_dynpfields[] IS INITIAL.
    CALL FUNCTION 'DYNP_VALUES_UPDATE'
      EXPORTING
        dyname               = p_sy_repid
        dynumb               = p_sy_dynnr
      TABLES
        dynpfields           = p_dynpfields
      EXCEPTIONS
        invalid_abapworkarea = 1
        invalid_dynprofield  = 2
        invalid_dynproname   = 3
        invalid_dynpronummer = 4
        invalid_request      = 5
        no_fielddescription  = 6
        undefind_error       = 7
        OTHERS               = 8.
  ENDIF.

ENDFORM.                               " UPDATE_FURTHER_ENTRIES

步骤四: 修改0300屏幕和0400屏幕。

0300屏幕修改

 用下面这段代码直接覆盖掉0300的逻辑流

如图:

 代码如下:


PROCESS BEFORE OUTPUT.
  MODULE p300_init.
  LOOP AT svali CURSOR index_100.                           "*054u
    MODULE p100_show.
  ENDLOOP.
  MODULE p100_set_cursor.
*
PROCESS AFTER INPUT.
  MODULE p100_leave AT EXIT-COMMAND.
  LOOP AT svali.                                            "*054u
    CHAIN.                                                  "B20K052439
      FIELD zsvald-value.                                    "B20K052439
      MODULE clear_update_flag.                             "B20K052439
      MODULE p100_get ON CHAIN-REQUEST.                     "B20K052439
      MODULE p100_get_new.                                  "B20K052439
    ENDCHAIN.                                               "B20K052439
  ENDLOOP.
  MODULE p100_code.
*
PROCESS ON VALUE-REQUEST.
  FIELD zsvald-value   MODULE p100_value.
* FIELD SVALD-KEYTEXT MODULE P100_VALUE.

*
PROCESS ON HELP-REQUEST.
  FIELD zsvald-value   MODULE p100_help.
  FIELD zsvald-keytext MODULE p100_help.

同理,0400屏幕也需要如此修改:

 

代码如下:


PROCESS BEFORE OUTPUT.
  MODULE p300_init.
  MODULE d400_list_param.                                   "*059i
  LOOP AT svali CURSOR index_100.                           "*053u
* LOOP.
    MODULE p100_show.
  ENDLOOP.
  MODULE p100_set_cursor.
*
PROCESS AFTER INPUT.
  MODULE p100_leave AT EXIT-COMMAND.
  LOOP AT svali.
    CHAIN.                                                  "B20K052439
      FIELD zsvald-value.                                    "B20K052439
      MODULE clear_update_flag.                             "B20K052439
      MODULE p100_get ON CHAIN-REQUEST.                     "B20K052439
      MODULE p100_get_new.                                  "B20K052439
    ENDCHAIN.                                               "B20K052439
  ENDLOOP.
  MODULE p100_code.
*
PROCESS ON VALUE-REQUEST.
  FIELD zsvald-value   MODULE p100_value.
* FIELD SVALD-KEYTEXT MODULE P100_VALUE.

*
PROCESS ON HELP-REQUEST.
  FIELD zsvald-value   MODULE p100_help.
  FIELD zsvald-keytext MODULE p100_help.

到此结束。。。。

按照以上操作即可将POPUP_GET_VALUES函数的VALUE字段由132变为255

  • 7
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值