Properties | SourceCde
Title |  |
Original language | DE | Englisch
Created | 22.04.1999 |  | SAP |
Last changed by | 23.06.2003 |  | SAP |
Status | Active |
Attributes
Type | INCLUDE program |
Status | Test program |
Application | Basis |
Package | SVIM | Basis View Maintenance
| Editor lock
txt
    1
    *----------------------------------------------------------------------*
    2
    ***INCLUDE LSVIMF5A .
    3
    *----------------------------------------------------------------------*
    4
    *&---------------------------------------------------------------------*
    5
    *&      Form  VIM_BC_LOGS_PUT
    6
    *&---------------------------------------------------------------------*
    7
    *       text
    8
    *----------------------------------------------------------------------*
    9
    *      <--P_BC_ENTRY_LIST  text
    10
    *----------------------------------------------------------------------*
    11
    FORM vim_bc_logs_put CHANGING p_bc_entry_list LIKE
    12
                                  vim_bc_entry_list.
    13
    14
      DATA: corr_keytab_save LIKE TABLE OF e071k, first,
    15
            dummy LIKE sy-subrc, transport_active LIKE t000-cccoractiv,
    16
            w_tabkey_value TYPE scpractr,
    17
            tabkey_values_n TYPE vim_bc_tab_logs,
    18
            tabkey_values_u TYPE vim_bc_tab_logs,
    19
            tabkey_values_d TYPE vim_bc_tab_logs,
    20
            w_bc_entry TYPE scpr_viewdata, bc_entries TYPE scpr_viewdatas,
    21
            w_bc_entry_list TYPE vimty_bc_entry_list_type,
    22
            bc_keytab TYPE bc_keytab_type,
    23
            bc_keytab_wa LIKE LINE OF bc_keytab,
    24
            p_msgid, p_msgty, p_msgno, bc_key_needed(1) TYPE c,
    25
            foreign_langu TYPE sy-langu,
    26
            rc LIKE sy-subrc, keys_identical TYPE xfeld,
    27
            subrc TYPE sy-subrc, tabix TYPE sy-tabix.
    28
    29
      STATICS: viewname_old TYPE vimdesc-viewname,
    30
               keylen_real TYPE i.
    31
    32
      CONSTANTS: bc_id_length TYPE i VALUE 32,
    33
                 bc_recno_length TYPE i VALUE 10.
    34
    35
      FIELD-SYMBOLS: <bc_entry_keyx> TYPE x, <key> TYPE x,
    36
                     <vim_bc_keyx> TYPE x, <w_bc_entry_x> TYPE x,
    37
                     <xlangu> TYPE x, <namtab> type vimnamtab.
    38
    39
      ASSIGN: w_bc_entry_list-keys(x_header-keylen) TO <bc_entry_keyx>.
    40
      ASSIGN: bc_keytab_wa-bc_tabkey TO <vim_bc_keyx> CASTING.
    41
      ASSIGN: w_bc_entry-data TO <w_bc_entry_x> CASTING.
    42
    43
      IF x_header-viewname NE viewname_old. "HCG: has table align gap?
    44
        viewname_old = x_header-viewname.
    45
        CLEAR keylen_real.
    46
        LOOP AT x_namtab ASSIGNING <namtab> WHERE keyflag = 'X' AND
    47
                                                    texttabfld IS INITIAL.
    48
          keylen_real = keylen_real + <namtab>-flength.
    49
        ENDLOOP.
    50
      ENDIF.
    51
      LOOP AT p_bc_entry_list INTO w_bc_entry_list WHERE
    52
       viewname = x_header-viewname AND action <> original.
    53
    *    IF w_bc_entry_list-action = neuer_geloescht.   Obsolete, was only
    54
    *      DELETE p_bc_entry_list. CONTINUE.            possible at bc-set
    55
    *    ENDIF.                              activation in dialog via SM30
    56
        IF first = space.
    57
          first = 'X'.
    58
          INSERT LINES OF corr_keytab INTO TABLE corr_keytab_save.
    59
          REFRESH corr_keytab.
    60
          CLEAR <table1>.
    61
          transport_active = vim_client_state.
    62
        ENDIF.
    63
    * fill corr_keytab
    64
        IF x_header-keylen = keylen_real.
    65
          READ TABLE total WITH KEY <bc_entry_keyx> BINARY SEARCH.
    66
        ELSE.
    67
          PERFORM vim_read_table_with_gap
    68
                        TABLES   total
    69
                        USING    <bc_entry_keyx>
    70
                                 x_namtab[]
    71
                        CHANGING subrc
    72
                                 tabix.
    73
          IF subrc = 0.
    74
            READ TABLE total INDEX tabix.
    75
          ENDIF.
    76
        ENDIF.
    77
        IF x_header-bastab EQ space.                            "view
    78
          MOVE <bc_entry_keyx> TO <f1_x>.
    79
          PERFORM (corr_formname) IN PROGRAM (sy-repid) USING
    80
                                                vim_writing_bc_imp_log
    81
                                                dummy.
    82
          REFRESH bc_keytab.
    83
          CLEAR bc_key_needed.
    84
          IF x_header-keylen > vim_max_trsp_keylength. "HCG tabkey up to 255
    85
            bc_key_needed = 'X'.
    86
          ENDIF.
    87
          IF bc_key_needed NE 'X'.           "Look for non-char field in key
    88
            LOOP AT x_namtab WHERE keyflag = 'X'.
    89
              IF 'CNDT' NS x_namtab-inttype. "non charlike field
    90
                bc_key_needed = 'X'.
    91
                EXIT.
    92
              ENDIF.
    93
            ENDLOOP.
    94
          ENDIF.
    95
          IF bc_key_needed NE 'X'.             "Look if viewkey > primtabkey
    96
            CLEAR keys_identical.
    97
            PERFORM vim_comp_roottabkey USING x_header
    98
                                              x_namtab[]
    99
                                     CHANGING keys_identical
    100
                                              rc.
    101
            IF keys_identical EQ space. bc_key_needed = 'X'. ENDIF.
    102
          ENDIF.
    103
          IF bc_key_needed NE space.                 "Tabkeys via new coding
    104
            LOOP AT corr_keytab.
    105
              MOVE-CORRESPONDING corr_keytab TO bc_keytab_wa.
    106
              APPEND bc_keytab_wa TO bc_keytab.
    107
            ENDLOOP.
    108
            PERFORM vim_build_bc_tabkeys USING w_bc_entry_list
    109
                                      CHANGING bc_keytab.
    110
          ELSE.  "Tabkeys as up to now via generated coding (corr_maint_...)
    111
            LOOP AT corr_keytab.
    112
              MOVE-CORRESPONDING corr_keytab TO bc_keytab_wa.
    113
              MOVE corr_keytab-tabkey TO bc_keytab_wa-bc_tabkey.
    114
              APPEND bc_keytab_wa TO bc_keytab.
    115
            ENDLOOP.
    116
    *     Look for other languages in bc-set and append to corr_keytab too
    117
            IF x_header-texttbexst NE space.
    118
              READ TABLE bc_keytab into bc_keytab_wa
    119
                                   with key objname = x_header-texttab.
    120
              LOOP AT w_bc_entry_list-forlangu INTO foreign_langu.
    121
                ASSIGN foreign_langu TO <xlangu> casting.
    122
                MOVE <xlangu> TO
    123
        <vim_bc_keyx>+x_header-sprasfdpos(cl_abap_char_utilities=>charsize).
    124
                APPEND bc_keytab_wa TO bc_keytab.
    125
              ENDLOOP.
    126
            ENDIF.
    127
          ENDIF.
    128
        ELSE.                                                   "base table
    129
          MOVE <vim_xtotal> TO <table1_x>.
    130
          MOVE-CORRESPONDING e071k TO bc_keytab_wa.
    131
          MOVE e071k-tabkey TO bc_keytab_wa-bc_tabkey.
    132
          bc_keytab_wa-objname = x_header-maintview.
    133
          MOVE <bc_entry_keyx> TO <vim_bc_keyx>(x_header-keylen).
    134
          APPEND bc_keytab_wa TO bc_keytab.
    135
          IF x_header-bastab <> space AND
    136
             x_header-texttbexst NE space AND         "base table with
    137
             <vim_xtotal_text> NE <text_initial_x>.   "text table
    138
            MOVE-CORRESPONDING e071k TO bc_keytab_wa.
    139
            MOVE e071k-tabkey TO bc_keytab_wa-bc_tabkey.
    140
            bc_keytab_wa-objname = x_header-texttab.
    141
            MOVE <vim_xtotal_text> TO <vim_bc_keyx>(x_header-textkeylen).
    142
            APPEND bc_keytab_wa TO bc_keytab.
    143
    *       other languages
    144
            READ TABLE x_namtab WITH KEY keyflag = 'X'         "langu field
    145
                                   primtabkey = '0000'.
    146
            LOOP AT w_bc_entry_list-forlangu INTO foreign_langu.
    147
              ASSIGN foreign_langu TO <xlangu> CASTING.
    148
              MOVE <xlangu> TO
    149
                   <vim_bc_keyx>+x_namtab-texttabpos(x_namtab-flength).
    150
              APPEND bc_keytab_wa TO bc_keytab.
    151
            ENDLOOP.
    152
          ENDIF.
    153
        ENDIF.                             "base table or view
    154
        CASE w_bc_entry_list-action.
    155
          WHEN neuer_eintrag.
    156
    * bc-set imported
    157
            PERFORM bc_entry_log_fill USING     x_header
    158
                                                x_namtab[]
    159
                                                bc_keytab[]
    160
                                                w_bc_entry_list
    161
                                          CHANGING tabkey_values_n.
    162
            CLEAR w_bc_entry_list-action.
    163
          WHEN aendern.
    164
    * bc-set entry modified
    165
            PERFORM bc_entry_log_fill USING     x_header
    166
                                                x_namtab[]
    167
                                                bc_keytab[]
    168
                                                w_bc_entry_list
    169
                                          CHANGING tabkey_values_u.
    170
            CLEAR w_bc_entry_list-action.
    171
            MOVE: w_bc_entry_list-id TO w_bc_entry-bcset_id,
    172
                  w_bc_entry_list-recnumber TO w_bc_entry-recnumber,
    173
                  x_header-viewname TO w_bc_entry-viewname,
    174
                  <vim_xtotal> TO <w_bc_entry_x>.
    175
            APPEND w_bc_entry TO bc_entries.
    176
          WHEN geloescht.
    177
    * bc-set entry deleted.
    178
            PERFORM bc_entry_log_fill USING     x_header
    179
                                                x_namtab[]
    180
                                                bc_keytab[]
    181
                                                w_bc_entry_list
    182
                                          CHANGING tabkey_values_d.
    183
            DELETE p_bc_entry_list.
    184
        ENDCASE.
    185
        REFRESH corr_keytab.   "weg???
    186
        REFRESH bc_keytab.
    187
      ENDLOOP.
    188
      IF NOT tabkey_values_n IS INITIAL.
    189
        DELETE ADJACENT DUPLICATES FROM tabkey_values_n COMPARING ALL
    190
         FIELDS.
    191
        LOOP AT tabkey_values_n INTO w_tabkey_value.
    192
          CALL FUNCTION 'SCPR_EXT_SCPRACTR_FILL'
    193
            EXPORTING
    194
              tablename         = w_tabkey_value-tablename
    195
              profid            = w_tabkey_value-profid
    196
              recnumber         = w_tabkey_value-recnumber
    197
              viewname          = x_header-maintview
    198
              viewvar           = x_header-viewname
    199
              del_record        = ' '
    200
              new_record        = 'X'
    201
              key               = w_tabkey_value-tabkey
    202
            EXCEPTIONS
    203
              wrong_parameters  = 1
    204
              internal_error    = 2
    205
              key_not_supportet = 3
    206
              fielddescr_error  = 4
    207
              OTHERS            = 5.
    208
          IF sy-subrc <> 0.
    209
            p_msgid = 'SCPR'.
    210
            CASE sy-subrc.
    211
              WHEN 1.
    212
                p_msgty = 'E'.
    213
                p_msgno = '273'.
    214
              WHEN 3.
    215
                p_msgty = 'W'.
    216
                p_msgno = '408'.
    217
              WHEN 4.
    218
                p_msgty = 'E'.
    219
                p_msgno = '395'.
    220
              WHEN OTHERS.
    221
                p_msgty = 'E'.
    222
                p_msgno = '320'.
    223
            ENDCASE.
    224
            PERFORM vim_process_message USING sy-msgid sy-msgty sy-msgty
    225
                                      sy-msgno space space space space.
    226
          ENDIF.
    227
        ENDLOOP.
    228
      ENDIF.
    229
      IF NOT tabkey_values_u IS INITIAL.
    230
        DELETE ADJACENT DUPLICATES FROM tabkey_values_u COMPARING ALL
    231
         FIELDS.
    232
        LOOP AT tabkey_values_u INTO w_tabkey_value.
    233
          CALL FUNCTION 'SCPR_EXT_SCPRACTR_FILL'
    234
            EXPORTING
    235
              tablename         = w_tabkey_value-tablename
    236
              profid            = w_tabkey_value-profid
    237
              recnumber         = w_tabkey_value-recnumber
    238
              viewname          = x_header-maintview
    239
              viewvar           = x_header-viewname
    240
              del_record        = ' '
    241
              new_record        = ' '
    242
              key               = w_tabkey_value-tabkey
    243
            EXCEPTIONS
    244
              wrong_parameters  = 1
    245
              internal_error    = 2
    246
              key_not_supportet = 3
    247
              fielddescr_error  = 4
    248
              OTHERS            = 5.
    249
          IF sy-subrc <> 0.
    250
            p_msgid = 'SCPR'.
    251
            CASE sy-subrc.
    252
              WHEN 1.
    253
                p_msgty = 'E'.
    254
                p_msgno = '273'.
    255
              WHEN 3.
    256
                p_msgty = 'W'.
    257
                p_msgno = '408'.
    258
              WHEN 4.
    259
                p_msgty = 'E'.
    260
                p_msgno = '395'.
    261
              WHEN OTHERS.
    262
                p_msgty = 'E'.
    263
                p_msgno = '320'.
    264
            ENDCASE.
    265
            PERFORM vim_process_message USING sy-msgid sy-msgty sy-msgty
    266
                                      sy-msgno space space space space.
    267
          ENDIF.
    268
        ENDLOOP.
    269
      ENDIF.
    270
      IF NOT tabkey_values_d IS INITIAL.
    271
        DELETE ADJACENT DUPLICATES FROM tabkey_values_d COMPARING ALL
    272
         FIELDS.
    273
        LOOP AT tabkey_values_d INTO w_tabkey_value.
    274
          CALL FUNCTION 'SCPR_EXT_SCPRACTR_FILL'
    275
            EXPORTING
    276
              tablename         = w_tabkey_value-tablename
    277
              profid            = w_tabkey_value-profid
    278
              recnumber         = w_tabkey_value-recnumber
    279
              viewname          = x_header-maintview
    280
              viewvar           = x_header-viewname
    281
              del_record        = 'X'
    282
              new_record        = ' '
    283
              key               = w_tabkey_value-tabkey
    284
            EXCEPTIONS
    285
              wrong_parameters  = 1
    286
              internal_error    = 2
    287
              key_not_supportet = 3
    288
              fielddescr_error  = 4
    289
              OTHERS            = 5.
    290
          IF sy-subrc <> 0.
    291
            p_msgid = 'SCPR'.
    292
            CASE sy-subrc.
    293
              WHEN 1.
    294
                p_msgty = 'E'.
    295
                p_msgno = '273'.
    296
              WHEN 3.
    297
                p_msgty = 'W'.
    298
                p_msgno = '408'.
    299
              WHEN 4.
    300
                p_msgty = 'E'.
    301
                p_msgno = '395'.
    302
              WHEN OTHERS.
    303
                p_msgty = 'E'.
    304
                p_msgno = '320'.
    305
            ENDCASE.
    306
            PERFORM vim_process_message USING sy-msgid sy-msgty sy-msgty
    307
                                      sy-msgno space space space space.
    308
          ENDIF.
    309
        ENDLOOP.
    310
      ENDIF.
    311
      IF NOT corr_keytab_save IS INITIAL.
    312
        INSERT LINES OF corr_keytab_save INTO TABLE corr_keytab.
    313
      ENDIF.
    314
    ENDFORM.                               " VIM_BC_LOGS_PUT
    315
    316
    *&---------------------------------------------------------------------*
    317
    *&      Form  bc_entry_log_fill
    318
    *&---------------------------------------------------------------------*
    319
    *       fills value table for BC-set activation log for every fix entity
    320
    *       field
    321
    *----------------------------------------------------------------------*
    322
    *      -->P_HEADER  text
    323
    *      -->P_NAMTAB  text
    324
    *      -->P_CORR_KEYTAB  text
    325
    *      -->P_BC_ENTRY  text
    326
    *      <--P_TABKEY_VALUE  text
    327
    *----------------------------------------------------------------------*
    328
    FORM bc_entry_log_fill USING        p_header TYPE vimdesc
    329
                                        p_namtab LIKE x_namtab[]
    330
                                        p_bc_keytab TYPE bc_keytab_type
    331
                                   p_bc_entry TYPE vimty_bc_entry_list_type
    332
                              CHANGING p_tabkey_values TYPE vim_bc_tab_logs.
    333
    334
      STATICS: dd28j_tab TYPE TABLE OF dd28j.
    335
      DATA: w_dd28j TYPE dd28j, w_tabkey_value TYPE scpractr,
    336
            w_fields TYPE vimty_fields_type.
    337
      FIELD-SYMBOLS: <namtab> TYPE vimnamtab, <dfies> TYPE dfies,
    338
                     <keytab> TYPE bc_key_type.
    339
    340
      IF p_header-bastab = space.
    341
        READ TABLE dd28j_tab INTO w_dd28j INDEX 1.
    342
        IF sy-subrc <> 0 OR p_header-viewname <> w_dd28j-viewname.
    343
    * get join-conditions
    344
          REFRESH dd28j_tab.
    345
          CALL FUNCTION 'DDIF_VIEW_GET'
    346
            EXPORTING
    347
              name          = p_header-viewname
    348
            TABLES
    349
              dd28j_tab     = dd28j_tab
    350
            EXCEPTIONS
    351
              illegal_input = 1
    352
              OTHERS        = 2.
    353
          IF sy-subrc <> 0.
    354
    * MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
    355
    *         WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
    356
          ENDIF.
    357
        ENDIF.
    358
      ENDIF.
    359
      w_tabkey_value-client = sy-mandt.
    360
      w_tabkey_value-profid = p_bc_entry-id.
    361
      w_tabkey_value-recnumber = p_bc_entry-recnumber.
    362
      w_tabkey_value-viewname = p_header-maintview.             "HCG 6.8.02
    363
      LOOP AT p_namtab ASSIGNING <namtab> WHERE keyflag = space OR
    364
       texttabfld = space.
    365
        READ TABLE p_bc_entry-fields INTO w_fields WITH KEY fieldname =
    366
         <namtab>-viewfield.
    367
        CHECK sy-subrc = 0.
    368
        READ TABLE p_tabkey_values WITH KEY client = sy-mandt
    369
          tablename = <namtab>-bastabname profid = p_bc_entry-id
    370
          recnumber = p_bc_entry-recnumber viewname = p_header-viewname
    371
          TRANSPORTING NO FIELDS.
    372
        IF sy-subrc <> 0.
    373
          LOOP AT p_bc_keytab ASSIGNING <keytab> WHERE
    374
                                    pgmid = 'R3TR' AND
    375
                                   object = 'TABU' AND
    376
                                  objname = <namtab>-bastabname.
    377
            w_tabkey_value-tablename = <namtab>-bastabname.
    378
            w_tabkey_value-tabkey = <keytab>-bc_tabkey.
    379
            APPEND w_tabkey_value TO p_tabkey_values.
    380
          ENDLOOP.
    381
          CHECK sy-subrc = 0.
    382
        ENDIF.
    383
        IF x_header-bastab = space.
    384
    * view
    385
          LOOP AT dd28j_tab INTO w_dd28j WHERE viewname = p_header-viewname
    386
           AND ltab = <namtab>-bastabname AND lfield = <namtab>-viewfield.
    387
            READ TABLE p_tabkey_values WITH KEY client = sy-mandt
    388
              tablename = w_dd28j-rtab profid = p_bc_entry-id
    389
              recnumber = p_bc_entry-recnumber viewname = p_header-viewname
    390
              TRANSPORTING NO FIELDS.
    391
            IF sy-subrc <> 0.
    392
              READ TABLE p_bc_keytab WITH KEY pgmid = 'R3TR'
    393
                                object = 'TABU'
    394
                                  objname = w_dd28j-rtab ASSIGNING <keytab>.
    395
              CHECK sy-subrc = 0.
    396
              w_tabkey_value-tablename = w_dd28j-rtab.
    397
              w_tabkey_value-tabkey = <keytab>-bc_tabkey.
    398
              APPEND w_tabkey_value TO p_tabkey_values.
    399
            ENDIF.
    400
          ENDLOOP.
    401
          LOOP AT dd28j_tab INTO w_dd28j WHERE viewname = p_header-viewname
    402
           AND rtab = <namtab>-bastabname AND rfield = <namtab>-viewfield.
    403
            READ TABLE p_tabkey_values WITH KEY client = sy-mandt
    404
              tablename = w_dd28j-ltab profid = p_bc_entry-id
    405
              recnumber = p_bc_entry-recnumber viewname = p_header-viewname
    406
              TRANSPORTING NO FIELDS.
    407
            IF sy-subrc <> 0.
    408
              LOOP AT p_bc_keytab ASSIGNING <keytab> WHERE
    409
                                    pgmid = 'R3TR' AND
    410
                                   object = 'TABU' AND
    411
                                  objname = w_dd28j-ltab.
    412
                w_tabkey_value-tablename = w_dd28j-ltab.
    413
                w_tabkey_value-tabkey = <keytab>-bc_tabkey.
    414
                APPEND w_tabkey_value TO p_tabkey_values.
    415
              ENDLOOP.
    416
              CHECK sy-subrc = 0.
    417
            ENDIF.
    418
          ENDLOOP.
    419
        ENDIF.
    420
      ENDLOOP.
    421
    ENDFORM.                               " bc_entry_log_fill
    422
    *&---------------------------------------------------------------------*
    423
    *&      Form  VIM_BC_LOGS_GET
    424
    *&---------------------------------------------------------------------*
    425
    *       text
    426
    *----------------------------------------------------------------------*
    427
    *      <--P_C_ENTRY_LIST  text
    428
    *      -->P_VIEW_NAME  text
    429
    *      -->P_HEADER  text
    430
    *      -->P_NAMTAB  text
    431
    *----------------------------------------------------------------------*
    432
    FORM vim_bc_logs_get USING    p_view_name TYPE tabname
    433
                                  p_header TYPE vimdesc
    434
                                  p_namtab LIKE x_namtab[]
    435
                    CHANGING p_bc_entry_list TYPE vimty_bc_entry_list_ttype.
    436
    437
      STATICS: tablist TYPE TABLE OF scprxtabl, viewname TYPE tabname.
    438
    439
      DATA:    tabkeys TYPE TABLE OF scpractr, w_tablist TYPE scprxtabl,
    440
               bc_entry_list_wa TYPE vimty_bc_entry_list_type, failed(1),
    441
               rc LIKE sy-subrc, keys_identical TYPE xfeld,
    442
               x030l_root TYPE x030l,
    443
               x030l_bastab TYPE x030l,
    444
               root_entry TYPE REF TO data,
    445
               bastab_entry TYPE REF TO data,
    446
               tabflags TYPE scpr_actfs, tabflags_wa TYPE scpr_actf,
    447
    *           tabflags_quick TYPE HASHED TABLE OF scpr_actf
    448
    *            WITH UNIQUE KEY tablename fieldname bcset_id
    449
               tabflags_quick TYPE SORTED TABLE OF scpr_actf
    450
                WITH NON-UNIQUE KEY tablename fieldname bcset_id
    451
                recnumber tabkey INITIAL SIZE 100,
    452
               fields_wa TYPE vimty_fields_type,
    453
               bc_entry_list TYPE STANDARD TABLE OF
    454
                vimty_bc_entry_list_type WITH KEY viewname keys,
    455
                tabkey_wa TYPE scpractr-tabkey,
    456
                tabkeys_wa TYPE scpractr,
    457
                roottab TYPE tabname,
    458
                tabix TYPE sy-tabix,
    459
                tabkey_struc(1024) TYPE c.
    460
      FIELD-SYMBOLS: <namtab> TYPE vimnamtab, <tabkeys> TYPE scpractr,
    461
                     <tabkeys_main> TYPE scpractr,
    462
                     <bastab> TYPE ANY, <bastab_x> TYPE x,
    463
                     <roottab> TYPE ANY, <roottab_x> TYPE x,
    464
                     <rootfld> TYPE ANY,
    465
                     <tabkey> TYPE x, <viewfld> TYPE ANY,
    466
                     <clnt> TYPE ANY,
    467
                     <tabkey_c> TYPE c.
    468
    469
      DELETE p_bc_entry_list WHERE viewname = p_header-maintview."HCG 6.8.02
    470
      CHECK vim_import_profile = space.
    471
    * CHECK 'TS' NS maint_mode.   "HCG Necessary in show and transport mode
    472
    *                   too, e.g. for selection show only data from BC-Sets
    473
      IF viewname <> p_header-viewname.
    474
    * make table list
    475
        viewname = p_header-viewname.
    476
        REFRESH tablist.
    477
        w_tablist-sign = 'I'. w_tablist-option = 'EQ'.
    478
        IF p_header-bastab EQ 'X'.                              "S-table
    479
          w_tablist-low = viewname.         "HCG only roottab in tablist
    480
          roottab = viewname.
    481
          COLLECT w_tablist INTO tablist.
    482
        ELSE.                                                      "View
    483
          w_tablist-low = p_header-roottab. "HCG only roottab in tablist
    484
          roottab = p_header-roottab.
    485
          COLLECT w_tablist INTO tablist.
    486
        ENDIF.
    487
      ENDIF.
    488
      CALL FUNCTION 'SCPR_BCSET_PROT_GET_TABKEYS'
    489
        EXPORTING
    490
          viewname = viewname
    491
        IMPORTING
    492
          actkeys  = tabkeys
    493
          tabflags = tabflags
    494
        TABLES
    495
          tabnames = tablist
    496
        EXCEPTIONS
    497
          no_data  = 1
    498
          OTHERS   = 2.
    499
      CHECK sy-subrc = 0 AND NOT tabkeys IS INITIAL.
    500
      IF p_header-bastab EQ 'X'.                              "S-table
    501
        roottab = viewname.
    502
      ELSE.                                                      "View
    503
        roottab = p_header-roottab.
    504
      ENDIF.
    505
      LOOP AT tabkeys INTO tabkeys_wa.
    506
        tabkey_wa = tabkeys_wa-tabkey.
    507
        tabix = sy-tabix.
    508
        CALL FUNCTION 'SCPR_EXT_ACTKEY_TO_KEY'
    509
          EXPORTING
    510
            tablename              = roottab
    511
            tablekey               = tabkey_wa
    512
          IMPORTING
    513
            key                    = tabkey_struc
    514
          EXCEPTIONS
    515
            WRONG_PARAMETERS       = 1
    516
            KEY_TOO_LARGE          = 2
    517
            FIELDDESCR_ERROR       = 3
    518
            INTERNAL_ERROR         = 4
    519
            OTHERS                 = 5.
    520
        IF sy-subrc NE 0.
    521
          MESSAGE ID sy-msgid TYPE 'I' NUMBER sy-msgno
    522
           WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
    523
        ENDIF.
    524
        ASSIGN tabkey_struc TO <tabkey_c> CASTING.
    525
        tabkeys_wa-tabkey = <tabkey_c>.
    526
        MODIFY tabkeys FROM tabkeys_wa INDEX tabix.
    527
      ENDLOOP.
    528
      bc_entry_list_wa-viewname = p_header-maintview.          "HCG 6.8.02
    529
      IF p_header-clidep <> space.
    530
        READ TABLE p_namtab ASSIGNING <namtab>
    531
         WITH KEY datatype = 'CLNT'.
    532
        ASSIGN COMPONENT <namtab>-viewfield
    533
         OF STRUCTURE <table1_wa> TO <clnt>.
    534
      ENDIF.
    535
      IF p_header-bastab = space.
    536
    * build up viewkeys and put'em into entry list
    537
    ***********************************************************************
    538
    * viewkey and roottabkey identical?
    539
        PERFORM vim_comp_roottabkey USING p_header
    540
                                          p_namtab
    541
                                    CHANGING keys_identical
    542
                                             rc.
    543
        CHECK rc = 0.
    544
        IF keys_identical = space.
    545
          PERFORM vim_get_x030l USING p_header-roottab
    546
                                CHANGING x030l_root
    547
                                         rc.
    548
          CHECK rc = 0.
    549
          CREATE DATA root_entry TYPE (p_header-roottab).
    550
          ASSIGN: root_entry->* TO <roottab>,
    551
                  <roottab> TO <roottab_x> CASTING.
    552
        ENDIF.
    553
        INSERT LINES OF tabflags INTO TABLE tabflags_quick.
    554
        LOOP AT tabkeys ASSIGNING <tabkeys_main> WHERE
    555
         tablename = p_header-roottab.
    556
          CLEAR: failed, <table1_wa>.
    557
    * get all primary table entries
    558
          bc_entry_list_wa-id = <tabkeys_main>-profid.
    559
          bc_entry_list_wa-recnumber = <tabkeys_main>-recnumber.
    560
          ASSIGN <tabkeys_main>-tabkey TO <tabkey> CASTING.
    561
          IF keys_identical <> space.
    562
    * move complete table key to view key
    563
            MOVE <tabkey>(p_header-keylen) TO <f1_wax>.
    564
          ELSE.
    565
    * fill view key field by field
    566
            CLEAR: <roottab>.
    567
            MOVE <tabkey>(x030l_root-keylen)
    568
             TO <roottab_x>(x030l_root-keylen).
    569
            LOOP AT p_namtab ASSIGNING <namtab> WHERE keyflag <> space AND
    570
             texttabfld = space.
    571
    * build viewkey...
    572
              CHECK <namtab>-datatype <> 'CLNT' OR p_header-clidep = space.
    573
              ASSIGN COMPONENT <namtab>-viewfield
    574
               OF STRUCTURE <table1_wa> TO <viewfld>.
    575
              IF <namtab>-bastabname = p_header-roottab.
    576
    * ... from primary table
    577
                ASSIGN COMPONENT <namtab>-bastabfld OF STRUCTURE <roottab>
    578
                 TO <rootfld>.
    579
                MOVE <rootfld> TO <viewfld>.
    580
              ELSE.
    581
    * ... from secondary table
    582
                failed = 'X'.
    583
                IF NOT <tabkeys> IS ASSIGNED
    584
                 OR <tabkeys>-tablename <> <namtab>-bastabname.
    585
                  READ TABLE tabkeys ASSIGNING <tabkeys>
    586
                   WITH KEY tablename = <namtab>-bastabname
    587
                            recnumber = <tabkeys_main>-recnumber
    588
                            profid = <tabkeys_main>-profid.
    589
                  IF sy-subrc <> 0.
    590
                    UNASSIGN <tabkeys>.
    591
                    EXIT.
    592
                  ENDIF.
    593
                  PERFORM vim_get_x030l USING <namtab>-bastabname
    594
                                        CHANGING x030l_bastab
    595
                                                 rc.
    596
                  CHECK rc = 0.
    597
                  CREATE DATA bastab_entry TYPE (<namtab>-bastabname).
    598
                  ASSIGN: bastab_entry->* TO <bastab>,
    599
                          <bastab> TO <bastab_x> CASTING.
    600
                ENDIF.
    601
                MOVE <tabkey>(x030l_bastab-keylen)
    602
                 TO <bastab_x>(x030l_bastab-keylen).
    603
                ASSIGN COMPONENT <namtab>-bastabfld OF STRUCTURE <bastab>
    604
                 TO <rootfld>.
    605
                MOVE <rootfld> TO <viewfld>.
    606
                CLEAR failed.
    607
              ENDIF.
    608
            ENDLOOP.
    609
            CHECK failed IS INITIAL.
    610
          ENDIF.
    611
          IF p_header-clidep <> space.
    612
    * fill client-field
    613
            MOVE sy-mandt TO <clnt>.
    614
          ENDIF.
    615
          MOVE <f1_wax> TO bc_entry_list_wa-keys.
    616
          REFRESH bc_entry_list_wa-fields.
    617
          LOOP AT p_namtab ASSIGNING <namtab>.
    618
            CHECK <namtab>-datatype <> 'CLNT' OR p_header-clidep = space.
    619
    * get bc-set field attributes
    620
            READ TABLE tabflags_quick INTO tabflags_wa WITH KEY
    621
             tablename = p_header-viewname fieldname = <namtab>-viewfield
    622
             bcset_id = bc_entry_list_wa-id
    623
             recnumber = bc_entry_list_wa-recnumber.
    624
            CHECK sy-subrc = 0.
    625
            fields_wa-fieldname = <namtab>-viewfield.
    626
            fields_wa-flag = tabflags_wa-flag.
    627
            APPEND fields_wa TO bc_entry_list_wa-fields.
    628
          ENDLOOP.
    629
          INSERT bc_entry_list_wa INTO TABLE bc_entry_list.
    630
        ENDLOOP.
    631
      ELSE.
    632
    * move table keys into entry list
    633
    ***********************************************************************
    634
        LOOP AT tabkeys ASSIGNING <tabkeys_main> WHERE
    635
         tablename = p_header-viewname.
    636
          bc_entry_list_wa-id = <tabkeys_main>-profid.
    637
          bc_entry_list_wa-recnumber = <tabkeys_main>-recnumber.
    638
          ASSIGN <tabkeys_main>-tabkey TO <tabkey> CASTING.
    639
          MOVE <tabkey>(p_header-keylen) TO <table1_wax>(p_header-keylen).
    640
          IF p_header-clidep <> space.
    641
    * fill client-field
    642
            MOVE sy-mandt TO <clnt>.
    643
          ENDIF.
    644
          MOVE <f1_wax> TO bc_entry_list_wa-keys.
    645
    * get bc-set field attributes
    646
          LOOP AT tabflags INTO tabflags_wa WHERE ( tablename =
    647
           p_header-viewname OR tablename = p_header-texttab ) AND
    648
           bcset_id = bc_entry_list_wa-id
    649
           AND recnumber = bc_entry_list_wa-recnumber.
    650
            fields_wa-fieldname = tabflags_wa-fieldname.
    651
            fields_wa-flag = tabflags_wa-flag.
    652
            APPEND fields_wa TO bc_entry_list_wa-fields.
    653
          ENDLOOP.
    654
          INSERT bc_entry_list_wa INTO TABLE bc_entry_list.
    655
        ENDLOOP.
    656
      ENDIF.
    657
      SORT bc_entry_list.
    658
    * should normally not be necessary:
    659
      DELETE ADJACENT DUPLICATES FROM bc_entry_list.
    660
      DESCRIBE TABLE bc_entry_list.
    661
    * changing of fix BC-set-entries?
    662
      CLEAR <status>-bcfixnochg.
    663
      IF sy-tfill > 0.
    664
        INSERT LINES OF bc_entry_list INTO TABLE p_bc_entry_list.
    665
        CALL FUNCTION 'SCPR_AUTHORITY_CHECK'
    666
          EXPORTING
    667
            task             = 'CHGFIXVAL'
    668
          EXCEPTIONS
    669
            wrong_parameters = 1
    670
            no_authority     = 2
    671
            OTHERS           = 3.
    672
        IF sy-subrc <> 0.
    673
          <status>-bcfixnochg = 'N'.
    674
        ELSE.
    675
          <status>-bcfixnochg = 'Y'.
    676
        ENDIF.
    677
      ENDIF.
    678
    ENDFORM.                               " VIM_GET_BC_LOGS
    679
    *&---------------------------------------------------------------------*
    680
    *&      Form  VIM_BC_LOGS_MAINTAIN
    681
    *&---------------------------------------------------------------------*
    682
    *       text
    683
    *----------------------------------------------------------------------*
    684
    *      -->P_HEADER         Header info of maintenance dialog
    685
    *      -->P_BACKGROUND     Flag: 'X' means BC-set import in background
    686
    *                                running.
    687
    *      <--P_BC_ENTRY_LIST  List of entries coming from BC-set
    688
    *----------------------------------------------------------------------*
    689
    FORM vim_bc_logs_maintain USING    p_header TYPE vimdesc
    690
                                       p_background TYPE xfeld
    691
                              CHANGING p_bc_entry_list LIKE
    692
                                       vim_bc_entry_list.
    693
    694
      DATA: fields_wa TYPE vimty_fields_type,
    695
            subrc TYPE sy-subrc, tabix TYPE sy-tabix.
    696
      STATICS:       viewname_old TYPE vimdesc-viewname,
    697
                     keylen_real TYPE i.
    698
      FIELD-SYMBOLS: <bc_entry> TYPE vimty_bc_entry_list_type,
    699
                     <key> TYPE x, <namtab> type vimnamtab.
    700
    701
      IF p_background = space.
    702
    * bc import running in dialogue
    703
        LOOP AT total.
    704
          CHECK ' N' NS <action>.
    705
          READ TABLE p_bc_entry_list ASSIGNING <bc_entry> WITH KEY
    706
           viewname = p_header-viewname keys = <vim_xtotal_key>.
    707
          CHECK sy-subrc = 0.
    708
          CASE <action>.
    709
            WHEN aendern.
    710
    * Rel. 4.6 only: does entry contain fix values?
    711
    *          LOOP AT <bc_entry>-fields INTO fields_wa
    712
    *           WHERE flag = vim_profile_fix.
    713
    *            TRANSLATE <bc_entry>-action USING ' U'.
    714
    *            EXIT.
    715
    *          ENDLOOP.
    716
            WHEN geloescht.
    717
    * deleting bc-set-entry
    718
              CASE <bc_entry>-action.
    719
                WHEN neuer_eintrag.
    720
                  <bc_entry>-action = neuer_geloescht.
    721
                WHEN OTHERS.
    722
                  <bc_entry>-action = geloescht.
    723
              ENDCASE.
    724
    *      WHEN zurueckholen.
    725
    ** undeleting BC-set-entry --> maintain table of BC-Set-entries
    726
    *        CASE <bc_entry>-action.
    727
    *          WHEN neuer_geloescht.
    728
    *            <bc_entry>-action = neuer_eintrag.
    729
    *          WHEN OTHERS.
    730
    *            <bc_entry>-action = original.
    731
          ENDCASE.
    732
        ENDLOOP.
    733
      ELSE.
    734
    * bc import running in background
    735
        DELETE vim_bc_entry_list WHERE viewname = p_header-viewname.
    736
        PERFORM vim_get_global_table IN PROGRAM saplsvim
    737
                    USING 'VIM_BC_ENTRY_LIST'
    738
                           vim_bc_entry_list
    739
                           sy-subrc.
    740
        IF sy-subrc <> 0.
    741
          EXIT.
    742
        ENDIF.
    743
        IF p_header-viewname NE viewname_old. "HCG: has table align gap?
    744
          viewname_old = p_header-viewname.
    745
          CLEAR keylen_real.
    746
          LOOP AT x_namtab ASSIGNING <namtab> WHERE keyflag = 'X' AND
    747
                                                    texttabfld IS INITIAL.
    748
            keylen_real = keylen_real + <namtab>-flength.
    749
          ENDLOOP.
    750
        ENDIF.
    751
        LOOP AT vim_bc_entry_list ASSIGNING <bc_entry> WHERE
    752
         viewname = p_header-viewname.
    753
          ASSIGN <bc_entry>-keys(x_header-keylen) TO <key>.
    754
          IF p_header-keylen = keylen_real.
    755
            READ TABLE total WITH KEY <key> BINARY SEARCH.
    756
            subrc = sy-subrc.
    757
          ELSE.
    758
            PERFORM vim_read_table_with_gap
    759
                        TABLES   total
    760
                        USING    <key>
    761
                                 x_namtab[]
    762
                        CHANGING subrc
    763
                                 tabix.
    764
            IF subrc = 0.
    765
              READ TABLE total INDEX tabix.
    766
            ENDIF.
    767
          ENDIF.
    768
    * bc-set entry really imported?
    769
          IF subrc <> 0 OR 'NU' NS <action>.
    770
            DELETE vim_bc_entry_list.
    771
          ENDIF.
    772
        ENDLOOP.
    773
      ENDIF.
    774
    ENDFORM.                               " VIM_BC_LOGS_MAINTAIN
    775
    *&---------------------------------------------------------------------*
    776
    *&      Form  VIM_BC_LOGS_USE
    777
    *&---------------------------------------------------------------------*
    778
    *       delivers field attribute defined in BC-sets
    779
    *----------------------------------------------------------------------*
    780
    *      -->P_FIELD         text
    781
    *      -->P_VIM_BC_ENTRY  text
    782
    *      <--P_SCREEN_INPUT  text
    783
    *      <--P_MODIFY_SCREEN  text
    784
    *----------------------------------------------------------------------*
    785
    FORM vim_bc_logs_use USING p_field TYPE fieldname
    786
                               p_vim_bc_entry TYPE vimty_bc_entry_list_type
    787
                         CHANGING p_screen LIKE screen
    788
                                  p_modify_screen TYPE xfeld.
    789
    790
      DATA w_field TYPE vimty_fields_type.
    791
    792
      READ TABLE p_vim_bc_entry-fields INTO w_field
    793
       WITH TABLE KEY fieldname = p_field.
    794
      CHECK sy-subrc = 0.
    795
      IF w_field-flag = vim_profile_fix.
    796
        p_screen-input = 0.
    797
        p_modify_screen = 'X'.
    798
      ENDIF.
    799
    ENDFORM.                               " VIM_BC_LOGS_USE
    800
    *&---------------------------------------------------------------------*
    801
    *&      Form  vim_chng_fix_flds
    802
    *&---------------------------------------------------------------------*
    803
    *       make fix values form bc-sets modifiable
    804
    *----------------------------------------------------------------------*
    805
    *  -->  p1        text
    806
    *  <--  p2        text
    807
    *----------------------------------------------------------------------*
    808
    FORM vim_chng_fix_flds.
    809
      IF <status>-bcfixnochg = 'Y'.
    810
        vim_bc_chng_allowed = 'X'.
    811
      ELSE.
    812
        MESSAGE e202(sv).
    813
    *   Sie haben keine Berechtigung, Felder mit fixen BC-Set-Werten zu ände
    814
      ENDIF.
    815
    ENDFORM.                               " vim_chng_fix_flds
    816
    *&---------------------------------------------------------------------*
    817
    *&      Form  vim_get_x030l
    818
    *&---------------------------------------------------------------------*
    819
    *       Delivers X030l fron dictionary.
    820
    *----------------------------------------------------------------------*
    821
    *      -->P_TABNAME     tablename
    822
    *      <--P_X030L
    823
    *      <--P_RC
    824
    *----------------------------------------------------------------------*
    825
    FORM vim_get_x030l  USING    p_tabname TYPE tabname
    826
                        CHANGING p_x030l TYPE x030l
    827
                                 p_rc LIKE sy-subrc.
    828
      CALL FUNCTION 'DDIF_NAMETAB_GET'
    829
        EXPORTING
    830
          tabname  = p_tabname
    831
        IMPORTING
    832
          x030l_wa = p_x030l
    833
        EXCEPTIONS
    834
          OTHERS   = 1.
    835
      p_rc = sy-subrc.
    836
    ENDFORM.                    " vim_get_x030l
    837
    *&---------------------------------------------------------------------*
    838
    *&      Form  vim_bc_show_fix_flds
    839
    *&---------------------------------------------------------------------*
    840
    *       text
    841
    *----------------------------------------------------------------------*
    842
    *  -->  p1        text
    843
    *  <--  p2        text
    844
    *----------------------------------------------------------------------*
    845
    FORM vim_bc_show_fix_flds.
    846
    DATA: p_tabtype TYPE objh-objecttype,
    847
          p_tabname TYPE scpr_tabl.
    848
    849
      p_tabname = x_header-maintview. "HCG 6.8.02 actlinks for maintview
    850
      if x_header-bastab = space.
    851
        p_tabtype = 'V'.
    852
      ELSE.
    853
        p_tabtype = 'S'.
    854
      ENDIF.
    855
      LOOP AT extract.
    856
        IF <xmark> NE markiert.
    857
          CONTINUE.
    858
        ELSE.
    859
          MOVE <vim_extract_struc> TO <table1>.
    860
          CALL FUNCTION 'SCPR_ACTIVATION_INFOS_SHOW'
    861
            EXPORTING
    862
              tablename     = p_tabname
    863
              tabletype     = p_tabtype
    864
              record        = <table1>
    865
            EXCEPTIONS
    866
              FIELDDEFINITION_ERROR  = 1
    867
              NO_TVDIR_ENTRY         = 2
    868
              TABLE_NOT_FOUND        = 3
    869
              TABLE_TO_LARGE         = 4
    870
              DDIF_INTERNAL_ERROR    = 5
    871
              WRONG_PARAMETERS       = 6
    872
              INTERNAL_ERROR         = 7
    873
              NO_ACTLINKS            = 8
    874
              KEY_TOO_LARGE          = 9
    875
              OTHERS                 = 10.
    876
          case sy-subrc.
    877
            when 0.
    878
            when 1.
    879
              message e395(SCPR) raising FIELDDEFINITION_ERROR.
    880
            when 2.
    881
              message e028(SCPR) with p_tabname raising NO_TVDIR_ENTRY.
    882
            when 3.
    883
              message e120(SCPR) with p_tabname raising TABLE_NOT_FOUND.
    884
            when 4.
    885
              message e026(SCPR) with p_tabname raising TABLE_TO_LARGE.
    886
            when 5.
    887
              message e035(SCPR) raising DDIF_INTERNAL_ERROR.
    888
            when 6.
    889
              message e273(SCPR) raising WRONG_PARAMETERS.
    890
            when 8.
    891
              message s399(SCPR) raising NO_ACTLINKS.
    892
            when 9.
    893
              message e408(SCPR) raising KEY_TOO_LARGE.
    894
            when others.
    895
              message e320(SCPR) raising INTERNAL_ERROR.
    896
          endcase.
    897
        ENDIF.
    898
      ENDLOOP.
    899
    ENDFORM.                    " vim_bc_show_fix_flds
    900
    *&---------------------------------------------------------------------*
    901
    *&      Form  vim_build_bc_tabkeys
    902
    *&---------------------------------------------------------------------*
    903
    *   To build up table keys for views with keylen > 120 up to 256
    904
    *   and / or non-character like fields.
    905
    *----------------------------------------------------------------------*
    906
    *      <--P_BC_KEYTAB  text
    907
    *----------------------------------------------------------------------*
    908
    FORM vim_build_bc_tabkeys USING bc_entry_list_wa TYPE
    909
                                           vimty_bc_entry_list_type
    910
                           CHANGING p_bc_keytab TYPE bc_keytab_type.
    911
    912
      TYPES: BEGIN OF tablist_type,
    913
               tabname TYPE objs-tabname,
    914
             END OF tablist_type.
    915
    916
      STATICS: cg_dd28j_tab LIKE dd28j OCCURS 30,
    917
               old_viewname LIKE vimdesc-viewname,
    918
               all_dfiestab LIKE dfies OCCURS 40.
    919
    920
      DATA: objstablist TYPE TABLE OF tablist_type,
    921
            namtab_wa TYPE vimnamtab,
    922
            tabname_wa TYPE objs-tabname,
    923
            dd28j_wa LIKE LINE OF cg_dd28j_tab,
    924
            primtab_entry TYPE REF TO data,
    925
            sektab_entry TYPE REF TO data,
    926
            p_bc_keytab_wa LIKE LINE OF p_bc_keytab,
    927
            keytab_index TYPE sy-tabix,
    928
            bc_keylen TYPE i, flag(1) TYPE c,
    929
            cg_langu(1) TYPE c,
    930
            cg_dfiestab LIKE dfies OCCURS 10,
    931
            dfies_wa LIKE LINE OF cg_dfiestab,
    932
            piecelist TYPE TABLE OF objs-tabname,
    933
            foreign_langu LIKE sy-langu,
    934
            langu_fieldname TYPE dfies-fieldname,
    935
            p_bc_keytab_langu TYPE bc_keytab_type,
    936
            w_bc_entry_list TYPE vimty_bc_entry_list_type.
    937
    938
      FIELD-SYMBOLS: <primtab> TYPE ANY, <sektab> TYPE ANY,
    939
                     <viewfld> TYPE ANY,
    940
                     <primtabfld> TYPE ANY, <sektabfld> TYPE ANY,
    941
                     <bc_tabkey> TYPE bc_key_type-bc_tabkey,
    942
                     <tabkey_x> TYPE x, <tabkey_struc_x> TYPE x.
    943
    944
      IF x_header-viewname NE old_viewname.
    945
        old_viewname = x_header-viewname.
    946
        CALL FUNCTION 'DDIF_VIEW_GET'
    947
          EXPORTING
    948
            name          = x_header-viewname
    949
            state         = 'A'
    950
            langu         = sy-langu
    951
          IMPORTING
    952
            gotstate      = flag
    953
          TABLES
    954
            dd28j_tab     = cg_dd28j_tab
    955
          EXCEPTIONS
    956
            illegal_input = 1
    957
            OTHERS        = 2.
    958
        IF sy-subrc <> 0.
    959
          MESSAGE e164(sv) WITH tabname_wa RAISING view_not_found.
    960
        ENDIF.
    961
        IF flag = space.
    962
          MESSAGE e306(sv) WITH tabname_wa RAISING view_not_found.
    963
        ENDIF.
    964
    *   Get tables from piecelist
    965
        SELECT tabname FROM objs INTO tabname_wa
    966
                           WHERE objectname = x_header-viewname
    967
                             AND objecttype = 'V'.
    968
          APPEND tabname_wa TO piecelist.
    969
        ENDSELECT.
    970
        REFRESH all_dfiestab.
    971
        LOOP AT piecelist INTO tabname_wa.
    972
          REFRESH cg_dfiestab.
    973
          CALL FUNCTION 'DDIF_NAMETAB_GET'
    974
            EXPORTING
    975
              tabname   = tabname_wa
    976
            TABLES
    977
              dfies_tab = cg_dfiestab[]
    978
            EXCEPTIONS
    979
              not_found = 1
    980
              OTHERS    = 2.
    981
          IF sy-subrc NE 0.
    982
            MESSAGE e028(sv) WITH tabname_wa RAISING view_not_found.
    983
          ENDIF.
    984
          LOOP AT cg_dfiestab INTO dfies_wa.
    985
            APPEND dfies_wa TO all_dfiestab.
    986
          ENDLOOP.
    987
        ENDLOOP.
    988
      ENDIF.
    989
      LOOP AT p_bc_keytab INTO p_bc_keytab_wa.
    990
        keytab_index = sy-tabix.
    991
        IF p_bc_keytab_wa-objname = x_header-roottab.
    992
    *-----Build tabkey for root-table from viewkey-------------------------
    993
          CREATE DATA primtab_entry TYPE (x_header-roottab).
    994
          ASSIGN primtab_entry->* TO <primtab>.
    995
          LOOP AT x_namtab WHERE keyflag = 'X' AND
    996
                               bastabname = x_header-roottab.
    997
            ASSIGN COMPONENT x_namtab-viewfield OF STRUCTURE
    998
                       <vim_total_struc> TO <viewfld>.
    999
            ASSIGN COMPONENT x_namtab-bastabfld OF STRUCTURE <primtab>
    1000
                       TO <primtabfld>.
    1001
            MOVE <viewfld> TO <primtabfld>.
    1002
          ENDLOOP.                 " Primtabkey completely in <primtab>
    1003
          PERFORM vim_get_bc_keylen    "Analog corr_maint_>>viewname<<
    1004
                  USING x_header-roottab
    1005
               CHANGING bc_keylen.
    1006
          ASSIGN <primtab> TO <tabkey_struc_x> CASTING.
    1007
          ASSIGN p_bc_keytab_wa-bc_tabkey TO <tabkey_x> CASTING.
    1008
          MOVE <tabkey_struc_x>(bc_keylen) TO <tabkey_x>(bc_keylen).
    1009
          MODIFY p_bc_keytab INDEX keytab_index FROM p_bc_keytab_wa.
    1010
        ELSEIF p_bc_keytab_wa-objname EQ x_header-texttab.
    1011
    *-----Build tabkeys for textable of view from viewkey field by field---
    1012
          REFRESH p_bc_keytab_langu.
    1013
          tabname_wa = p_bc_keytab_wa-objname.
    1014
          CREATE DATA sektab_entry TYPE (tabname_wa).
    1015
          ASSIGN sektab_entry->* TO <sektab>.
    1016
          PERFORM vim_get_bc_keylen    "Analog corr_maint_>>viewname<<
    1017
                      USING tabname_wa
    1018
                      CHANGING bc_keylen.
    1019
          LOOP AT all_dfiestab INTO dfies_wa WHERE tabname = tabname_wa
    1020
                                              AND keyflag = 'X'.
    1021
            CLEAR cg_langu.
    1022
            READ TABLE cg_dd28j_tab WITH KEY rtab = tabname_wa
    1023
                                           rfield = dfies_wa-fieldname
    1024
                                        INTO dd28j_wa.
    1025
            IF sy-subrc EQ 0.
    1026
              READ TABLE x_namtab WITH KEY bastabname = dd28j_wa-ltab
    1027
                                            bastabfld = dd28j_wa-lfield.
    1028
            ELSE.       "Field not in join -> additional keyfield in view
    1029
              READ TABLE x_namtab WITH KEY bastabname = tabname_wa
    1030
                                        bastabfld = dfies_wa-fieldname.
    1031
              IF sy-subrc NE 0.    "Then it must be langu field of texttab
    1032
                cg_langu = 'X'.
    1033
              ENDIF.
    1034
            ENDIF.
    1035
            IF cg_langu EQ space.                 "Field is not langu field
    1036
              ASSIGN COMPONENT x_namtab-viewfield OF STRUCTURE
    1037
                         <vim_total_struc> TO <viewfld>.
    1038
              ASSIGN COMPONENT dfies_wa-fieldname OF STRUCTURE
    1039
                                               <sektab> TO <sektabfld>.
    1040
              MOVE <viewfld> TO <sektabfld>.
    1041
            ELSE.                                     "Field is langu field
    1042
              langu_fieldname = dfies_wa-fieldname.
    1043
              ASSIGN COMPONENT dfies_wa-fieldname OF STRUCTURE
    1044
                                               <sektab> TO <sektabfld>.
    1045
              MOVE sy-langu TO <sektabfld>.
    1046
            ENDIF.
    1047
            ASSIGN <sektab> TO <tabkey_struc_x> CASTING.
    1048
            ASSIGN p_bc_keytab_wa-bc_tabkey TO <tabkey_x> CASTING.
    1049
            MOVE <tabkey_struc_x>(bc_keylen) TO <tabkey_x>(bc_keylen).
    1050
          ENDLOOP.
    1051
          MODIFY p_bc_keytab INDEX keytab_index FROM p_bc_keytab_wa.
    1052
    *     Look for other languages in bc-set and append to p_bc_keytab too
    1053
          ASSIGN COMPONENT langu_fieldname OF STRUCTURE
    1054
                                               <sektab> TO <sektabfld>.
    1055
          LOOP AT bc_entry_list_wa-forlangu INTO foreign_langu.
    1056
            MOVE foreign_langu TO <sektabfld>.
    1057
            MOVE <tabkey_struc_x>(bc_keylen) TO <tabkey_x>(bc_keylen).
    1058
            APPEND p_bc_keytab_wa TO p_bc_keytab_langu.
    1059
          ENDLOOP.
    1060
        ELSE.
    1061
    *-----Build tabkeys for secondary tabs from viewkey field by field-----
    1062
          tabname_wa = p_bc_keytab_wa-objname.
    1063
          CREATE DATA sektab_entry TYPE (tabname_wa).
    1064
          ASSIGN sektab_entry->* TO <sektab>.
    1065
          PERFORM vim_get_bc_keylen    "Analog corr_maint_>>viewname<<
    1066
                      USING tabname_wa
    1067
                      CHANGING bc_keylen.
    1068
          LOOP AT all_dfiestab INTO dfies_wa WHERE tabname = tabname_wa
    1069
                                              AND keyflag = 'X'.
    1070
            CLEAR cg_langu.
    1071
            READ TABLE cg_dd28j_tab WITH KEY rtab = tabname_wa
    1072
                                           rfield = dfies_wa-fieldname
    1073
                                        INTO dd28j_wa.
    1074
            IF sy-subrc EQ 0.
    1075
              READ TABLE x_namtab WITH KEY bastabname = dd28j_wa-ltab
    1076
                                            bastabfld = dd28j_wa-lfield.
    1077
            ELSE.       "Field not in join -> additional keyfield in view
    1078
              READ TABLE x_namtab WITH KEY bastabname = tabname_wa
    1079
                                        bastabfld = dfies_wa-fieldname.
    1080
              IF sy-subrc NE 0.                 "Then it must be an error
    1081
    *            error.!!!!
    1082
              ENDIF.
    1083
            ENDIF.
    1084
            ASSIGN COMPONENT x_namtab-viewfield OF STRUCTURE
    1085
                       <vim_total_struc> TO <viewfld>.
    1086
            ASSIGN COMPONENT dfies_wa-fieldname OF STRUCTURE
    1087
                                             <sektab> TO <sektabfld>.
    1088
            MOVE <viewfld> TO <sektabfld>.
    1089
            ASSIGN <sektab> TO <tabkey_struc_x> CASTING.
    1090
            ASSIGN p_bc_keytab_wa-bc_tabkey TO <tabkey_x> CASTING.
    1091
            MOVE <tabkey_struc_x>(bc_keylen) TO <tabkey_x>(bc_keylen).
    1092
          ENDLOOP.
    1093
          MODIFY p_bc_keytab INDEX keytab_index FROM p_bc_keytab_wa.
    1094
        ENDIF.
    1095
      ENDLOOP.
    1096
      APPEND LINES OF p_bc_keytab_langu TO p_bc_keytab.
    1097
    ENDFORM.                    " vim_build_bc_tabkeys
    1098
    *&---------------------------------------------------------------------*
    1099
    *&      Form  vim_read_table_with_gap
    1100
    *&---------------------------------------------------------------------*
    1101
    *       Implementierung des
    1102
    *         READ TABLE <it_data> WITH KEY <key> BINARY SEARCH
    1103
    *       für Tabellen mit Alignment-Lücken (Nicht-Character-Feld wie
    1104
    *       z.B. ein INT4-Feld im Schlüssel)
    1105
    *
    1106
    *       Voraussetzung zum Aufruf: gap_table ist sortiert
    1107
    *
    1108
    *       Rückgabewert: SUBRC = 0    1. Datensatz passend zum KEY
    1109
    *       (analog                    wurde gefunden (wichtig für
    1110
    *        BINARY                    BC-Sets mit Schlüsselkonflikt)
    1111
    *        SEARCH)                   Datensatznummer in TABIX
    1112
    *
    1113
    *                     SUBRC = 4    Eintrag wurde nicht gefunden
    1114
    *                                  Datensatznummer + 1 in TABIX
    1115
    *
    1116
    *                     SUBRC = 8    Eintrag wurde nicht gefunden
    1117
    *                                  Letzte Datensatznummer + 1 in TABIX
    1118
    *----------------------------------------------------------------------*
    1119
    *     To use function SCPR_CTRL_CT_COMP_TWO_RECORDS table of field
    1120
    *     description in SCPR format is created and filled partly.
    1121
    *----------------------------------------------------------------------*
    1122
    FORM vim_read_table_with_gap TABLES   gap_table
    1123
                             USING    key   TYPE x
    1124
                                      namtab LIKE x_namtab[]
    1125
                             CHANGING subrc TYPE sy-subrc
    1126
                                      tabix TYPE sy-tabix.
    1127
    1128
      TYPES: scpr_x8192(8192) TYPE x.
    1129
      DATA: result  TYPE scpr_txt20,
    1130
            tab_i   TYPE sy-tabix,
    1131
            tab_j   TYPE sy-tabix,
    1132
            tab_k   TYPE sy-tabix,
    1133
            tab_len TYPE sy-tabix.
    1134
    1135
      DATA: align TYPE f, wa_8192 TYPE scpr_x8192,
    1136
            it_fldnames TYPE STANDARD TABLE OF scpr_flddescr,
    1137
            fldnames_wa LIKE LINE OF it_fldnames,
    1138
            gap_table_wa(2048) TYPE c.
    1139
      FIELD-SYMBOLS: <wa_it_data> TYPE x,
    1140
                     <namtab> TYPE vimnamtab.
    1141
    1142
    * Fill necessary fields in it_fieldnames from namtab
    1143
      LOOP AT namtab ASSIGNING <namtab> WHERE keyflag = 'X'
    1144
                                        AND texttabfld = space.
    1145
        fldnames_wa-fieldname = <namtab>-viewfield.
    1146
        fldnames_wa-position = <namtab>-position.
    1147
        fldnames_wa-intlen = <namtab>-flength.
    1148
        fldnames_wa-keyflag = 'X'.
    1149
        fldnames_wa-flag = 'FKY'. "KEY would do the same job...
    1150
        APPEND fldnames_wa TO it_fldnames.
    1151
      ENDLOOP.
    1152
    1153
      DESCRIBE TABLE gap_table LINES tab_len.
    1154
      tab_i = 1.
    1155
      tab_j = tab_len.
    1156
      subrc = 8.
    1157
      tabix = tab_len + 1.
    1158
      ASSIGN wa_8192 TO <wa_it_data>.
    1159
      ASSIGN gap_table_wa TO <wa_it_data> CASTING.
    1160
    1161
      DO.
    1162
        IF tab_i > tab_j.
    1163
    *     Datensatz wurde nicht gefunden
    1164
          subrc = 4.
    1165
          tabix = tab_k + 1.
    1166
          EXIT.
    1167
        ENDIF.
    1168
        tab_k = ( tab_i + tab_j ) / 2.
    1169
    1170
        READ TABLE gap_table INTO gap_table_wa INDEX tab_k.
    1171
    1172
        CALL FUNCTION 'SCPR_CTRL_CT_COMP_TWO_RECORDS'
    1173
          EXPORTING
    1174
            cu_lines    = <wa_it_data>
    1175
            bc_lines    = key
    1176
            compare_key = 'X'
    1177
          IMPORTING
    1178
            RESULT      = RESULT
    1179
          tables
    1180
            it_fldnames = it_fldnames.
    1181
    1182
        IF result = 'LT'.
    1183
          tab_j = tab_k - 1.
    1184
        ELSEIF result = 'GT'.
    1185
          tab_i = tab_k + 1.
    1186
        ELSE.
    1187
          subrc = 0.
    1188
          tabix = tab_k.
    1189
          EXIT.
    1190
        ENDIF.
    1191
      ENDDO.
    1192
    ENDFORM.                    " read_table_with_gap