Load table from file

Source : Badr the Goat

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
*&---------------------------------------------------------------------
*& Report ZBC_INTEG_TABLE
*&---------------------------------------------------------------------
*&
*&---------------------------------------------------------------------
*REPORT ZBC_INTEG_TABLE.

*&---------------------------------------------------------------------
* Program to create/delete table contents from a flat file             
*&---------------------------------------------------------------------
* Use at your own risks - misuse can lead to database inconsistencies  
*&---------------------------------------------------------------------
* Data
DATA: it_dd03p TYPE TABLE OF dd03p,
      is_dd03p TYPE dd03p.

DATA: it_rdata TYPE TABLE OF text1024,
      is_rdata TYPE text1024.

DATA: it_fields TYPE TABLE OF fieldname.

DATA: it_file TYPE REF TO data,
      is_file TYPE REF TO data.

DATA: w_error  TYPE text132.

 Macros
DEFINE write_error.
  CONCATENATE 'Error: table'
              p_table
              &1
              &2
         INTO w_error
         SEPARATED BY space.
  CONDENSE w_error.
  WRITE: / w_error.
  STOP.
END-OF-DEFINITION.

 Field symbols
FIELD-SYMBOLS: <table> TYPE STANDARD TABLE,
               <data>  TYPE any,
               <fs>    TYPE any.

* Selection screen
SELECTION-SCREEN: BEGIN OF BLOCK b01 WITH FRAME TITLE TEXT-b01.
PARAMETERS: p_file  TYPE localfile DEFAULT 'C:temp' OBLIGATORY,
            p_separ TYPE c DEFAULT ';' OBLIGATORY.
SELECTION-SCREEN: END OF BLOCK b01.

SELECTION-SCREEN: BEGIN OF BLOCK b02 WITH FRAME TITLE TEXT-b02.
PARAMETERS: p_table TYPE tabname OBLIGATORY
                                 MEMORY ID dtb
                                 MATCHCODE OBJECT dd_dbtb_16.
SELECTION-SCREEN: END OF BLOCK b02.

SELECTION-SCREEN: BEGIN OF BLOCK b03 WITH FRAME TITLE TEXT-b03.
PARAMETERS: p_create TYPE c AS CHECKBOX.
SELECTION-SCREEN: END OF BLOCK b03,
                  SKIP.

SELECTION-SCREEN: BEGIN OF BLOCK b04 WITH FRAME TITLE TEXT-b04.
PARAMETERS: p_nodb RADIOBUTTON GROUP g1 DEFAULT 'X'
                               USER-COMMAND rg1,
            p_save RADIOBUTTON GROUP g1,
            p_dele RADIOBUTTON GROUP g1.
SELECTION-SCREEN: SKIP.
PARAMETERS: p_test TYPE c AS CHECKBOX,
            p_list TYPE c AS CHECKBOX DEFAULT 'X'.
SELECTION-SCREEN: END OF BLOCK b04.

 At selection screen
AT SELECTION-SCREEN.
  IF sy-ucomm = 'RG1'.
    IF p_nodb IS INITIAL.
      p_test = 'X'.
    ENDIF.
  ENDIF.

* At selection screen
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_file.
  CALL FUNCTION 'F4_FILENAME'
    EXPORTING
      field_name = 'P_FILE'
    IMPORTING
      file_name  = p_file.

* Start of selection
START-OF-SELECTION.

  PERFORM f_table_definition USING p_table.

  PERFORM f_upload_data USING p_file.

  PERFORM f_prepare_table USING p_table.

  PERFORM f_process_data.

  IF p_nodb IS INITIAL.
    PERFORM f_modify_table.
  ENDIF.

  IF p_list = 'X'.
    PERFORM f_list_records.
  ENDIF.

 End of selection
END-OF-SELECTION.

*---------------------------------------------
* FORM f_table_definition                                       
*---------------------------------------------
  -->  VALUE(IN_TABLE)                                               
