terça-feira, 26 de abril de 2011

Batch Input - Básico

  "  Vamos agora tentar explicar um Batch Input, sabe quando tem aquele
" funcionário que tem um monte de dados dentro de um arquivo externo como
" um arquivo .xls ou .txt ou qualquer outro formato fora do SAP e este
" funcinário fala que os dados estão dentro de um arquivo e que pra
" cadastrar todos dentro da SAP demoraria dias, nessa hora o funcional
" escuta em sua mente sombria a palavra BATCH INPUT, a primeira coisa
" que o funcional fala é organize todos os dados em um único arquivo
" pulando uma linha por registro e separando os dados por ';' ou 'Space'
" recomendo ';' pois as vezes contem dados com espaço dentro e isso pode
" atrapalhar o processo de Input no Sistema.
"  Crie um arquivo que servirá como entrada de dados com as informações:

" 8000000001;nome teste1;rua teste1;São Paulo1;12345671
" 8000000002;nome teste2;rua teste2;São Paulo2;12345672

"  Lembrando que a ordem é muito importante pois eh gravado na ordem.

"  Tem um outro arquivo muito importante tb, o famoso SHDB contendo o
" mapeamento do processo por este arquivo vc consegue ver quais são os
" dados necessários para realizar com sucesso o processo qualque dúvida
" http://abapjuniores.blogspot.com/2011/04/shdb-basico.html.
"  Segue abaixo um programa comentado básico para um batch imput funciona.

*&---------------------------------------------------------------------*
REPORT zmj_batch.


" Tipos ....
TYPES:
" Dados que serão informados pelo arquivo.
  BEGIN OF ty_arqui,
    cliente TYPE rf02d-kunnr,        " Código do Cliente
    nome    TYPE kna1-name1,         " Nome do cliente
    rua     TYPE kna1-stras,         " Rua do cliente
    end     TYPE kna1-ort01,         " Endereço do cliente
    tel     TYPE kna1-telf1,         " telefone do cliente
  END OF ty_arqui,

" Batch input nova estrutura do campo de tabela
  BEGIN OF ty_bdcdata,
    program   TYPE bdcdata-program,  " Pool de módulos BDC
    dynpro    TYPE bdcdata-dynpro,   " NÚmero de tela BDC
    dynbegin  TYPE bdcdata-dynbegin, " Início BDC de uma tela
    fnam      TYPE bdcdata-fnam,     " Nome do campo
    fval      TYPE bdcdata-fval,     " Valor do campo BDC
  END OF ty_bdcdata,

" Relação informativa do log
  BEGIN OF ty_message,
    cliente TYPE rf02d-kunnr,        " Código do cliente
    msgty   TYPE message-msgty,      " Tipo da mensagem
    msgno   TYPE message-msgno,      " Numero da mensagem
    msgtx   TYPE message-msgtx,      " Descrição da mensagem
  END OF   ty_message
    .

" Tabelas Internas ....
DATA: it_arqui    TYPE TABLE OF ty_arqui,
      it_bdcdata  TYPE TABLE OF ty_bdcdata,
      it_msg      TYPE TABLE OF bdcmsgcoll WITH HEADER LINE,
      it_message  TYPE TABLE OF ty_message
        .
" Tabela que recebe as informações crua do arquivo que será tratado
DATA: BEGIN OF t_line OCCURS 0,
        linha(108) TYPE c,
      END OF t_line
        .

" Estruturas ...
DATA: st_arqui   TYPE ty_arqui,
      st_bdcdata TYPE ty_bdcdata,
      st_message TYPE ty_message
        .

" Variaveis ....
DATA: vg_mode(1) TYPE VALUE 'N'" informa o Modo do Call Transaction
      vg_texto(100) TYPE c,        " Texto para o Indicator
      vg_s TYPE VALUE 'S',       " Informa o Update do call Transaction
      mensg LIKE message VALUE IS INITIAL, " variavel que recebe retorno
      msgno LIKE sy-msgno
        .


" Tela de Seleção ....
" texto (
SELECTION-SCREEN BEGIN OF BLOCK WITH FRAME TITLE text-001.
PARAMETERS:    p_dest TYPE string, " Texto ( Arquivo txt: )
               p_log  TYPE string  " Texto ( Arquivo log: )
                 .
SELECTION-SCREEN END OF BLOCK a.

