0% found this document useful (0 votes)
251 views24 pages

BOM Management Class Definition

The class defines methods for a bill of materials (BOM) object. It includes methods to load BOM header and item data, generate output, validate and modify BOM content in an Excel file.

Uploaded by

joaobitar
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as TXT, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
251 views24 pages

BOM Management Class Definition

The class defines methods for a bill of materials (BOM) object. It includes methods to load BOM header and item data, generate output, validate and modify BOM content in an Excel file.

Uploaded by

joaobitar
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as TXT, PDF, TXT or read online on Scribd

*----------------------------------------------------------------------*

* CLASS ZCL_BOM DEFINITION


*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS zcl_bom DEFINITION
PUBLIC
FINAL
CREATE PUBLIC .

PUBLIC SECTION.

TYPES:
zrange_matnr TYPE RANGE OF matnr .
TYPES:
zrange_werks TYPE RANGE OF werks_d .
TYPES:
BEGIN OF ty_mast,
matnr TYPE matnr,
werks TYPE werks_d,
stlan TYPE stlan,
stlnr TYPE stnum,
stlal TYPE stalt,
END OF ty_mast .
TYPES:
tt_mast TYPE TABLE OF ty_mast .
TYPES:
BEGIN OF ty_stko,
stlnr TYPE stnum,
stlal TYPE stalt,
stkoz TYPE cim_count,
datuv TYPE datuv,
stktx TYPE stktx,
END OF ty_stko .
TYPES:
tt_stko TYPE TABLE OF ty_stko .

DATA t_mast TYPE tt_mast .

METHODS constructor
IMPORTING
!ir_matnr TYPE zrange_matnr OPTIONAL
!ir_werks TYPE zrange_werks OPTIONAL .
METHODS carrega_bom_header
EXPORTING
!et_bom_header TYPE ztpp_bom_header .
METHODS carrega_bom_item
IMPORTING
!it_bom_header TYPE ztpp_relat_bom_header
EXPORTING
!et_bom_item TYPE ztpp_relat_bom_item .
METHODS gera_xls
IMPORTING
!it_bom_item TYPE ztpp_relat_bom_item .
METHODS config_fieldcat
CHANGING
!ct_fieldcat TYPE lvc_t_fcat .
METHODS valida_arquivo
IMPORTING
!it_xls_content TYPE ztpp_bom_change_xls_content
EXPORTING
!ev_retorno TYPE boolean
!ev_msg TYPE string .
METHODS alterar_lt
CHANGING
!ct_xls_content TYPE ztpp_bom_change_xls_content .
METHODS criar_lt
CHANGING
!ct_xls_content TYPE ztpp_bom_change_xls_content .
METHODS alterar_header_lt
CHANGING
!cs_lista_tecnica TYPE zspp_bom_change_xls_content .
METHODS alterar_item_lt
CHANGING
!cs_lista_tecnica TYPE zspp_bom_change_xls_content .
METHODS excluir_item_lt
CHANGING
!cs_lista_tecnica TYPE zspp_bom_change_xls_content .
METHODS incluir_item_lt
CHANGING
!cs_lista_tecnica TYPE zspp_bom_change_xls_content .
PROTECTED SECTION.
PRIVATE SECTION.
ENDCLASS.

CLASS ZCL_BOM IMPLEMENTATION.

*
<SIGNATURE>------------------------------------------------------------------------
---------------+
* | Instance Public Method ZCL_BOM->ALTERAR_HEADER_LT
*
+----------------------------------------------------------------------------------
---------------+
* | [<-->] CS_LISTA_TECNICA TYPE ZSPP_BOM_CHANGE_XLS_CONTENT
*
+----------------------------------------------------------------------------------
----</SIGNATURE>
METHOD alterar_header_lt.

DATA:
lv_material TYPE csap_mbom-matnr,
lv_plant TYPE csap_mbom-werks,
lv_bom_usage TYPE csap_mbom-stlan,
lv_alternative TYPE csap_mbom-stlal,
lv_change_no TYPE csap_mbom-aennr,
lv_valid_from TYPE csap_mbom-datuv,
lv_warning TYPE capiflag-flwarning,

ls_mast LIKE LINE OF me->t_mast,


ls_stko TYPE stko_api01,
ls_stko_return TYPE stko_api02.

READ TABLE me->t_mast INTO ls_mast WITH KEY matnr = cs_lista_tecnica-matnr


werks = cs_lista_tecnica-werks.
lv_material = cs_lista_tecnica-matnr.
lv_plant = cs_lista_tecnica-werks.
lv_bom_usage = ls_mast-stlan.
lv_alternative = cs_lista_tecnica-stlal.
lv_change_no = cs_lista_tecnica-aennr.
WRITE sy-datum TO lv_valid_from MM/DD/YYYY.

ls_stko-base_quan = cs_lista_tecnica-bmeng.
ls_stko-base_unit = cs_lista_tecnica-bmein.
ls_stko-bom_status = cs_lista_tecnica-stlst.
ls_stko-bom_text = cs_lista_tecnica-ztext.
ls_stko-alt_text = cs_lista_tecnica-stktx.

CALL FUNCTION 'CSAP_MAT_BOM_MAINTAIN'


EXPORTING
material = lv_material
plant = lv_plant
bom_usage = lv_bom_usage
alternative = lv_alternative
valid_from = lv_valid_from
change_no = lv_change_no
i_stko = ls_stko
fl_commit_and_wait = 'X'
fl_complete = 'X'
IMPORTING
fl_warning = lv_warning
o_stko = ls_stko_return
EXCEPTIONS
error = 1
OTHERS = 2.

IF sy-subrc = 0.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'.
cs_lista_tecnica-stprc = 'Header alterado com sucesso'.

ELSE.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4 INTO cs_lista_tecnica-stprc.
IF cs_lista_tecnica-stprc IS INITIAL.
cs_lista_tecnica-stprc = 'Erro na alteração do header'.
ENDIF.
ENDIF.

