ABAP Create BOM CS01 from SQL Data

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
METHOD get_boms_from_siito.
  DATA:
        exc_ref TYPE REF TO cx_root,
        error_text TYPE string,
        lt_bom_from_siito TYPE TABLE OF zhm_d_bom_fr_sit,
        lv_date_import_osn TYPE string,
        lv_date_import_from TYPE string,
        lv_key_tbl TYPE int4,
        ls_bom_from_siito LIKE LINE OF lt_bom_from_siito .

  FIELD-SYMBOLS:
                 <fs_bom_from_siito> LIKE LINE OF lt_bom_from_siito.

*Connect to database
  TRY.
      EXEC SQL.
        connect TO 'SAP_AIS'
      ENDEXEC.
      IF sy-subrc <> 0.
        MESSAGE 'Unable to connect to SAP_AIS' TYPE 'E' DISPLAY LIKE 'I'.
        RETURN.
      ENDIF.

    CATCH cx_sy_native_sql_error INTO exc_ref.

      error_text = exc_ref->get_text( ).

      MESSAGE error_text TYPE 'I'.
  ENDTRY.

*SQL for select
  "Fields matnr_ext,bismt,versb,pbdnr,edatv,plnmg,meins
  TRY.
      EXEC SQL.
        OPEN dbcur FOR
        SELECT

          KEY_TBL
          ,NZ_CH
          ,DATA_OSN
          ,OZM_MAIN
          ,MAKTX
          ,MAKTX_FULL
          ,ZEINRKD
          ,MATNR_EXT
          ,IDNRK
          ,POSNR
          ,SORTF
          ,MENGE
          ,MEINS
          ,DATA_FORM
          ,NTGEW
          ,GEWEI
          ,LABOR
          ,MTART
          ,PRIZN_DOB
          ,PRIZN
        FROM temp.dbo.sap_spec
      ENDEXEC.
    CATCH cx_sy_native_sql_error INTO exc_ref.

      error_text = exc_ref->get_text( ).

      MESSAGE error_text TYPE 'I'.
  ENDTRY.

  DO.
    CLEAR ls_bom_from_siito .
    TRY.
        EXEC SQL.
          FETCH NEXT dbcur INTO :ls_bom_from_siito-KEY_TBL,
                                :ls_bom_from_siito-NZ_CH,
                                :lv_date_import_osn,
                                :ls_bom_from_siito-OZM_MAIN,
                                :ls_bom_from_siito-MAKTX,
                                :ls_bom_from_siito-MAKTX_FULL,
                                :ls_bom_from_siito-ZEINRKD,
                                :ls_bom_from_siito-MATNR_EXT,
                                :ls_bom_from_siito-IDNRK,
                                :ls_bom_from_siito-POSNR,
                                :ls_bom_from_siito-SORTF,
                                :ls_bom_from_siito-MENGE,
                                :ls_bom_from_siito-MEINS,
                                :lv_date_import_from,
                                :ls_bom_from_siito-NTGEW,
                                :ls_bom_from_siito-GEWEI,
                                :ls_bom_from_siito-LABOR,
                                :ls_bom_from_siito-MTART,
                                :ls_bom_from_siito-PRIZN_DOB,
                                :ls_bom_from_siito-PRIZN
        ENDEXEC.
      CATCH cx_sy_native_sql_error INTO exc_ref.

        error_text = exc_ref->get_text( ).

        MESSAGE error_text TYPE 'I'.
    ENDTRY.
    IF sy-subrc <> 0.
      EXEC SQL.
        CLOSE dbcur
      ENDEXEC.
      EXIT.
    ELSE.
      TRANSLATE ls_bom_from_siito-meins TO UPPER CASE.
      SELECT SINGLE t006~msehi
        INTO ls_bom_from_siito-meins
        FROM t006
          INNER JOIN t006b
            ON t006~msehi = t006b~msehi
        WHERE mseh3 = ls_bom_from_siito-meins  AND spras = 'R'.

      TRANSLATE ls_bom_from_siito-meins TO UPPER CASE.
      SELECT SINGLE t006~msehi
        INTO ls_bom_from_siito-gewei
        FROM t006
          INNER JOIN t006b
            ON t006~msehi = t006b~msehi
        WHERE mseh3 = ls_bom_from_siito-gewei AND spras = 'R'.

      REPLACE ALL OCCURRENCES OF '-' IN lv_date_import_osn WITH ''.
      ls_bom_from_siito-data_osn = lv_date_import_osn(8).

      REPLACE ALL OCCURRENCES OF '-' IN lv_date_import_from WITH ''.
      ls_bom_from_siito-data_osn = lv_date_import_from(8).

      APPEND ls_bom_from_siito TO lt_bom_from_siito.
    ENDIF.
  ENDDO.

  MODIFY zhm_d_bom_fr_sit FROM TABLE lt_bom_from_siito.

  zcl_zhm_app_bom=>create_bom_for_siito( ).