" Quando for requisitado um valor no 'Parameter faça ...
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_dest.
  PERFORM z_busca_arquivo.

" Quando for requisitado um valor no 'Parameter faça ...
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_log.
  PERFORM z_mostra_local.

"  Começa aki ...
START-OF-SELECTION.
  PERFORM: z_baixa_arquivo,
           z_trata_arquivo,
           z_monta_shdb,
           z_manda_arquivo
           .

*&---------------------------------------------------------------------*
*&      Form  z_busca_arquivo
*&---------------------------------------------------------------------*
  "  Pega o valor contido no parameters e add o texto '.txt' no final assim o
  " o nome do arquivo fica com a extensão desejada.
  FORM z_busca_arquivo.
  CONCATENATE p_dest '.txt' INTO p_dest.
  CALL FUNCTION 'WS_FILENAME_GET'
       EXPORTING
            def_filename = ' '
            def_path     = 'C:\'
            mask         ',Texto,*.txt,Todos,*.*.'
            mode         'O'
            title        'Arquivo de Entrada'(004)
       IMPORTING
            filename     = p_dest
       EXCEPTIONS
            OTHERS.

ENDFORM.                    " z_busca_local

*&---------------------------------------------------------------------*
*&      Form  z_mostra_local
*&---------------------------------------------------------------------*
  " Mostra o local onde será gravado o arquivo de Log.
FORM z_mostra_local .
  CALL METHOD cl_gui_frontend_services=>directory_browse
    EXPORTING
      window_title         = 'Informar o caminho para gerar o arquivo'
      initial_folder       = 'C:\'
    CHANGING
      selected_folder      = p_log
    EXCEPTIONS
      cntl_error           = 1
      error_no_gui         = 2
      not_supported_by_gui = 3
      OTHERS               4.
  " Nome do Arquivo do Log contendo o endereço+NOME1+HORA+.TXT.
  CONCATENATE  p_log '\' sy-uname '_' sy-uzeit '.TXT' INTO p_log
          .

ENDFORM.                    " Z_MOSTRA_LOCAL

*&---------------------------------------------------------------------*
*&      Form  Z_MONTA_ARQUIVO
*&---------------------------------------------------------------------*
"  Pega o arquivo externo relacionado e coloca os dados na 'T_LINE
FORM z_baixa_arquivo.
  CALL FUNCTION 'GUI_UPLOAD'
    EXPORTING
      filename = p_dest
    TABLES
      data_tab = t_line
    EXCEPTIONS
      OTHERS   17.

ENDFORM.                    " Z_MONTA_ARQUIVO

*&---------------------------------------------------------------------*
*&      Form  Z_TRATA_ARQUIVO
*&---------------------------------------------------------------------*
"  Será os dados conforme sequencia de campos e add na tabela principal
FORM z_trata_arquivo.
  LOOP AT t_line.
    " o Split quebra a linha e separa por delimitador ';' colocando cada dado
    " em cada campo sequencialmente.
    SPLIT t_line AT ';' INTO: st_arqui-cliente
                              st_arqui-nome
                              st_arqui-rua
                              st_arqui-end
                              st_arqui-tel
                              .
    " Add registro na tabela.
    APPEND st_arqui TO it_arqui.

  ENDLOOP.
ENDFORM.                    " Z_TRATA_ARQUIVO
*&---------------------------------------------------------------------*
*&      Form  z_monta_shdb
*&---------------------------------------------------------------------*
FORM z_monta_shdb.

  LOOP AT it_arqui INTO st_arqui.
    " cria uma variavel pra informar qual cliente está porcessando no
    " perform z_sapgui_progress_indicator.
    CONCATENATE 'Processando o Cliente -' st_arqui-cliente
    INTO vg_texto SEPARATED BY space.
    "  informa o processo atual
    PERFORM z_sapgui_progress_indicator USING vg_texto.
    " É aki que o bixo pega, lembra dakele arquivo SHDB que enviaram pra vc
    " é aki que ele começa a faze sentido, oq nós estamos fazendo aki e criando
    " uma tabela com as informações conforme o SHDB só mundando a informação
    " que vc quer que mude conforme o registro.
    "  Depois de terminar os performs z_preenche_bdc vc vai dar uma olhada
    " na tabela it_bdcdata pq ela vai estar igualzinha com o SHDB que
    " enviaram pra vc.
    " Crie um 'Perform pra cada tela que tiver no SHDB.
    PERFORM z_preenche_bdc USING:

      'X'    'SAPMF02D'       '0101',
      ' '    'BDC_CURSOR'     'RF02D-D0110',
      ' '    'BDC_OKCODE'     '/00',
      ' '    'RF02D-KUNNR'    st_arqui-cliente,
      ' '    'RF02D-D0110'    'X'.

    PERFORM z_preenche_bdc USING:

      'X'    'SAPMF02D'        '0110',
      ' '    'BDC_CURSOR'      'KNA1-TELF1',
      ' '    'BDC_OKCODE'      '/00',
      ' '    'KNA1-NAME1'     st_arqui-nome,
      ' '    'KNA1-STRAS'     st_arqui-rua,
      ' '    'KNA1-ORT01'     st_arqui-end,
      ' '    'KNA1-TELF1'      st_arqui-tel.

    PERFORM z_carrega_transacao.
    PERFORM z_imprime_mensagem.

    CLEAR it_bdcdata.

  ENDLOOP.
