abap - call transaction e batch input

12
BATCH-INPUT CALL TRANSACTION O Procedimento CALL TRANSACTION é usado para executar uma transação on-line com alimentação de dados simultânea. Normalmente é usada para viabilizar procedimentos contidos em programas onde neles encontram-se as validações de entrada. Por exemplo, imagine um processo que engloba: emissão de pedido de venda, geração de ordem de produção, separação de matéria-prima em estoque, apontamento de produção, liberação do produto acabado na expedição, emissão da nota fiscal de saída e emissão de boleto bancário. Muito bem, este processo tem suas transações específicas. Em cada transação já existem procedimentos que complementam esta lista simples. Por exemplo, separar matéria-prima em estoque implica em: verificar disponibilidade, emitir solicitação de compra caso não tenha estoque, atualizar saldo de estoque entre outros processos executados a partir dele. Agora você precisa fazer isto acontecer em uma única tela. Pois é desta forma que a empresa necessita que seja feito. Pode parecer loucura, mas isto é algo comum, trata-se de um procedimento que a empresa adotou para agilizar seus processos. A função do CALL TRANSACTION é isto, oferecer o meio para que executemos uma transação que preenche os campos de uma tela e ainda clique no botão Salvar. Estas informações são armazenadas em um BDC Session. Local adequado para armazenar e descarregar no momento oportuno as informações que irão preencher esta transação que está sendo executada. O programa é desenvolvido pela SE38 e pode ser, inclusive, um report comum. A seguir um exemplo de alimentação da transação MM01. Normalmente o CALL TRANSACTION será usado para tarefas ON-LINE, para otimização de processos. Ou seja, ele é executado no momento em que o comando é disparado. Chamar uma transação é uma forma de alimentar (dar carga) em um banco de dados. Imagine que seja necessário preencher a tabela de materiais. Não é uma tabela que armazena materiais. São várias, mas as entradas praticamente são a partir de uma transação, a MM01, que por sua vez pode startar outras transações durante a sua operação. Se os dados forem gravados diretamente no banco de dados, muitas das validações e consistências feitas no programa simplesmente serão ignoradas. Desta forma, a maneira como freqüentemente os dados são alimentados também passa pela BDC Session. Pode-se usar o CALL TRANSACTION, mas o ideal é o processo de Batch-Input. A idéia neste caso, é ter os dados em algum arquivo e rodar a transação com instruções que façam com que os campos da transação sejam preenchidos e gravados, repetindo este processo para cada registro a ser adicionado nas tabelas de materiais. Desta forma, obedecendo os critérios de entrada necessários para o cadastro de materiais. A diferença de um CALL TRANSACTION para um procedimento de BATCH-INPUT é que este último não é executado no momento em que é chamado. Um procedimento de BATCH-INPUT cria uma pasta no servidor com o conteúdo do BDC Session e os executa em um outro momento. Quando o servidor não estiver sobrecarregado, por exemplo. Para entender, CALL TRANSACTION: executa uma transação, passa a ela os procedimentos a serem executados, aguarda a execução e trata o retorno no momento que o obteve. LM-Informática 1

Upload: jukaskt

Post on 20-Apr-2015

297 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: ABAP - Call Transaction e Batch Input

BATCH-INPUT CALL TRANSACTION

O Procedimento CALL TRANSACTION é usado para executar uma transação on-line com alimentação de dados simultânea. Normalmente é usada para viabilizar procedimentos contidos em programas onde neles encontram-se as validações de entrada.

Por exemplo, imagine um processo que engloba: emissão de pedido de venda, geração de ordem de produção, separação de matéria-prima em estoque, apontamento de produção, liberação do produto acabado na expedição, emissão da nota fiscal de saída e emissão de boleto bancário.

Muito bem, este processo tem suas transações específicas. Em cada transação já existem procedimentos que complementam esta lista simples. Por exemplo, separar matéria-prima em estoque implica em: verificar disponibilidade, emitir solicitação de compra caso não tenha estoque, atualizar saldo de estoque entre outros processos executados a partir dele.

Agora você precisa fazer isto acontecer em uma única tela. Pois é desta forma que a empresa necessita que seja feito. Pode parecer loucura, mas isto é algo comum, trata-se de um procedimento que a empresa adotou para agilizar seus processos.

