Skip to Content
Author's profile photo Former Member

FBRA com SAP GUI Scripting x Excel – Primeiros Passos.

Introdução

Muitas vezes precisamos automatizar um processo de input de informações para o SAP e para essa atividade existem diversas ferramentas disponibilizadas pela SAP, mas vamos focar no SAP GUI Scripting.

Esse artigo demonstra a utilização do SAP GUI Scripting que é uma API(Interface de Programação de Aplicações), que pode ser usada para automação de tarefas (repetitivas), testes e carga de dados.

O SAP GUI Scripting é escrito na linguagem de programação VB (Microsoft VBScrip), o VB é uma linguagem de script de fácil aprendizado usada amplamente no pacote MS Office (principalmente Excel) e sistemas comerciais deste o Windows 98.

Apesar do SAP GUI Scripting não ser uma ferramenta nova, vou apresentar sua atualização básica devido ao grande poder de construção, interação com MS Office e flexibilidade.

Objetivo


O objetivo é demostrar automatização de anulação de compensações usando a transação FBRA com SAP GUI Scripting.


Verificação do ambiente


Passo 01:  Habilitar o SAP GUI Scripting no SAP GUI Configuration conforme a tela abaixo.

/wp-content/uploads/2016/01/s0_s_863793.png.

Passo 02: Na transação rz11 você terá que habilitar o  parâmetro sapgui/user_scripting conforme a nota http://service.sap.com/sap/support/notes/480149.


Criação do Script.


Semelhante ao a LSMW o SAP GUI Scripting precisamos mapear os campos e após o mapeamento o SAP gera o script VB.


Vamos usar a opção “Registro e Reprodução de Scrpit” conforme os passos abaixo:

Passo 01: Criação do script.

S1_S1.png

Passo 02: É necessário informar a pasta e nome do script para o SAP salvar as informações.


S2_S2.png

Passo 03: Para começar a gravar é necessário clicar no botão “Registrar Script” e chamar a transação FBRA e informar os dados normalmente.


/wp-content/uploads/2016/01/s3_s3_863057.png


Passo 04: Vamos usar a transação normalmente e concluir o processo da anulação de partida, após a conclusão vamos clicar no botão “Encerrar”. Nesta etapa o SAP já mapeou o campos e tem as informações necessárias.

/wp-content/uploads/2016/01/s5_s5_863077.png


Passo 05: Vamos abrir o script com o bloco de notas.

/wp-content/uploads/2016/01/s6_s6_863068.png

Passo 06:  Observe que as informações digitas para anulação do documento estão gravadas no script, se executarmos esse scrpit agora ele irá reproduzir no passo 04.


/wp-content/uploads/2016/01/s7_s7_863070.png



Passo 06:  Vamos inserir os blocos (Vermelho) B1 e B2 no nosso script, não é necessário conhecimento de programação.

O bloco B1 vai chamar a planilha (Excel) aberta, ler a planilha, criar uma estrutura de repetição e criar as variáveis com os conteúdos das colunas, com isso substituímos os valores fixos com as variáveis criadas.

O bloco B2 só fecha a instrutura de repetição.

/wp-content/uploads/2016/01/s9_s_863779.png




Código Fonte :



If Not IsObject(application) Then

   Set SapGuiAuto  = GetObject(“SAPGUI”)

   Set application = SapGuiAuto.GetScriptingEngine

End If

If Not IsObject(connection) Then

   Set connection = application.Children(0)

End If

If Not IsObject(session) Then

   Set session    = connection.Children(0)

End If

If IsObject(WScript) Then

   WScript.ConnectObject session,     “on”

   WScript.ConnectObject application, “on”

End If

REM  B1 INICIO***********************************************

Dim objExcel

Dim objSheet, intRow, i

Set objExcel = GetObject(, “Excel.Application”)         ‘ CHAMA O EXCEL ATIVO 

Set objSheet = objExcel.ActiveWorkbook.ActiveSheet   ‘ LER O CONTEUDO DA PRIMEIRA ABA DO EXECEL

For i = 2 To objSheet.UsedRange.Rows.Count           ‘ LER DA PLANILHA APARTI DA 2 LINHA

    DOCUMENTO = Trim(CStr(objSheet.Cells(i, 1).Value))  ‘A VARIAVEL DOCUMENTO

    EMPRESA   = Trim(CStr(objSheet.Cells(i, 2).Value))  ‘A VARIAVEL EMPRESA

    ANO       = Trim(CStr(objSheet.Cells(i, 3).Value))  ‘A VARIAVEL ANO

    session.findById(“wnd[0]”).maximize