ENDMETHOD. "ALTERAR_HEADER_LT

*
<SIGNATURE>------------------------------------------------------------------------
---------------+
* | Instance Public Method ZCL_BOM->ALTERAR_ITEM_LT
*
+----------------------------------------------------------------------------------
---------------+
* | [<-->] CS_LISTA_TECNICA TYPE ZSPP_BOM_CHANGE_XLS_CONTENT
*
+----------------------------------------------------------------------------------
----</SIGNATURE>
METHOD alterar_item_lt.

DATA:
lv_material TYPE csap_mbom-matnr,
lv_plant TYPE csap_mbom-werks,
lv_bom_usage TYPE csap_mbom-stlan,
lv_alternative TYPE csap_mbom-stlal,
lv_change_no TYPE csap_mbom-aennr,
lv_valid_from TYPE csap_mbom-datuv,
lv_postp TYPE postp,
lv_posnr TYPE sposn,
lv_idnrk TYPE idnrk,
lv_warning TYPE capiflag-flwarning,

ls_mast LIKE LINE OF me->t_mast,


ls_stko TYPE stko_api01,
ls_stko_return TYPE stko_api02,

lt_stpo_open TYPE TABLE OF stpo_api02,


lt_stpo_maintain TYPE TABLE OF stpo_api03.

DATA: ls_stpo_maintain LIKE LINE OF lt_stpo_maintain.


DATA: ls_stpo_open LIKE LINE OF lt_stpo_open.

READ TABLE me->t_mast INTO ls_mast WITH KEY matnr = cs_lista_tecnica-matnr


werks = cs_lista_tecnica-werks.

lv_material = cs_lista_tecnica-matnr.
lv_plant = cs_lista_tecnica-werks.
lv_bom_usage = ls_mast-stlan.
lv_alternative = cs_lista_tecnica-stlal.
lv_change_no = cs_lista_tecnica-aennr.
WRITE sy-datum TO lv_valid_from MM/DD/YYYY.

CALL FUNCTION 'CSAP_MAT_BOM_OPEN' "carrega infos de posicionamento BOM


EXPORTING
material = lv_material
plant = lv_plant
bom_usage = lv_bom_usage
alternative = lv_alternative
valid_from = lv_valid_from
change_no = lv_change_no
IMPORTING
o_stko = ls_stko_return
fl_warning = lv_warning
TABLES
t_stpo = lt_stpo_open
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 INTO cs_lista_tecnica-stprc.
IF cs_lista_tecnica-stprc IS INITIAL.
cs_lista_tecnica-stprc = 'Erro na explosão da LT'.
ENDIF.
ENDIF.

lv_postp = cs_lista_tecnica-postp.
lv_posnr = cs_lista_tecnica-posnr.

CALL FUNCTION 'CONVERSION_EXIT_ALPHA_OUTPUT'


EXPORTING
input = cs_lista_tecnica-idnrk
IMPORTING
output = lv_idnrk.

READ TABLE lt_stpo_open INTO ls_stpo_open WITH KEY item_categ = lv_postp


item_no = lv_posnr
component = lv_idnrk.

ls_stpo_maintain = ls_stpo_open.

ls_stpo_maintain-comp_qty = cs_lista_tecnica-menge.
ls_stpo_maintain-comp_unit = cs_lista_tecnica-meins.
ls_stpo_maintain-change_no = cs_lista_tecnica-aennr.
ls_stpo_maintain-issue_loc = cs_lista_tecnica-lgort.
APPEND ls_stpo_maintain TO lt_stpo_maintain.

CALL FUNCTION 'CSAP_MAT_BOM_MAINTAIN'


EXPORTING
material = lv_material
plant = lv_plant
bom_usage = lv_bom_usage
alternative = lv_alternative
valid_from = lv_valid_from
change_no = lv_change_no
i_stko = ls_stko
fl_commit_and_wait = 'X'
fl_complete = 'X'
IMPORTING
fl_warning = lv_warning
o_stko = ls_stko_return
TABLES
t_stpo = lt_stpo_maintain
EXCEPTIONS
error = 1
OTHERS = 2.

IF sy-subrc = 0.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'.

IF sy-subrc <> 0.
* Implement suitable error handling here
ENDIF.

cs_lista_tecnica-stprc = 'Item alterado com sucesso'.

ELSE.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4 INTO cs_lista_tecnica-stprc.
IF cs_lista_tecnica-stprc IS INITIAL.
cs_lista_tecnica-stprc = 'Erro na alteração do item'.
ENDIF.
ENDIF.

ENDMETHOD. "ALTERAR_ITEM_LT

*
<SIGNATURE>------------------------------------------------------------------------
---------------+
* | Instance Public Method ZCL_BOM->ALTERAR_LT
*
+----------------------------------------------------------------------------------
---------------+
* | [<-->] CT_XLS_CONTENT TYPE ZTPP_BOM_CHANGE_XLS_CONTENT
*
+----------------------------------------------------------------------------------
----</SIGNATURE>
METHOD alterar_lt.

DATA: ls_xls_content_h TYPE zspp_bom_change_xls_content,


ls_xls_content TYPE zspp_bom_change_xls_content,
lt_xls_content TYPE ztpp_bom_change_xls_content,
ls_stko TYPE stko_api01,
ls_mast LIKE LINE OF me->t_mast,
lv_warning TYPE capiflag-flwarning,
lt_stpo TYPE TABLE OF stpo_api03,
ls_stpo TYPE stpo_api03,
lt_stko TYPE TABLE OF stko_api02,
lv_msg TYPE zspp_bom_change_xls_content-stprc,
lv_tabix TYPE sy-tabix.

lt_xls_content[] = ct_xls_content[].

" DELETE lt_xls_content WHERE procs = '' and tipoi = 'COMP'.

LOOP AT lt_xls_content INTO ls_xls_content.

lv_tabix = sy-tabix.

CASE ls_xls_content-procs.
WHEN 'A'. "Alteração na LT
IF ls_xls_content-tipoi = 'H'. "alteração no header

