Sap Script

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:

'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

'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.

2 comentários sobre “Executar Sap Gui Script escolhendo a sessão

  • Olá excelente dia amigo, muito obrigado por compartilhar as informações.

    Resposta
  • 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

    Resposta

Deixe uma resposta