Samira Radwan Ответов: 2

Вы должны ввести положительную длительность-VBA


Привет Эксперты,

У меня есть приложение vba, которое я должен поддерживать.
На самом деле я не эксперт по vba, но стараюсь!
приложение в основном получает данные из БД и отправляет эти данные в outlook для создания встречи.
данные сначала отображаются пользователю в форме windows, а затем пользователь должен нажать кнопку, чтобы создать встречу/напоминание в календаре outlook.

при запуске приложения. он дает эту ошибку (-2147467259 вы должны ввести положительную длительность). не совсем уверен, почему, но я уверен, что все даты верны. Я позаботился о том, чтобы дата заказа была до даты прибытия, а также дата встречи всегда была сегодняшней.

Я не создавал это приложение, но я отследил код, и все записи для объекта outlook выглядят правильно. Даже приложение. работает на других машинах, к которым я не могу получить доступ для тестирования. Если он действительно работает на других машинах, то это какие-то конфигурации outlook?

Было бы также здорово, если бы кто-нибудь предложил пример кода, использующего VBA для создания встречи outlook.

Пожалуйста, посоветуйте.

Что я уже пробовал:

' part of the code been written so far
Dim appOutLook          As Object   'Outlook.Application  ' Object '
    Dim olAppt              As Object   'Outlook.AppointmentItem ' '
    Dim olApptFind          As Object   'Outlook.AppointmentItem ' '
    Dim objNameSpace        As Object   'Outlook.Namespace ' Object
    Dim objOutlookFolder    As Object   'Outlook.Folder ' Object
    Dim sFilter             As String
    Dim objAppointment      As Object
    Dim FoldersArray        As Variant
    Dim FolderPath          As String
    Dim sUserCalendar       As String
    Dim myRecipient         As Object   'Outlook.Recipient
    Dim iCalType            As Integer
    Dim sSharedCalendar     As String
    
    iCalType = 1
    RS.Open "SELECT * FROM Container WHERE isnull(UserName,'') = '" & SQLSafe(UCase(Trim(macForm.ConnInfo.User))) & "'", CN, adOpenDynamic, adLockOptimistic
    If Not RS.EOF Then
        sUserCalendar = Trim(F_CFNS(RS.Fields("CalendarLocation")))
        iCalType = F_CFND(RS.Fields("CalendarType"))
        sSharedCalendar = Trim(F_CFNS(RS.Fields("SharedCalendarLocation")))
    End If
    RS.Close
    If Trim(sUserCalendar) = "" And Trim(sSharedCalendar) = "" Then
        MsgBox "Cannot add Calendar Appointment as the Outlook options have not been setup yet."
        Exit Function
    End If
    
    
    Set appOutLook = CreateObject("Outlook.Application")
    Set objNameSpace = appOutLook.GetNamespace("MAPI")
    
    
    If iCalType = 1 Then
        FolderPath = Trim(sUserCalendar) 'Trim(Me.cboOutlookParent.Text) ' "Outlook/Calendar"
        If Trim(FolderPath) = "" Then Exit Function
        FoldersArray = Split(FolderPath, "/")
        Select Case UBound(FoldersArray, 1)
        Case 0
                Set objOutlookFolder = objNameSpace.Folders(FoldersArray(0))
        Case 1
                Set objOutlookFolder = objNameSpace.Folders(FoldersArray(0)).Folders(FoldersArray(1))
        Case 2
                Set objOutlookFolder = objNameSpace.Folders(FoldersArray(0)).Folders(FoldersArray(1)).Folders(FoldersArray(2))
        Case 3
                Set objOutlookFolder = objNameSpace.Folders(FoldersArray(0)).Folders(FoldersArray(1)).Folders(FoldersArray(2)).Folders(FoldersArray(3))
        Case 4
                Set objOutlookFolder = objNameSpace.Folders(FoldersArray(0)).Folders(FoldersArray(1)).Folders(FoldersArray(2)).Folders(FoldersArray(3)).Folders(FoldersArray(4))
        Case Else
                MsgBox "Error Getting Outlook Folder.  Cannot Continue."
                Exit Function
        End Select
    Else
        Set myRecipient = objNameSpace.CreateRecipient(Trim(sSharedCalendar))
        myRecipient.Resolve
        If myRecipient.Resolved Then
            Set objOutlookFolder = objNameSpace.GetSharedDefaultFolder(myRecipient, 9) 'olFolderCalendar)
        Else
            MsgBox "Erorr Accessing Shared Calendar"
            Exit Function
        End If
    End If
    
    
    
    '- Calendar Subject 

    sSubject = ""
    RS.Open "SELECT * FROM Container WHERE isnull(UserName,'') = '" & SQLSafe(UCase(Trim(macForm.ConnInfo.User))) & "'", CN, adOpenDynamic, adLockOptimistic
    If Not RS.EOF Then
        For j = 1 To 5
            If UCase(Trim(F_CFNS(RS.Fields("cboSubjectTab" & j)))) <> "" Or F_CFNS(RS.Fields("SubjectPrefix" & j)) <> "" Then
                sSubject = sSubject & F_CFNS(RS.Fields("SubjectPrefix" & j)) & f_GetSubjectFromOutlookField(UCase(Trim(sContainerNo)), UCase(Trim(F_CFNS(RS.Fields("cboSubjectTab" & j)))), F_CFND(RS.Fields("SubjectField" & j))) & F_CFNS(RS.Fields("SubjectSuffix" & j)) & F_CFNS(RS.Fields("SubjectSeperator"))
            End If
        Next j
    End If
    RS.Close
    '- PO List -                                                                                   
    Dim sPOs As String
    sPOs = "Order No | Line No | Item No" & vbCrLf
    RS.Open "SELECT * FROM ORDLIN WHERE ltrim(rtrim(isnull(POORDLIN_SQL.User_Def_Fld_4,''))) = '" & SQLSafe(sContainerNo) & "' ORDER BY Ord_NO, Line_No", CN, adOpenDynamic, adLockOptimistic
    Do While Not RS.EOF
        sPOs = sPOs & F_CFNS(RS.Fields("Ord_No")) & " | " & F_CFND(RS.Fields("Line_NO")) & " | " & F_CFNS(RS.Fields("Item_No")) & vbCrLf
        RS.MoveNext
    Loop
    RS.Close    
  
    If Trim(sSubject) = "" Then
        sSubject = "Container ETA Appointment: " & sContainerNo
    End If
    sFilter = "[Mileage] = Container:" & sContainerNo & ""
    
    Set objAppointment = objOutlookFolder.Items.Find(sFilter)
    If Not TypeName(objAppointment) = "Nothing" Then
        
        '- EDIT EXISTING APPOINTMENT -                                                                 
        With objAppointment
            '''------------------------------error starts here--- --------
            .start = DateValue(dDate) + TimeValue("08:00")
            .End = DateValue(dDate) + TimeValue("09:00")
            .alldayevent = False
            .Subject = sSubject 'Cntnr:" & sContainerNo & "-" &
            .body = "CONTAINTER CALENDAR APPOINTMENT" & vbCrLf & "Container: " & sContainerNo & vbCrLf & "Auto UPDATED: " & Now() & " By User: " & UCase(Trim(macForm.ConnInfo.User)) & vbCrLf & vbCrLf & sPOs
            If Trim(sCatValue) <> "" Then
                .Categories = Trim(sCatValue)
            End If
            .Save
        End With

Richard Deeming

Ваш код уязвим для SQL-инъекция[^]. НИКОГДА используйте конкатенацию строк для построения SQL-запроса. ВСЕГДА используйте параметризованный запрос.

Все, что вы хотели знать о SQL-инъекции (но боялись спросить) | Трой Хант[^]
Как я могу объяснить SQL-инъекцию без технического жаргона? | Обмен Стеками Информационной Безопасности[^]
Шпаргалка по параметризации запросов / OWASP[^]


И нет, звоню а SQLSafe функция "экранирования" специальных символов не делает ваш код неуязвимым для SQLi!

Samira Radwan

спасибо, Ричард, я знаю о SQL-инъекции и согласен с вами , просто так получилось, что мне приходится поддерживать код, написанный кем-то другим, и исправлять ошибки тоже.
спасибо снова

2 Ответов

Рейтинг:
2

Andy Lanng

Похоже, что вся ваша оболочка снята. Пользователь этого сегмента:

With objAppointment
                        .Start = DateValue(dDate) + TimeValue("08:00")
            .End = DateValue(dDate) + TimeValue("09:00")
            .AllDayEvent = False
            .Subject = sSubject 
            .Body = "CONTAINTER CALENDAR APPOINTMENT" & vbCrLf & "Container: " & sContainerNo & vbCrLf & "Auto UPDATED: " & Now() & " By User: " & UCase(Trim(macForm.ConnInfo.User)) & vbCrLf & vbCrLf & sPOs


Samira Radwan

Привет, Энди, что ты имел в виду, говоря "вся твоя оболочка снята"? код, который вы здесь предоставили, такой же, как и у меня. пожалуйста объяснить. спасибо

Andy Lanng

Я имею в виду регистр, как в верхнем регистре, нижнем регистре, титле и camelCase.
Все свойства objAppointment следует заголовка:
Начать не начинать,
Конец в порядке
AllDayEvent не alldayevent
Тема в порядке
Тело не тело

Samira Radwan

Я изменил (заголовка) не повезло. любое другое предположение о том, что может быть причиной?
Спасибо!

Andy Lanng

Хорошо, попробуйте заменить .End = DateValue (dDate) + TimeValue ("09:00") следующим:
.Duration = 60

Рейтинг:
0

CHill60

Компилятор VBA не чувствителен к регистру (к сожалению).

Я нигде не могу найти в вашем коде, где dDate он либо объявлен, либо инициализирован - если он равен нулю, пуст или что-то еще, то вы не будете устанавливать ни Начало, ни конец встречи и сгенерируете ошибку, которую получаете.

Вы упомянули кучу дат, которые, как вы уверены, верны - я полагаю, в базе данных, но вы, похоже, не помещаете эти даты в объект.

Вы попросили пример кода - то, что у вас есть, кажется прекрасным, но вот еще один пример Создание Встреч С Использованием Данных Электронных Таблиц[^]

EDIT - я нашел ссылку, которая предполагает, что эта ошибка может возникнуть, если права пользователя не были настроены правильно. Это соответствовало бы сценарию "работает на другой машине". Видеть Это.TheLibrarie.Com » вы должны ввести положительную продолжительность[^]


Samira Radwan

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

CHill60

Я обновил свой ответ - очевидно, это сообщение может быть сгенерировано без какого-либо отношения к продолжительности! См. подход в ссылке, которую я предоставил (это был самый короткий и ясный ответ, который я нашел)

Maciej Los

5ед!

CHill60

Спасибо! Я все время забываю, как VBA может выбрасывать странные сообщения, которые часто не имеют никакого отношения к реальной причине. Воспоминания о VB6 ... и осмелюсь сказать, MS-BASIC ... Ох уж эти воспоминания!