CALL METHOD me->alterar_header_lt


CHANGING
cs_lista_tecnica = ls_xls_content.

WAIT UP TO 1 SECONDS.

MODIFY ct_xls_content FROM ls_xls_content INDEX lv_tabix.

ELSE. "alteração no comp


CALL METHOD me->alterar_item_lt
CHANGING
cs_lista_tecnica = ls_xls_content.

WAIT UP TO 1 SECONDS.

MODIFY ct_xls_content FROM ls_xls_content INDEX lv_tabix.

ENDIF.

WHEN 'E'. "exclusão de comp


IF ls_xls_content-tipoi = 'COMP'.

CALL METHOD me->excluir_item_lt


CHANGING
cs_lista_tecnica = ls_xls_content.

WAIT UP TO 1 SECONDS.

MODIFY ct_xls_content FROM ls_xls_content INDEX lv_tabix.

ENDIF.

WHEN 'I'. "inclusão de item

IF ls_xls_content-tipoi = 'COMP'.

CALL METHOD me->incluir_item_lt


CHANGING
cs_lista_tecnica = ls_xls_content.

WAIT UP TO 1 SECONDS.

MODIFY ct_xls_content FROM ls_xls_content INDEX lv_tabix.

ENDIF.
ENDCASE.

ENDLOOP.

ENDMETHOD. "ALTERAR_LT

*
<SIGNATURE>------------------------------------------------------------------------
---------------+
* | Instance Public Method ZCL_BOM->CARREGA_BOM_HEADER
*
+----------------------------------------------------------------------------------
---------------+
* | [<---] ET_BOM_HEADER TYPE ZTPP_BOM_HEADER
*
+----------------------------------------------------------------------------------
----</SIGNATURE>
METHOD carrega_bom_header.
TYPES:
BEGIN OF ty_stko,
stlty TYPE stko-stlty,
stlnr TYPE stko-stlnr,
stlal TYPE stko-stlal,
stkoz TYPE stko-stkoz,
werks TYPE stko-wrkan,
datuv TYPE stko-datuv,
stktx TYPE stktx,
END OF ty_stko,

BEGIN OF ty_stzu,
stlnr TYPE stzu-stlnr,
ztext TYPE stzu-ztext,
stuez TYPE stzu-stuez,
END OF ty_stzu.

DATA:
lt_stko TYPE TABLE OF ty_stko,
lt_stko_aux TYPE TABLE OF ty_stko,
lt_stzu TYPE TABLE OF ty_stzu,
lt_stzu_aux TYPE TABLE OF ty_stzu,

ls_stko TYPE ty_stko,


ls_stzu TYPE ty_stzu,
ls_bom_header TYPE zspp_bom_header,

c_m TYPE c VALUE 'M'.

SELECT stlty
stlnr
stlal
stkoz
wrkan
datuv
stktx
INTO TABLE lt_stko
FROM stko
FOR ALL ENTRIES IN me->t_mast
WHERE stlnr = me->t_mast-stlnr
AND stlal = me->t_mast-stlal
AND stlty = c_m.

SORT lt_stko BY stlnr ASCENDING stlal ASCENDING stkoz DESCENDING.

DATA: lv_stlnr TYPE stnum.


DATA: lv_stlal TYPE stlal.

lt_stko_aux[] = lt_stko[].

CLEAR: lv_stlnr, lv_stlal.

LOOP AT lt_stko_aux INTO ls_stko.


IF lv_stlnr = ls_stko-stlnr AND lv_stlal = ls_stko-stlal.
DELETE TABLE lt_stko FROM ls_stko.
ELSE.
lv_stlnr = ls_stko-stlnr.
lv_stlal = ls_stko-stlal.
ENDIF.
ENDLOOP.

SELECT stlnr
ztext
stuez
INTO TABLE lt_stzu
FROM stzu
FOR ALL ENTRIES IN lt_stko
WHERE stlty = lt_stko-stlty
AND stlnr = lt_stko-stlnr
AND wrkan = lt_stko-werks.

SORT lt_stzu BY stlnr ASCENDING stuez DESCENDING.

lt_stzu_aux[] = lt_stzu[].

CLEAR: lv_stlnr.

LOOP AT lt_stzu_aux INTO ls_stzu.


IF lv_stlnr = ls_stzu-stlnr.
DELETE TABLE lt_stzu FROM ls_stzu.
ELSE.
lv_stlnr = ls_stzu-stlnr.
ENDIF.
ENDLOOP.

LOOP AT lt_stko INTO ls_stko.

READ TABLE lt_stzu INTO ls_stzu WITH KEY stlnr = ls_stko-stlnr.

ls_bom_header-stlnr = ls_stko-stlnr.
ls_bom_header-stlal = ls_stko-stlal.
ls_bom_header-stkoz = ls_stko-stkoz.
ls_bom_header-datuv = ls_stko-datuv.
ls_bom_header-stktx = ls_stko-stktx.
ls_bom_header-ztext = ls_stzu-ztext.
APPEND ls_bom_header TO et_bom_header.
ENDLOOP.

ENDMETHOD. "CARREGA_BOM_HEADER

*
<SIGNATURE>------------------------------------------------------------------------
---------------+
* | Instance Public Method ZCL_BOM->CARREGA_BOM_ITEM
*
+----------------------------------------------------------------------------------
---------------+
* | [--->] IT_BOM_HEADER TYPE ZTPP_RELAT_BOM_HEADER
* | [<---] ET_BOM_ITEM TYPE ZTPP_RELAT_BOM_ITEM
*
+----------------------------------------------------------------------------------
----</SIGNATURE>
METHOD carrega_bom_item.

DATA:
ls_bom_header TYPE zspp_relat_bom_header,
ls_mast TYPE ty_mast,
lt_stb TYPE TABLE OF stpox,
ls_stb TYPE stpox,
ls_topmat TYPE cstmat,
ls_bom_item TYPE zspp_relat_bom_item,