ENDFORM.                    " z_monta_shdb
*&---------------------------------------------------------------------*
*&      Form  Z_PREENCHE_BDC
*&---------------------------------------------------------------------*
"  Se Dynbegin = 'X' ele preenche as informações da tela, senão ele preenche
" o campo e o dado dela. prontio.
FORM z_preenche_bdc  USING dynbegin
                           name
                           value.
  IF dynbegin = 'X'.
    MOVE: name      TO st_bdcdata-program,
          value     TO st_bdcdata-dynpro,
          dynbegin  TO st_bdcdata-dynbegin.
    APPEND st_bdcdata TO it_bdcdata.
  ELSE.

    MOVE: name  TO st_bdcdata-fnam,
          value TO st_bdcdata-fval.
    APPEND st_bdcdata TO it_bdcdata.

  ENDIF.
"  prepara a estrutura para o Loop.
  CLEAR st_bdcdata.
ENDFORM.                    " Z_PREENCHE_BDC
*&---------------------------------------------------------------------*
*&      Form  Z_CARREGA_TRANSACAO
*&---------------------------------------------------------------------*
FORM z_carrega_transacao .
"  Chama a trasação informada usando a tabela 'IT_BDCDATA que na verdade
" é um shdb que vai automátiza o processo até o ultimo registro, existe
" dois metodos de ver o processo, no 'MODE se colocar 'N' vc não visualiza
" o processo, agora se vc coloca 'A' no 'MODE vc terá que apertar 'Enter
" por processo e depois de efetuar o processo por registro ele popula a
" tabela 'IT_MSG com os dados de retorno,se foi realizado com exito, ou se
" deu algum problema.
  CALL TRANSACTION 'XD02' USING it_bdcdata
                          MODE  vg_mode
                          UPDATE vg_s
                          MESSAGES INTO it_msg
                            .

ENDFORM.                    " Z_CARREGA_TRANSACAO

*&---------------------------------------------------------------------*
*&      Form  Z_IMPRIME_MENSAGEM
*&---------------------------------------------------------------------*
FORM z_imprime_mensagem.
"  Dá 'Loop na tabela de retorno da chamada da transação e alimenta outra
" tabela com a retorno referenciado com o Cliente
  LOOP AT it_msg.
    msgno = it_msg-msgnr.
    "  Function que faz mostrar a mensagem
    CALL FUNCTION 'WRITE_MESSAGE'
      EXPORTING
        msgid         = it_msg-msgid
        msgno         = msgno
        msgty         = it_msg-msgtyp
        msgv1         = it_msg-msgv1
        msgv2         = it_msg-msgv2
        msgv3         = it_msg-msgv3
        msgv4         = it_msg-msgv4
        msgv5         = ' '
     IMPORTING
*       ERROR         =
        messg         = mensg
*       MSGLN         =
              .
  ENDLOOP.

  st_message-cliente = st_arqui-cliente.
  st_message-msgty   = mensg-msgty.
  st_message-msgno   = mensg-msgno.
  st_message-msgtx   = mensg-msgtx.
" popula a tabela principal de mensagem que será o Log de erro.
  APPEND st_message TO it_message.

*   WRITE: / , st_arqui-cliente ,
*              mensg-msgtx,
*              mensg-msgty
*           .

ENDFORM.                    " Z_IMPRIME_MENSAGEM