*  EXEC SQL.
*    CLOSE dbcur
*  ENDEXEC.
ENDMETHOD.
METHOD create_bom_for_siito.
  DATA:
        lt_bom TYPE TABLE OF zhm_d_bom_fr_sit,
        lt_bom_unique TYPE TABLE OF zhm_d_bom_fr_sit,
        ls_istko TYPE stko_api01,
        ls_o_stko TYPE  stko_api02,
        lv_data TYPE datuv_bi,
        lv_change_no TYPE  csap_mbom-aennr,
        lt_o_stko TYPE TABLE OF  stko_api02,
        lt_stpo TYPE TABLE OF stpo_api03,
        lt_stpo_read TYPE TABLE OF stpo_api02,
        lv_aenr TYPE aennr,
        iv_delete_flg TYPE char01,
        lv_posnr_str TYPE char04,
        lt_display TYPE TABLE OF stpo_api03,
        ls_display LIKE LINE OF lt_display,
        lt_stpo_read_api03 TYPE TABLE OF stpo_api02.

  FIELD-SYMBOLS:
                 <fs_bom> LIKE LINE OF lt_bom,
                 <fs_bom_unique> LIKE LINE OF lt_bom,
                 <fs_stpo_read> LIKE LINE OF lt_stpo_read,
                 <fs_stpo_read_api03> LIKE LINE OF lt_stpo_read_api03,
                 <fs_stpo> LIKE LINE OF lt_stpo.

  SELECT *
    FROM zhm_d_bom_fr_sit
    INTO CORRESPONDING FIELDS OF TABLE lt_bom.

  lt_bom_unique[] = lt_bom[].

  SORT lt_bom_unique BY ozm_main.
  DELETE ADJACENT DUPLICATES FROM lt_bom_unique COMPARING ozm_main.

  LOOP AT lt_bom_unique ASSIGNING <fs_bom_unique>.
    CLEAR lt_stpo.
    LOOP AT lt_bom ASSIGNING <fs_bom> WHERE ozm_main = <fs_bom_unique>-ozm_main.
      APPEND INITIAL LINE TO lt_stpo ASSIGNING <fs_stpo>.
      lv_posnr_str = <fs_bom>-posnr.

      CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
        EXPORTING
          input  = lv_posnr_str
        IMPORTING
          output = <fs_stpo>-item_no.

      <fs_stpo>-item_categ = 'L'.
      <fs_stpo>-component = <fs_bom>-idnrk.
      <fs_stpo>-comp_qty = <fs_bom>-menge.
      TRANSLATE <fs_stpo>-comp_qty USING '.,'.
      SELECT SINGLE t006b~mseh3
        INTO <fs_stpo>-comp_unit
        FROM t006
          INNER JOIN t006b
            ON t006~msehi = t006b~msehi
          WHERE t006~msehi = <fs_bom>-meins AND spras = 'R'.
      <fs_stpo>-sortstring = '07'.
    ENDLOOP.

    lv_change_no = sy-datum(4).

    CONCATENATE sy-datum+6(2) '.' sy-datum+4(2) '.' sy-datum(4) INTO lv_data.

    lv_aenr = sy-datum(4).

    CALL FUNCTION 'CSAP_MAT_BOM_READ'
      EXPORTING
        material  = <fs_bom_unique>-ozm_main
        plant     = '1014'
        bom_usage = 'V'
      TABLES
        t_stpo    = lt_stpo_read
      EXCEPTIONS
        error     = 1
        OTHERS    = 2.

    IF sy-subrc = 0.
      LOOP AT lt_stpo_read ASSIGNING <fs_stpo_read>.
        READ TABLE lt_stpo ASSIGNING <fs_stpo> WITH KEY component = <fs_stpo_read>-component
                                                        item_no = <fs_stpo_read>-item_no
                                                        comp_qty = <fs_stpo_read>-comp_qty.
        IF sy-subrc <> 0.
          iv_delete_flg = 'X'.
        ENDIF.
      ENDLOOP.

      IF iv_delete_flg = 'X'.
        LOOP AT lt_stpo_read ASSIGNING <fs_stpo_read>.
          delete_item( EXPORTING iv_matnr_ext = <fs_bom_unique>-ozm_main
                                 iv_werks = '1014'
                                 iv_bom_usage = 'V'
                                 is_stpo = <fs_stpo_read> ).


        ENDLOOP.

        CALL FUNCTION 'CSAP_MAT_BOM_MAINTAIN'
          EXPORTING
            material           = <fs_bom_unique>-ozm_main
            plant              = '1014'
            bom_usage          = 'V'
            valid_from         = lv_data
            i_stko             = ls_istko
            fl_commit_and_wait = 'X'
            "change_no          = lv_aenr
            "fl_bom_create      = 'X'
          IMPORTING
            o_stko             = ls_o_stko        "change_no = lv_aenr
          TABLES
            t_stpo             = lt_stpo
          EXCEPTIONS
            error              = 1
            OTHERS             = 2.

        IF sy-subrc <> 0 AND sy-batch = ''.
          MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
          WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
        ELSE.
          ls_display-component = <fs_bom_unique>-ozm_main.
          APPEND ls_display TO lt_display.
          APPEND LINES OF  lt_stpo TO lt_display.
        ENDIF.
      ENDIF.
    ELSE.
      CALL FUNCTION 'CSAP_MAT_BOM_MAINTAIN'
        EXPORTING
          material           = <fs_bom_unique>-ozm_main
          plant              = '1014'
          bom_usage          = 'V'
          valid_from         = lv_data
          i_stko             = ls_istko
          fl_commit_and_wait = 'X'