lv_pp01 TYPE c LENGTH 4 VALUE 'PP01',


lv_1 TYPE c VALUE '1'.

CHECK me->t_mast IS NOT INITIAL.

CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'


EXPORTING
text = 'Carregando itens...'.

LOOP AT it_bom_header INTO ls_bom_header.


READ TABLE me->t_mast INTO ls_mast WITH KEY stlal = ls_bom_header-stlal stlan
= ls_bom_header-stlan stlnr = ls_bom_header-stlnr.

"montando header
CLEAR ls_bom_item.
ls_bom_item-tipoi = 'H'.
ls_bom_item-matnr = ls_mast-matnr.
ls_bom_item-werks = ls_mast-werks.
ls_bom_item-stlal = ls_mast-stlal.
ls_bom_item-stlnr = ls_mast-stlnr.
ls_bom_item-stktx = ls_bom_header-stktx.
ls_bom_item-ztext = ls_bom_header-ztext.

CALL FUNCTION 'CS_BOM_EXPL_MAT_V2'


EXPORTING
aumgb = abap_true
capid = lv_pp01
datuv = sy-datum
ehndl = lv_1
mktls = abap_true
mehrs = abap_false
mmory = lv_1
mtnrv = ls_mast-matnr
svwvo = abap_true
werks = ls_mast-werks
vrsvo = abap_true
stlal = ls_mast-stlal
stlan = ls_mast-stlan
IMPORTING
topmat = ls_topmat
TABLES
stb = lt_stb
EXCEPTIONS
alt_not_found = 1
call_invalid = 2
material_not_found = 3
missing_authorization = 4
no_bom_found = 5
no_plant_data = 6
no_suitable_bom_found = 7
conversion_error = 8
OTHERS = 9.
CALL FUNCTION 'CSIO_REFRESH_BUFFER'
EXPORTING
beltb = 'MAST'.

CALL FUNCTION 'CSIO_REFRESH_BUFFER'


EXPORTING
beltb = 'STPO'.

CALL FUNCTION 'CSIO_REFRESH_BUFFER'


EXPORTING
beltb = 'STKO'.

IF sy-subrc <> 0 OR lt_stb IS INITIAL.

ls_bom_item-stprc = 'Erro na explosão da LT'.


APPEND ls_bom_item TO et_bom_item.

CONTINUE.

ENDIF.

"header
ls_bom_item-maktx = ls_topmat-maktx.
ls_bom_item-bmeng = ls_topmat-bmeng.
ls_bom_item-bmein = ls_topmat-bmein.
ls_bom_item-stlst = ls_topmat-stlst.
APPEND ls_bom_item TO et_bom_item.

"item
LOOP AT lt_stb INTO ls_stb.
ls_bom_item-tipoi = 'COMP'.
ls_bom_item-idnrk = ls_stb-idnrk.
ls_bom_item-idntx = ls_stb-ojtxp.
ls_bom_item-posnr = ls_stb-posnr.
ls_bom_item-postp = ls_stb-postp.
ls_bom_item-meins = ls_stb-meins.
ls_bom_item-menge = ls_stb-menge.
ls_bom_item-lgort = ls_stb-lgort.
APPEND ls_bom_item TO et_bom_item.
ENDLOOP.

ENDLOOP.

ENDMETHOD. "CARREGA_BOM_ITEM

*
<SIGNATURE>------------------------------------------------------------------------
---------------+
* | Instance Public Method ZCL_BOM->CONFIG_FIELDCAT
*
+----------------------------------------------------------------------------------
---------------+
* | [<-->] CT_FIELDCAT TYPE LVC_T_FCAT
*
+----------------------------------------------------------------------------------
----</SIGNATURE>
METHOD config_fieldcat.

DATA: ls_fieldcat TYPE lvc_s_fcat.


FIELD-SYMBOLS: <fs_fieldcat> LIKE LINE OF ct_fieldcat.

LOOP AT ct_fieldcat ASSIGNING <fs_fieldcat>.

CASE <fs_fieldcat>-fieldname.
WHEN 'PROCS'.
<fs_fieldcat>-reptext = 'PROC'.
WHEN 'TIPOI'.
<fs_fieldcat>-reptext = 'TIPO'.
WHEN 'AENNR'.
<fs_fieldcat>-reptext = 'N. MODIF.'.
WHEN 'MATNR'.
<fs_fieldcat>-reptext = 'MATERIAL'.
WHEN 'MAKTX'.
<fs_fieldcat>-reptext = 'DESCRIÇÃO'.
WHEN 'WERKS'.
<fs_fieldcat>-reptext = 'CENTRO'.
WHEN 'STLAL'.
<fs_fieldcat>-reptext = 'ALTERNATIVA'.
WHEN 'STLNR'.
<fs_fieldcat>-reptext = 'LISTA TÉCNICA'.
WHEN 'STKTX'.
<fs_fieldcat>-reptext = 'TEXTO ALT'.
WHEN 'ZTEXT'.
<fs_fieldcat>-reptext = 'BOM TEXTO'.
WHEN 'BMENG'.
<fs_fieldcat>-reptext = 'QTD BÁSICA'.
WHEN 'BMEIN'.
<fs_fieldcat>-reptext = 'UM BÁSICA'.
WHEN 'STLST'.
<fs_fieldcat>-reptext = 'STATUS'.
WHEN 'IDNRK'.
<fs_fieldcat>-reptext = 'COMPONENTE'.
WHEN 'IDNTX'.
<fs_fieldcat>-reptext = 'DENOMINAÇÃO'.
WHEN 'POSNR'.
<fs_fieldcat>-reptext = 'ITEM'.
WHEN 'POSTP'.
<fs_fieldcat>-reptext = 'CTG ITEM'.
WHEN 'MEINS'.
<fs_fieldcat>-reptext = 'UNIDADE'.
WHEN 'MENGE'.
<fs_fieldcat>-reptext = 'QTD'.
WHEN 'LGORT'.
<fs_fieldcat>-reptext = 'DEPÓSITO'.
WHEN 'STPRC'.
<fs_fieldcat>-reptext = 'STATUS'.
ENDCASE.
ENDLOOP.