REM B1 FIM *************************************************

    session.findById(“wnd[0]/tbar[0]/okcd”).Text = “/nfbra”

    session.findById(“wnd[0]”).sendVKey 0

    session.findById(“wnd[0]/usr/txtRF05R-AUGBL”).Text  = DOCUMENTO

    session.findById(“wnd[0]/usr/ctxtRF05R-BUKRS”).Text = EMPRESA

    session.findById(“wnd[0]/usr/txtRF05R-GJAHR”).Text  = ANO

    session.findById(“wnd[0]/usr/txtRF05R-GJAHR”).SetFocus

    session.findById(“wnd[0]/usr/txtRF05R-GJAHR”).caretPosition = 4

    session.findById(“wnd[0]/tbar[0]/btn[11]”).press

    session.findById(“wnd[0]”).sendVKey 0

    session.findById(“wnd[1]/usr/btnSPOP-OPTION1”).press

    session.findById(“wnd[1]/usr/ctxtRF05R-STGRD”).Text = “01”

    session.findById(“wnd[1]/tbar[0]/btn[0]”).press

    session.findById(“wnd[0]”).sendVKey 0

REM B2 ************************************************

Next

REM ****************************************************

Passo 07:  Criação da Planilha Excel, só é necessário criar a planilha com colunas DOCUMENTO, EMPRESA e ANO conforme o print abaixo.

S8_S.png

Passo 08: Para executar o script é necessário que a planilha (Excel) esteja aberta e com isso vamos usar a opção “Registro e Reprodução de Scrpit”, selecionar o botão “Processar Script” conforme o print abaixo.


Com isso SAP vai interpretar o arquivo script executando a transação FBRA com SAP  e lendo as informações da planilha(Excel).

S1_S1.png




/wp-content/uploads/2016/01/s10_s_863789.png


Conclusão


Poderíamos usar LSMW para fazer essa atividade que foi descrita acima, mas a ideia é desvincular da LSMW e apresentar SAP GUI Scripting.

Muitas empresas têm verdadeiros sistemas em planilhas Excel que posteriormente seus resultados precisam ser integrados com o SAP.

A automação dessas tarefas não substitui a inteligência no SAP, mais complementa na utilização do SAP com o usuário final, com isso, dando mais opções ao consultor para desenhar soluções.

O SAP GUI Scripting x MS Office abre leque de possibilidades que vão muito além do que foi apresentado neste artigo, caso queiram conhecer um pouco mais, segue link abaixo.

Caso alguém encontrei algum divergência ou inconsistência, por favor fique a vontade para a devida colaboração.

Abaixo link com maiores informações caso queriam apreender mais.

SAP Connectivity with MS Excel

http://scn.sap.com/docs/DOC-31015

Introduction to SAP Gui Scripting

http://scn.sap.com/community/gui/blog/2012/10/08/introduction-to-sap-gui-scripting

The SAP GUI Scripting API

https://www.sdn.sap.com/irj/scn/index?rid=/library/uuid/80aaac18-2dfe-2a10-bbb1-ec9b3760ea4c&overridelayout=true


SAP GUI Scripting API Documentation


VBScript User’s Guide

https://msdn.microsoft.com/en-us/library/sx7b3k7y(v=vs.85).aspx

Artur Paulino Da Silva Cardoso

Claudio Rafael