*&---------------------------------------------------------------------*
*&      Form  Z_MANDA_ARQUIVO
*&---------------------------------------------------------------------*
FORM z_manda_arquivo .
"  Cria um arquivo externo conforme 'Filename com as informações da 'Data_tab
  CALL FUNCTION 'GUI_DOWNLOAD'
    EXPORTING
      filename = p_log
    TABLES
      data_tab = it_message
    EXCEPTIONS
      OTHERS   17.
ENDFORM.                    " Z_MANDA_ARQUIVO

*&---------------------------------------------------------------------*
*&      Form  Z_SAPGUI_PROGRESS_INDICATOR
*&---------------------------------------------------------------------*
FORM z_sapgui_progress_indicator  USING texto.

  CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
    EXPORTING
      percentage = 10
      text       = texto.

ENDFORM.                    " Z_SAPGUI_PROGRESS_INDICATOR

"  Debugem isso, estudem, façam de outra forma pois não eh tão facil assim,
" apertem F1, muda o 'MODE no 'CALL TRANSACTION pra ver processo por processo
" abusem deste programa, olhem abaixo o SHDB possivel para este Batch input,
" provavelmente deve ter mais campo mostrando valores mas nós não precisavamos
" cadatrar outros campos, e qualquer dúvida e soh fala, t+.


"                                               T XD02  BS AA X   F
"SAPMF02D 0101  X
"                                                 BDC_CURSOR  RF02D-D0110
"                                                 BDC_OKCODE  /00
"                                                 RF02D-KUNNR 8000000001
"                                                 RF02D-D0110 X
"SAPMF02D 0110  X
"                                                 BDC_CURSOR  KNA1-TELF1
"                                                 BDC_OKCODE  /00
"                                                 KNA1-NAME1  teste
"                                                 KNA1-STRAS  rua teste
"                                                 KNA1-ORT01  São Paulo
"                                                 KNA1-TELF1  12345678

15 comentários:

  1. Testado e aprovado hein mano ...
    hehe.

    Valeu !!!

    ResponderExcluir
  2. Mauro,

    Muito bom meu caro!

    Hoje tive q fazer meu primeiro Batch Input. E seu exemplo foi minha chave para desenvolvimento do meu programa.

    Parabéns.

    ResponderExcluir
  3. Sempre bom saber aonde buscar ajuda quando precisamos.
    Valeu brother.

    ResponderExcluir
  4. A função 'WS_FILENAME_GET' não funciona, deve ser minha versão do sistema... Acho que isso compromete o codigo inteiro..

    ResponderExcluir
  5. Não fique nervoso meu caro, Use esse metodo --- cl_gui_frontend_services=>file_open_dialog !!!

    ResponderExcluir
  6. Esse blog é top das galáxias!!! Parabéns!!!!

    ResponderExcluir
  7. Boa tarde sou novo no mundo SAP, e não entendi bem a função desse batch input, qual seria a utilidade do report acima, porque quando executo pede para selecionar o arquivo e para salvar em um destino, mas quando abro o mesmo aparece em arquivo de texto assim:
    8000000001;Rodrigo;rua teste1;São Paulo1;12345671
    8000000002;Katia;rua teste2;São Paulo2;12345672

    ResponderExcluir
  8. Muito boa a explicação. O único detalhe que faltou explicar corretamente, é que a transação XD02 é para alteração de clientes, enquanto a XD01 é para o cadastro.

    ResponderExcluir
  9. Funcionou, mas tem um problema, todos os arquivos txt q eu busco no diretório mesmo nao sendo mapeado no sdhb o programa aceita, não popula a tabela mas nao da erro. Queria saber uma maneira de quando colocar um arquivo txt q nao e com os parametros desejaveis, o programa de erro, coloquei mensagens de erro mas mesmo assim da certo. Aqui vai o código da minha aplicação.


    ResponderExcluir
  10. Muito bom! Obrigada pelo compartilhando de conhecimento.

    ResponderExcluir
  11. Ola, boa noite !!
    Obrigado por compartilhar conosco.
    Estou tentando automatizar uma criacao de conexao na SM59, porem aparece uma mensagem standard do SAP e ela nao loga na transacao SHDB pois n e uma tela !! Ja tentei dar enter, click e etx mas nada funciona !! Teria alguma ideia de como posso resolver isso, se e que possivel ?? Obrigado

    ResponderExcluir