ENDMETHOD. "CONFIG_FIELDCAT

*
<SIGNATURE>------------------------------------------------------------------------
---------------+
* | Instance Public Method ZCL_BOM->CONSTRUCTOR
*
+----------------------------------------------------------------------------------
---------------+
* | [--->] IR_MATNR TYPE ZRANGE_MATNR(optional)
* | [--->] IR_WERKS TYPE ZRANGE_WERKS(optional)
*
+----------------------------------------------------------------------------------
----</SIGNATURE>
METHOD constructor.

TYPES:
BEGIN OF ty_set_eliminate,
matnr TYPE matnr,
werks TYPE werks_d,
END OF ty_set_eliminate.
DATA:
lt_set_eliminate TYPE TABLE OF ty_set_eliminate,

ls_set_eliminate TYPE ty_set_eliminate,


ls_mast LIKE LINE OF me->t_mast,

lv_matnr TYPE matnr.

"marcados para eliminação por mandante


SELECT matnr
INTO TABLE lt_set_eliminate
FROM mara
WHERE lvorm = abap_true
AND matnr IN ir_matnr.

"marcados para eliminação por mandante e planta


SELECT matnr
werks
APPENDING TABLE lt_set_eliminate
FROM marc
WHERE lvorm = abap_true
AND matnr IN ir_matnr
AND werks IN ir_werks.

SORT lt_set_eliminate.
DELETE ADJACENT DUPLICATES FROM lt_set_eliminate.

SELECT matnr
werks
stlan
stlnr
stlal
INTO TABLE me->t_mast
FROM mast
WHERE matnr IN ir_matnr
AND werks IN ir_werks.

LOOP AT lt_set_eliminate INTO ls_set_eliminate.


DELETE me->t_mast WHERE matnr = ls_set_eliminate-matnr.
ENDLOOP.
ENDMETHOD. "CONSTRUCTOR

*
<SIGNATURE>------------------------------------------------------------------------
---------------+
* | Instance Public Method ZCL_BOM->CRIAR_LT
*
+----------------------------------------------------------------------------------
---------------+
* | [<-->] CT_XLS_CONTENT TYPE ZTPP_BOM_CHANGE_XLS_CONTENT
*
+----------------------------------------------------------------------------------
----</SIGNATURE>
METHOD criar_lt.

DATA: ls_xls_content_h TYPE zspp_bom_change_xls_content,


ls_xls_content TYPE zspp_bom_change_xls_content,
ls_stko TYPE stko_api01,
ls_mast LIKE LINE OF me->t_mast,
ls_stpo TYPE stpo_api03,
ls_stko_return TYPE stko_api02,

lt_stpo TYPE TABLE OF stpo_api03,

lv_warning TYPE capiflag-flwarning,


lv_msg TYPE zspp_bom_change_xls_content-stprc,
lv_matnr_h TYPE csap_mbom-matnr,
lv_werks_h TYPE csap_mbom-werks,
lv_stlal_h TYPE stalt,
lv_aennr_h TYPE csap_mbom-aennr,
lv_valid_from TYPE csap_mbom-datuv,
lv_bom_num TYPE stko_api02-bom_no.

READ TABLE ct_xls_content INTO ls_xls_content_h INDEX 1. "header


READ TABLE me->t_mast INTO ls_mast WITH KEY matnr = ls_xls_content_h-matnr
werks = ls_xls_content_h-werks. "bom usage

IF ls_mast IS INITIAL. "nova lista técnica

lv_matnr_h = ls_xls_content_h-matnr.
lv_werks_h = ls_xls_content_h-werks.
lv_stlal_h = ls_xls_content_h-stlal.
lv_aennr_h = ls_xls_content_h-aennr.
WRITE sy-datum TO lv_valid_from MM/DD/YYYY.

"montando ls_stko - infos de material


ls_stko-base_quan = ls_xls_content_h-bmeng.
ls_stko-base_unit = ls_xls_content_h-bmein.
ls_stko-bom_status = ls_xls_content_h-stlst.
ls_stko-alt_text = ls_xls_content_h-stktx.
ls_stko-bom_text = ls_xls_content_h-ztext.
LOOP AT ct_xls_content INTO ls_xls_content WHERE tipoi = 'COMP'.

ls_stpo-item_categ = ls_xls_content-postp.
ls_stpo-item_no = ls_xls_content-posnr.
ls_stpo-component = ls_xls_content-idnrk.
ls_stpo-comp_qty = ls_xls_content-menge.
ls_stpo-comp_unit = ls_xls_content-meins.
ls_stpo-issue_loc = ls_xls_content-lgort.
APPEND ls_stpo TO lt_stpo.

ENDLOOP.

CALL FUNCTION 'CSAP_MAT_BOM_MAINTAIN'


EXPORTING
material = lv_matnr_h
plant = lv_werks_h
bom_usage = '1'
change_no = lv_aennr_h
valid_from = lv_valid_from
i_stko = ls_stko
fl_commit_and_wait = abap_true
fl_bom_create = abap_true
fl_new_item = abap_true
fl_complete = abap_true
fl_default_values = abap_true
IMPORTING
fl_warning = lv_warning
o_stko = ls_stko_return
TABLES
t_stpo = lt_stpo
EXCEPTIONS
error = 1
OTHERS = 2.

IF sy-subrc = 0.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'.
lv_msg = 'LT criada com sucesso'.
ELSE.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4 INTO lv_msg.
IF lv_msg IS INITIAL.
lv_msg = 'Erro na criação da LT'.
ENDIF.
ENDIF.

LOOP AT ct_xls_content INTO ls_xls_content.


ls_xls_content-stprc = lv_msg.
MODIFY ct_xls_content FROM ls_xls_content INDEX sy-tabix.
ENDLOOP.