A função do CALL TRANSACTION é isto, oferecer o meio para que executemos uma transação que preenche os campos de uma tela e ainda clique no botão Salvar.

Estas informações são armazenadas em um BDC Session. Local adequado para armazenar e descarregar no momento oportuno as informações que irão preencher esta transação que está sendo executada.

O programa é desenvolvido pela SE38 e pode ser, inclusive, um report comum. A seguir um exemplo de alimentação da transação MM01.

Normalmente o CALL TRANSACTION será usado para tarefas ON-LINE, para otimização de processos. Ou seja, ele é executado no momento em que o comando é disparado.

Chamar uma transação é uma forma de alimentar (dar carga) em um banco de dados. Imagine que seja necessário preencher a tabela de materiais. Não é uma tabela que armazena materiais. São várias, mas as entradas praticamente são a partir de uma transação, a MM01, que por sua vez pode startar outras transações durante a sua operação.

Se os dados forem gravados diretamente no banco de dados, muitas das validações e consistências feitas no programa simplesmente serão ignoradas. Desta forma, a maneira como freqüentemente os dados são alimentados também passa pela BDC Session. Pode-se usar o CALL TRANSACTION, mas o ideal é o processo de Batch-Input.

A idéia neste caso, é ter os dados em algum arquivo e rodar a transação com instruções que façam com que os campos da transação sejam preenchidos e gravados, repetindo este processo para cada registro a ser adicionado nas tabelas de materiais. Desta forma, obedecendo os critérios de entrada necessários para o cadastro de materiais.

A diferença de um CALL TRANSACTION para um procedimento de BATCH-INPUT é que este último não é executado no momento em que é chamado. Um procedimento de BATCH-INPUT cria uma pasta no servidor com o conteúdo do BDC Session e os executa em um outro momento. Quando o servidor não estiver sobrecarregado, por exemplo.

Para entender,

CALL TRANSACTION: executa uma transação, passa a ela os procedimentos a serem executados, aguarda a execução e trata o retorno no momento que o obteve.

BATCH-INPUT: Preenche uma pasta no servidor com os procedimentos necessários para executar uma transação, no processamento da pasta a transação é chamada e os procedimentos guardados na pasta são repassados, o programa não aguarda que a execução seja encerrada, pois muitas vezes sequer tenha iniciado. O retorno é tratado quando todo o processo estiver concluído.

LM-Informática 1

Page 2: ABAP - Call Transaction e Batch Input

BATCH-INPUT CALL TRANSACTION

******************************************* Programa Call Transaction* Autor: Marcos Alexandre Martins* Data: 22/09/2004******************************************

REPORT ZMM00134CT .

* Definição PARA CALL TRANSACTION

DATA: T_BDC LIKE BDCDATA OCCURS 0 WITH HEADER LINE, T_MSG LIKE BDCMSGCOLL OCCURS 0 WITH HEADER LINE.

DATA: MENSG LIKE MESSAGE VALUE IS INITIAL, MSGNO LIKE SY-MSGNO.

* Definição da tabela interna de UPLOAD

DATA: BEGIN OF T_UP OCCURS 0,WERKS(4) TYPE C,VKORG(4) TYPE C,VTWEG(2) TYPE C,MAKTX(40) TYPE C,MEINS(2) TYPE C,MTPOS_MARA(4) TYPE C,GEWEI(3) TYPE C,NORMT(18) TYPE C,SKTOF(1) TYPE C,MTPOS(4) TYPE C,

END OF T_UP.

*----------------------------------------------------------* Tela de selecao*----------------------------------------------------------PARAMETERS: P_PATH LIKE RLGRAP-FILENAME, P_MODO TYPE C DEFAULT 'A'.

AT SELECTION-SCREEN ON VALUE-REQUEST FOR P_PATH.CALL FUNCTION 'KD_GET_FILENAME_ON_F4'

EXPORTINGMASK = 'A:\*.*'

CHANGINGFILE_NAME = P_PATH.

*----------------------------------------------------------* corpo principal*----------------------------------------------------------

START-OF-SELECTION.PERFORM ABRE_ARQ.PERFORM TRATA_ARQ.

END-OF-SELECTION.

*&---------------------------------------------------------------------**& Form abre_arq*&---------------------------------------------------------------------*FORM ABRE_ARQ.

CALL FUNCTION 'WS_UPLOAD'EXPORTING

