1
resposta

SAP GUI Scripting/VBA: Loop de linhas de itens se perde ao inserir múltiplas linhas na FB70/FB60.

Olá, amigos!
Estou automatizando as transações FB70 e FB60 no SAP usando VBA com SAP GUI Scripting. O código abre a transação, preenche os dados do cabeçalho e depois percorre as linhas de uma planilha Excel para inserir itens na tabela SAP (tblSAPLFSKBTABLE).
O problema é que o loop se perde quando:

Preciso inserir uma nova linha no SAP (botão btnROW_INSERT) — isso acontece em documentos com muitas linhas de itens.
Outro usuário não necessariamente tem a mesma quantidade de linhas visíveis na tela.
Após inserir ou rolar, os índices não correspondem mais e o loop não encontra a posição correta para continuar preenchendo.

Aqui está o trecho crítico do código:

' Loop das linhas do Excel
Dim i As Integer, sapRow As Integer
i = 4
sapRow = 0

Do While Sheets("User Input Data").Range("E" & i).Value <> "" 'Line Item


    session.findById("wnd[0]/usr/subITEMS:SAPLFSKB:0100/tblSAPLFSKBTABLE/ctxtACGL_ITEM-HKONT[1," & sapRow & "]").Text = Sheets("User Input Data").Range("P" & i).Value 'Origin GL
    session.findById("wnd[0]/usr/subITEMS:SAPLFSKB:0100/tblSAPLFSKBTABLE/txtACGL_ITEM-WRBTR[4," & sapRow & "]").Text = Sheets("User Input Data").Range("Q" & i).Value 'Amount
    session.findById("wnd[0]/usr/subITEMS:SAPLFSKB:0100/tblSAPLFSKBTABLE/txtACGL_ITEM-ZUONR[9," & sapRow & "]").Text = Sheets("User Input Data").Range("T" & i).Value 'Assignment
    session.findById("wnd[0]/usr/subITEMS:SAPLFSKB:0100/tblSAPLFSKBTABLE/ctxtACGL_ITEM-SGTXT[11," & sapRow & "]").Text = Sheets("User Input Data").Range("U" & i).Value 'Document Text / Invoice Description
    session.findById("wnd[0]/usr/subITEMS:SAPLFSKB:0100/tblSAPLFSKBTABLE/ctxtACGL_ITEM-VBUND[14," & sapRow & "]").Text = Sheets("User Input Data").Range("W" & i).Value 'Trading Partner / LE Recipient
    session.findById("wnd[0]/usr/subITEMS:SAPLFSKB:0100/tblSAPLFSKBTABLE/ctxtACGL_ITEM-KOSTL[17," & sapRow & "]").Text = Sheets("User Input Data").Range("Y" & i).Value 'Origin CC
    session.findById("wnd[0]/usr/subITEMS:SAPLFSKB:0100/tblSAPLFSKBTABLE/ctxtACGL_ITEM-PRCTR[27," & sapRow & "]").Text = Sheets("User Input Data").Range("X" & i).Value 'Origin PC
    session.findById("wnd[0]/usr/subITEMS:SAPLFSKB:0100/tblSAPLFSKBTABLE/ctxtACGL_ITEM-PPRCT[28," & sapRow & "]").Text = Sheets("User Input Data").Range("Z" & i).Value 'Partner PC
    session.findById("wnd[0]/usr/subITEMS:SAPLFSKB:0100/tblSAPLFSKBTABLE/ctxtACGL_ITEM-MATNR[45," & sapRow & "]").Text = Sheets("User Input Data").Range("AA" & i).Value 'Material Number
    session.findById("wnd[0]/usr/subITEMS:SAPLFSKB:0100/tblSAPLFSKBTABLE/ctxtACGL_ITEM-MWSKZ[6," & sapRow & "]").Text = Sheets("User Input Data").Range("R" & i).Value 'Origin Tax Code
    session.findById("wnd[0]/usr/subITEMS:SAPLFSKB:0100/tblSAPLFSKBTABLE/ctxtACGL_ITEM-TXJCD[7," & sapRow & "]").Text = Sheets("User Input Data").Range("S" & i).Value 'Tax Jurisdiction


    Call SendVKeyUntilNoAlert(session)
    
    i = i + 1
    sapRow = sapRow + 1
Loop

Mesmo tentando usar btnROW_INSERT ou rolar com verticalScrollbar.Position, o loop não acompanha corretamente a posição real da linha no SAP.
Pergunta:
Vocês sabem me ajudar a analisar/criar a melhor prática para manter o loop sincronizado com a tabela SAP quando:

  • É necessário inserir novas linhas dinamicamente?
  • A quantidade de linhas visíveis varia entre usuários?
    Devo recalcular RowCount a cada iteração? Existe alguma forma de referenciar a última linha ou usar um método seguro para navegar na tabela sem depender de índices fixos?

Agradeço muito qualquer dica ou exemplo que possam compartilhar!

1 resposta

OII, Gabriela!

Como a sua dúvida é externa ao curso, eu consigo apenas de orientar com algumas sugestões por não ter conhecimento total em que o problema está envolvido. Por isso, deixo as sugestões abaixo, avalie direitinho e teste o que faz sentido para o contexto do seu projeto.

Aqui estão algumas sugestões:

  1. Recalcular a Posição da Linha: Em vez de usar um índice fixo para sapRow, você pode recalcular a posição da linha a cada iteração. Uma abordagem é verificar a quantidade de linhas já preenchidas na tabela SAP antes de inserir novos dados. Isso pode ser feito usando métodos de contagem de linhas disponíveis no SAP GUI Scripting.

  2. Usar Métodos de Navegação do SAP: Em vez de depender de índices fixos, considere usar métodos de navegação que o SAP GUI Scripting oferece. Por exemplo, você pode usar a função findById para localizar elementos com base em propriedades diferentes, como valores de células, em vez de posições fixas.

  3. Inserção de Novas Linhas: Ao inserir uma nova linha, certifique-se de que o script esteja sempre verificando a posição atual da tabela. Você pode usar o método btnROW_INSERT e, em seguida, atualizar a posição da linha atual com base na resposta do SAP após a inserção.

  4. Verificação de Alertas: Após cada inserção ou modificação, use uma função para verificar se há alerta ou mensagens de erro no SAP. Isso pode ajudar a garantir que o script não continue a execução em um estado inconsistente.

Espero que essas sugestões ajudem!

Até mais!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado!