TABLES: coas, cepc.
*-----------------------------------------------------------------------
* Internal Tables and Work Areas
*-----------------------------------------------------------------------
DATA: BEGIN OF gt_table OCCURS 0, "internal order table
auart LIKE aufk-auart, "order type
aufnr LIKE aufk-aufnr, "order number
ktext LIKE aufk-ktext, "description
bukrs LIKE aufk-bukrs, "company code
gsber LIKE aufk-gsber, "business area
prctr LIKE aufk-prctr, "profit center
funca LIKE aufk-func_area, "function area
END OF gt_table.
DATA: BEGIN OF gt_exists OCCURS 0. "existed IO
INCLUDE STRUCTURE gt_table.
DATA: END OF gt_exists.
DATA: BEGIN OF gt_prft_cntr OCCURS 0."the profit center not existing IO
INCLUDE STRUCTURE gt_table.
DATA: END OF gt_prft_cntr.
DATA: BEGIN OF gt_submit OCCURS 0. "the submitted IO
INCLUDE STRUCTURE gt_table.
DATA: END OF gt_submit.
DATA: BEGIN OF gt_bdcdata OCCURS 0. "BDC DATA
INCLUDE STRUCTURE bdcdata.
DATA: END OF gt_bdcdata.
DATA: BEGIN OF gt_messtab OCCURS 10. "message table
INCLUDE STRUCTURE bdcmsgcoll.
DATA: END OF gt_messtab.
DATA: gt_imesg LIKE mesg OCCURS 0 WITH HEADER LINE.
*-----------------------------------------------------------------------
* Variables
*-----------------------------------------------------------------------
DATA: gv_group(12) TYPE c VALUE 'INTERNAL_ORD', "BDC Name
gv_user(12) TYPE c, "BDC User
gv_keep(1) TYPE c VALUE 'X', " ' '=Delete,'X'=keep after processing
gv_holddate LIKE sy-datum. "Date
DATA: gv_flag(1) TYPE c,
gv_lin TYPE i. "number of orders
DATA: gv_c170(170),
gv_c_uline(50) VALUE '__________________________________________________'.
DATA: tab TYPE filetable.
DATA: rc TYPE i.
DATA: rs TYPE c.
DATA: l_file TYPE string.
*-----------------------------------------------------------------------
* Selection Screen
*-----------------------------------------------------------------------
PARAMETERS: bdctype(1) TYPE c DEFAULT 'B' NO-DISPLAY,
bdcmode LIKE bdcrun-bdc_amodus DEFAULT 'A' NO-DISPLAY.
PARAMETERS: in_file TYPE c LENGTH 128 DEFAULT 'C:/TEMP/*.txt'.
SELECTION-SCREEN SKIP 1.
*--------- AT SELECTION-SCREEN ON VALUE-REQUEST ----------
AT SELECTION-SCREEN ON VALUE-REQUEST FOR in_file.
CALL METHOD cl_gui_frontend_services=>file_open_dialog
EXPORTING
window_title = 'Select a valid file'
file_filter = 'All files(*.*)|*.*|Text file(*.txt)|*.txt|Word file(*.doc)|*.doc'
CHANGING
file_table = tab
rc = rc
EXCEPTIONS
file_open_dialog_failed = 1
cntl_error = 2
error_no_gui = 3
not_supported_by_gui = 4
OTHERS = 5.
IF sy-subrc = 0 AND rc = 1.
READ TABLE tab INTO in_file INDEX 1.
ENDIF.
AT SELECTION-SCREEN.
l_file = in_file.
CALL METHOD cl_gui_frontend_services=>file_exist
EXPORTING
file = l_file
RECEIVING
result = rs
.
IF sy-subrc <> 0 OR rs NE 'X'.
MESSAGE i001(00) WITH 'The file do not exist'.
STOP.
ENDIF.
*--------- START-OF-SELECTION ----------
START-OF-SELECTION.
REFRESH gt_table.
CALL FUNCTION 'WS_UPLOAD'
EXPORTING
filename = in_file
filetype = 'DAT'
TABLES
data_tab = gt_table
EXCEPTIONS
conversion_error = 1
file_open_error = 2
file_read_error = 3
invalid_table_width = 4
invalid_type = 5
no_batch = 6
unknown_error = 7
OTHERS = 8.
IF sy-subrc <> 0.
PERFORM collect_messages USING 'Z3' 'I' '000'
'Unable to upload input file '
in_file '' ''.
ENDIF.
SORT gt_table BY aufnr gsber DESCENDING.
DELETE ADJACENT DUPLICATES FROM gt_table COMPARING aufnr.
PERFORM open_group.
PERFORM fill_bdc_data.
PERFORM bdc_close_group.
PERFORM write_report.
FORM open_group.
gv_user = sy-uname.
CALL FUNCTION 'BDC_OPEN_GROUP'
EXPORTING
client = sy-mandt
group = gv_group
holddate = gv_holddate
keep = gv_keep
user = gv_user.
IF sy-subrc <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
* WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.
ENDFORM. " OPEN_GROUP
FORM fill_bdc_data.
CLEAR gt_table.
LOOP AT gt_table.
CLEAR gt_messtab.
CLEAR gt_bdcdata.
REFRESH gt_bdcdata.
REFRESH gt_messtab.
CLEAR gv_flag.
* Check if Profit Center exists.
SELECT SINGLE * FROM cepc
WHERE prctr = gt_table-prctr.
IF sy-subrc <> 0.
CLEAR gt_prft_cntr.
MOVE-CORRESPONDING gt_table TO gt_prft_cntr.
APPEND gt_prft_cntr.
gv_flag = 'X'.
ENDIF.
* check if Internal Order has already been created.
SELECT SINGLE * FROM coas
WHERE aufnr = gt_table-aufnr.
IF sy-subrc = 0.
CLEAR gt_exists.
MOVE-CORRESPONDING gt_table TO gt_exists.
APPEND gt_exists.
gv_flag = 'X'.
ENDIF.
IF gv_flag <> 'X'.
PERFORM bdcdata USING: 'X' 'SAPMKAUF' '0100', "order type
' ' 'COAS-AUART' gt_table-auart,
' ' 'BDC_OKCODE' '=KOKR'.
PERFORM bdcdata USING: 'X' 'SAPLSPO4' '0300', "control area
' ' 'SVALD-VALUE(01)' '1000',
' ' 'BDC_OKCODE' '=FURT'.
PERFORM bdcdata USING: 'X' 'SAPMKAUF' '0100', "ok code
' ' 'BDC_OKCODE' '/00'.
PERFORM bdcdata USING: 'X' 'SAPMKAUF' '0600', "order master data
' ' 'COAS-AUFNR' gt_table-aufnr,
' ' 'COAS-KTEXT' gt_table-ktext,
' ' 'COAS-BUKRS' gt_table-bukrs,
' ' 'COAS-GSBER' gt_table-gsber,
' ' 'COAS-PRCTR' gt_table-prctr,
' ' 'COAS-FUNC_AREA' gt_table-funca,
' ' 'BDC_OKCODE' '=SICH'.
PERFORM bdc_insert.
MOVE-CORRESPONDING gt_table TO gt_submit.
APPEND gt_submit.
ENDIF.
ENDLOOP.
ENDFORM. " FILL_BDC_DATA
FORM bdc_insert.
CALL FUNCTION 'BDC_INSERT'
EXPORTING
tcode = 'KO01'
TABLES
dynprotab = gt_bdcdata.
IF sy-subrc <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
* WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.
ENDFORM. " BDC_INSERT
FORM bdc_close_group.
CALL FUNCTION 'BDC_CLOSE_GROUP'.
IF sy-subrc <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
* WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.
ENDFORM. " BDC_CLOSE_GROUP
FORM call_transaction.
CALL TRANSACTION 'KO01' USING gt_bdcdata
MODE bdcmode
MESSAGES INTO gt_messtab.
ENDFORM. " CALL_TRANSACTION
FORM bdcdata USING p_begin p_field1 p_field2.
CLEAR gt_bdcdata.
CASE p_begin.
WHEN 'X'.
gt_bdcdata-program = p_field1.
gt_bdcdata-dynpro = p_field2.
gt_bdcdata-dynbegin = 'X'.
WHEN space.
gt_bdcdata-fnam = p_field1.
gt_bdcdata-fval = p_field2.
ENDCASE.
APPEND gt_bdcdata.
ENDFORM. " BDCDATA
FORM write_report.
DESCRIBE TABLE gt_exists LINES gv_lin.
IF gv_lin >= 1.
PERFORM collect_messages USING 'Z3' 'I' '000'
'The following Internal Orders already exist.' '' '' ''.
PERFORM collect_messages USING 'Z3' 'I' '000'
gv_c_uline '' '' ''.
LOOP AT gt_exists.
PERFORM collect_messages USING 'Z3' 'I' '000'
gt_exists-aufnr '' '' ''.
ENDLOOP.
PERFORM collect_messages USING 'Z3' 'I' '000'
gv_c_uline '' '' ''.
ENDIF.
DESCRIBE TABLE gt_prft_cntr LINES gv_lin.
IF gv_lin >= 1.
PERFORM collect_messages USING 'Z3' 'I' '000'
'The following Profit centers do not exist.' '' '' ''.
PERFORM collect_messages USING 'Z3' 'I' '000'
gv_c_uline '' '' ''.
PERFORM collect_messages USING 'Z3' 'I' '000'
'Internal Order Profit Center.' '' '' ''.
LOOP AT gt_prft_cntr.
PERFORM collect_messages USING 'Z3' 'I' '000'
gt_prft_cntr-aufnr
gt_prft_cntr-prctr '' ''.
ENDLOOP.
PERFORM collect_messages USING 'Z3' 'I' '000'
gv_c_uline '' '' ''.
ENDIF.
DESCRIBE TABLE gt_submit LINES gv_lin.
IF gv_lin >= 1.
PERFORM collect_messages USING 'Z3' 'I' '000'
'BDC was created for the following Internal Orders.'
'' '' ''.
PERFORM collect_messages USING 'Z3' 'I' '000'
gv_c_uline '' '' ''.
LOOP AT gt_submit.
PERFORM collect_messages USING 'Z3' 'I' '000'
gt_submit-aufnr '' '' ''.
ENDLOOP.
PERFORM collect_messages USING 'Z3' 'I' '000'
gv_c_uline '' '' ''.
ENDIF.
PERFORM collect_messages USING 'Z3' 'I' '000'
'The following Internal Orders have no Business Area.'
'' '' ''.
PERFORM collect_messages USING 'Z3' 'I' '000'
gv_c_uline '' '' ''.
DELETE gt_table WHERE NOT gsber = ' '.
LOOP AT gt_table.
PERFORM collect_messages USING 'Z3' 'I' '000'
gt_table-aufnr '' '' ''.
ENDLOOP.
PERFORM collect_messages USING 'Z3' 'I' '000'
gv_c_uline '' '' ''.
ENDFORM. " WRITE_REPORT
FORM collect_messages USING p_msgid
p_msgty
p_msgnr
p_msgv1
p_msgv2
p_msgv3
p_msgv4.
CLEAR gt_imesg.
gt_imesg-arbgb = p_msgid.
gt_imesg-msgty = p_msgty.
gt_imesg-txtnr = p_msgnr.
gt_imesg-msgv1+0(2) = '@ '.
gt_imesg-msgv1+2(48) = p_msgv1.
gt_imesg-msgv2 = p_msgv2.
gt_imesg-msgv3 = p_msgv3.
gt_imesg-msgv4 = p_msgv4.
APPEND gt_imesg.
CONCATENATE p_msgv1 p_msgv2 p_msgv3 p_msgv4
INTO gv_c170 SEPARATED BY space.
WRITE:/ gv_c170.
ENDFORM.