cancel
Showing results for 
Search instead for 
Did you mean: 

Condicional no SAP Script

Former Member
0 Kudos

Senhores,

Como resolver a questão abaixo:

- Estou usando o Script do SAP 4.7 e ao elaborar uma rotina em uma transação foi surpreendido com duas alternativas de feedback ao sistema, ou seja, existe duas possibilidades de resposta ao sistema.

Foi justamente nessas duas possibilidades que peço a ajuda de vocês para dar solução:

Estou usando esta rotina:

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

session.findById("wnd[0]/tbar[0]/okcd").text = "cj02"

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

session.findById("wnd[0]/usr/ctxt*PROJ-PSPID").text = ""

For i = 2 To 65000

Set objExcel = GetObject(,"Excel.Application")

objExcel.Visible = True

objExcel.DisplayAlerts = False

with objExcel

.Workbooks.Open ("c: oboNorma_Peps.xls")

.Windows("Norma_Peps.xls").Activate

.Visible = True

.DisplayAlerts = False

.Sheets("Marcar para Eliminação").Select

.Cells(i,1).Select

pep = objexcel.Cells(i,1)

.Cells(i,1) = pep

End With

session.findById("wnd[0]/usr/ctxt*PROJ-PSPID").text = ""

session.findById("wnd[0]/usr/ctxt*PROJ-PSPID").text = ""

session.findById("wnd[0]/usr/ctxt*PRPS-POSID").text = pep

session.findById("wnd[0]/usr/ctxt*PRPS-POSID").setFocus

session.findById("wnd[0]/usr/ctxt*PRPS-POSID").caretPosition = 0

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

session.findById("wnd 0]/usr/tabsTABCJLE/tabpLEGR/ssubLISTE:SAPLCJWB:0902/tblSAPLCJWBTAB_902").getAbsoluteRow(0).selected = true

session.findById("wnd[0]/usr/tabsTABCJLE/tabpLEGR/ssubLISTE:SAPLCJWB:0902/tblSAPLCJWBTAB_902/txtPRPS-STUFE[1,0]").setFocus

session.findById("wnd[0]/usr/tabsTABCJLE/tabpLEGR/ssubLISTE:SAPLCJWB:0902/tblSAPLCJWBTAB_902/txtPRPS-STUFE[1,0]").caretPosition = 0

session.findById("wnd[0]/mbar/menu[1]/menu[2]/menu[10]").select

Até neste momento o programa funciona.

Daqui em diante, o programa tem que identificar que tipo de janela e tomar a ação devida.

Se for a janela A, deve seguir com a rotina abaixo:

session.findById("wnd[1]/usr/btnOPTION2").press

session.findById("wnd[0]/tbar[0]/btn[3]").press

session.findById("wnd[0]/usr/ctxt*PROJ-PSPID").text = ""

session.findById("wnd[0]/usr/ctxt*PRPS-POSID").text = ""

session.findById("wnd[0]/usr/ctxt*PRPS-POSID").setFocus

session.findById("wnd[0]/usr/ctxt*PRPS-POSID").caretPosition = 0

with objExcel

.Windows("Norma_Peps.xls").Activate

.Visible = True

.DisplayAlerts = False

.Sheets("Marcar para Eliminação").Select

.Cells(i,2).Select

.Cells(i,2) = "X"

.ActiveWorkbook.Save

End With

Next

End Function

Se for a janela B, deve seguir com a rotina abaixo:

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

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

session.findById("wnd[0]/usr/ctxt*PROJ-PSPID").text = ""

session.findById("wnd[0]/usr/ctxt*PRPS-POSID").text = ""

session.findById("wnd[0]/usr/ctxt*PRPS-POSID").setFocus

session.findById("wnd[0]/usr/ctxt*PRPS-POSID").caretPosition = 0

Next

End Function

Como elaborar uma condicional que consiga saber qual ação tomar ?

Agradeço,

Eduardo

Accepted Solutions (1)

Accepted Solutions (1)

Former Member
0 Kudos

A rotina "pega" o dado do excel e atualiza em uma transação do SAP, linha por linha, uma vez que esta transação do SAP não aceita atualização por lote.