Assigned Tags

      19 Comments
      You must be Logged on to comment or reply to a post.
      Author's profile photo Marssel Vilaça
      Marssel Vilaça

      Muito boa opção para processamento massivo. A LSMW é a mais utilizada porém é importante conhecer outros métodos que também são simples e eficazes.

      Valeu

      Abraço

      Author's profile photo Thiago Felipe Silveira
      Thiago Felipe Silveira

      Boa Tarde,

      LIMA?

      Não conheço.

      Tem algum link pra indicar?

      Author's profile photo Marssel Vilaça
      Marssel Vilaça

      Com corretor LIMA

      Sem corretor LSMW

      Melhor comentar pelo laptop! 😉

      Author's profile photo Thiago Felipe Silveira
      Thiago Felipe Silveira

      Ah ta... Já estava indignado que nunca tinha ouvido falar dessa ferramenta. kkkkkkk

      Author's profile photo Douglas Brito da Silva
      Douglas Brito da Silva

      Muito Bom Artur!!!

      Author's profile photo Former Member
      Former Member

      Boa tarde,

      Estou iniciando agora a automatizar minhas atividades e tentei copiar conforme o exemplo, porém não consegui, será que poderiam me ajudar?

      Aparece a informação ao realizar o passo 8 "Invalid Character -"

       

      Segue abaixo o código com as informações que modifiquei, podem me ajudar por favor?

      If Not IsObject(application) Then
      Set SapGuiAuto  = GetObject("SAPGUI")
      Set application = SapGuiAuto.GetScriptingEngine
      End If
      If Not IsObject(connection) Then
      Set connection = application.Children(0)
      End If
      If Not IsObject(session) Then
      Set session    = connection.Children(0)
      End If
      If IsObject(WScript) Then
      WScript.ConnectObject session,     "on"
      WScript.ConnectObject application, "on"
      End If

      REM  B1 INICIO***********************************************

      Dim objExcel

      Dim objSheet, intRow, i
      Set objExcel = GetObject(, “Excel.Application”)         ‘ CHAMA O EXCEL ATIVO

      Set objSheet = objExcel.ActiveWorkbook.ActiveSheet   ‘ LER O CONTEUDO DA PRIMEIRA ABA DO EXECEL
      For i = 2 To objSheet.UsedRange.Rows.Count           ‘ LER DA PLANILHA APARTI DA 2 LINHA

      Centro = Trim(CStr(objSheet.Cells(i, 1).Value))  ‘A VARIAVEL Centro

      LINHA   = Trim(CStr(objSheet.Cells(i, 2).Value))  ‘A VARIAVEL LINHA

      DATA_INICIO = Trim(CStr(objSheet.Cells(i, 3).Value))  ‘A VARIAVEL DATA INICIO

      DATA_FIM   = Trim(CStr(objSheet.Cells(i, 4).Value))  ‘A VARIAVEL DATA FIM

      VARIANTE   = Trim(CStr(objSheet.Cells(i, 5).Value))  ‘A VARIAVEL VARIANTE

      session.findById(“wnd[0]”).maximize

      REM B1 FIM *************************************************

      session.findById("wnd[0]/tbar[0]/okcd").text = "/nzmnpprep0006"
      session.findById("wnd[0]").sendVKey 0
      session.findById("wnd[0]/usr/ctxtS_WERKS-LOW").text = CENTRO
      session.findById("wnd[0]/usr/ctxtS_ARBPL-LOW").text = LINHA
      session.findById("wnd[0]/usr/ctxtS_GSTRI-LOW").text = INICIO
      session.findById("wnd[0]/usr/ctxtS_GSTRI-HIGH").text = FIM
      session.findById("wnd[0]/usr/ctxtP_VARI").text = VARIANTE
      session.findById("wnd[0]/usr/ctxtP_VARI").setFocus
      session.findById("wnd[0]/usr/ctxtP_VARI").caretPosition = 11
      session.findById("wnd[0]").sendVKey 8
      session.findById("wnd[0]/tbar[1]/btn[45]").press
      session.findById("wnd[1]/usr/subSUBSCREEN_STEPLOOP:SAPLSPO5:0150/sub:SAPLSPO5:0150/radSPOPLI-SELFLAG[1,0]").select
      session.findById("wnd[1]/usr/subSUBSCREEN_STEPLOOP:SAPLSPO5:0150/sub:SAPLSPO5:0150/radSPOPLI-SELFLAG[1,0]").setFocus
      session.findById("wnd[1]/tbar[0]/btn[0]").press
      session.findById("wnd[1]/usr/ctxtDY_PATH").text = "c:\script1"
      session.findById("wnd[1]/usr/ctxtDY_FILENAME").text = "zmnpprep0006.xls"
      session.findById("wnd[1]/usr/ctxtDY_FILENAME").caretPosition = 16
      session.findById("wnd[1]/tbar[0]/btn[11]").press
      REM B2 ************************************************

      Next

      REM ****************************************************

       

       

      OBRIGADA

       

       

       

      Author's profile photo Former Member
      Former Member
      Blog Post Author

      O login no SAP não bem sucedido!

      Author's profile photo Alex Jame
      Alex Jame

      Olá, a variante precisa ter o mesmo nome no B1 e no B2, por exemplo: DATA_INICIO e DATA_INICIO.

      Author's profile photo Former Member
      Former Member

      Estou como este mesmo problema de  “Invalid Character -”

      Como se resolve?

       

      Obrigado

      Author's profile photo André dos Santos
      André dos Santos

      Mesmo problema do Joao, alguém pode nos ajudar?

      Obrigado!

       

      Author's profile photo Former Member
      Former Member

      Boa tarde pessoal!

      Criei o script abaixo mas está dando o erro "The control could not be found by id.-".

      If Not IsObject(Application) Then
      Set SapGuiAuto = GetObject("SAPGUI")
      Set Application = SapGuiAuto.GetScriptingEngine
      End If
      If Not IsObject(Connection) Then
      Set Connection = Application.Children(0)
      End If
      If Not IsObject(session) Then
      Set session = Connection.Children(0)
      End If
      If IsObject(WScript) Then
      WScript.ConnectObject session, "on"
      WScript.ConnectObject Application, "on"
      End If
      REM B1 INICIO***********************************************
      Dim objExcel

      Dim objSheet, intRow, i

      Set objExcel = GetObject(, "Excel.Application") 'CHAMA O EXCEL ATIVO

      Set objSheet = objExcel.ActiveWorkbook.ActiveSheet 'LER O CONTEUDO DA PRIMEIRA  ABA DO EXECEL

      For i = 2 To objSheet.UsedRange.Rows.Count 'LER DA PLANILHA APARTI DA 2 LINHA

      NUMERO_RUA = Trim(CStr(objSheet.Cells(i, 1).Value)) 'A VARIAVEL NUMERO_RUA
      CEP_DNE = Trim(CStr(objSheet.Cells(i, 2).Value)) 'A VARIAVEL CEP_DNE
      session.findById("wnd[0]").maximize
      REM B1 FIM *************************************************

      session.findById("wnd[0]/tbar[0]/okcd").text = "/nZMED95"
      session.findById("wnd[0]/tbar[0]/btn[0]").press
      session.findById("wnd[0]/usr/ctxtADRSTREET-STRT_CODE").Text = NUMERO_RUA
      session.findById("wnd[0]/usr/ctxtADRSTREET-STRT_CODE").caretPosition = 6
      session.findById("wnd[0]/tbar[1]/btn[2]").press
      session.findById("wnd[0]/usr/tblSAPLZMED_LOGRADOUROTC_SECAO_RUA/ctxtTI_SECAO_RUA-POST_CODE[5,0]").Text = CEP_DNE
      session.findById("wnd[0]/usr/tblSAPLZMED_LOGRADOUROTC_SECAO_RUA/ctxtTI_SECAO_RUA-POST_CODE[5,0]").SetFocus
      session.findById("wnd[0]/usr/tblSAPLZMED_LOGRADOUROTC_SECAO_RUA/ctxtTI_SECAO_RUA-POST_CODE[5,0]").caretPosition = 0
      session.findById("wnd[0]").sendVKey 0
      session.findById("wnd[1]/usr/btnBUTTON_1").press
      session.findById("wnd[0]/tbar[0]/btn[11]").press
      REM B2 ************************************************
      Next
      REM ****************************************************

      Obrigado!

       

      Alysson

      Author's profile photo Alex Jame
      Alex Jame

      Algum campo é pop-up? Nesse caso pode não funcionar corretamente ou pode ser o conteúdo do campo, formata o seu Excel para texto.

      Author's profile photo Alex Jame
      Alex Jame

      Observe que o comando session.findById("wnd[0]").sendVKey 0 é equivalente a tecla ENTER, pode ser que está faltando no processo.

      Author's profile photo Former Member
      Former Member

      Muito interessante a matéria e a ajuda que deram para resolver o problema de um outro usuário, o que me motivou a fazer a minha pergunta.

      Sou bem cru no sistema, mas também já fiz algumas programações como a apresentada.

      Meu principal problema é que a opção "Registro e Reprodução de Scrpit", de vez em quando, aparece desabilitada, impedindo a execução do script vb. Depois de algum tempo, ele aparece habilitada novamente e os scripts funcionam perfeitamente. Não faço idéia do que pode ser isso e, todas as soluções que encontrei pedem para entrar em transações que não possuo acesso, já que sou apenas usuário do sap,

      Caso alguém saiba como resolver, poderiam me informar?

       

      Grato.

      Author's profile photo Haroldo Silva
      Haroldo Silva

      Prezado, Boa Noite

      Vou tentar uma adaptação para a transação MM01, preciso "cadastrar/estender" NMs. códigos de materiais para "depósitos" no SAP.

      São códigos já existentes, como não tenho certeza que todos estejam no Centro pretendido, pretendo fazer o seguinte.

      Na coluna A ficarão os códigos dos materiais

      Na coluna B o Centro, inicialmente será apenas o "T001"

      Na coluna C os depósitos, ora um material terá cadastro no Deposito DP01 ora no DPCE e ora nos dois depósitos, acredito que neste caso eu deva repetir o código em outra linha.

      Vou ver quais as visões que serão necessárias, os demais campos acho que vou fazer pela MM17, pois são default.

      O que acham?

      Author's profile photo marcio Fernando
      marcio Fernando

      Você pode fazer esse trabalho rapidamente atraves da MM17

      Author's profile photo Haroldo Silva
      Haroldo Silva

      Ok Marcio eu conheço a MM17, estava testando outras formas, agora estou testando no módulo PM na IL02 utilizando o mesmo preceito.

      Author's profile photo Mariane Costa Reis
      Mariane Costa Reis

      Bom dia!

      Ótimo artigo, muito explicativo. Estou precisando automatizar a transação ME38, pois estou realizando um trabalho extenso semanal de cadastramento de itens que penso que poderá ser automatizado, porém possuo dificuldade na parte da linguagem de códigos, qual caminho devo seguir para início?

      Author's profile photo Haroldo Silva
      Haroldo Silva

      Fiz um teste para a transação IL02 e tenho retorno da mensagem caractere invalido também, código abaixo:

      Fiz algumas buscas pelo código e não encontrei erro, nem nestas aspas duplas que ao copiar o código as vezes vem em formato diferente, mas olhei todas e alterei.

      Utilizando o gravador, fica muita sujeira no código, quando se utiliza o scroll, limpei isso.

      If Not IsObject(application) Then
      Set SapGuiAuto = GetObject("SAPGUI")
      Set application = SapGuiAuto.GetScriptingEngine
      End If
      If Not IsObject(connection) Then
      Set connection = application.Children(0)
      End If
      If Not IsObject(session) Then
      Set session = connection.Children(0)
      End If
      If IsObject(WScript) Then
      WScript.ConnectObject session, "on"
      WScript.ConnectObject application, "on"
      End If

      REM B1 INICIO***********************************************

      Dim objExcel

      Dim objSheet, intRow, i

      Set objExcel = GetObject(, "Excel.Application") ‘ CHAMA O EXCEL ATIVO

      Set objSheet = objExcel.ActiveWorkbook.ActiveSheet ‘ LER O CONTEUDO DA PRIMEIRA ABA DO EXCEL

      For i = 2 To objSheet.UsedRange.Rows.Count ‘ LER DA PLANILHA A PARTIR DA 2 LINHA

      LOCAL = Trim(CStr(objSheet.Cells(i, 1).Value)) ‘A VARIAVEL LOCAL

      STATUSUSU = Trim(CStr(objSheet.Cells(i, 2).Value)) ‘A VARIAVEL STATUSUSU

      session.findById("wnd[0]").maximize

      REM B1 FIM *************************************************

      session.findById("wnd[0]/tbar[0]/okcd").Text = "/nil02"

      session.findById("wnd[0]").sendVKey 0

      session.findById("wnd[0]/usr/ctxtIFLO-TPLNR").text = LOCAL

      session.findById("wnd[0]/usr/ctxtSTTXU-RILO0").Text = STATUSUSU

      session.findById("wnd[0]").sendVKey 0

      session.findById("wnd[1]/usr/btnOPTION2").press
      session.findById("wnd[0]/usr/btnSTATUS").press
      session.findById("wnd[0]/usr/tabsTABSTRIP_0300/tabpANWS/ssubSUBSCREEN:SAPLBSVA:0302/tblSAPLBSVATC_E/radJ_STMAINT-ANWS[0,3]").press
      session.findById("wnd[0]/usr/tabsTABSTRIP_0300/tabpANWS/ssubSUBSCREEN:SAPLBSVA:0302/tblSAPLBSVATC_E/radJ_STMAINT-ANWS[0,3]").setFocus
      session.findById("wnd[0]/tbar[0]/btn[3]").press
      session.findById("wnd[0]/tbar[0]/btn[11]").press

      REM B2 ************************************************

      Next

      REM ****************************************************