*&---------------------------------------------------------------------*
*& Report YCS_BOM_UPLOAD *
*& *
*&---------------------------------------------------------------------*
*& *
*& *
*&---------------------------------------------------------------------*
DATA gt_exclude
TYPE STANDARD TABLE OF syucomm
.
* Data Filenames: MATNR.txt
* BMK(SORTF);MENGE;MATNR;CATEG;SHKZ
*e.g.
* -SH14;5,00;271252832;L;X
* -*;6,00;271252838;L;
* -A10;7,00;271252844;L;X
* -1U1;2,00;271259006;D;
* POPUP Selection def
BEGIN OF ty_sel,
component TYPE stpo_api02-component,
change_no TYPE stpo_api02-change_no,
bom_text TYPE stko_api01-bom_text,
checkbox(1),
END OF ty_sel.
* Data displayed
gt_seldat TYPE TABLE OF ty_sel.
* Datenfile
DATA: BEGIN OF it_bom
OCCURS 0, sortstring TYPE sortp,
comp_qty TYPE i,
component TYPE matnr,
item_categ TYPE postp,
item_no TYPE sposn,
item_text2 TYPE potx2,
bulk_mat TYPE schgt,
END OF it_bom.
fname TYPE file_table-filename,
component TYPE matnr,
* aennr TYPE csap_mbom-aennr,
END OF t_files.
* File Table
DATA: it_files
TYPE TABLE OF t_files
. DATA: ls_files
TYPE t_files
.
gv_heute TYPE csap_mbom-datuv.
* Datei
PARAMETERS: p_stlan
TYPE mast
-stlan
DEFAULT '3' OBLIGATORY.
*** Drucktaste 1
p_werk = '1207'.
* siehe RSSYSTDB Gui Status %_00
*** "Ausführen" verbieten
*** "Ausführen + Drucken" verbieten
*** "Im Hintergrund ausführen" verbieten
*** Variante sichern verbieten
*** Variante löschen verbieten
*** Variante holen
*** Variante anzeigen verbieten
* ZURÜCK unterdrücken
* APPEND 'E' TO gt_exclude.
* BEENDEN unterdrücken
* ABBRECHEN unterdrücken
*** Aktuellen Status setzen und obige Funktionen verbieten
CALL FUNCTION 'RS_SET_SELSCREEN_STATUS'
EXPORTING
p_status = sy-pfkey
p_exclude = gt_exclude.
* Datumsformat = DD.MM.JJJJ
WRITE p_date
TO gv_heute
.
*** Selektionsbild (PAI)
*** Drucktasten abfragen
rc = 0.
* Read the selected files into it_files
LOOP AT it_files
ASSIGNING <p
>.
rc = 0.
rc = 0.
* IF rc NE 0.
* Ausgabe des Protokolls
CALL FUNCTION 'Y_BAL_LOG'
EXPORTING
i_display = 'X'
i_refresh = 'X'
i_repid = sy-repid
EXCEPTIONS
error_create = 1
error_add_message = 2
error_refresh = 3
error_display_profile = 4
error_display = 5
OTHERS = 6.
* LEAVE PROGRAM.
* EXIT.
* ENDIF.
* MESSAGE s030(29) WITH <p>-component .
*&---------------------------------------------------------------------*
*& Form file_select
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
DATA file_table
TYPE filetable
WITH HEADER LINE. DATA lv_title
TYPE string. DATA lv_filter
TYPE string.
lv_title = 'Open BOM file'(014).
lv_filter = 'BOM-file(*.TXT)|*.txt'.
CALL METHOD cl_gui_frontend_services=>file_open_dialog
EXPORTING
window_title = lv_title
initial_directory = 'C:\temp'
file_filter = lv_filter
multiselection = 'X'
CHANGING
file_table = file_table[]
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 OR rc
< 1. rc = 1.
LOOP AT file_table
INTO f_name
. ls_files-fname = f_name.
rc = 0.
*&---------------------------------------------------------------------*
*& Form file_upload
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
DATA it_data
TYPE TABLE OF tab512
. DATA ls_data
TYPE tab512
. DATA lv_fname
TYPE string. DATA lt_split
TYPE TABLE OF tab512
. DATA ls_split
TYPE sychar512
.
lv_fname = <p>-fname.
CALL METHOD cl_gui_frontend_services=>gui_upload
EXPORTING
filename = lv_fname
filetype = 'ASC'
has_field_separator = 'X'
CHANGING
data_tab = it_data
EXCEPTIONS
file_open_error = 1
file_read_error = 2
no_batch = 3
gui_refuse_filetransfer = 4
invalid_type = 5
no_authority = 6
unknown_error = 7
bad_data_format = 8
header_not_allowed = 9
separator_not_allowed = 10
header_too_long = 11
unknown_dp_error = 12
access_denied = 13
dp_out_of_memory = 14
disk_full = 15
dp_timeout = 16
not_supported_by_gui = 17
error_no_gui = 18
OTHERS = 19.
rc = 1.
LOOP AT it_data
INTO ls_data
. lv_index = sy-tabix * 10.
SPLIT ls_data
AT ';' INTO TABLE lt_split
. k = lines( lt_split ).
* GET BMK
READ TABLE lt_split INDEX 1 INTO ls_split.
it_bom-sortstring = ls_split.
* GET Quantity
READ TABLE lt_split INDEX 2 INTO ls_split.
REPLACE ',' IN ls_split
WITH '.' IN CHARACTER MODE. it_bom-comp_qty = ls_split.
* GET Component
READ TABLE lt_split INDEX 3 INTO ls_split.
* Matnr mapping
it_bom-component = ls_split.
* GET Item Category
READ TABLE lt_split INDEX 4 INTO ls_split.
it_bom-item_categ = ls_split.
* GET additional Document info text
IF it_bom
-item_categ
= 'D'.
READ TABLE lt_split INDEX 5 INTO ls_split.
it_bom-item_text2 = ls_split.
* GET Bulk Mat hook
READ TABLE lt_split INDEX 6 INTO ls_split.
it_bom-bulk_mat = 'X'.
* GET Posnr
it_bom-item_no = lv_index.
*rc = 1.
*&---------------------------------------------------------------------*
*& Form renew_bom
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
CONSTANTS: lc_base_quan
TYPE basmn_bi
VALUE '1'. "Ticket#4293878 insert * DATA lv_ans(1).
* DATA lv_matnr TYPE matnr.
* DATA lv_aennr TYPE aennr.
DATA lv_tstko
TYPE stko_api01
. * DATA ls_stko TYPE stko_api02.
* DATA lt_stko TYPE TABLE OF stko_api02.
* DATA ls_stpo TYPE stpo_api02.
* DATA lt_stpo TYPE TABLE OF stpo_api02.
** Teste ob Materialstückliste schon existiert
* SELECT COUNT(*) FROM mast WHERE
* matnr = <p>-component AND
* werks = p_werk AND
* stlan = p_stlan.
* Check BOM exisitence (incl. ChangeNo)
* CALL FUNCTION 'CSAP_MAT_BOM_READ'
* EXPORTING
* material = <p>-component
* plant = p_werk
* bom_usage = p_stlan
* TABLES
* t_stpo = lt_stpo
* t_stko = lt_stko
* EXCEPTIONS
* error = 1
* OTHERS = 2.
*
* IF sy-subrc = 0.
* READ TABLE lt_stko INDEX 1 INTO ls_stko.
*
* LOOP AT lt_stpo INTO ls_stpo WHERE change_no NE ' '.
* EXIT.
* ENDLOOP.
*
** check for HEAD change number and POS change number
* IF ls_stpo-change_no IS INITIAL AND ls_stko-chg_no IS INITIAL.
* ELSE.
* PERFORM write_log USING <p>-component 'discarded - Change numbers'(016).
* CLEAR <p>-component.
* EXIT.
* ENDIF.
*
* ENDIF."sy-subrc
* IF NOT lt_stko[] IS INITIAL.
* für BOM_OPEN
** DATA: BEGIN OF tstpo2 OCCURS 0.
** INCLUDE STRUCTURE stpo_api02.
** DATA: END OF tstpo2.
** DATA ls_tstpo2 TYPE stpo_api02.
**
** REFRESH tstpo2.
** CALL FUNCTION 'CSAP_MAT_BOM_OPEN'
** EXPORTING
** material = <p>-component
** plant = p_werk
** bom_usage = p_stlan
** valid_from = ls_stko-valid_from
*** change_no = lv_aennr
** fl_no_change_doc = 'X'
** TABLES
** t_stpo = tstpo2
** EXCEPTIONS
** error = 1
** OTHERS = 2.
**
** IF sy-subrc = 0.
** LOOP AT tstpo2 INTO ls_tstpo2.
**
** ls_tstpo2-fldelete = 'X'.
**
** CALL FUNCTION 'CSAP_BOM_ITEM_MAINTAIN'
** EXPORTING
** i_stpo = ls_tstpo2
** EXCEPTIONS
** error = 1
** OTHERS = 2.
**
** ENDLOOP.
**
** ENDIF.
**
**
** CALL FUNCTION 'CSAP_MAT_BOM_CLOSE'
** EXCEPTIONS
** error = 1
** OTHERS = 2.
**
** IF sy-subrc <> 0.
** ENDIF.
rc = 0.
CALL FUNCTION 'CSAP_MAT_BOM_DELETE'
EXPORTING
material = <p>-component
plant = p_werk
bom_usage = p_stlan
* valid_from = ls_stko-valid_from
* change_no = lv_aennr
fl_commit_and_wait = 'X'
EXCEPTIONS
error = 1
OTHERS = 2.
* MESSAGE ID 'SY' TYPE 'E' NUMBER '002' WITH
* 'Error while trying to delete BOM.'(011).
*- Materialstückliste anlegen (nur Kopfdaten)
*- Kopfdaten füllen
* lv_tstko-base_quan = '1.000'. " Ticket#4293878 delete
lv_tstko-base_quan = lc_base_quan. " Ticket#4293878 insert
lv_tstko-bom_text = 'Bill of Material from file'(012).
CALL FUNCTION 'CSAP_MAT_BOM_CREATE'
EXPORTING
material = <p>-component
plant = p_werk
bom_usage = p_stlan
valid_from = gv_heute
* change_no = <p>-aennr
i_stko = lv_tstko
EXCEPTIONS
error = 1.
MESSAGE ID 'SY' TYPE 'E' NUMBER '002' WITH 'Error trying to create BOM.'(013).
* ELSE.
* existiert nicht - neu anlegen
*- Materialstückliste anlegen (nur Kopfdaten)
*- Kopfdaten füllen
* lv_tstko-base_quan = '1.000'.
* lv_tstko-bom_text = 'Bill of Material from file'(012).
*
* CALL FUNCTION 'CSAP_MAT_BOM_CREATE'
* EXPORTING
* material = <p>-component
* plant = p_werk
* bom_usage = p_stlan
* valid_from = gv_heute
** change_no = <p>-aennr
* i_stko = lv_tstko
* EXCEPTIONS
* error = 1.
*
* IF sy-subrc EQ 1.
* MESSAGE ID 'SY' TYPE 'E' NUMBER '002' WITH
* 'Error trying to create BOM.'(013).
* ENDIF.
*
* ENDIF."bom exist
*&---------------------------------------------------------------------*
*& Form maint_bom
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* für BOM_OPEN
DATA: BEGIN OF tstpo2
OCCURS 0.
DATA ls_tstpo2
TYPE stpo_api02
.
DATA lv_matnr
TYPE matnr
.
CHECK NOT <p
>-component
IS INITIAL.
* Böse Falle !
WAIT UP TO 1 SECONDS.
CALL FUNCTION 'CSAP_MAT_BOM_OPEN'
EXPORTING
material = <p>-component
plant = p_werk
bom_usage = p_stlan
valid_from = gv_heute
* change_no = <p>-aennr
fl_no_change_doc = 'X'
t_stpo = tstpo2
EXCEPTIONS
error = 1
OTHERS = 2.
IF sy
-subrc
= 0. " Test(ohne wait) erreicht 4-5 durchläufe !
i = lines( it_bom ).
lv_cnt = sy-tabix.
* ls_tstpo2-item_categ = 'L'. "Mußeingabe
IF ls_tstpo2
-bulk_mat
= 'X' AND ls_tstpo2
-item_categ
= 'L'. ls_tstpo2-rel_cost = space.
ls_tstpo2-rel_engin = space.
ls_tstpo2-rel_pmaint = space.
ls_tstpo2-rel_sales = space.
ls_tstpo2-rel_prod = 'X'.
* CLEAR ls_tstpo2-BULK_MAT.
IF ls_tstpo2
-item_categ
= 'D'. ls_tstpo2-document = ls_tstpo2-component.
CLEAR ls_tstpo2
-component
. CLEAR ls_tstpo2
-bulk_mat
. ls_tstpo2-doc_type = 'SEG'.
CALL FUNCTION 'CSAP_BOM_ITEM_MAINTAIN'
EXPORTING
i_stpo = ls_tstpo2
EXCEPTIONS
error = 1
OTHERS = 2.
IF ls_tstpo2
-component
IS INITIAL. PERFORM write_log
USING ls_tstpo2
-document
'could not be saved'(009
). PERFORM write_log
USING ls_tstpo2
-component
'could not be saved'(009
).
rc = 1.
* Fortschrittsanzeige
lv_ptext = 'bearbeite Material'.
SEPARATED BY space.
SEPARATED BY space.
SEPARATED BY space.
CALL FUNCTION 'PROGRESS_INDICATOR'
EXPORTING
i_text = lv_ptext
i_processed = lv_cnt
i_total = i
i_output_immediately = 'X'.
CALL FUNCTION 'CSAP_MAT_BOM_CLOSE'
EXCEPTIONS
error = 1
OTHERS = 2.
break guenther.
PERFORM write_log
USING <p
>-component
'could not be Opened'.
*&---------------------------------------------------------------------*
*& Form write_log
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->MATNR text
* -->TEXT text
*----------------------------------------------------------------------*
FORM write_log
USING matnr
TYPE c text
TYPE c
.
CALL FUNCTION 'Y_BAL_LOG'
EXPORTING
i_msgty = 'E'
i_msgid = '0U'
i_msgno = '533'
i_msgv1 = matnr
i_msgv2 = text
i_msgv3 = ' '
i_repid = sy-repid
EXCEPTIONS
error_create = 1
error_add_message = 2
error_refresh = 3
error_display_profile = 4
error_display = 5
OTHERS = 6.
*&---------------------------------------------------------------------*
*& Form update_filetab
*&---------------------------------------------------------------------*
* Extract BomNo and ChangeNo from filename
*----------------------------------------------------------------------*
DATA lt_split
TYPE TABLE OF tab512
. DATA ls_split
TYPE sychar512
.
LOOP AT it_files
ASSIGNING <p
>. SPLIT <p
>-fname
AT '\' INTO TABLE lt_split
. k = lines( lt_split ).
READ TABLE lt_split INDEX k INTO ls_split.
SPLIT ls_split
AT '.' INTO TABLE lt_split
. k = lines( lt_split ).
READ TABLE lt_split INDEX 1 INTO ls_split.
SPLIT ls_split
AT '_' INTO TABLE lt_split
. k = lines( lt_split ).
READ TABLE lt_split INDEX 1 INTO <p>-component.
* check if material exist
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
IMPORTING
output = <p>-component.
SELECT COUNT(*) FROM mara
WHERE matnr
= <p
>-component
. PERFORM write_log
USING <p
>-component
'Material doesn´t exist.'(015
).
DELETE it_files
WHERE component
= space.
*---------------------------------------------------------------------*
* Form f_display_data
*---------------------------------------------------------------------*
* Macro definition
add 1 to ls_fieldcat
-col_pos
. ls_fieldcat-fieldname = &1.
ls_fieldcat-ref_tabname = &2.
append ls_fieldcat
to lt_fieldcat
.
ls_private TYPE slis_data_caller_exit,
ls_seldat TYPE ty_sel,
ls_fieldcat TYPE slis_fieldcat_alv,
lt_fieldcat TYPE slis_t_fieldcat_alv.
* Copy entries for selection
LOOP AT it_files
ASSIGNING <p
>. ls_seldat-component = <p>-component.
SELECT SINGLE maktx
FROM makt
INTO ls_seldat
-bom_text
WHERE matnr = <p>-component AND spras = sy-langu.
PERFORM check_bom_change_num
CHANGING <p
>-component
.
IF <p
>-component
IS INITIAL. ls_seldat-checkbox = ' '.
ls_seldat-change_no = 'X'.
ls_seldat-checkbox = 'X'.
ls_seldat-change_no = ' '.
APPEND ls_seldat
TO gt_seldat
.
* Build the field catalog chg_kz
m_fieldcat 'COMPONENT' 'STPO_API02'.
m_fieldcat 'CHANGE_NO' 'STPO_API02'.
m_fieldcat 'BOM_TEXT' 'STKO_API01'.
* Optimize column width
ls_private-columnopt = 'X'.
* Display data in a POPUP
CALL FUNCTION 'REUSE_ALV_POPUP_TO_SELECT'
EXPORTING
i_title = 'Please select items'
i_selection = 'X'
i_zebra = 'X'
it_fieldcat = lt_fieldcat
i_tabname = 'GT_SELDAT'
i_checkbox_fieldname = 'CHECKBOX'
is_private = ls_private
IMPORTING
e_exit = g_exit
t_outtab = gt_seldat.
* Terminate
PERFORM write_log
USING '' 'Terminate by user'(017
).
LOOP AT it_files
ASSIGNING <p
> WHERE component
NE ' '. READ TABLE gt_seldat WITH KEY component = <p>-component checkbox = 'X' INTO ls_seldat.
DELETE it_files
WHERE component
= space.
*&---------------------------------------------------------------------*
*& Form check_bom_change_num
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->I_BOM text
*----------------------------------------------------------------------*
FORM check_bom_change_num
CHANGING i_bom
TYPE csap_mbom
-matnr
.
DATA lv_tstko
TYPE stko_api01
. DATA ls_stko
TYPE stko_api02
. DATA lt_stko
TYPE TABLE OF stko_api02
. DATA ls_stpo
TYPE stpo_api02
. DATA lt_stpo
TYPE TABLE OF stpo_api02
.
* Check BOM exisitence (incl. ChangeNo)
CALL FUNCTION 'CSAP_MAT_BOM_READ'
EXPORTING
material = i_bom
plant = p_werk
bom_usage = p_stlan
t_stpo = lt_stpo
t_stko = lt_stko
EXCEPTIONS
error = 1
OTHERS = 2.
READ TABLE lt_stko INDEX 1 INTO ls_stko.
LOOP AT lt_stpo
INTO ls_stpo
WHERE change_no
NE ' '.
* check for HEAD change number and POS change number
IF ls_stpo
-change_no
IS INITIAL AND ls_stko
-chg_no
IS INITIAL. PERFORM write_log
USING i_bom
'discarded - Change numbers'(016
).