O problema esta após a linha "session.findById("wnd[0]/mbar/menu[1]/menu[2]/menu[10]").select", onde:

1) O SAP exibe duas caixas de ações possíveis: Uma para aceitar e continuar a gravação e outra para cancelar a gravação e continuar o processo.

2) Estas caixas de ações estão representadas após o u201Cif err=0 thenu201D (ação para cancelar a gravação) e após o u201Celseu201D (aceitar e continuar a gravação).

3) Ambas as caixas de ações, são interpretadas pelo scrip SAP da mesma maneira, ou seja, ambas são descritas como: u201Csession.findById("wnd[0]/mbar/menu[1]/menu[2]/menu[10]").selectu201D

4) Como fazer uma condicional onde o script consiga interpretar qual ação que devo tomar, mediante a caixa de ação apresentada, ou melhor, diante a botões de ações apresentados ?

Agradeço pelo apoio.

Eduardo

former_member182114
Active Contributor
0 Kudos

Bom dia Eduardo,

Agora sim está bem claro o que tá pegando. Particularmente eu não faria um VB script para esta situação, faria através de batch input mesmo ou LSMW se fosse o caso, principalmente devido à segurança, se não me engano, o script precisa de um usuário/senha exposto em algum lugar... Então não seria uma boa solução para usuário final, apenas para experts, que pelo visto é o seu caso.

Anyway... Você tentou testar o if err=0 após o press ?

tipo:

if err=0 then

session.findById("wnd[1]/usr/btnOPTION2").press

if err<>0 then

entao deve ser a outra caixa que apareceu...

O que tava pensando é já que não dá pra saber "que caixa apareceu", talvez dê pra colocar a lógica no "qual botão consigo clicar"...

Atenciosamente, Fernando Da Rós

Edited by: Fernando Ros on Mar 1, 2010 11:23 PM

Answers (4)

Answers (4)

Former Member
0 Kudos

Bom dia Fernando ...

Agradeço pela ajuda e pelo elogio ("Expert").

A solução apresentada por você funcionou e resolveu meu problema.

Em relação ao "Expert" agradeço novamente. Mas sou um simples usuário do ambiente SAP. Com tantas proibições em meu sistema, estou aventurando neste único recurso que ainda não foi bloqueado para uso.

Sobre a dica que você comentou, para evitar o uso do VB script, utilizar o batch input mesmo ou LSMW, eu não conheço. Você sabe informar onde eu poderia aprender mais sobre estes recursos ? u2013 Isto é claro, caso eu consigua utilizá-lo na condição de usuário.

Att,,

Eduardo

former_member182114
Active Contributor
0 Kudos

Bom dia Eduardo,

O LSMW na verdade é uma ferramenta que funciona como ponte entre os arquivos e os batch input / BAPIs. Dá uma olhada nesse passo-a-passo: http://sapbrainsonline.com/TOOLS/LSMW/SAP_LSMW_steps_introduction.html

Já o batch input em si é "exatamente" o que você está fazendo pelo VB, através da transação SM35 você faz a "gravação" das telas automaticamente... Depois pega este "mapeamento" de telas e coloca em um programa SE38.

O VB Script que vocë fez é justamente a utilização deste mapeamento. O programa faria a mesma coisa, porém em ABAP. O tratamento que você pode fazer é superior, você pode associar uma transação a este programa e liberar para os usuários para por exemplo informar o arquivo e mandar executar.

Aqui tem um exemplo em que o camarada fez a gravação da transação exportou a "macro" ou "script", modificou ele externamente e depois importou e executou. http://abap4.tripod.com/download/BatchInputInstructions.pdf

A ferramenta é muito útil, se precisa de programa ou não vai depender da necessidade, expertise de quem vai executar, se é uma vez apenas. Se for de uso comum, então programa.

Estas transações são comuns para o perfil de ABAP/BASIS, em algumas empresas com restrições, bem provavelmente como usuário não terá acesso.

No google tem muita informação, dá uma procurada pelos termos. Se quiser restringir às da SAP usa no google site:sap.com

