Скрипт Lotus: Как исправить ошибку «91 Переменная объекта не задана в FUNCTIONNAME (переменная объекта не задана)» - PullRequest
0 голосов
/ 23 мая 2019

Код при запуске вручную (щелчок правой кнопкой мыши и запуск) работает отлично, но проблема возникает, когда он автоматизирован с использованием расписания. При автоматизации код работает нормально, но в конце выполнения кода происходит сбой с приведенным выше сообщением об ошибке.

Код выглядит нормально, переменные устанавливаются так, как должны, и код работает нормально, когда выполняется вручную.

Sub processJobs(dbCurrent As NotesDatabase)
Dim vwLookup As NotesView
Dim docReq As NotesDocument
Dim dtMonthAgo As New NotesDateTime(Today)
Dim dtDelDate As NotesDateTime
Dim itmDelDate As NotesItem
Dim sender As NotesName
Dim receiver As NotesName
Dim nmServer As NotesName
Dim lngNoOfDays As Long
Dim mail As Email
Dim intCount As Integer
Dim intCountFailed As Integer
Dim strSendTo As String

On Error GoTo ErrorHandler
On Error 4000 GoTo RecipientNameBlank
On Error 4294 GoTo RecipientNotInNAB

Call AgentLog.LogAction("--------- Process Job ---------")

Call dtMonthAgo.AdjustMonth( -1 )  ' set the dtMonthAgo date to one month ago
Call dtMonthAgo.Setanytime() ' remove the time component from the date

Set vwLookup = dbCurrent.Getview("JobView")
vwLookup.Autoupdate = False

Set docReq = vwLookup.Getfirstdocument()

intCount = 0
intCountFailed = 0
Do Until docReq Is Nothing
    Set itmDelDate = docReq.GetFirstItem("DeliveryDate")
    If itmDelDate.Type = 1024 Then
        Set dtDelDate = itmDelDate.DateTimeValue
        Call dtDelDate.SetAnyTime

        If dtMonthAgo.TimeDifference(dtDelDate) > 0  Then
            intCount = intCount + 1
            Set mail = New Email ' send email...
            mail.Subject = "Processed Job"
            mail.HTML = getCompletionHTML(docReq, mail.WebURL)

            Set sender = New NotesName(docReq.JobBy(0))
            Set receiver = New NotesName(docReq.DespatchTo(0))
            Set nmServer = New NotesName(dbCurrent.Server)
            If receiver.Organization = nmServer.Organization Then
                strSendTo = receiver.Abbreviated
                ' send a copy to..
                If sender.Abbreviated <> receiver.Abbreviated Then
                    mail.CopyTo = docReq.JobBy(0)
                End If
            Else
                strSendTo = sender.Abbreviated
            End If

            mail.Send(strSendTo)
            Call agentLog.LogAction(strSendTo & " - Job No: " & docReq.JobNo(0))
   flagDoc:
            ' flag the job...
            Call docReq.Replaceitemvalue("CompletionJob", "Y")
            Call docReq.Replaceitemvalue("CompletionJobDate", Now)
            Call docReq.Save(True, False)
        End If
    End If
    Set docReq = vwLookup.Getnextdocument(docReq)
Loop

Call AgentLog.LogAction("")
Call AgentLog.LogAction("Attempted to send " & CStr(intCount) & " Job")
Call AgentLog.LogAction("Failed to send " & CStr(intCountFailed) & " Job")
Call AgentLog.LogAction("--------- End of job process ---------")

ErrorHandler:
If Not AgentLog Is Nothing Then
    Call AgentLog.LogError(Err, "errorHandler: " & CStr(Err) & " " & Error$ & " in " & LSI_Info(2))
End If
Resume getOut

23/05/2019 00:00:05 errorHandler: 91 Object variable not set in PROCESSJOBS(Object variable not set)

Предполагалось, что агент просматривает представление, получает имена получателей, устанавливает переменные и затем автоматически отправляет электронное письмо. Автоматизируя, он выполняет цикл просмотра и получения / установки имен получателя, но завершается неудачно сразу после получения фамилии, в которой переменная объекта не установлена. Выполнение кода вручную не создает никаких проблем, но этот код должен выполняться автоматически.

Ответы [ 2 ]

2 голосов
/ 23 мая 2019

В вашем ErrorHandler зарегистрируйте (или распечатайте) строку, где произошла ошибка.

ErrHandler:
Print "Got error " & Error$ & " on line " & cstr(Erl)

пример скопирован из IBM

1 голос
/ 23 мая 2019

Вам необходим оператор Exit Sub, чтобы предотвратить попадание кода в обработчик ошибок.

Call AgentLog.LogAction("")
Call AgentLog.LogAction("Attempted to send " & CStr(intCount) & " Job")
Call AgentLog.LogAction("Failed to send " & CStr(intCountFailed) & " Job")
Call AgentLog.LogAction("--------- End of job process ---------")

Exit Sub ' **** You need this

ErrorHandler:
If Not AgentLog Is Nothing Then
    Call AgentLog.LogError(Err, "errorHandler: " & CStr(Err) & " " & Error$ & " in " & LSI_Info(2))
End If
Resume getOut

Вы также, похоже, не инициализируете AgentLog, хотя это может быть глобальным. Успешно ли он записывает эти строки в журнал агента, когда вы запускаете его по расписанию? Если нет, возможно, существует проблема с доступом к базе данных журнала агента на сервере, на котором она запланирована.

...