ELSE. "lt já existe, deve criar uma nova alternativa

DATA: lt_bom_header TYPE TABLE OF bicsk,

ls_bom_header TYPE bicsk,


ls_group_data TYPE bgr00,
lv_msgid TYPE t100-arbgb,
lv_msgno TYPE t100-msgnr,
lv_msgty TYPE sy-msgty,
lv_msgv1 TYPE sy-msgv1,
lv_msgv2 TYPE sy-msgv2,
lv_msgv3 TYPE sy-msgv3,
lv_msgv4 TYPE sy-msgv4,

lt_bom_item TYPE TABLE OF bicsp,


ls_bom_item TYPE bicsp,
lt_bom_sub_item TYPE TABLE OF bicsu.

WRITE sy-datum TO lv_valid_from MM/DD/YYYY.

ls_bom_header-stype = 'M'.
ls_bom_header-tcode = 'CS01'.
ls_bom_header-aennr = ls_xls_content_h-aennr.
ls_bom_header-bmeng = ls_xls_content_h-bmeng.
ls_bom_header-datuv = lv_valid_from.
ls_bom_header-matnr = ls_xls_content_h-matnr.
ls_bom_header-stktx = ls_xls_content_h-stktx.
ls_bom_header-stlal = ls_xls_content_h-stlal.
ls_bom_header-stlan = ls_mast-stlan.
ls_bom_header-stlst = ls_xls_content_h-stlst.
ls_bom_header-werks = ls_xls_content_h-werks.

LOOP AT ct_xls_content INTO ls_xls_content WHERE tipoi = 'COMP'.


ls_bom_item-stype = 'M'.
ls_bom_item-xline = '0001'.
ls_bom_item-idnrk = ls_xls_content-idnrk.
ls_bom_item-meins = ls_xls_content-meins.
ls_bom_item-menge = ls_xls_content-menge.
ls_bom_item-posnr = ls_xls_content-posnr.
ls_bom_item-postp = ls_xls_content-postp.
ls_bom_item-lgort = ls_xls_content-lgort.
APPEND ls_bom_item TO lt_bom_item.
ENDLOOP.

CALL FUNCTION 'CS_BI_BOM_CREATE_BATCH_INPUT1'


EXPORTING
bom_header = ls_bom_header
group_data = ls_group_data
IMPORTING
msgid = lv_msgid
msgno = lv_msgno
msgty = lv_msgty
msgv1 = lv_msgv1
msgv2 = lv_msgv2
msgv3 = lv_msgv3
msgv4 = lv_msgv4
TABLES
bom_item = lt_bom_item
bom_sub_item = lt_bom_sub_item.

IF lv_msgty = 'S'.
lv_msg = 'LT alternativa criada com sucesso'.
ELSE.
CONCATENATE lv_msgid lv_msgno lv_msgty lv_msgv1 lv_msgv2 lv_msgv3 lv_msgv4
INTO lv_msg SEPARATED BY space.
ENDIF.

LOOP AT ct_xls_content INTO ls_xls_content.


ls_xls_content-stprc = lv_msg.
MODIFY ct_xls_content FROM ls_xls_content INDEX sy-tabix.
ENDLOOP.

ENDIF.

ENDMETHOD. "CRIAR_LT

*
<SIGNATURE>------------------------------------------------------------------------
---------------+
* | Instance Public Method ZCL_BOM->EXCLUIR_ITEM_LT
*
+----------------------------------------------------------------------------------
---------------+
* | [<-->] CS_LISTA_TECNICA TYPE ZSPP_BOM_CHANGE_XLS_CONTENT
*
+----------------------------------------------------------------------------------
----</SIGNATURE>
METHOD excluir_item_lt.

DATA:
lv_material TYPE csap_mbom-matnr,
lv_plant TYPE csap_mbom-werks,
lv_bom_usage TYPE csap_mbom-stlan,
lv_alternative TYPE csap_mbom-stlal,
lv_change_no TYPE csap_mbom-aennr,
lv_valid_from TYPE csap_mbom-datuv,
lv_warning TYPE capiflag-flwarning,
lv_postp TYPE postp,
lv_posnr TYPE sposn,
lv_idnrk TYPE idnrk,

ls_mast LIKE LINE OF me->t_mast,


ls_stko TYPE stko_api01,
ls_stko_return TYPE stko_api02,
ls_stpo_open TYPE stpo_api02,
ls_stpo_maintain TYPE stpo_api03,

lt_stpo_open TYPE TABLE OF stpo_api02,


lt_stpo_maintain TYPE TABLE OF stpo_api03.

READ TABLE me->t_mast INTO ls_mast WITH KEY matnr = cs_lista_tecnica-matnr


werks = cs_lista_tecnica-werks.

lv_material = cs_lista_tecnica-matnr.
lv_plant = cs_lista_tecnica-werks.
lv_bom_usage = ls_mast-stlan.
lv_alternative = cs_lista_tecnica-stlal.
lv_change_no = cs_lista_tecnica-aennr.
WRITE sy-datum TO lv_valid_from MM/DD/YYYY.

CALL FUNCTION 'CSAP_MAT_BOM_OPEN' "carrega infos de posicionamento BOM


EXPORTING
material = lv_material
plant = lv_plant
bom_usage = lv_bom_usage
alternative = lv_alternative
valid_from = lv_valid_from
change_no = lv_change_no
IMPORTING
o_stko = ls_stko_return
fl_warning = lv_warning
TABLES
t_stpo = lt_stpo_open
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 INTO cs_lista_tecnica-stprc.
IF cs_lista_tecnica-stprc IS INITIAL.
cs_lista_tecnica-stprc = 'Erro na explosão da LT'.
ENDIF.

EXIT.
ENDIF.

lv_postp = cs_lista_tecnica-postp.
lv_posnr = cs_lista_tecnica-posnr.

CALL FUNCTION 'CONVERSION_EXIT_ALPHA_OUTPUT'


