Решено Проверка при сохранении

Тема в разделе "Lotus - Программирование", создана пользователем k85, 10 июл 2015.

  1. k85

    k85 Well-Known Member

    Регистрация:
    11 окт 2011
    Сообщения:
    137
    Симпатии:
    0
    в базе есть проверка на вложение, проверяется на Querysave
    Код (LotusScript):
     Forall item In Doc.Items
    If Ucase(item.Name) = "$FILE" Then
    If  Right$( Lcase(item.Values(0) ),4) = ".pdf"  Then
    Else
    Messagebox "неверный фармат!"
    Continue=False
    Exit Sub
    End If
     
    End If
     
    End Forall
    при создании нового проверяет, потом если открыть на редактирование - проверяет, но если открыть на редактирование вложить файл с неверным расширением, появится сообщение и после этого удалить неверное вложение и вновь его добавить - дает сохранить и не ругается
    Что не так ?
     
  2. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.073
    Симпатии:
    299
    обновление РТ полей и вложений происходит сложным образом
    ваш код это не учитывает
    можно попробовать Update(True), для uidoc, и Update для rtitem (точно действует для текста)
    есть еще хак с подменой инмемори дока http://www-10.lotus.com/ldd/dominowiki.nsf/dx/Working_with_IBM_Lotus_Notes_rich_text_fields
     
  3. k85

    k85 Well-Known Member

    Регистрация:
    11 окт 2011
    Сообщения:
    137
    Симпатии:
    0
    уже как только не пробую - не выходит

    может можно как-то по другому решить, необходимо во вложениях в Body проверять файлы и разрешать вносить (соответственно сохранять) только в определенных форматах документы, например .doc, .jpeg
     
  4. erdi

    erdi Well-Known Member

    Регистрация:
    20 авг 2008
    Сообщения:
    261
    Симпатии:
    36
    1) RT поле скрыть, создать свою кнопку "вложить" и там проверять что пользователь выбрал
    2) попробуй так
    Код (LotusScript):
     Continue=False
    Dim doc As NotesDocument
    Set doc=Source.Document
     
    Dim dname As Variant
    dname=Evaluate({@AttachmentNames}, doc)
     
    If dname(0)<>"" Then
    Forall n In dname
    If Right( Lcase(n),4) = ".pdf" Then
    Continue=True
    Exit Sub
    End If
    End Forall
    End If
    Messagebox "неверный фармат!"
     
  5. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.073
    Симпатии:
    299
    вот набросал:
    Код (LotusScript):
    %REM
    *--------------------------------------------
    Function UpdateUIdoc
    Description: Comments for Function
    %END REM

    Function UpdateUIdoc(uidoc As NotesUIDocument, rtName As String) As NotesUIDocument
    Dim routineName As String
    routineName="UpdateUIdoc"
    On Error GoTo ErrH
    'your code here
        Dim wksp As New NotesUIWorkspace
        Dim ses As New NotesSession
        Dim uidocNew As NotesUIDocument
        Dim doc As NotesDocument
        Dim rti As NotesRichTextItem
        Dim strFieldname As String
     
        uidoc.Refresh True ' do this if the rich text field is editable, to get the current contents in case user has modified them.
        Set doc = uidoc.Document  ' get the back-end document for the document open on screen.
        strFieldname = uidoc.CurrentField ' remember the current field if any
        Set rti = doc.GetFirstItem(rtName)
        rti.Update
        Dim newdoc As NotesDocument, unid As String
        unid=doc.Universalid
        Set newdoc=ses.Currentdatabase.Createdocument()
        Call doc.Copyallitems(newdoc, True)
        doc.SaveOptions = "0" ' In order to close the document without a "do you want to save" prompt. If this is a mail-in doc you may need to set MailOptions="0" also to avoid being prompted.
        Call uidoc.Close(True)
        Delete uidoc
        Set doc=GetDocumentByUNIDSilent(ses.Currentdatabase,unid)
        ForAll itm In doc.Items
            Dim tmp As NotesItem
            Set tmp=itm
            Call tmp.Remove()
        End ForAll
        Call newdoc.Copyallitems(doc,True)
        Set uidocNew = wksp.EditDocument(True, doc, , , , True)
        If Len(strFieldname) > 0 Then uidocNew.GotoField(strFieldname)
    Set UpdateUIdoc=uidocNew
    Quit:
    Exit Function
    ErrH:
    Error Err, RaiseError
    Resume Quit
    End Function
    использование
    Код (LotusScript):
    Sub Querysave(Source As Notesuidocument, Continue As Variant)
    Continue=True
    Set Source=UpdateUIdoc(Source, {body})
    If HasAttachmentName(Source.Document, {*.docx}) Then Msgbox {Attach is not valid}:Continue=False:Exit Sub
    Source.Document.Save True, False
    End Sub
    ф-ции для аттачей
    Код (LotusScript):
    Function AttachmentsName(objdoc As NotesDocument) As Variant
    AttachmentsName=Evaluate("@AttachmentNames(0)", objdoc)
    End Function
    Function HasAttachmentName(objdoc As NotesDocument, wildcard As String) As Boolean
        Dim arr As Variant
        arr=AttachmentsName(objdoc)
        If Not IsEmpty(arr) Then
            If IsArray(arr) Then
                ForAll a In arr
                    If CStr(a) Like wildcard Then
                        HasAttachmentName=True
                        Exit Function
                    End If
                End ForAll
            Else
                If CStr(arr) Like wildcard Then
                    HasAttachmentName=True
                End If
            End If
        End If
    End Function
    [DOUBLEPOST=1436793735,1436793612][/DOUBLEPOST]получение дока из дб оформлена так
    Код (LotusScript):
    Function GetDocumentByUNIDSilent(db As NotesDatabase, UNID As String) As NotesDocument
        On Error GoTo ErrH
        Dim doc As NotesDocument
        Set doc = db.GetDocumentByUNID(UNID)
        If doc.IsValid And Not doc.IsDeleted Then
            'проверка - если, например, недоступен по readers
            If doc.Size > 0 Then
                Set GetDocumentByUNIDSilent = doc
            End If
        End If 
    Quit:
        Exit Function
    ErrH:
    '   RaiseError
        Resume Quit
    End Function
     
  6. k85

    k85 Well-Known Member

    Регистрация:
    11 окт 2011
    Сообщения:
    137
    Симпатии:
    0
    @lmike,
    спасибо! буду пробовать и разбираться
     
  7. k85

    k85 Well-Known Member

    Регистрация:
    11 окт 2011
    Сообщения:
    137
    Симпатии:
    0
    извиняюсь, не могу разобраться немного
    все работает классно, если документ уже был и его просто редактировать, а если новый, то пишет что ошибка в этой строке
    Set Source=UpdateUIdoc(Source, {body})
     
  8. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.073
    Симпатии:
    299
    ну звиняйте :) - я забыл про новые доки, надо в код добавить проверку, на новизну дока и просто использовать newdoc (при получении uidocNew)
     
  9. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.073
    Симпатии:
    299
    после uidoc.Close(True) д.б.
    Код (LotusScript):
        Dim isnew As Boolean
        isnew=doc.Isnewnote
        Delete uidoc
        If Not isnew Then
            Set doc=GetDocumentByUNIDSilent(ses.Currentdatabase,unid)
            ForAll itm In doc.Items
                Dim tmp As NotesItem
                Set tmp=itm
                Call tmp.Remove()
            End ForAll
            Call newdoc.Copyallitems(doc,True)
        Else
            Set doc=newdoc
        End If
     
    сами сопоставьте код
    [DOUBLEPOST=1436809183,1436809067][/DOUBLEPOST]удаление всех айтемов из дока (OnDisk) - м.б. что-то более оптимальное есть, но я заленился
     
    2 пользователям это понравилось.
  10. k85

    k85 Well-Known Member

    Регистрация:
    11 окт 2011
    Сообщения:
    137
    Симпатии:
    0
    при использовать newdoc (при получении uidocNew) , ошибка
    если использовать дебагер , то видно, что в новом документе все поля копируются, а файлы не в само поле Body помещаются, а ниже (вне полей)
     
  11. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.073
    Симпатии:
    299
    код выше не работает?
     
    2 пользователям это понравилось.
  12. k85

    k85 Well-Known Member

    Регистрация:
    11 окт 2011
    Сообщения:
    137
    Симпатии:
    0
    сейчас все удалю и заново попробую, так как не вышло, и уже не могу найти всех своих изменений. лучше все с нуля буду пробовать, просто для новых появилась опять проблема в этом месте Set Source=UpdateUIdoc(Source, {body})
     
  13. k85

    k85 Well-Known Member

    Регистрация:
    11 окт 2011
    Сообщения:
    137
    Симпатии:
    0
    @lmike, спасибо огромнейшее, все заработало, после создания с нуля, все работает отлично
     
  14. k85

    k85 Well-Known Member

    Регистрация:
    11 окт 2011
    Сообщения:
    137
    Симпатии:
    0
    появилась небольшая проблема, ранее после проверки переходило на Queryclose, где запускается заполение протокола изменений документа, а теперь после querysave далее не проходит по остальным и получается не заполняется протокол
     
  15. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.073
    Симпатии:
    299
    оно и понятно - объект убит
     
  16. k85

    k85 Well-Known Member

    Регистрация:
    11 окт 2011
    Сообщения:
    137
    Симпатии:
    0
    просто если проверять на соответствие определенных полей и записывать в протокол, а потом проверять вложение, то если вложение неверно, то человек может не захотеть сохранять ,а история должна уже будет сохраниться.

    если в конце, то уже объекта нет (
     
    #16 k85, 20 июл 2015
    Последнее редактирование модератором: 20 июл 2015
  17. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.073
    Симпатии:
    299
    если не захочет сохраняться док - до квери-сэйв не дойдет
    а если не захочет после запроса - дык записать протокол уже можно было (на QS)
    [DOUBLEPOST=1437398788,1437398630][/DOUBLEPOST]короче - всё можно определить на QS и обновление, вернее код по проверкам перенести в обновление, а на QS вызывать ViewRefresh
     
  18. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.073
    Симпатии:
    299
    еще вариант - вызывать самому
    Код (LotusScript):
    Sub Querysave(Source As Notesuidocument, Continue As Variant)
    Continue=True
    Set Source=UpdateUIdoc(Source, {body})
    If HasAttachmentName(Source.Document, {*.docx}) Then Msgbox {Attach is not valid}:Continue=False:Exit Sub
    Source.Document.Save True, False
    Call PostSave(Source)
    End Sub
    при условии что знаем что делаем ;)
    [DOUBLEPOST=1437411929,1437411909][/DOUBLEPOST]и кстати - QueryClose отрабатывается и так
    [DOUBLEPOST=1437412067][/DOUBLEPOST]
    а вот с этого места поподробнее - где история, что это?
     
  19. k85

    k85 Well-Known Member

    Регистрация:
    11 окт 2011
    Сообщения:
    137
    Симпатии:
    0
    в базе на queryclose выполняется проверка соотвествия полей и вносится в поле информация, если изменили определенные поля, т.е. функция находится там
    но у меня на querysave (если смотреть дебагером) все выполняется , ошибок нет,
    проходит
    If HasAttachmentName...
    Source.Document.Save True, False
    Call PostSave(Source) - переходит и возвращает назад на querysave
    End If

    End Sub
    и выходит
     
  20. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.073
    Симпатии:
    299
    правильно, и что смущает?
     
Загрузка...

Поделиться этой страницей