Sei sulla pagina 1di 22

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

* PoolMóds : ZPPMI0001
* Cliente : Elektro
* Módulo : PM
* Transação: ZTPM012
* Descrição: Atualizar as informações técnicas dos equipamentos
* Autor : Carlos Eduardo D. Ferreira / ATT Data: 04/03/2009
*----------------------------------------------------------------------
* Histórico de Alterações:
*----------------------------------------------------------------------
* Data |Change # |Autor |Alteração
*----------------------------------------------------------------------
* 04/03/2009 | ECDK901672|Carlos Eduardo D |Desenvolvimento Inicial
*----------------------------------------------------------------------
REPORT zppmi0001.
*----------------------------------------------------------------------
* Definição de Constantes
*----------------------------------------------------------------------
CONSTANTS:
c_case1 TYPE char04
VALUE '0001', "Condições case
c_case2 TYPE char04
VALUE '0002', "Condições case
c_case3 TYPE char04
VALUE '0003', "Condições case
c_case4 TYPE char04
VALUE '0004', "Condições case
c_case5 TYPE char04
VALUE '0005', "Condições case
c_case6 TYPE char04
VALUE '0006', "Condições case
c_case7 TYPE char04
VALUE '0007', "Condições case
c_case8 TYPE char04
VALUE '0008', "Condições case
c_sucesso TYPE char01
VALUE 'S', "Mensagem de sucesso
c_erro TYPE char01
VALUE 'E', "Mensagem de erro
c_warning TYPE char01
VALUE 'W', "Mensagem de alerta
c_sim TYPE char01
VALUE 'X', "Valor Booleano Verdadeiro
c_filename TYPE string
VALUE '*.xls', "Extensão dos arquivos
c_filter TYPE string
VALUE 'Excel(*.XLS)|*.XLS|', "Filtro dos aquivos
c_tcode TYPE sy-tcode
VALUE 'IE02', "Transação
c_classe_equip TYPE klah-klart
VALUE '002', "Tipo da classe
*** Constantes utilizadas no batchinput
c_background TYPE char01
VALUE 'N', "Executar o batchinput
c_0100 TYPE bdcdata-fval
VALUE '0100', "Valor Batchinput
c_rm63e_equnr TYPE bdcdata-fval
VALUE 'RM63E-EQUNR', "Valor Batchinput
c_00 TYPE bdcdata-fval
VALUE '/00', "Valor Batchinput
c_itob_serge TYPE bdcdata-fval
VALUE 'ITOB-SERGE', "Valor Batchinput
c_kl TYPE bdcdata-fval
VALUE '=KL', "Valor Batchinput
c_wcheck TYPE bdcdata-fval
VALUE 'WCHECK_V_H-GWLEN_I', "Valor Batchinput
c_002 TYPE bdcdata-fval
VALUE '002', "Valor Batchinput
c_rmclf_class TYPE bdcdata-fval
VALUE 'RMCLF-CLASS(01)', "Valor Batchinput
c_saplcbcm TYPE bdcdata-fval
VALUE 'SAPLCBCM', "Valor Batchinput
c_back TYPE bdcdata-fval
VALUE '=BACK', "Valor Batchinput
c_0101 TYPE bdcdata-fval
VALUE '0101', "Valor Batchinput
c_t06 TYPE bdcdata-fval
VALUE 'T\06', "Valor Batchinput
c_mepo TYPE bdcdata-fval
VALUE '=MEPO', "Valor Batchinput
c_itob_shtxt TYPE bdcdata-fval
VALUE 'ITOB-SHTXT', "Valor Batchinput
c_4110 TYPE bdcdata-fval
VALUE '4110', "Valor Batchinput
c_impt_indct TYPE bdcdata-fval
VALUE 'IMPT-INDCT(01)', "Valor Batchinput
c_gdpt TYPE bdcdata-fval
VALUE '=GDPT', "Valor Batchinput
c_5110 TYPE bdcdata-fval
VALUE '5110', "Valor Batchinput
c_rimro_pyeac TYPE bdcdata-fval
VALUE 'RIMR0-PYEAC', "Valor Batchinput
c_2 TYPE bdcdata-fval
VALUE '2', "Valor Batchinput
c_erw TYPE bdcdata-fval
VALUE '/ERW', "Valor Batchinput
c_rimr0_flgsl TYPE bdcdata-fval
VALUE 'RIMR0-FLGSL(01)', "Valor Batchinput
c_bu TYPE bdcdata-fval
VALUE '=BU', "Valor Batchinput
c_gs_caract TYPE bdcdata-fval
VALUE 'GS_CARACT_EQUIP-CARACT_', "Nome do campo da tabela
c_rctms_mwert TYPE bdcdata-fval
VALUE 'RCTMS-MWERT(', "Nome do campo da tabela
c_fecha TYPE char01
VALUE ')', "Fecha colchete
c_04_27 TYPE bdcdata-fval
VALUE '04/27', "Valor Batchinput
c_0120 TYPE bdcdata-fval
VALUE '0120', "Valor Batchinput
c_pick TYPE bdcdata-fval
VALUE '=PICK', "Valor Batchinput
c_1101 TYPE bdcmsgcoll-dynumb
VALUE '1101', "Valor Batchinput
c_wei1 TYPE bdcdata-fval
VALUE '=WEI1', "Valor Batchinput
c_su TYPE bdcdata-fval
VALUE '=SU', "Valor Batchinput
c_0300 TYPE bdcdata-fval
VALUE '0300', "Valor Batchinput
c_msg_erro_tela TYPE bdcmsgcoll-msgnr
VALUE '344', "Valor Batchinput
c_msg_ok TYPE bdcdata-fval
VALUE '817', "Valor Batchinput
c_status_fabr TYPE jstat-stat
VALUE 'E0001', "Valor Batchinput
c_page_down TYPE bdcdata-fval
VALUE 'P++'. "Valor Batchinput
*----------------------------------------------------------------------
* Definição de Tipos
*----------------------------------------------------------------------
TYPES:
*** Tabela com informações recebidas do aquivo excel
BEGIN OF caract_equip_type,
cod_elektro TYPE equnr, "Equipamento
fabricante TYPE herst, "Fabricante
modelo TYPE typbz, "Modelo
n_serie_fabr TYPE serge, "Nº série fabricante
data_fabr(7) TYPE c, "Data de fabricação
data_ini_garantia TYPE gwldt, "Data inicio da garantia
data_fim_garantia TYPE gwlen, "Data fim da garantia
classe TYPE class-class, "Classe
caract_01(25) TYPE c, "Caracteristica 1
caract_02(25) TYPE c, "Caracteristica 2
caract_03(25) TYPE c, "Caracteristica 3
caract_04(25) TYPE c, "Caracteristica 4
caract_05(25) TYPE c, "Caracteristica 5
caract_06(25) TYPE c, "Caracteristica 6
caract_07(25) TYPE c, "Caracteristica 7
caract_08(25) TYPE c, "Caracteristica 8
caract_09(25) TYPE c, "Caracteristica 9
caract_10(25) TYPE c, "Caracteristica 10
caract_11(25) TYPE c, "Caracteristica 11
caract_12(25) TYPE c, "Caracteristica 12
caract_13(25) TYPE c, "Caracteristica 13
caract_14(25) TYPE c, "Caracteristica 14
caract_15(25) TYPE c, "Caracteristica 15
caract_16(25) TYPE c, "Caracteristica 16
caract_17(25) TYPE c, "Caracteristica 17
caract_18(25) TYPE c, "Caracteristica 18
caract_19(25) TYPE c, "Caracteristica 19
caract_20(25) TYPE c, "Caracteristica 20
caract_21(25) TYPE c, "Caracteristica 21
caract_22(25) TYPE c, "Caracteristica 22
caract_23(25) TYPE c, "Caracteristica 23
caract_24(25) TYPE c, "Caracteristica 24
caract_25(25) TYPE c, "Caracteristica 25
caract_26(25) TYPE c, "Caracteristica 26
caract_27(25) TYPE c, "Caracteristica 27
caract_28(25) TYPE c, "Caracteristica 28
caract_29(25) TYPE c, "Caracteristica 29
caract_30(25) TYPE c, "Caracteristica 30
END OF caract_equip_type,
*** Tabela de informações dos equipamentos
BEGIN OF equi_type,
equnr TYPE equi-equnr, "Equipamento
eqtyp TYPE ztbpm0004-eqtyp, "Categoria de equip
eqart TYPE ztbpm0004-eqart, "Tipo do objeto téc
mptyp TYPE ztbpm0004-mptyp, "Categoria do ponto
psort TYPE ztbpm0004-psort, "Nº do item do ponto
indct TYPE ztbpm0004-indct, "Indicador
pttxt TYPE ztbpm0004-pttxt, "Descrição
atnam TYPE ztbpm0004-atnam, "Nome da carac
pyeac TYPE ztbpm0004-pyeac, "Atividade anual
END OF equi_type,
*** Tabela de saida
BEGIN OF saida_type,
equnr TYPE equi-equnr, "Equipamento
eqktx TYPE eqkt-eqktx, "Descrição do equipamento
msg(80) TYPE c, "Mensagem
msgtyp TYPE bdcmsgcoll-msgtyp, "Tipo da mensagem
END OF saida_type,
*** Tabela de informações dos equipamentos
BEGIN OF eqkt_type,
equnr TYPE eqkt-equnr, "Equipamento
eqktx TYPE eqkt-eqktx, "Descrição do equipamento
eqart TYPE equi-eqart, "Tipo do objeto téc
objnr TYPE equi-objnr, "Nº objeto
END OF eqkt_type,
*** Classe do equipamento
BEGIN OF class_type,
class TYPE klah-class, "Classe do equipamento
END OF class_type,
*** Dados cabeçalho da classe
BEGIN OF klah_type,
clint TYPE klah-clint, "Nº classe interno
klart TYPE klah-klart, "Tipo de classe
class TYPE klah-class, "Nº classe
END OF klah_type,
*** Caracteristicas para classes
BEGIN OF ksml_type,
clint TYPE ksml-clint, "Nº classe interno
posnr TYPE ksml-posnr, "Nº do item
adzhl TYPE ksml-adzhl, "Contador interno
imerk TYPE ksml-imerk, "Característica interna
klart TYPE ksml-klart, "Tipo de classe
END OF ksml_type,
*** Característica
BEGIN OF cabn_type,
atinn TYPE cabn-atinn, "Característica interna
adzhl TYPE cabn-adzhl, "Contador interno
atnam TYPE cabn-atnam, "Nome da característica
END OF cabn_type.
*----------------------------------------------------------------------*
* Definição de Tabelas Internas
*----------------------------------------------------------------------*
DATA:
*** Tabela de caracteristicas dos equipamentos
gw_caract_equip TYPE STANDARD TABLE OF caract_equip_type,
*** Tabela equipamentos a para criar ponto de medição
gw_equi TYPE STANDARD TABLE OF equi_type,
*** Recebe dados do arquivo
gw_arquivo TYPE STANDARD TABLE OF alsmex_tabline,
*** Tabela do batchinput
gw_bdcdata TYPE STANDARD TABLE OF bdcdata,
*** Agrupar mensagens
gw_messtab TYPE STANDARD TABLE OF bdcmsgcoll,
*** Tabela de saida
gw_saida TYPE STANDARD TABLE OF saida_type,
*** Tabela de equipamentos
gw_eqkt TYPE STANDARD TABLE OF eqkt_type,
*** Tabela cabeçalho da classe
gw_klah TYPE STANDARD TABLE OF klah_type,
*** Tabela Caracteristicas para classes
gw_ksml TYPE STANDARD TABLE OF ksml_type,
*** Tabela de Característica
gw_cabn TYPE STANDARD TABLE OF cabn_type,
*** Tabela de classes do equipamento
gw_class TYPE STANDARD TABLE OF class_type.

