Executar Sap Gui Script escolhendo a sessão
Olá pessoal, nessa postagem vou atender a um pedido de um colega inscrito no meu canal. O seu questionamento era com relação a sessão que o código VBA executa no SAP, acredito que ele já deva ter sessões em aberto e gostaria de utilizar uma sessão para continuar o processo a partir daquele ponto, ou não derrubar um tela que ele esta trabalhando naquele momento.
Para isso vou utilizar uma função que também já postei aqui no canal (clique aqui para ver a postagem), mas como é para um caso especifico eu simplifiquei a função “eu acho rs”, bom vamos lá!
Crie um modulo no seu VBAProject, e cole o código abaixo:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 |
'Autor: Fabio Mitsueda 'Contato: mitsueda.fabio@gmail.com 'Data Criação: 17/07/2023 Option Explicit 'Variaveis publicas de objeto que representão o SAP Public objSapGui As Object Public objApplication As Object Public objConnection As Object Public Session As Object '(1)Systema logado '(2)Nome do usuario '(3)Transação '(4)Objeto connection '(5)Objeto Session Public Function GetSapUserOpen() As Variant 'Variaveis diversas Dim vSapInfo() As Variant Dim vColunas(1 To 5) As Variant Dim strID As String Dim strUser As String Dim strTransacao As String Dim i, x As Integer 'Variaveis de objeto SAP Dim objSAP As Object Dim objSapApp As Object Dim objConnect As Object Dim objSession As Object 'Verificando se existe uma instacia do SAP aberta, não necessariamente logada While x < 10 And objSAP Is Nothing x = x + 1 On Error Resume Next Set objSAP = GetObject("SAPGUI") On Error GoTo 0 Wend 'Verificando se a variavel SAP foi carregada corretamente If objSAP Is Nothing Then GoTo Fim End If 'Carregando variavel que representa a janela do SAP o applicativo On Error Resume Next Set objSapApp = objSAP.GetScriptingEngine On Error GoTo 0 'Caso não tenha sido carregada vá para o fim do código If objSapApp Is Nothing Then GoTo Fim End If 'Percorrendo todas as janelas abertas do SAP e capturando informações For Each objConnect In objSapApp.Children 'Se a conexão caiu não executar o teste para a janela dessa rodada If Not objConnect.DisabledByServer Then For Each objSession In objConnect.Children 'Verificando se a sessão está em execução If objSession.Busy = False Then 'Verificando se está logado atravez da transação S000 que é a tela de log If objSession.Info.Transaction <> "S000" Then 'ID do sistema strID = objSession.Info.SystemName 'Nome do usuario strUser = objSession.Info.user 'Transação da janela strTransacao = objSession.Info.Transaction 'Capturando dados ReDim Preserve vSapInfo(i) 'Redimensionando matriz vColunas(1) = strID 'Capturando Id do sistema vColunas(2) = strUser 'Capturando o nome do usuario vColunas(3) = strTransacao 'Capturando o codigo da transacao Set vColunas(4) = objConnect 'Capturando objeto conexão Set vColunas(5) = objSession 'Capturando objeto sessão vSapInfo(i) = vColunas 'Atribuino colunas capturadas a variavel i = i + 1 'Aumentado variavel em um para proximo loop End If End If Next End If Next Fim: 'Retornando valores para função If i = 0 Then GetSapUserOpen = Empty Else GetSapUserOpen = vSapInfo End If 'Descarregando as variaveis de objeto Set objSAP = Nothing Set objSapApp = Nothing Set objConnect = Nothing Set objSession = Nothing End Function |
Para esse exemplo vou utilizar um Userform, carregando uma combo box com o retorno da função acima, então no seu VBAProject crie um Userform, com um combo box e um botão de comando para executar o script no SAP, e cole o código abaixo, caso não esteja usando o arquivo que vou disponibilizar logo abaixo, atentar para o nome dos controles
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
'Autor: Fabio Mitsueda 'Contato: mitsueda.fabio@gmail.com 'Data Criação: 17/07/2023 Option Explicit 'Variavel que ira receber dados do SAP Dim vSap As Variant 'Evento de inicialiação do Userform Private Sub UserForm_Initialize() Dim x As Integer 'Verificando se existe SAP logado vSap = GetSapUserOpen() 'Caso a varivael não esteja vazia popular o combobox If Not IsEmpty(vSap) Then With Me.cbo_Session 'Efetuando looping na variavel recebida 'E adicionando informações ao combo box For x = LBound(vSap) To UBound(vSap) .AddItem "Id: " & vSap(x)(1) & " | " & "Tcode: " & vSap(x)(3) Next End With End If End Sub 'Botão para executar a transação Private Sub CmdConectar_Click() 'Carregando objeto de sessao conforme seleção no combo box Set Session = vSap(Me.cbo_Session.ListIndex)(5) 'Aqui utilizando a sessao carregada anteriormente Session.findById("wnd[0]/usr/ctxtRACCT-LOW").Text = "300000" Session.findById("wnd[0]/usr/ctxtRBUKRS-LOW").Text = "1000" Session.findById("wnd[0]/usr/txtRYEAR").Text = "2023" End Sub 'Descarregando variaveis Private Sub UserForm_Terminate() Set objSapGui = Nothing Set objApplication = Nothing Set objConnection = Nothing Set Session = Nothing vSap = Empty End Sub |
Feito isso é sé executar o código com as janelas abertas, selecionar a sessão que quer executar e pronto. Para baixar o arquivo exemplo dessa postagem clique no aqui.
Olá excelente dia amigo, muito obrigado por compartilhar as informações.
Eu consigo ignorar o tempo de esperar de um código? por exemplo, clicar em executar uma tabela da se16n e em seguida fazer isto em outra página, sem aguardar a tabela gerar