* CODEPAGE = ' 'FILENAME = P_PATHFILETYPE = 'ASC'

* HEADLEN = ' '* LINE_EXIT = ' '* TRUNCLEN = ' '* USER_FORM = ' '* USER_PROG = ' '* DAT_D_FORMAT = ' '* IMPORTING

LM-Informática 2

CALL TRANSACTION

Page 3: ABAP - Call Transaction e Batch Input

BATCH-INPUT CALL TRANSACTION

* FILELENGTH =TABLES

DATA_TAB = T_UPEXCEPTIONS

CONVERSION_ERROR = 1FILE_OPEN_ERROR = 2FILE_READ_ERROR = 3INVALID_TYPE = 4NO_BATCH = 5UNKNOWN_ERROR = 6INVALID_TABLE_WIDTH = 7GUI_REFUSE_FILETRANSFER = 8CUSTOMER_ERROR = 9OTHERS = 10

.IF SY-SUBRC <> 0.

MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNOWITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.

ENDIF.

ENDFORM. " abre_arq

*&---------------------------------------------------------------------**& Form TRATA_ARQ*&---------------------------------------------------------------------** text*----------------------------------------------------------------------** --> p1 text* <-- p2 text*----------------------------------------------------------------------*

FORM TRATA_ARQ.LOOP AT T_UP.

REFRESH T_BDC.PERFORM INSERT_LINE USING:'X' 'SAPLMGMM' '0060',' ' 'BDC_OKCODE' '/00',' ' 'RMMG1-MBRSH' 'C',' ' 'RMMG1-MTART' 'FERT'.

PERFORM INSERT_LINE USING:'X' 'SAPLMGMM' '0070',' ' 'BDC_OKCODE' '=ENTR',' ' 'MSICHTAUSW-KZSEL(01)' 'X',' ' 'MSICHTAUSW-KZSEL(02)' 'X'.

PERFORM INSERT_LINE USING:'X' 'SAPLMGMM' '4004',' ' 'BDC_OKCODE' '/00',' ' 'MAKT-MAKTX'T_UP-MAKTX,' ' 'MARA-MEINS' T_UP-MEINS,' ' 'MARA-MTPOS_MARA' T_UP-MTPOS_MARA,' ' 'MARA-GEWEI' T_UP-GEWEI.

PERFORM INSERT_LINE USING:'X' 'SAPLMGMM' '4004',' ' 'BDC_OKCODE' '/00',' ' 'MAKT-MAKTX'T_UP-MAKTX.

* salva dadosPERFORM INSERT_LINE USING:'X' 'SAPLSPO1' '0300',' ' 'BDC_OKCODE' '=YES'.

LM-Informática 3

CALL TRANSACTION

Page 4: ABAP - Call Transaction e Batch Input

BATCH-INPUT CALL TRANSACTION

* CHAMA TRANSAÇÃO MM01 USANDO A TABELA T_BDC CRIADA COM OS DADOS* ANTERIORES

REFRESH T_MSG.CALL TRANSACTION 'MM01'

USING T_BDC MODE P_MODOMESSAGES INTO T_MSGUPDATE 'S'.

LOOP AT T_MSG.MSGNO = T_MSG-MSGNR.

CALL FUNCTION 'WRITE_MESSAGE'EXPORTING

MSGID = T_MSG-MSGID "Id. da mensagemMSGNO = MSGNO "Número da mensagemMSGTY = T_MSG-MSGTYP "Tipo de erroMSGV1 = T_MSG-MSGV1 "1º parâmetroMSGV2 = T_MSG-MSGV2 "2º parâmetroMSGV3 = T_MSG-MSGV3 "3º parâmetroMSGV4 = T_MSG-MSGV4 "4º parâmetroMSGV5 = ' ' "tabmess-fldname

IMPORTING* ERROR =

MESSG = MENSG.* MSGLN =

WRITE / MENSG-MSGTX.ENDLOOP.

ENDLOOP.ENDFORM. " TRATA_ARQ

*&---------------------------------------------------------------------**& Form insert_line*&---------------------------------------------------------------------** text*----------------------------------------------------------------------** -->P_0133 text* -->P_0134 text* -->P_0135 text*----------------------------------------------------------------------*FORM INSERT_LINE USING U_START TYPE C U_NAME TYPE C U_VALUE.

CLEAR T_BDC.