*---------------------------------------------
FORM f_table_definition USING VALUE(in_table).
  DATA: l_tname TYPE tabname,
        l_state TYPE ddgotstate,
        l_dd02v TYPE dd02v.

  l_tname = in_table.
  CALL FUNCTION 'DDIF_TABL_GET'
    EXPORTING
      name          = l_tname
    IMPORTING
      gotstate      = l_state
      dd02v_wa      = l_dd02v
    TABLES
      dd03p_tab     = it_dd03p
    EXCEPTIONS
      illegal_input = 1
      OTHERS        = 2.
  IF l_state NE 'A'.
    write_error 'does not exist or is not active' space.
  ENDIF.
  IF l_dd02v-tabclass NE 'TRANSP' AND
     l_dd02v-tabclass NE 'CLUSTER'.
    write_error 'is type' l_dd02v-tabclass.
  ENDIF.
ENDFORM.

* ---------------------------------------------
* FORM f_prepare_table
*---------------------------------------------
FORM f_prepare_table USING VALUE(in_table).
  DATA: l_tname TYPE tabname,
        lt_ftab TYPE lvc_t_fcat.

  l_tname = in_table.
  CALL FUNCTION 'LVC_FIELDCATALOG_MERGE'
    EXPORTING
      i_structure_name = l_tname
    CHANGING
      ct_fieldcat      = lt_ftab
    EXCEPTIONS
      OTHERS           = 1.
  IF sy-subrc NE 0.
    WRITE: / 'Error while building field catalog'.
    STOP.
  ENDIF.

  CALL METHOD cl_alv_table_create=>create_dynamic_table
    EXPORTING
      it_fieldcatalog = lt_ftab
    IMPORTING
      ep_table        = it_file.

  ASSIGN it_file-> TO <table>.
  CREATE DATA is_file LIKE LINE OF <table>.
  ASSIGN is_file-> TO <data>.

ENDFORM.

* ---------------------------------------------
* FORM f_upload_data                                          
* ---------------------------------------------
FORM f_upload_data USING VALUE(in_file).
  DATA: l_file  TYPE string,
        l_ltext TYPE string.

  DATA: l_lengt TYPE i,
        l_field TYPE fieldname.

  DATA: l_missk   TYPE c.

  l_file = in_file.
  l_lengt = strlen( in_file ).

  FORMAT INTENSIFIED ON.
  WRITE: / 'Reading file', in_file(l_lengt).
  CALL FUNCTION 'GUI_UPLOAD'
    EXPORTING
      filename = l_file
      filetype = 'ASC'
    TABLES
      data_tab = it_rdata
    EXCEPTIONS
      OTHERS   = 1.
  IF sy-subrc <> 0.
    WRITE: /3 'Error uploading', l_file.
    STOP.
  ENDIF.

 File not empty
  DESCRIBE TABLE it_rdata LINES sy-tmaxl.
  IF sy-tmaxl = 0.
    WRITE: /3 'File', l_file, 'is empty'.
    STOP.
  ELSE.
    WRITE: '-', sy-tmaxl, 'rows read'.
  ENDIF.

 File header on first row
  READ TABLE it_rdata INTO is_rdata INDEX 1.
  l_ltext = is_rdata.
  WHILE l_ltext CS p_separ.
    SPLIT l_ltext AT p_separ INTO l_field l_ltext.
    APPEND l_field TO it_fields.
  ENDWHILE.
  IF sy-subrc = 0.
    l_field = l_ltext.
    APPEND l_field TO it_fields.
  ENDIF.

 Check all key fields are present
  SKIP.
  FORMAT RESET.
  FORMAT COLOR COL_HEADING.
  WRITE: /3 'Key fields'.
  FORMAT RESET.
  LOOP AT it_dd03p INTO is_dd03p WHERE NOT keyflag IS INITIAL.
    WRITE: /3 is_dd03p-fieldname.
    READ TABLE it_fields WITH KEY table_line = is_dd03p-fieldname
                         TRANSPORTING NO FIELDS.
    IF sy-subrc = 0.
      FORMAT COLOR COL_POSITIVE.
      WRITE: 'ok'.
      FORMAT RESET.
    ELSEIF is_dd03p-datatype NE 'CLNT'.
      FORMAT COLOR COL_NEGATIVE.
      WRITE: 'error'.
      FORMAT RESET.
      l_missk = 'X'.
    ENDIF.
  ENDLOOP.

 Log other fields
  SKIP.
  FORMAT COLOR COL_HEADING.
  WRITE: /3 'Other fields'.
  FORMAT RESET.
  LOOP AT it_dd03p INTO is_dd03p WHERE keyflag IS INITIAL.
    WRITE: /3 is_dd03p-fieldname.
    READ TABLE it_fields WITH KEY table_line = is_dd03p-fieldname
                         TRANSPORTING NO FIELDS.
    IF sy-subrc = 0.
      WRITE: 'X'.
    ENDIF.
  ENDLOOP.

 Missing key field
  IF l_missk = 'X'.
    SKIP.
    WRITE: /3 'Missing key fields - no further processing'.
    STOP.
  ENDIF.