Atenciosamente, Fernando Da Ró

Former Member
0 Kudos

continua post anterior:

session.findById("wnd[0]/usr/ctxt*PROJ-PSPID").text = ""

session.findById("wnd[0]/usr/ctxt*PROJ-PSPID").text = ""

session.findById("wnd[0]/usr/ctxt*PRPS-POSID").text = pep

session.findById("wnd[0]/usr/ctxt*PRPS-POSID").setFocus

session.findById("wnd[0]/usr/ctxt*PRPS-POSID").caretPosition = 0

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

session.findById("wnd[0]/usr/tabsTABCJLE/tabpLEGR/ssubLISTE:SAPLCJWB:0902/tblSAPLCJWBTAB_902").getAbsoluteRow(0).selected = true

session.findById("wnd[0]/usr/tabsTABCJLE/tabpLEGR/ssubLISTE:SAPLCJWB:0902/tblSAPLCJWBTAB_902/txtPRPS-STUFE[1,0]").setFocus

session.findById("wnd[0]/usr/tabsTABCJLE/tabpLEGR/ssubLISTE:SAPLCJWB:0902/tblSAPLCJWBTAB_902/txtPRPS-STUFE[1,0]").caretPosition = 0

session.findById("wnd[0]/mbar/menu[1]/menu[2]/menu[10]").select

" PROBLEMA"

if err=0 then

session.findById("wnd[1]/usr/btnOPTION2").press

session.findById("wnd[0]/tbar[0]/btn[3]").press

session.findById("wnd[0]/usr/ctxt*PROJ-PSPID").text = ""

session.findById("wnd[0]/usr/ctxt*PRPS-POSID").text = ""

session.findById("wnd[0]/usr/ctxt*PRPS-POSID").setFocus

session.findById("wnd[0]/usr/ctxt*PRPS-POSID").caretPosition = 0

with objExcel

.Windows("Norma_Peps.xls").Activate

.Visible = True

.DisplayAlerts = False

.Sheets("Marcar para Eliminação").Select

.Cells(i,2).Select

.Cells(i,2) = "X"

.ActiveWorkbook.Save

End With

else

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

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

session.findById("wnd[0]/usr/ctxt*PROJ-PSPID").text = ""

session.findById("wnd[0]/usr/ctxt*PRPS-POSID").text = ""

session.findById("wnd[0]/usr/ctxt*PRPS-POSID").setFocus

session.findById("wnd[0]/usr/ctxt*PRPS-POSID").caretPosition = 0

end if

Next

End Function

Continua no próximo post

Former Member
0 Kudos

Fernando, tentarei ser mais claro.

Eu utilizo um arquivo .vbs onde executo a rotina. Este arquivo é externo ao SAP 4.7.

O conteúdo desta rotina segue abaixo:

Dim objExcel, pep, i

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

Set delt = CreateObject("Scripting.FileSystemObject")

Set objExcel = CreateObject("Excel.Application")

TROCA_PEP()

Function TROCA_PEP()

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

session.findById("wnd[0]/tbar[0]/okcd").text = "cj02"

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

session.findById("wnd[0]/usr/ctxt*PROJ-PSPID").text = ""

For i = 2 To 65000

Set objExcel = GetObject(,"Excel.Application")

objExcel.Visible = True

objExcel.DisplayAlerts = False

with objExcel

.Workbooks.Open ("c: oboNorma_Peps.xls")

.Windows("Norma_Peps.xls").Activate

.Visible = True

.DisplayAlerts = False

.Sheets("Marcar para Eliminação").Select

.Cells(i,1).Select

pep = objexcel.Cells(i,1)

.Cells(i,1) = pep

End With

continua no próximo post

former_member182114
Active Contributor
0 Kudos

Bom dia Eduardo,

Tá complicado de ler sua mensagem, poderia postar em dois partes ?

(tem um limite de caracteres que depois dele bagunça tudo, se nao me engano 2.500)

E este script qual é ? VB script ? vi algo de Excel no texto é VBA ? É GuiXT ?

Vc está rodando esse script no SAP ou fora dele ?

Atenciosamente, Fernando Da Ró