MOVE U_START TO T_BDC-DYNBEGIN.

IF U_START = 'X'.MOVE:U_NAME TO T_BDC-PROGRAM,U_VALUE TO T_BDC-DYNPRO.

ELSE.MOVE:U_NAME TO T_BDC-FNAM,U_VALUE TO T_BDC-FVAL.

ENDIF.

APPEND T_BDC.

LM-Informática 4

CALL TRANSACTION

Page 5: ABAP - Call Transaction e Batch Input

BATCH-INPUT CALL TRANSACTION

******************************************* Programa Batch - Input* Autor: Marcos Alexandre Martins******************************************

REPORT ZMM00134BI .

* Definição PARA BATCH-INPUT

DATA: T_BDC LIKE BDCDATA OCCURS 0 WITH HEADER LINE, T_MSG LIKE BDCMSGCOLL OCCURS 0 WITH HEADER LINE.

DATA: MENSG LIKE MESSAGE VALUE IS INITIAL, MSGNO LIKE SY-MSGNO.

* Definição da tabela interna de UPLOAD

DATA: BEGIN OF T_UP OCCURS 0, WERKS(4) TYPE C, VKORG(4) TYPE C, VTWEG(2) TYPE C, MAKTX(40) TYPE C, MEINS(2) TYPE C, MTPOS_MARA(4) TYPE C, GEWEI(3) TYPE C, NORMT(18) TYPE C, SKTOF(1) TYPE C, MTPOS(4) TYPE C, END OF T_UP.

*----------------------------------------------------------* Tela de selecao*----------------------------------------------------------PARAMETERS: P_PATH LIKE RLGRAP-FILENAME, P_PASTA LIKE APQI-GROUPID OBLIGATORY.

* Abre path para procura do arquivoAT SELECTION-SCREEN ON VALUE-REQUEST FOR P_PATH. CALL FUNCTION 'KD_GET_FILENAME_ON_F4' EXPORTING MASK = 'A:\*.*' CHANGING FILE_NAME = P_PATH.

*----------------------------------------------------------* corpo principal*----------------------------------------------------------START-OF-SELECTION. PERFORM ABRE_ARQ. PERFORM TRATA_ARQ.END-OF-SELECTION.

*&---------------------------------------------------------------------**& Form abre_arq*&---------------------------------------------------------------------*FORM ABRE_ARQ. CALL FUNCTION 'WS_UPLOAD' EXPORTING* CODEPAGE = ' ' FILENAME = P_PATH FILETYPE = 'ASC'* HEADLEN = ' '* LINE_EXIT = ' '* TRUNCLEN = ' '* USER_FORM = ' '* USER_PROG = ' '* DAT_D_FORMAT = ' '

LM-Informática 5

BATCH-INPUT

Page 6: ABAP - Call Transaction e Batch Input

BATCH-INPUT CALL TRANSACTION

* IMPORTING* FILELENGTH = TABLES DATA_TAB = T_UP EXCEPTIONS CONVERSION_ERROR = 1 FILE_OPEN_ERROR = 2 FILE_READ_ERROR = 3 INVALID_TYPE = 4 NO_BATCH = 5 UNKNOWN_ERROR = 6 INVALID_TABLE_WIDTH = 7 GUI_REFUSE_FILETRANSFER = 8 CUSTOMER_ERROR = 9 OTHERS = 10 . IF SY-SUBRC <> 0.

MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNOWITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.

ENDIF.

ENDFORM. " abre_arq

*&---------------------------------------------------------------------**& Form TRATA_ARQ*&---------------------------------------------------------------------*FORM TRATA_ARQ.

PERFORM BDC_OPEN_GROUP.

LOOP AT T_UP.

REFRESH T_BDC.PERFORM INSERT_LINE USING:'X' 'SAPLMGMM' '0060',' ' 'BDC_OKCODE' '/00',' ' 'RMMG1-MBRSH' 'C',' ' 'RMMG1-MTART' 'FERT'.

PERFORM INSERT_LINE USING:'X' 'SAPLMGMM' '0070',' ' 'BDC_OKCODE' '=ENTR',' ' 'MSICHTAUSW-KZSEL(01)' 'X',' ' 'MSICHTAUSW-KZSEL(02)' 'X'.