*----------------------------------------------------------------------*
* Definição de Estruturas
*----------------------------------------------------------------------*
DATA:
gs_caract_equip TYPE caract_equip_type, "Equipamentos
gs_bdcdata TYPE bdcdata, "BatchInput
gs_messtab TYPE bdcmsgcoll, "Mensagens
gs_saida TYPE saida_type, "Estrutura dados de saida
gs_eqkt TYPE eqkt_type, "Inf equipamentos
gs_equi TYPE equi_type, "Inf equipamentos
gs_klah TYPE klah_type, "Cabeçalho da classe
gs_ksml TYPE ksml_type, "Caracteristicas classes
gs_class TYPE class_type. "Classes do equipamento
*----------------------------------------------------------------------
* Definição de Variáveis
*----------------------------------------------------------------------
DATA:
gc_zebrado TYPE c, "Flag impressão zebrado
*** Flag de controle para verificar se é a segunda vez que é executado
*** o programa pois o mapeamento do batchinput deverá ser diferente
*** quando o mesmo ja tiver informado o número da classe
gc_controle TYPE c. "Flag de controle

*----------------------------------------------------------------------*
* Definição de Field-Symbols
*----------------------------------------------------------------------*
FIELD-SYMBOLS:
*** Field symbol para a tebala de arquivo
<fs_arquivo> TYPE alsmex_tabline.
*----------------------------------------------------------------------
* Definição da Tela de Seleções
*----------------------------------------------------------------------
SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE text-001.
PARAMETERS: p_path TYPE localfile OBLIGATORY. "Local arquivo excel
SELECTION-SCREEN END OF BLOCK b1.
*----------------------------------------------------------------------
* AT SELECTION-SCREEN
*----------------------------------------------------------------------
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_path.
* Localizar arquivo de entrada
PERFORM zf_busca_arquivo_entrada.
*----------------------------------------------------------------------
* Evento: Start-of-Selection
*----------------------------------------------------------------------
START-OF-SELECTION.
*** Inicializa variáveis
PERFORM zf_init_var.
*** Busca Dados - Pega as informações da planilha do excel
PERFORM zf_busca_dados.
*** Formata os dados selecionados no excel
PERFORM zf_processa_dados.
*----------------------------------------------------------------------
* Evento: End-of-Selection
*----------------------------------------------------------------------
END-OF-SELECTION.
*** Verifica se possui dados para exibir
IF gw_saida[] IS INITIAL.
MESSAGE i006(zlpm01) WITH text-e03 ."Erro de inconsistência
ELSE.
*** Exibição do status dos equipamentos
PERFORM zf_lista_equip.
ENDIF.
*&---------------------------------------------------------------------*
*& Form zf_busca_arquivo_entrada
*&---------------------------------------------------------------------*
* Help para buscar arquivo de um diretório
*----------------------------------------------------------------------*
FORM zf_busca_arquivo_entrada.
*** Declaração das variáveis utilizadas no perform
DATA:
lw_file_table TYPE filetable, "Tabela nome do Arquivo
ls_file_name TYPE LINE OF filetable,"Estrutura nome do Arquivo
li_rc TYPE i, "Número de arquivos ou -1 se erro
li_user_action TYPE i, "Usuario
ls_windows_title TYPE string. "Título da Janela
*** Exibe Pop Up 'Abrir Arquivo'
CALL METHOD cl_gui_frontend_services=>file_open_dialog
EXPORTING
window_title = ls_windows_title
default_filename = c_filename
file_filter = c_filter
CHANGING
file_table = lw_file_table
rc = li_rc
user_action = li_user_action
EXCEPTIONS
file_open_dialog_failed = 1
cntl_error = 2
error_no_gui = 3
not_supported_by_gui = 4
OTHERS = 5.
*** Verificar se ocorreu erro
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
*** Adiciona o nome do arquivo no campo
IF li_user_action <> cl_gui_frontend_services=>action_cancel.
READ TABLE lw_file_table INTO ls_file_name INDEX 1.
IF sy-subrc IS INITIAL.
p_path = ls_file_name.
ENDIF.
ENDIF.
ENDFORM. " zf_busca_arquivo_entrada
*&---------------------------------------------------------------------*
*& Form ZF_INIT_VAR
*&---------------------------------------------------------------------*
* Inicializa as variavies
*----------------------------------------------------------------------*
FORM zf_init_var .
*** Limpa as tabelas
REFRESH:
gw_caract_equip, "Tabela de equipamentos
gw_equi, "Tabela com inf dos equipamentos
gw_arquivo, "Tabela com dados do excel
gw_bdcdata, "Tabela para o batchinput
gw_messtab, "Tabela de mensagens
gw_saida, "Tabela de saida
gw_eqkt, "Tabela com inf dos equipamentos
gw_eqkt, "Tabela de equipamentos
gw_klah, "Tabela cabeçalho da classe
gw_ksml, "Caracteristicas para classes
gw_cabn, "Característica
gw_class. "classes do equipamento
*** Limpa as workareas e demais variantes
CLEAR:
gs_caract_equip, "Equipamentos
gs_bdcdata, "BatchInput
gs_messtab, "Mensagens
gs_saida, "Estrutura dados de saida
gs_eqkt, "Inf equipamentos
gs_equi, "Inf equipamentos
gs_klah, "Cabeçalho da classe
gs_ksml, "Caracteristicas classes
gs_class, "Classes do equipamento
gc_zebrado. "Flag impressão zebrado
ENDFORM. " ZF_INIT_VAR
*&---------------------------------------------------------------------*
*& Form ZF_BUSCA_DADOS
*&---------------------------------------------------------------------*
* Seleciona os dados nas diversas tabelas
*----------------------------------------------------------------------*
FORM zf_busca_dados .
*** Seleciona os dados da planilha do excel
PERFORM zf_seleciona_excel.
*** Preenche a tabela interna com os dados da planilha
PERFORM zf_preenche_planilha.
*** Seleciona as informações dos equipamentos
PERFORM zf_seleciona_inf_equip.
*** Seleciona caracteristicas da classe
PERFORM zf_seleciona_caract.
ENDFORM. " ZF_BUSCA_DADOS
*&---------------------------------------------------------------------*
*& Form ZF_SELECIONA_EXCEL
*&---------------------------------------------------------------------*
* Seleciona os dados do arquivo excel
*----------------------------------------------------------------------*
FORM zf_seleciona_excel .
*** Declaração das variaveis
DATA:
lc_arq1 TYPE rlgrap-filename. "Nome do aquivo
*** Atribuição do nome do arquivo
lc_arq1 = p_path.
*** Upload do arquivo XLS.
CALL FUNCTION 'ALSM_EXCEL_TO_INTERNAL_TABLE'
EXPORTING
filename = lc_arq1
i_begin_col = 1
i_begin_row = 3
i_end_col = 35
i_end_row = 65536
TABLES
intern = gw_arquivo
EXCEPTIONS
inconsistent_parameters = 1
upload_ole = 2
OTHERS = 3.
*** Erro Ao carregar o arquivo.
IF sy-subrc <> 0.
MESSAGE i000(zlpm01) WITH text-e01 ."Erro ao carregar arquivo
LEAVE LIST-PROCESSING.
ENDIF.
*** Arquivo não encontrado
IF gw_arquivo[] IS INITIAL.
MESSAGE i000(zlpm01) WITH text-e02 ."Arquivo não contem registros
LEAVE LIST-PROCESSING.
ENDIF.
ENDFORM. " ZF_SELECIONA_EXCEL
*&---------------------------------------------------------------------*
*& Form ZF_PREENCHE_PLANILHA
*&---------------------------------------------------------------------*
* Preenche a tabela interna com os dados da planilha
*----------------------------------------------------------------------*
FORM zf_preenche_planilha .
*** Declaração de variáveis utilizadas no perform
DATA: lc_campo TYPE char30, "Nome do cmapo na tela do Batchinput
ln_tabix(2) TYPE n. "Contador indice
*** Field-symbols utilizadao para receber os dados da planilha
FIELD-SYMBOLS: <fs> TYPE ANY.
*** Ordena arquivo
SORT gw_arquivo BY row col.
*** Move arquivo para uma tabela interna.
LOOP AT gw_arquivo ASSIGNING <fs_arquivo>.
*** Verfica qual coluna para adicionar na tabela interna
CASE <fs_arquivo>-col.
WHEN c_case1.
gs_caract_equip-cod_elektro = <fs_arquivo>-value.
WHEN c_case2.
gs_caract_equip-fabricante = <fs_arquivo>-value.
WHEN c_case3.
gs_caract_equip-modelo = <fs_arquivo>-value.
WHEN c_case4.
gs_caract_equip-n_serie_fabr = <fs_arquivo>-value.
WHEN c_case5.
gs_caract_equip-data_fabr = <fs_arquivo>-value.
WHEN c_case6.
gs_caract_equip-data_ini_garantia = <fs_arquivo>-value.
WHEN c_case7.
gs_caract_equip-data_fim_garantia = <fs_arquivo>-value.
WHEN c_case8.
gs_caract_equip-classe = <fs_arquivo>-value.
gs_class-class = <fs_arquivo>-value.
ENDCASE.
*** Verifica se faz parte das colunas não fixas da tabela
IF <fs_arquivo>-col > 8.
ln_tabix = <fs_arquivo>-col - 8.
*** Concatena o indice com o nome do campo para o field-symbol
CONCATENATE c_gs_caract ln_tabix INTO lc_campo.
ASSIGN (lc_campo) TO <fs>.
IF sy-subrc EQ 0.
*** Atribui o valor da planilha no campo
*** correspondente da tabela interna
<fs> = <fs_arquivo>-value.
ENDIF.
ENDIF.
*** Para cada linha da tabela
AT END OF row.
*** Adiciona a linha na tabela
APPEND gs_caract_equip TO gw_caract_equip.
APPEND gs_class TO gw_class.
*** Limpa as variáveis utilizadas
CLEAR:
gs_caract_equip,
gs_class.
ENDAT.
ENDLOOP.
ENDFORM. " ZF_PREENCHE_PLANILHA
*&---------------------------------------------------------------------*
*& Form ZF_SELECIONA_INF_EQUIP
*&---------------------------------------------------------------------*
* Seleciona as informações dos equipamentos
*----------------------------------------------------------------------*
FORM zf_seleciona_inf_equip .
*** verifica se a planilha esta preenchida
IF NOT gw_caract_equip[] IS INITIAL.
*** Seleciona todos os equip que devem ser criado o ponto de medição
SELECT a~equnr
b~eqtyp
b~eqart
b~mptyp
b~psort
b~indct
b~pttxt
b~atnam
b~pyeac
INTO TABLE gw_equi
FROM equi AS a
INNER JOIN ztbpm0004 AS b
ON a~eqtyp = b~eqtyp
AND a~eqart = b~eqart
FOR ALL ENTRIES IN gw_caract_equip
WHERE a~equnr = gw_caract_equip-cod_elektro.
*** Verifica se ocorreu erro na seleção
IF sy-subrc EQ 0.
SORT gw_equi BY equnr eqtyp eqart ASCENDING.
ELSE.
REFRESH gw_equi.
ENDIF.
*** Seleciona informações dos equipamentos
SELECT a~equnr
a~eqktx
b~eqart
b~objnr
FROM eqkt AS a
INNER JOIN equi AS b
ON a~equnr = b~equnr
INTO TABLE gw_eqkt
FOR ALL ENTRIES IN gw_caract_equip
WHERE a~equnr = gw_caract_equip-cod_elektro
AND a~spras = sy-langu.
*** Verifica se ocorreu erro
IF sy-subrc EQ 0.
SORT gw_eqkt BY equnr eqktx objnr ASCENDING.
ELSE.
REFRESH gw_eqkt.
ENDIF.
ENDIF.
ENDFORM. " ZF_SELECIONA_INF_EQUIP
*&---------------------------------------------------------------------*
*& Form ZF_SELECIONA_CARACT
*&---------------------------------------------------------------------*
* Seleciona todas as caracteristicas de uma determinada classe
*----------------------------------------------------------------------*
FORM zf_seleciona_caract .
*** Organiza a tabela de classe
SORT gw_class ASCENDING BY class .
*** Deleta os registros duplicados
DELETE ADJACENT DUPLICATES FROM gw_class.
*** Verifica se a tabela está vazia
IF NOT gw_class[] IS INITIAL.
* Seleciona dados do cabeçalho de classe
SELECT clint klart class
INTO TABLE gw_klah
FROM klah
FOR ALL ENTRIES IN gw_class
WHERE klart = c_classe_equip
AND class = gw_class-class.
*** Verifica se encontrou registro
IF sy-subrc EQ 0.
*** Organiza a tabela de cabeçalho da classe
SORT gw_klah ASCENDING BY clint klart.
* Seleciona características para classes
SELECT clint posnr adzhl imerk klart
INTO TABLE gw_ksml
FROM ksml
FOR ALL ENTRIES IN gw_klah
WHERE clint = gw_klah-clint AND
klart = gw_klah-klart.
*** Organiza os dados da tabela características para classes
SORT gw_ksml ASCENDING BY imerk.
*** Verifica se a tabela está vazia
IF NOT gw_ksml[] IS INITIAL.
*** Seleciona as caracteristicas
SELECT atinn adzhl atnam
INTO TABLE gw_cabn
FROM cabn
FOR ALL ENTRIES IN gw_ksml
WHERE atinn = gw_ksml-imerk
AND adzhl = gw_ksml-adzhl.
ENDIF.
ENDIF.
ENDIF.
ENDFORM. " ZF_SELECIONA_CARACT
*&---------------------------------------------------------------------*
*& Form ZF_PROCESSA_DADOS
*&---------------------------------------------------------------------*
* Executa o processamento dos dados
*----------------------------------------------------------------------*
FORM zf_processa_dados .
*** Declaração de variáveis utilizadas neste perform
DATA:
ln_status TYPE char01. "Status do equipamento
*** Processa todos os registros dando um loop nos equipamentos
LOOP AT gw_caract_equip INTO gs_caract_equip.
*** Verifica status do equipamento
PERFORM zf_consiste_status CHANGING ln_status.
IF ln_status EQ c_sim.
*** Faz o mapeamento do batcinput
PERFORM zf_mapeia_batchinput.
*** Chama o batcinput
PERFORM zf_chama_batchinput.
ELSE.
*** Atribuição dos valores a serem exibidos na tabela de saida
gs_saida-equnr = gs_caract_equip-cod_elektro.
gs_saida-eqktx = gs_eqkt-eqktx.
gs_saida-msgtyp = c_erro.
gs_saida-msg = text-e06.
APPEND gs_saida TO gw_saida.
ENDIF.
*** Limpa a workarea
CLEAR gs_caract_equip.
ENDLOOP.
ENDFORM. " ZF_PROCESSA_DADOS
*&---------------------------------------------------------------------*
*& Form ZF_MAPEIA_BATCHINPUT
*&---------------------------------------------------------------------*
* Faz o mapeamento dos dados do batchinput para transação IE02
*----------------------------------------------------------------------*
FORM zf_mapeia_batchinput .
*** Declaração das variavies utilizadas neste perform
DATA:
ln_baujj TYPE itob-baujj, "Ano de construção
ln_baumm TYPE itob-baumm, "Mês da construção
lc_shtxt TYPE itob-shtxt, "Denominação do objeto técnico
lc_eqart TYPE equi-eqart, "Tipo do objeto técnico
lc_pyeac TYPE ztbpm0004-pyeac. "Atividade anual
*** Limpa tabelas e estruturas utilizadas no batchinput
REFRESH:
gw_bdcdata.
*** Limpa tabelas e estruturas utilizadas no batchinput
CLEAR:
gs_bdcdata.
*** Atribuição do mes e do ano
ln_baujj = gs_caract_equip-data_fabr(4).
ln_baumm = gs_caract_equip-data_fabr+4(2).
*** Seleciona as informações dos equipamentos
READ TABLE gw_eqkt
INTO gs_eqkt
WITH KEY equnr = gs_caract_equip-cod_elektro
BINARY SEARCH.
*** Verifica se encontrou registros
IF sy-subrc EQ 0.
*** Atribui a descrição do equipamento
lc_shtxt = gs_eqkt-eqktx.
lc_eqart = gs_eqkt-eqart.
ELSE.
*** Limpa a variavel da descrição
CLEAR lc_shtxt.
ENDIF.
*** Mapeamento do batchinput
PERFORM zf_bdc_dynpro USING:
'SAPMIEQ0' c_0100.
PERFORM zf_bdc_field USING:
'BDC_CURSOR' c_rm63e_equnr,
'BDC_OKCODE' c_00,
'RM63E-EQUNR' gs_caract_equip-cod_elektro.
PERFORM zf_bdc_dynpro USING:
'SAPMIEQ0' c_0101.
PERFORM zf_bdc_field USING:
'BDC_OKCODE' c_t06,
'BDC_CURSOR' c_itob_serge,
'ITOB-HERST' gs_caract_equip-fabricante,
'ITOB-TYPBZ' gs_caract_equip-modelo,
'ITOB-BAUJJ' ln_baujj,
'ITOB-BAUMM' ln_baumm,
'ITOB-SERGE' gs_caract_equip-n_serie_fabr,
'ITOB-SHTXT' lc_shtxt,
'ITOB-EQART' lc_eqart.
PERFORM zf_bdc_dynpro USING:
'SAPMIEQ0' c_0101.
PERFORM zf_bdc_field USING:
'BDC_OKCODE' c_kl,
'BDC_CURSOR' c_wcheck,
'WCHECK_V_H-GWLDT_I' gs_caract_equip-data_ini_garantia,
'WCHECK_V_H-GWLEN_I' gs_caract_equip-data_fim_garantia,
'WCHECK_V_H-WAGET_I' c_sim,
'WCHECK_V_H-GAERB_I' c_sim.
IF gc_controle IS INITIAL.
*** Tela de seleção do tipo da classe
PERFORM zf_bdc_dynpro USING:
'SAPMSSY0' c_0120.
PERFORM zf_bdc_field USING:
'BDC_OKCODE' c_pick,
'BDC_CURSOR' c_04_27,
'RMCLF-KLART' c_002.
ENDIF.
PERFORM zf_bdc_dynpro USING:
'SAPLCLFM' c_1101.
PERFORM zf_bdc_field USING:
'BDC_OKCODE' c_00,
'BDC_CURSOR' c_rmclf_class,
'RMCLF-CLASS(01)' gs_caract_equip-classe,
'BDC_SUBSCR' c_saplcbcm.
PERFORM zf_bdc_dynpro USING:
'SAPLCLFM' c_1101.
PERFORM zf_bdc_field USING:
'BDC_OKCODE' c_00.
*** Mapeamento das caracteristicsa
PERFORM zf_mapeia_caract.
PERFORM zf_bdc_dynpro USING:
'SAPLCLFM' c_1101.
PERFORM zf_bdc_field USING:
'BDC_OKCODE' c_wei1.
PERFORM zf_bdc_dynpro USING:
'SAPMIEQ0' c_0101.
PERFORM zf_bdc_field USING:
'BDC_OKCODE' c_su,
'WCHECK_V_H-GWLDT_I' gs_caract_equip-data_ini_garantia,
'WCHECK_V_H-GWLEN_I' gs_caract_equip-data_fim_garantia,
'WCHECK_V_H-WAGET_I' c_sim,
'WCHECK_V_H-GAERB_I' c_sim,
'BDC_CURSOR' c_itob_shtxt,
'ITOB-SHTXT' lc_shtxt.
*** Muda o status
PERFORM zf_bdc_dynpro USING:
'SAPLBSVA' c_0300.
PERFORM zf_bdc_field USING:
'BDC_OKCODE' c_back,
'BDC_CURSOR' 'J_STMAINT-ANWS(02)',
'J_STMAINT-ANWS(02)' c_sim.
*** Leitura nos equipamentos que é para criar ponto de medição
READ TABLE gw_equi
INTO gs_equi
WITH KEY equnr = gs_caract_equip-cod_elektro.
*** Verifica se é para criar ponto de medição
IF sy-subrc EQ 0.
lc_pyeac = gs_equi-pyeac.
REPLACE '.' IN lc_pyeac WITH ''.
PERFORM zf_bdc_dynpro USING:
'SAPMIEQ0' c_0101.
PERFORM zf_bdc_field USING:
'BDC_OKCODE' c_mepo,
'WCHECK_V_H-GWLDT_I' gs_caract_equip-data_ini_garantia,
'WCHECK_V_H-GWLEN_I' gs_caract_equip-data_fim_garantia,
'WCHECK_V_H-WAGET_I' c_sim,
'WCHECK_V_H-GAERB_I' c_sim,
'BDC_CURSOR' c_itob_shtxt,
'ITOB-SHTXT' lc_shtxt.
PERFORM zf_bdc_dynpro USING:
'SAPLIMR0' c_4110.
PERFORM zf_bdc_field USING:
'BDC_CURSOR' c_impt_indct,
'BDC_OKCODE' c_00,
'IMPT-ATNAM(01)' gs_equi-atnam,
'IMPT-PTTXT(01)' gs_equi-pttxt,
'IMPT-INDCT(01)' gs_equi-indct.
PERFORM zf_bdc_dynpro USING:
'SAPLIMR0' c_4110.
PERFORM zf_bdc_field USING:
'BDC_CURSOR' c_rimr0_flgsl,
'BDC_OKCODE' c_gdpt,
'RIMR0-FLGSL(01)' c_sim.
PERFORM zf_bdc_dynpro USING:
'SAPLIMR0' c_5110.
PERFORM zf_bdc_field USING:
'BDC_CURSOR' c_rimro_pyeac,
'BDC_OKCODE' c_00,
'IMPT-PTTXT' gs_equi-pttxt,
'IMPT-ATNAM' gs_equi-atnam,
'IMPT-INDCT' gs_equi-indct,
'IMPT-DECIM' c_2,
'RIMR0-PYEAC' lc_pyeac.
PERFORM zf_bdc_dynpro USING:
'SAPLIMR0' c_5110.
PERFORM zf_bdc_field USING:
'BDC_OKCODE' c_erw.
PERFORM zf_bdc_dynpro USING:
'SAPLIMR0' c_4110.
PERFORM zf_bdc_field USING:
'BDC_OKCODE' c_erw,
'BDC_CURSOR' c_rimr0_flgsl.
ENDIF.
*** Salva as alterações do equipamento
PERFORM zf_bdc_dynpro USING:
'SAPMIEQ0' c_0101.
PERFORM zf_bdc_field USING:
'BDC_OKCODE' c_bu,
'WCHECK_V_H-GWLDT_I' gs_caract_equip-data_ini_garantia,
'WCHECK_V_H-GWLEN_I' gs_caract_equip-data_fim_garantia,
'WCHECK_V_H-WAGET_I' c_sim,
'WCHECK_V_H-GAERB_I' c_sim,
'BDC_CURSOR' c_itob_shtxt,
'ITOB-SHTXT' lc_shtxt.
ENDFORM. " ZF_MAPEIA_BATCHINPUT
*&---------------------------------------------------------------------*
*& Form ZF_BDC_DYNPRO
*&---------------------------------------------------------------------*
* Utilizado p/ carga dos dados utilizados para execução do
* Batch Input - programa / tela
*----------------------------------------------------------------------*
* -->p_program Programa que simula o Batch Input
* -->p_tela Tela que simula o Batch Input
*----------------------------------------------------------------------*
FORM zf_bdc_dynpro USING value(p_program) TYPE any
value(p_dynpro) TYPE any.
*** Atribui os campos e valores na tabela do batchinput
CLEAR gs_bdcdata.
gs_bdcdata-program = p_program.
gs_bdcdata-dynpro = p_dynpro.
gs_bdcdata-dynbegin = c_sim.
*** Insere o registro
APPEND gs_bdcdata TO gw_bdcdata.
ENDFORM. " ZF_BDC_DYNPRO
*&---------------------------------------------------------------------*
*& Form ZF_BDC_FIELD
*&---------------------------------------------------------------------*
* Utilizado p/ carga dos valores utilizados no Batch Input
*----------------------------------------------------------------------*
* -->p_campo Campo que receberá o valor durante o Batch Input
* -->p_valor Valor que será atribuído ao campo no Batch Input
*----------------------------------------------------------------------*
FORM zf_bdc_field USING value(p_campo) TYPE any
value(p_valor) TYPE any.
*** Atribui os campos e valores na tabela do batchinput
CLEAR gs_bdcdata.
gs_bdcdata-fnam = p_campo.
gs_bdcdata-fval = p_valor.
*** Insere o registro
APPEND gs_bdcdata TO gw_bdcdata.
ENDFORM. " ZF_BDC_FIELD
*&---------------------------------------------------------------------*
*& Form ZF_MAPEIA_CARACT
*&---------------------------------------------------------------------*
* Mapeia as caracteristicas encontradas
*----------------------------------------------------------------------*
FORM zf_mapeia_caract .
*** Declaração de variáveis utilizdas neste perform
DATA:
lc_campo1 TYPE char30, "Campo 1
lc_campo2 TYPE char30, "Campo 2
ln_tabix(2) TYPE n, "Contador
ln_aux(2) TYPE n, "Contador
ln_tab(2) TYPE n. "Contador
*** Declaração de field-symbols
FIELD-SYMBOLS: <fs_tab> TYPE ANY. "Tabela 3
*** Inicializa os contadores
ln_tabix = 1.
ln_tab = 1.
*** ordena os campos da tabela de dados da classes
SORT gw_ksml ASCENDING BY clint posnr adzhl imerk klart.
*** Leitura na tabela de classes
READ TABLE gw_klah INTO gs_klah
WITH KEY class = gs_caract_equip-classe.
IF sy-subrc EQ 0.
*** Loop na tabela de de classes
LOOP AT gw_ksml
INTO gs_ksml
WHERE clint = gs_klah-clint
AND klart = gs_klah-klart.
*** Seleciona a caracteristica
READ TABLE gw_cabn
WITH KEY atinn = gs_ksml-imerk
adzhl = gs_ksml-adzhl
TRANSPORTING NO FIELDS.
*** Verifica se encontrou regsitro
IF sy-subrc EQ 0.
*** Verifica se é para pular para a proxima pagina
ln_aux = ln_tabix MOD 10.
*** Verfica se é multiplo de 10 para pular para a proxima pagina
IF ln_aux EQ 0.
*** Atribui o mapeamento do PageDown
PERFORM zf_bdc_dynpro USING:
'SAPLCLFM' c_1101.
PERFORM zf_bdc_field USING:
'BDC_OKCODE' c_page_down.
*** Atribui o mapeamento do ENTER para os campos da tela
PERFORM zf_bdc_dynpro USING:
'SAPLCLFM' c_1101.
PERFORM zf_bdc_field USING:
'BDC_OKCODE' c_00.
*** Organiza o número da caracteristica
ln_tab = ln_tab - 9.
ENDIF.
*** Concatena o nome do campo
CONCATENATE c_rctms_mwert
ln_tab
c_fecha
INTO lc_campo1.
*** Concatena o nome do campo
CONCATENATE c_gs_caract
ln_tabix
INTO lc_campo2.
*** Pega os valores dos campos
ASSIGN (lc_campo2) TO <fs_tab>.
*** Veririca se executou o assign
IF sy-subrc EQ 0.
*** Mapeia os campos
PERFORM zf_bdc_field USING:
lc_campo1 <fs_tab>.
ENDIF.
*** Incrementa o contador
ln_tabix = ln_tabix + 1.
ln_tab = ln_tab + 1.
ENDIF.
ENDLOOP.
ENDIF.
ENDFORM. " ZF_MAPEIA_CARACT
*&---------------------------------------------------------------------*
*& Form ZF_CHAMA_BATCHINPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM zf_chama_batchinput .
*** Declaração da variáveis utilizadas neste perform
DATA:
ls_ctuparams TYPE ctu_params, "Parâm. para call transaction
ln_msg_return(80) TYPE c, "Variable with a message error.
lc_ok TYPE c.
*** Limpa parametros do batchinput
CLEAR:
ls_ctuparams,
gs_saida,
gs_messtab,
lc_ok.
REFRESH:
gw_messtab.
*** verifica se é para executar background ou foreing ground
ls_ctuparams-dismode = c_background.
*** Atribuição dos parametros batchinput
ls_ctuparams-updmode = c_sucesso.
ls_ctuparams-cattmode = space.
ls_ctuparams-defsize = c_sim.
ls_ctuparams-nobinpt = c_sim.
*** Atribuição dos valores a serem exibidos na tabela de saida
gs_saida-equnr = gs_caract_equip-cod_elektro.
gs_saida-eqktx = gs_eqkt-eqktx.
*** Chama a trasanção IE02 - Para alterar o equipamento
CALL TRANSACTION c_tcode USING gw_bdcdata
OPTIONS FROM ls_ctuparams
MESSAGES INTO gw_messtab.
*** Verifica se o batchinput ocorreu erro devido a tela de
*** sintese de classificação
READ TABLE gw_messtab
WITH KEY msgnr = c_msg_erro_tela
dynumb = c_1101
TRANSPORTING NO FIELDS.
*** Verifica se encontrou o registro
IF sy-subrc EQ 0 AND gc_controle IS INITIAL.
*** Seta o flag de controle como sim para não
*** executar novamente este procedimento
gc_controle = c_sim.
*** Deleta o mapeamento referente a sintese da classe
DELETE gw_bdcdata INDEX 25.
DELETE gw_bdcdata INDEX 24.
DELETE gw_bdcdata INDEX 23.
DELETE gw_bdcdata INDEX 22.
*** Limpa tabela de menssagens
REFRESH gw_messtab.
*** Chama a transação sem o mapeamento da sintese de classe
CALL TRANSACTION c_tcode USING gw_bdcdata
OPTIONS FROM ls_ctuparams
MESSAGES INTO gw_messtab.
ENDIF.
*** Verifica se ocorreu algum erro
* IF sy-subrc <> 0.
LOOP AT gw_messtab INTO gs_messtab
WHERE msgtyp = c_erro
OR msgtyp = c_warning
OR ( msgtyp = c_sucesso
AND msgnr = c_msg_ok ).
PERFORM zf_busca_mensagem USING gs_messtab-tcode
gs_messtab-msgid
gs_messtab-msgnr
gs_messtab-msgv1
gs_messtab-msgv2
gs_messtab-msgv3
gs_messtab-msgv4
CHANGING ln_msg_return.
*** Atribui as mensagens na tabela de saida
gs_saida-msgtyp = gs_messtab-msgtyp.
gs_saida-msg = ln_msg_return.
APPEND gs_saida TO gw_saida.
*** Flag de controle das msg de retorno
lc_ok = 'X'.
ENDLOOP.
*** Verifica se foi salvo alguma msg de retorno na tb de saida
IF lc_ok IS INITIAL.
gs_saida-msgtyp = c_erro.
gs_saida-msg = text-e08.
APPEND gs_saida TO gw_saida.
ENDIF.
ENDFORM. " ZF_CHAMA_BATCHINPUT
*&---------------------------------------------------------------------*
*& Form ZF_BUSCA_MENSAGEM
*&---------------------------------------------------------------------*
* Busca a mensagem standard retornada pelo call transaction
* formatando-a da maneira correta.
*----------------------------------------------------------------------*
* -->P_TCODE Código da transação
* -->P_ID Código da mensagem
* -->P_MSG_NO Número da mensagem
* -->P_MSG1 Mensagem Parte 1
* -->P_MSG2 Mensagem Parte 2
* -->P_MSG3 Mensagem Parte 3
* -->P_MSG4 Mensagem Parte 4
* <--p_msg_return Mensagem de retorno preparada
*----------------------------------------------------------------------*
FORM zf_busca_mensagem USING value(p_tcode) TYPE any
value(p_id) TYPE any
value(p_msg_no) TYPE any
value(p_msg1) TYPE any
value(p_msg2) TYPE any
value(p_msg3) TYPE any
value(p_msg4) TYPE any
CHANGING
value(p_msg_return) TYPE any.
*** Declaração das variáveis utilizadas neste perform
DATA:
ln_msg_error TYPE shkontext-meldung.
"Aux. p/ buscar msg de erro
*** Limpesa das variáveis
CLEAR:
ln_msg_error,
p_msg_return.
*** Chama Função para preparar mensagem de erro
CALL FUNCTION 'MESSAGE_PREPARE'
EXPORTING
language = sy-langu
msg_id = p_id
msg_no = p_msg_no
msg_var1 = p_msg1(50)
msg_var2 = p_msg2(50)
msg_var3 = p_msg3(50)
msg_var4 = p_msg4(50)
IMPORTING
msg_text = ln_msg_error
EXCEPTIONS
function_not_completed = 1
message_not_found = 2
OTHERS = 3.
*** Verifica SUBRC e formata mensagem de erro
IF sy-subrc = 0.
CONDENSE p_tcode.
CONCATENATE p_tcode '-' ln_msg_error INTO p_msg_return.
ELSE.
p_msg_return = text-e04.
ENDIF.
ENDFORM. "zf_busca_mensagem
*&---------------------------------------------------------------------*
*& Form ZF_CONSISTE_STATUS
*&---------------------------------------------------------------------*
* Consiste o status para verificar se o equipamento pode ser
* Processado
*----------------------------------------------------------------------*
FORM zf_consiste_status CHANGING p_status TYPE char01.
*** Declaração das variaveis utilizadas no programa
DATA:
lw_jstat TYPE TABLE OF jstat.
*** Limpesa das variaveis
REFRESH lw_jstat.
CLEAR:
p_status.
*** Seleciona o objnr da tabela de equipamentos
READ TABLE gw_eqkt
INTO gs_eqkt
WITH KEY equnr = gs_caract_equip-cod_elektro
BINARY SEARCH.
*** Verifica se encontrou registro
IF sy-subrc EQ 0.
*** Busca o status do equipamento
CALL FUNCTION 'STATUS_READ'
EXPORTING
objnr = gs_eqkt-objnr
only_active = c_sim
TABLES
status = lw_jstat
EXCEPTIONS
object_not_found = 1
OTHERS = 2.
*** Veririca se encontrou
IF sy-subrc IS INITIAL.
READ TABLE lw_jstat
WITH KEY stat = c_status_fabr
TRANSPORTING NO FIELDS.
*** Veririca se encontrou registro
IF sy-subrc EQ 0.
*** Atribui o flag no status
p_status = c_sim.
ENDIF.
ENDIF.
ENDIF.
ENDFORM. " ZF_CONSISTE_STATUS
*&--------------------------------------------------------------------*
*& Form ZF_LISTA_EQUIP
*&--------------------------------------------------------------------*
* Lista os equipamentos atualizados
*---------------------------------------------------------------------*
FORM zf_lista_equip.
*** Deleta os regsitros duplicados
SORT gw_saida BY equnr ASCENDING.
*** deleta os registros duplicados
DELETE ADJACENT DUPLICATES FROM gw_saida.
*** Imprime títulos do cabeçalho
FORMAT COLOR COL_HEADING.
WRITE: / sy-vline,
text-002," CENTERED,
22 sy-vline,
text-003," CENTERED,
65 sy-vline,
text-005," CENTERED,
AT sy-linsz sy-vline.
NEW-LINE.
ULINE.
*** Loop na tabela de saida
LOOP AT gw_saida INTO gs_saida.
*** Imprime os dados das NF geradas
PERFORM zf_imprime_zebrado.
ENDLOOP.
NEW-LINE.
ULINE.
ENDFORM. " ZF_LISTA_DOC
*&---------------------------------------------------------------------*
*& Form ZF_IMPRIME_ZEBRADO
*&---------------------------------------------------------------------*
* Impreme os dados da tabela de saída zebrado
*----------------------------------------------------------------------*
FORM zf_imprime_zebrado .
*** Verifica se é para colocar a cor forte
IF gc_zebrado IS INITIAL.
*** Verifica qual tipo da msg para colorir
CASE gs_saida-msgtyp.
WHEN c_sucesso.
FORMAT COLOR COL_POSITIVE INTENSIFIED ON.
WHEN c_warning.
FORMAT COLOR COL_TOTAL INTENSIFIED ON.
WHEN c_erro.
FORMAT COLOR COL_NEGATIVE INTENSIFIED ON.
ENDCASE.
gc_zebrado = c_sim.
ELSE.
*** Verifica qual tipo da msg para colorir
CASE gs_saida-msgtyp.
WHEN c_sucesso.
FORMAT COLOR COL_POSITIVE INTENSIFIED OFF.
WHEN c_warning.
FORMAT COLOR COL_TOTAL INTENSIFIED OFF.
WHEN c_erro.
FORMAT COLOR COL_NEGATIVE INTENSIFIED OFF.
ENDCASE.
***Limpa a variável para fazer a zebra
CLEAR gc_zebrado.
ENDIF.
*** Imprime os dados na tela
WRITE: / sy-vline,
gs_saida-equnr,
sy-vline,
gs_saida-eqktx,
sy-vline,
gs_saida-msg(70),
AT sy-linsz sy-vline.
ENDFORM. " ZF_IMPRIME_ZEBRADO

Potrebbero piacerti anche