ENDFORM.

* ---------------------------------------------
* FORM f_process_data                                           
* ---------------------------------------------
FORM f_process_data.
  DATA: l_ltext TYPE string,
        l_stext TYPE text40,
        l_field TYPE fieldname,
        l_datat TYPE c.
  DATA lv_date type datum.

  LOOP AT it_rdata INTO is_rdata FROM 2.
    l_ltext = is_rdata.
    LOOP AT it_fields INTO l_field.
      ASSIGN COMPONENT l_field OF STRUCTURE <data> TO <fs>.
      IF sy-subrc = 0.
       Field value comes from file, determine conversion
        DESCRIBE FIELD <fs> TYPE l_datat.
        CASE l_datat.
          WHEN 'N'.
            SPLIT l_ltext AT p_separ INTO l_stext l_ltext.
            WRITE l_stext TO <fs> RIGHT-JUSTIFIED.
            OVERLAY <fs> WITH '0000000000000000'.           "max 16
          WHEN 'P'.
            SPLIT l_ltext AT p_separ INTO l_stext l_ltext.
            TRANSLATE l_stext USING ',.'.
            <fs> = l_stext.
          WHEN 'F'.
            SPLIT l_ltext AT p_separ INTO l_stext l_ltext.
            TRANSLATE l_stext USING ',.'.
            <fs> = l_stext.
          WHEN 'D'.
            SPLIT l_ltext AT p_separ INTO l_stext l_ltext.
            TRANSLATE l_stext USING '/.-.'.
            CALL FUNCTION 'CONVERT_DATE_TO_INTERNAL'
              EXPORTING
                date_external = l_stext
              IMPORTING
                date_internal = <fs>
              EXCEPTIONS
                OTHERS        = 1.

            IF sy-subrc <> 0 AND l_stext IS NOT INITIAL.

              lv_date = l_stext.

              CALL FUNCTION 'CONVERT_DATE_TO_EXTERNAL'
                EXPORTING
                  date_internal            = lv_date
                                                         IMPORTING
                 DATE_EXTERNAL            =
                EXCEPTIONS
                  date_internal_is_invalid = 1
                  OTHERS                   = 2.
              IF sy-subrc = 0.
                <fs> = lv_date.
              ENDIF.
                CALL FUNCTION 'CONVERT_DATE_TO_EXTERNAL'


            ENDIF.

          WHEN 'T'.
            R2R-IGH- Programme ZFI_INTEG_TABLE
            SPLIT l_ltext AT p_separ INTO l_stext l_ltext.
            CALL FUNCTION 'CONVERT_TIME_INPUT'
              EXPORTING
                input  = l_stext
              IMPORTING
                output = <fs>
              EXCEPTIONS
                OTHERS = 1.
          WHEN OTHERS.
            SPLIT l_ltext AT p_separ INTO <fs> l_ltext.
        ENDCASE.
      ELSE.
        SHIFT l_ltext UP TO p_separ.
        SHIFT l_ltext.
      ENDIF.
    ENDLOOP.
    IF NOT <data> IS INITIAL.
      LOOP AT it_dd03p INTO is_dd03p WHERE datatype = 'CLNT'.
       This field is mandant
        ASSIGN COMPONENT is_dd03p-fieldname OF STRUCTURE <data>
                                                      TO <fs>.
        <fs> = sy-mandt.
      ENDLOOP.
      IF p_create = 'X'.
        IF is_dd03p-rollname = 'ERDAT'.
          ASSIGN COMPONENT is_dd03p-fieldname OF STRUCTURE <data>
                                                        TO <fs>.
          <fs> = sy-datum.
        ENDIF.
        IF is_dd03p-rollname = 'ERZET'.
          ASSIGN COMPONENT is_dd03p-fieldname OF STRUCTURE <data>
                                                        TO <fs>.
          <fs> = sy-uzeit.
        ENDIF.
        IF is_dd03p-rollname = 'ERNAM'.
          ASSIGN COMPONENT is_dd03p-fieldname OF STRUCTURE <data>
                                                        TO <fs>.
          <fs> = sy-uname.
        ENDIF.
      ENDIF.
      IF is_dd03p-rollname = 'AEDAT'.
        ASSIGN COMPONENT is_dd03p-fieldname OF STRUCTURE <data>
                                                      TO <fs>.
        <fs> = sy-datum.
      ENDIF.
      IF is_dd03p-rollname = 'AETIM'.
        ASSIGN COMPONENT is_dd03p-fieldname OF STRUCTURE <data>
                                                      TO <fs>.
        <fs> = sy-uzeit.
      ENDIF.
      IF is_dd03p-rollname = 'AENAM'.
        ASSIGN COMPONENT is_dd03p-fieldname OF STRUCTURE <data>
                                                      TO <fs>.
        <fs> = sy-uname.
      ENDIF.
      APPEND <data> TO <table>.
    ENDIF.
  ENDLOOP.