"          change_no          = lv_aenr
        IMPORTING
          o_stko             = ls_o_stko        "change_no = lv_aenr
        TABLES
          t_stpo             = lt_stpo
        EXCEPTIONS
          error              = 1
          OTHERS             = 2.
      IF sy-subrc <> 0 AND sy-batch = ''.
        MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
        WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
      ELSE.
        ls_display-component = <fs_bom_unique>-ozm_main.
        APPEND ls_display TO lt_display.
        APPEND LINES OF  lt_stpo TO lt_display.
      ENDIF.
    ENDIF.
  ENDLOOP.
  IF sy-batch = ''.
    zcl_zhm_super=>display_it_table( changing it_table = lt_display ).
  ENDIF.
ENDMETHOD.
METHOD delete_item.
  DATA :
        ls_stko         TYPE stko_api02                   ,
        lv_result       TYPE sy-subrc                     ,
        lt_tstp2        TYPE STANDARD TABLE OF stpo_api02 ,
        lt_tdep2_source TYPE STANDARD TABLE OF dep_source ,
        ls_tstp2        TYPE stpo_api02          ,
        lv_data type datuv_bi,
        lv_flwarning TYPE capiflag-flwarning.

  CONCATENATE sy-datum+6(2) '.' sy-datum+4(2) '.' sy-datum(4) INTO lv_data.

  CALL FUNCTION 'CSAP_MAT_BOM_OPEN'
    EXPORTING
      material    = iv_matnr_ext
      plant       = iv_werks
      bom_usage   = iv_bom_usage
      valid_from = lv_data

"        alternative = gs_mast_list-stlal
      change_no   = space
    IMPORTING
      o_stko      = ls_stko
      fl_warning  = lv_flwarning
    TABLES
      t_stpo      = lt_tstp2
    EXCEPTIONS
      error       = 1
      OTHERS      = 2.

  IF sy-subrc <> 0.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
      WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
    EXIT.
  ENDIF.

  CLEAR:   lt_tstp2[]        ,
  lt_tdep2_source[] .

  MOVE-CORRESPONDING is_stpo TO ls_tstp2 .

  ls_tstp2-fldelete := abap_true.

  CALL FUNCTION 'CSAP_BOM_ITEM_MAINTAIN'
    EXPORTING
      i_stpo       = ls_tstp2
    IMPORTING
      fl_warning   = lv_flwarning
    TABLES
      t_dep_source = lt_tdep2_source
    EXCEPTIONS
      error        = 1
      OTHERS       = 2.

  IF sy-subrc <> 0.
    EXIT.
  ENDIF.

  CALL FUNCTION 'CSAP_MAT_BOM_CLOSE'
    IMPORTING
      fl_warning = lv_flwarning
    EXCEPTIONS
      error      = 1.

  IF sy-subrc <> 0.
    EXIT.
  ENDIF.
ENDMETHOD.

Добавить комментарий