Batch Input utilizando a técnica de Call Transaction e Pasta.

************************************************************************
***                                                                  ***
***        PROGRAMA: X                                        ***
***        OBJETIVO: Modelo de Interface Inbound - Batch Input       ***
***                  utilizando técnia call transaction e Pasta      ***

REPORT X LINE-SIZE 172 LINE-COUNT 65.

*****************************************
*** Tabelas do Banco de Dados do R/3  ***
*****************************************
* tables:                     "Descrição da Tabela

*********************************
***  Definição de Parâmetros  ***
*********************************
SELECTION-SCREEN BEGIN OF BLOCK param WITH FRAME TITLE text-001.
PARAMETERS: p_modo(1) TYPE c DEFAULT 'N'.
SELECTION-SCREEN: ULINE.
PARAMETERS: p_file TYPE string
            DEFAULT 'c:clientes9.txt' OBLIGATORY.
SELECTION-SCREEN END OF BLOCK param.

*************************************
*** Variáveis Globais do Programa ***
*************************************
DATA: w_contatot  TYPE i,        "Total de Registros do Arquivo
      w_contaval  TYPE i,        "Registros Validos
      w_containv  TYPE i,        "Registros Invalidos
      w_contapro  TYPE i,        "Registros processados em Call Trans
      w_contabdc  TYPE i,        "Registros postos em pasta BDC
      w_numrec    TYPE i,        "Numero do Registro corrente
      w_numerros  TYPE i,        "Contador de Erros de Call Transac.
      w_codmsg(5) TYPE c,        "Codigo de Mensagem na Forma IINNN
      w_valido(1) TYPE c,        "Flag para Validação de Registros
      w_conta     TYPE i,        "Calculos de uso Geral
      w_subrc       LIKE sy-subrc.

*********************************
*** Tabelas Internas Globais  ***
*********************************
*** Tabela cm Definição das Transações Batch Input
DATA: BEGIN OF t_bdc OCCURS 100.
        INCLUDE STRUCTURE bdcdata.
DATA: END OF t_bdc.


*** Tabela para Registro de Mensagens de Erro das Transações
DATA: BEGIN OF t_msg OCCURS 10.
        INCLUDE STRUCTURE bdcmsgcoll.
DATA: END OF t_msg.

************************************************************************
***                          TYPES                                   ***
************************************************************************
TYPES: BEGIN OF ty_entrada,
         kunnr(4)  TYPE c, "Código do cliente
         vkorg(4)  TYPE c, "Organização de vendas
         vtweg(2)  TYPE c, "Canal de distribuição
         spart(2)  TYPE c, "Setor de Atividade
         ktokd(4)  TYPE c, "Grupo de Contas
         name1(18) TYPE c, "Nome do Cliente
         land1(2)  TYPE c, "País
         spras(2)  TYPE c, "Idioma
       END OF ty_entrada.

************************************************************************
***               TABELAS INTERNAS                                   ***
************************************************************************
DATA:
    t_entrada TYPE TABLE OF ty_entrada,

************************************************************************
***                    ESTRUTURAS                                    ***
************************************************************************
    e_entrada TYPE ty_entrada.

*************************************
***  Evento: at selection screen  ***
*************************************
AT SELECTION-SCREEN.

*** Valida modo de call transaction
  IF NOT p_modo CA 'AEN'.
    MESSAGE e000(zcpx001_13) WITH text-m01.
*   &
  ENDIF.

**********************************
*** Evento start-of-selection  ***
**********************************
START-OF-SELECTION.

* Rotina para leitura do arquivo
  PERFORM le_arquivo.

* Rotina para processamento dos dados de Batch Input
  PERFORM processa.

* Rotina para executar Batch Input
  PERFORM executa.

***********************************************************
*** Subrotina genérica para adicionar telas em bdcdata  ***
***********************************************************
FORM bdc_tela USING programa tela.
  CLEAR t_bdc.
  t_bdc-program  = programa.
  t_bdc-dynpro   = tela.
  t_bdc-dynbegin = 'X'.
  APPEND t_bdc.
ENDFORM.                    "BDC_TELA