EXPORTING
input = cs_lista_tecnica-idnrk
IMPORTING
output = lv_idnrk.

READ TABLE lt_stpo_open INTO ls_stpo_open WITH KEY item_categ = lv_postp


item_no = lv_posnr
component = lv_idnrk.

ls_stpo_open-fldelete = abap_true.

ls_stpo_maintain = ls_stpo_open.
APPEND ls_stpo_maintain TO lt_stpo_maintain.

CALL FUNCTION 'CSAP_MAT_BOM_MAINTAIN'


EXPORTING
material = lv_material
plant = lv_plant
bom_usage = lv_bom_usage
alternative = lv_alternative
valid_from = lv_valid_from
change_no = lv_change_no
i_stko = ls_stko
fl_commit_and_wait = 'X'
fl_complete = 'X'
IMPORTING
fl_warning = lv_warning
o_stko = ls_stko_return
TABLES
t_stpo = lt_stpo_maintain
EXCEPTIONS
error = 1
OTHERS = 2.

IF sy-subrc = 0.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'.

IF sy-subrc <> 0.
* Implement suitable error handling here
ENDIF.

cs_lista_tecnica-stprc = 'Item excluído com sucesso'.

ELSE.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4 INTO cs_lista_tecnica-stprc.
IF cs_lista_tecnica-stprc IS INITIAL.
cs_lista_tecnica-stprc = 'Erro na exclusão do item'.
ENDIF.

ENDIF.

ENDMETHOD. "EXCLUIR_ITEM_LT

*
<SIGNATURE>------------------------------------------------------------------------
---------------+
* | Instance Public Method ZCL_BOM->GERA_XLS
*
+----------------------------------------------------------------------------------
---------------+
* | [--->] IT_BOM_ITEM TYPE ZTPP_RELAT_BOM_ITEM
*
+----------------------------------------------------------------------------------
----</SIGNATURE>
METHOD gera_xls.

DATA:
ls_bom_item TYPE zspp_relat_bom_item,
ls_xls_content TYPE zspp_bom_change_xls_content,
lt_xls_content TYPE ztpp_bom_change_xls_content,
lv_version TYPE string,
lv_file_type TYPE salv_bs_constant,
lv_flavour TYPE string,
lt_xml_choice TYPE if_salv_bs_xml=>t_type_xml_choice,
ls_xml_choice TYPE if_salv_bs_xml=>s_type_xml_choice,
g_xstring TYPE xstring,
lo_data TYPE REF TO data,
lo_result_data TYPE REF TO cl_salv_ex_result_data_table,
lt_fieldcatalog TYPE lvc_t_fcat.
"povoando tabela de conteudo xlsx
LOOP AT it_bom_item INTO ls_bom_item.
ls_xls_content-tipoi = ls_bom_item-tipoi.
ls_xls_content-aennr = ls_bom_item-aennr.
ls_xls_content-matnr = ls_bom_item-matnr.
ls_xls_content-maktx = ls_bom_item-maktx.
ls_xls_content-werks = ls_bom_item-werks.
ls_xls_content-stlal = ls_bom_item-stlal.
ls_xls_content-stlnr = ls_bom_item-stlnr.
ls_xls_content-stktx = ls_bom_item-stktx.
ls_xls_content-ztext = ls_bom_item-ztext.
ls_xls_content-bmeng = ls_bom_item-bmeng.
ls_xls_content-bmein = ls_bom_item-bmein.
ls_xls_content-stlst = ls_bom_item-stlst.
ls_xls_content-idnrk = ls_bom_item-idnrk.
ls_xls_content-idntx = ls_bom_item-idntx.
ls_xls_content-posnr = ls_bom_item-posnr.
ls_xls_content-postp = ls_bom_item-postp.
ls_xls_content-meins = ls_bom_item-meins.
ls_xls_content-menge = ls_bom_item-menge.
ls_xls_content-lgort = ls_bom_item-lgort.
ls_xls_content-stprc = ls_bom_item-stprc.

REPLACE '.' WITH ',' INTO: ls_xls_content-bmeng,


ls_xls_content-menge.

APPEND ls_xls_content TO lt_xls_content.


ENDLOOP.

"versão do xml
CASE cl_salv_bs_a_xml_base=>get_version( ).
WHEN if_salv_bs_xml=>version_25.
lv_version = if_salv_bs_xml=>version_25.
WHEN if_salv_bs_xml=>version_26.
lv_version = if_salv_bs_xml=>version_26.
WHEN OTHERS.
ENDCASE.

"filetype: XLSX
lv_file_type = if_salv_bs_xml=>c_type_xlsx.
"flavour: export
lv_flavour = if_salv_bs_c_tt=>c_tt_xml_flavour_export.

"data -> excel

GET REFERENCE OF lt_xls_content INTO lo_data.

"configurando fieldcat
CALL FUNCTION 'LVC_FIELDCATALOG_MERGE'
EXPORTING
i_structure_name = 'ZSPP_BOM_CHANGE_XLS_CONTENT'
CHANGING
ct_fieldcat = lt_fieldcatalog
EXCEPTIONS
inconsistent_interface = 1
program_error = 2
OTHERS = 3.
CALL METHOD me->config_fieldcat
CHANGING
ct_fieldcat = lt_fieldcatalog.

"montando obj com infos e config


CALL METHOD cl_salv_ex_util=>factory_result_data_table
EXPORTING
r_data = lo_data
t_fieldcatalog = lt_fieldcatalog
RECEIVING
r_result_data_table = lo_result_data.

CHECK lo_result_data IS NOT INITIAL.

"gerando xtring com infos


CALL METHOD cl_salv_bs_tt_util=>if_salv_bs_tt_util~transform
EXPORTING
xml_type = lv_file_type
xml_version = lv_version
r_result_data = lo_result_data
xml_flavour = lv_flavour
gui_type = if_salv_bs_xml=>c_gui_type_gui
IMPORTING
xml = g_xstring.

