Отправил каждую команду SAP другому субподрядчику и выполнил ее для обработки ошибок

Когда в графический интерфейс SAP отправляется команда, например SAPsession.FindById("wnd[0]").resizeWorkingPane(170, 25, False), и возникает ошибка, я хотел бы зарегистрировать ошибку и позволить сценарию продолжить работу после ввода пользователя (при необходимости), чтобы исправить ошибку. Далее я хочу использовать журнал для проверки ошибок и их исправления.

Я думал сделать это с помощью дополнительного модуля, который обрабатывает команду SAP GUI и улавливает ошибку, как показано ниже.

Я знаю, что приведенный ниже код вообще не тренируется, но это просто иллюстрация того, чего я хотел бы достичь.

Спасибо!


  Private sub DoSomethingInSAP() 
      SAPCommand(SAPsession.FindById("wnd[0]").resizeWorkingPane(170, 25, False))
      SAPCommand(SAPsession.FindById("wnd[0]/tbar[0]/okcd").text = "/nsu3")
      SAPCommand(SAPsession.FindById("wnd[0]").sendVKey(0))
  End Sub

  Private sub SAPCommand(input as ?????)         '//SAPCommand to be executed
      try
           Run SAPCommand
      Catch ex as Exception
           Log("Error: " & input & vbCRLF & ex.tostring)
           msgbox("First fix the error for command: " & vbCRLF & input & vbCRLF & "Next: Click 'Ok' to continue")
      end try
  end sub

Вы действительно используете VBA?

Tim Williams 25.06.2024 18:33
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
1
63
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Я бы предложил что-то вроде следующего:

Private Sub DoSomethingInSAP()
   On Error GoTo error

   SAPsession.FindById("wnd[0]").resizeWorkingPane(170, 25, False)
   SAPsession.FindById("wnd[0]/tbar[0]/okcd").Text = "/nsu3"
   SAPsession.FindById("wnd[0]").sendVKey (0)
   
   Exit Sub
   
error:
   Log("Error: " & input & vbCRLF & ex.tostring)
   MsgBox("First fix the error for command: " & vbCRLF & input & vbCRLF & "Next: Click 'Ok' to continue")
   
   Resume Next
End Sub

Если возникает ошибка с первым FindById, управление переходит к блоку ошибок, где вы можете вести журнал и пользовательский ввод. Resume Next — ключевой элемент вашего сценария. Он вернет управление оператору, следующему за оператором, вызвавшим ошибку, в данном случае второму FindById.

Минус этого подхода заключается в том, что вы не будете знать, какая команда вызвала ошибку при регистрации и пользовательском вводе.

Вот один из способов сделать это, но вам нужно будет добавить номера строк к каждой строке кода, что может вызвать ошибку.

Вам также нужно будет «доверить доступ к проекту VB» в настройках Excel (?).

Совет: Найдите номер строки ошибки в VBA

Стоит отметить, что если ошибка возникает в ненумерованной строке, то Erl вернет номер из самой последней нумерованной строки (или ноль, если цифры не использовались).

Sub Tester()

10  On Error GoTo haveError:
20  Debug.Print "Before error"
30  Debug.Print 1 / 0
40  Debug.Print "After error"

Exit Sub

haveError:
    If MsgBox("Error '" & Err.Description & "' with:" _
               & vbLf & vbLf & GetLine("Module1", "Tester", Erl) & _
               vbLf & vbLf & "Continue?", vbYesNo, "Error") <> vbYes Then Exit Sub
    Resume Next
    
End Sub

'return a numbered a line of code from a named module and method
Function GetLine(module, proc, lineNum)
    Const vbext_pk_Proc = 0
    Dim m As Object, lStart As Long, lEnd As Long, l As Long, txt
    
    Set m = ThisWorkbook.VBProject.VBComponents(module).CodeModule
    lStart = m.ProcStartLine(proc, vbext_pk_Proc)
    lEnd = lStart + m.ProcCountLines(proc, vbext_pk_Proc)
    For l = lStart To lEnd
        txt = Trim(m.Lines(l, 1))
        If txt Like lineNum & " *" Then
            GetLine = txt
            Exit Function
        End If
    Next l
    GetLine = "Line number " & line & " not found"
End Function

Другие вопросы по теме

Неожиданная «внутренняя ошибка» при доступе к моей авторизованной панели управления пользователем после входа в систему
Как получить ошибку SQLite в PHP/Laravel, когда цитируемый столбец не существует
Невозможно подключиться к базе данных Oracle 19c с помощью SSH-туннеля с использованием Python
Как я могу использовать TEST_PROTECT в Unity C Test Framework, чтобы добиться поведения примера
Запрос API Trefle с использованием Elm
Как избежать клонирования при передаче значения в функцию-потребитель, но при необходимости вернуть его в случае ошибки?
Как мне управлять возвращаемым нулевым значением при поиске в реестре в блоке Try-Catch? Получение «Вы не можете вызвать метод для выражения с нулевым значением»
Как получить SEQNO с помощью TONWEB SDK
Почему мое приложение Nuxt перенаправляется на страницу 404 моего хостинг-провайдера, а не на мою пользовательскую страницу error.vue?
Подход и разница между выдачей ошибок и исключений во Flutter/Dart