**********************************************************
*** Subrotina genérica para adicionar telas em bdcdata ***
**********************************************************
FORM bdc_campo USING campo valor.
  CLEAR t_bdc.
  t_bdc-dynpro = space.
  t_bdc-fnam = campo.
  t_bdc-fval = valor.
  APPEND t_bdc.
ENDFORM.                    "BDC_CAMPO

***********************************
***   Processa registro no R/3  ***
***********************************
FORM processa.

  REFRESH t_bdc.



  LOOP AT t_entrada INTO e_entrada.

*** Tela inicial da Transação
    PERFORM bdc_tela  USING 'SAPMF02D' '0107'.
    PERFORM bdc_campo USING 'BDC_OKCODE' '/00'.
    PERFORM bdc_campo USING 'RF02D-KUNNR' e_entrada-kunnr.
    PERFORM bdc_campo USING 'RF02D-VKORG' e_entrada-vkorg.
    PERFORM bdc_campo USING 'RF02D-VTWEG' e_entrada-vtweg.
    PERFORM bdc_campo USING 'RF02D-SPART' e_entrada-spart.
    PERFORM bdc_campo USING 'RF02D-KTOKD' e_entrada-ktokd.

*** Tela de Dados principais
    PERFORM bdc_tela  USING 'SAPMF02D' '110'.
    PERFORM bdc_campo USING 'KNA1-NAME1'   e_entrada-name1.
    PERFORM bdc_campo USING 'KNA1-LAND1'   e_entrada-land1.
    PERFORM bdc_campo USING 'KNA1-SPRAS'   e_entrada-spras.
    PERFORM bdc_campo USING 'BDC_OKCODE' '=UPDA'.

*** Tela de Dados principais
    PERFORM bdc_tela  USING 'SAPMF02D' '315'.
    PERFORM bdc_campo USING 'BDC_OKCODE' '=UPDA'.
    PERFORM bdc_campo USING 'KNVV-KZAZU' 'X'.
    PERFORM bdc_campo USING 'KNVV-VSBED' '01'.
    PERFORM bdc_campo USING 'KNVV-ANTLF' '9'.

*** Tela de Dados principais
    PERFORM bdc_tela  USING 'SAPMF02D' '1350'.
    PERFORM bdc_campo USING 'KNVI-TAXKD(01)' '0'.


  ENDLOOP.

ENDFORM.                    "PROCESSA
*&---------------------------------------------------------------------*
*&      Form  LE_ARQUIVO
*&---------------------------------------------------------------------*
*       Lê arquivo de texto
*----------------------------------------------------------------------*
FORM le_arquivo .

  CALL FUNCTION 'GUI_UPLOAD'
    EXPORTING
      filename                      = p_file
     filetype                      = 'ASC'
    TABLES
      data_tab                      = t_entrada.
  IF sy-subrc <> 0.
 MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
         WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
  ENDIF.



ENDFORM.                    " LE_ARQUIVO
*&---------------------------------------------------------------------*
*&      Form  EXECUTA
*&---------------------------------------------------------------------*
*       Executa Batch Input
*----------------------------------------------------------------------*
FORM executa .
*** Tenta executar com Técnica Call Transaction
  REFRESH t_msg.

  CALL TRANSACTION 'V-03' USING t_bdc MODE p_modo UPDATE 'S'
       MESSAGES INTO t_msg.
  w_subrc = sy-subrc.
  CLEAR w_numerros.
  LOOP AT t_msg.
    IF t_msg-msgtyp NA 'IWS'.
      w_numerros = w_numerros + 1.
    ENDIF.
  ENDLOOP.

*** Se transação terminou com erro, guarda dados em Pasta Batch Input
  IF w_subrc <> 0 OR w_numerros <> 0.

*** Insere transação em Pasta Batch Input
    IF w_contabdc = 0.
      CALL FUNCTION 'BDC_OPEN_GROUP'
        EXPORTING
          client = sy-mandt
          group  = 'CLIENTES_09'
          keep   = 'X'
          user   = sy-uname.
    ENDIF.
    CALL FUNCTION 'BDC_INSERT'
      EXPORTING
        tcode     = 'V-03'
      TABLES
        dynprotab = t_bdc.
    w_contabdc  = w_contabdc + 1.
  ELSE.
    w_contapro = w_contapro + 1.
  ENDIF.

ENDFORM.                    " EXECUTA