lt_xml_choice = cl_salv_export_xml_dialog=>get_gui_spreadsheet_formats( ).

"salvando xlsx
READ TABLE lt_xml_choice INTO ls_xml_choice WITH KEY xml_type = lv_file_type.
IF sy-subrc EQ 0.
cl_salv_export_xml_dialog=>download( EXPORTING s_xml_choice = ls_xml_choice
xml = g_xstring ).
ENDIF.

IF sy-subrc IS INITIAL.
MESSAGE 'Arquivo gerado com sucesso' TYPE 'S'.
ENDIF.

ENDMETHOD. "GERA_XLS

*
<SIGNATURE>------------------------------------------------------------------------
---------------+
* | Instance Public Method ZCL_BOM->INCLUIR_ITEM_LT
*
+----------------------------------------------------------------------------------
---------------+
* | [<-->] CS_LISTA_TECNICA TYPE ZSPP_BOM_CHANGE_XLS_CONTENT
*
+----------------------------------------------------------------------------------
----</SIGNATURE>
METHOD incluir_item_lt.

DATA: lt_stpo TYPE TABLE OF stpo_api03,

lv_material TYPE csap_mbom-matnr,


lv_plant TYPE csap_mbom-werks,
lv_bom_usage TYPE csap_mbom-stlan,
lv_alternative TYPE csap_mbom-stlal,
lv_change_no TYPE csap_mbom-aennr,
lv_valid_from TYPE csap_mbom-datuv,
lv_warning TYPE capiflag-flwarning,

ls_stpo TYPE stpo_api03,


ls_mast LIKE LINE OF me->t_mast,
ls_stko TYPE stko_api01,
ls_stko_return TYPE stko_api02.

READ TABLE me->t_mast INTO ls_mast WITH KEY matnr = cs_lista_tecnica-matnr


werks = cs_lista_tecnica-werks.

lv_material = cs_lista_tecnica-matnr.
lv_plant = cs_lista_tecnica-werks.
lv_bom_usage = ls_mast-stlan.
lv_alternative = cs_lista_tecnica-stlal.
lv_change_no = cs_lista_tecnica-aennr.
WRITE sy-datum TO lv_valid_from MM/DD/YYYY.

ls_stpo-item_categ = cs_lista_tecnica-postp.
ls_stpo-item_no = cs_lista_tecnica-posnr.
ls_stpo-component = cs_lista_tecnica-idnrk.
ls_stpo-comp_qty = cs_lista_tecnica-menge.
ls_stpo-comp_unit = cs_lista_tecnica-meins.
ls_stpo-issue_loc = cs_lista_tecnica-lgort.
APPEND ls_stpo TO lt_stpo.

CALL FUNCTION 'CSAP_MAT_BOM_MAINTAIN'


EXPORTING
material = lv_material
plant = lv_plant
bom_usage = lv_bom_usage
alternative = lv_alternative
valid_from = lv_valid_from
change_no = lv_change_no
i_stko = ls_stko
fl_commit_and_wait = 'X'
fl_complete = 'X'
IMPORTING
fl_warning = lv_warning
o_stko = ls_stko_return
TABLES
t_stpo = lt_stpo
EXCEPTIONS
error = 1
OTHERS = 2.

IF sy-subrc = 0.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'.
cs_lista_tecnica-stprc = 'Item incluído com sucesso'.

ELSE.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4 INTO cs_lista_tecnica-stprc.
IF cs_lista_tecnica-stprc IS INITIAL.
cs_lista_tecnica-stprc = 'Erro na inclusão do item'.
ENDIF.

ENDIF.

ENDMETHOD. "INCLUIR_ITEM_LT

*
<SIGNATURE>------------------------------------------------------------------------
---------------+
* | Instance Public Method ZCL_BOM->VALIDA_ARQUIVO
*
+----------------------------------------------------------------------------------
---------------+
* | [--->] IT_XLS_CONTENT TYPE ZTPP_BOM_CHANGE_XLS_CONTENT
* | [<---] EV_RETORNO TYPE BOOLEAN
* | [<---] EV_MSG TYPE STRING
*
+----------------------------------------------------------------------------------
----</SIGNATURE>
METHOD valida_arquivo.
DATA:
ls_xls_content LIKE LINE OF it_xls_content,

r_procs TYPE RANGE OF zspp_bom_change_xls_content-procs,


s_procs LIKE LINE OF r_procs,
r_tipoi TYPE RANGE OF zspp_bom_change_xls_content-tipoi,
s_tipoi LIKE LINE OF r_tipoi.

s_procs-sign = 'I'.
s_procs-option = 'EQ'.
s_procs-low = 'A'.
APPEND s_procs TO r_procs.
s_procs-low = 'E'.
APPEND s_procs TO r_procs.
s_procs-low = 'I'.
APPEND s_procs TO r_procs.
s_procs-low = space.
APPEND s_procs TO r_procs.

s_tipoi-sign = 'I'.
s_tipoi-option = 'EQ'.
s_tipoi-low = 'H'.
APPEND s_tipoi TO r_tipoi.
s_tipoi-low = 'COMP'.
APPEND s_tipoi TO r_tipoi.

"Validação coluna A -> só é permitido A, E, I ou space.


LOOP AT it_xls_content INTO ls_xls_content.

IF ls_xls_content-procs NOT IN r_procs.


ev_msg = 'Operação não prevista. Checar coluna A'.
EXIT.
ENDIF.

IF ls_xls_content-tipoi NOT IN r_tipoi.


ev_msg = 'Tipo não previsto. Checar coluna B'.
EXIT.
ENDIF.

IF ls_xls_content-procs <> '' AND ls_xls_content-aennr = ''.


ev_msg = 'Alteração sem número de modificação. Checar coluna C'.
EXIT.
ENDIF.

ENDLOOP.

IF ev_msg IS INITIAL.
ev_retorno = abap_true.
ENDIF.

ENDMETHOD. "VALIDA_ARQUIVO
ENDCLASS.

You might also like