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.
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.
Passo 02: É necessário informar a pasta e nome do script para o SAP salvar as informações.
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.
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.
Passo 05: Vamos abrir o script com o bloco de notas.
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.
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.
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.
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).
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
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
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
Boa Tarde,
LIMA?
Não conheço.
Tem algum link pra indicar?
Com corretor LIMA
Sem corretor LSMW
Melhor comentar pelo laptop! 😉
Ah ta... Já estava indignado que nunca tinha ouvido falar dessa ferramenta. kkkkkkk
Muito Bom Artur!!!
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
O login no SAP não bem sucedido!
Olá, a variante precisa ter o mesmo nome no B1 e no B2, por exemplo: DATA_INICIO e DATA_INICIO.
Estou como este mesmo problema de “Invalid Character -”
Como se resolve?
Obrigado
Mesmo problema do Joao, alguém pode nos ajudar?
Obrigado!
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
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.
Observe que o comando session.findById("wnd[0]").sendVKey 0 é equivalente a tecla ENTER, pode ser que está faltando no processo.
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.
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?
Você pode fazer esse trabalho rapidamente atraves da MM17
Ok Marcio eu conheço a MM17, estava testando outras formas, agora estou testando no módulo PM na IL02 utilizando o mesmo preceito.
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?
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 ****************************************************