ENDFORM.

* ---------------------------------------------
*       FORM f_modify_table                                           
* ---------------------------------------------
FORM f_modify_table.
  SKIP.
  IF p_save = 'X'.
    MODIFY (p_table) FROM TABLE <table>.
  ELSEIF p_dele = 'X'.
    DELETE (p_table) FROM TABLE <table>.
  ELSE.
    EXIT.
  ENDIF.

  IF sy-subrc EQ 0.
    FORMAT COLOR COL_POSITIVE.
    IF p_save = 'X'.
      WRITE: /3 'Modify table OK'.
    ELSE.
      WRITE: /3 'Delete table OK'.
    ENDIF.
    FORMAT RESET.
    IF p_test IS INITIAL.
      COMMIT WORK.
    ELSE.
      ROLLBACK WORK.
      WRITE: '- test only, no update'.
    ENDIF.
  ELSE.
    FORMAT COLOR COL_NEGATIVE.
    WRITE: /3 'Error while modifying table'.
    FORMAT RESET.
  ENDIF.
ENDFORM.

* ---------------------------------------------
* FORM f_list_records                                           
* ---------------------------------------------
FORM f_list_records.
  DATA: l_tleng TYPE i,
        l_lasti TYPE i,
        l_offst TYPE i.

 Output width
  l_tleng = 1.
  LOOP AT it_dd03p INTO is_dd03p.
    l_tleng = l_tleng + is_dd03p-outputlen.
    IF l_tleng LT sy-linsz.
      l_lasti = sy-tabix.
      l_tleng = l_tleng + 1.
    ELSE.
      l_tleng = l_tleng - is_dd03p-outputlen.
      EXIT.
    ENDIF.
  ENDLOOP.

 Output header
  SKIP.
  FORMAT COLOR COL_HEADING.
  WRITE: /3 'Contents'.
  FORMAT RESET.
  ULINE AT /3(l_tleng).

 Output records
  LOOP AT <table> ASSIGNING <data>.
    LOOP AT it_dd03p INTO is_dd03p FROM 1 TO l_lasti.
      IF is_dd03p-position = 1.
        WRITE: /3 sy-vline.
        l_offst = 3.
      ENDIF.
      ASSIGN COMPONENT is_dd03p-fieldname OF STRUCTURE <data> TO <fs>.
      l_offst = l_offst + 1.
      IF is_dd03p-decimals LE 2.
        WRITE: AT l_offst <fs>.
      ELSE.
        WRITE: AT l_offst <fs> DECIMALS 3.
      ENDIF.
      l_offst = l_offst + is_dd03p-outputlen.
      WRITE: AT l_offst sy-vline.
    ENDLOOP.
  ENDLOOP.

 Ouptut end
  ULINE AT /3(l_tleng).

ENDFORM.