PERFORM INSERT_LINE USING:'X' 'SAPLMGMM' '4004',' ' 'BDC_OKCODE' '/00',' ' 'MAKT-MAKTX'T_UP-MAKTX,' ' 'MARA-MEINS' T_UP-MEINS,' ' 'MARA-MTPOS_MARA' T_UP-MTPOS_MARA,' ' 'MARA-GEWEI' T_UP-GEWEI.

PERFORM INSERT_LINE USING:'X' 'SAPLMGMM' '4004',' ' 'BDC_OKCODE' '/00',' ' 'MAKT-MAKTX'T_UP-MAKTX.

*salva dadosPERFORM INSERT_LINE USING:'X' 'SAPLSPO1' '0300',' ' 'BDC_OKCODE' '=YES'.

PERFORM BDC_INSERT.

ENDLOOP.

PERFORM BDC_CLOSE_GROUP.

LM-Informática 6

BATCH-INPUT

Page 7: ABAP - Call Transaction e Batch Input

BATCH-INPUT CALL TRANSACTION

ENDFORM. " TRATA_ARQ

*&---------------------------------------------------------------------**& Form insert_line*&---------------------------------------------------------------------** text*----------------------------------------------------------------------*FORM INSERT_LINE USING U_START TYPE C U_NAME TYPE C U_VALUE.

CLEAR T_BDC.

MOVE U_START TO T_BDC-DYNBEGIN.

IF U_START = 'X'.MOVE:U_NAME TO T_BDC-PROGRAM,U_VALUE TO T_BDC-DYNPRO.

ELSE.MOVE:U_NAME TO T_BDC-FNAM,U_VALUE TO T_BDC-FVAL.

ENDIF.

APPEND T_BDC.

ENDFORM. " insert_line

*&---------------------------------------------------------------------**& Form bdc_open_group*&---------------------------------------------------------------------** text*----------------------------------------------------------------------** --> p1 text* <-- p2 text*----------------------------------------------------------------------*FORM BDC_OPEN_GROUP. CALL FUNCTION 'BDC_OPEN_GROUP' EXPORTING CLIENT = SY-MANDT* DEST = FILLER8 GROUP = P_PASTA* HOLDDATE = FILLER8 KEEP = 'X' USER = SY-UNAME* RECORD = FILLER1* IMPORTING* QID = EXCEPTIONS CLIENT_INVALID = 1 DESTINATION_INVALID = 2 GROUP_INVALID = 3 GROUP_IS_LOCKED = 4 HOLDDATE_INVALID = 5 INTERNAL_ERROR = 6 QUEUE_ERROR = 7 RUNNING = 8 SYSTEM_LOCK_ERROR = 9 USER_INVALID = 10 OTHERS = 11

.

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. " bdc_open_group

LM-Informática 7

BATCH-INPUT

Page 8: ABAP - Call Transaction e Batch Input

BATCH-INPUT CALL TRANSACTION

*&---------------------------------------------------------------------**& Form BDC_INSERT*&---------------------------------------------------------------------** text*----------------------------------------------------------------------** --> p1 text* <-- p2 text*----------------------------------------------------------------------*FORM BDC_INSERT.

DATA: V_CODE LIKE TSTC-TCODE.

V_CODE = 'MM01'.

CALL FUNCTION 'BDC_INSERT' EXPORTING TCODE = V_CODE* POST_LOCAL = NOVBLOCAL* PRINTING = NOPRINT TABLES

DYNPROTAB = T_BDCEXCEPTIONSINTERNAL_ERROR = 1NOT_OPEN = 2QUEUE_ERROR = 3TCODE_INVALID = 4PRINTING_INVALID = 5POSTING_INVALID = 6OTHERS = 7.

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. " BDC_INSERT

*&---------------------------------------------------------------------**& Form bdc_close_group*&---------------------------------------------------------------------** text*----------------------------------------------------------------------** --> p1 text* <-- p2 text*----------------------------------------------------------------------*FORM BDC_CLOSE_GROUP.

CALL FUNCTION 'BDC_CLOSE_GROUP' EXCEPTIONS

NOT_OPEN = 1QUEUE_ERROR = 2OTHERS = 3.

IF SY-SUBRC = 0.

MESSAGE I368(00) WITH 'PASTA CRIADA COM SUCESSO. PASTA:' P_PASTA.

ENDIF.

LM-Informática 8

BATCH-INPUT