Проверка вложения файлов определённых расширений

k85

Well-known member
11.10.2011
158
0
#1
Что делаю не так. Перед сохранением документа проверяю поле вложения на формат файлов

Код:
Set rtitem = BackEndDoc.GetFirstItem( "Body" )
If Not (rtitem Is Nothing) Then
If ( rtitem.Type = RICHTEXT ) Then
If Isempty(rtitem.EmbeddedObjects) Then
Print "Вложения нет..."
Exit Sub
End If
Forall o In rtitem.EmbeddedObjects
If Right$(o.Name,4) = ".doc" Then
….
Else
Messagebox "нельзя использовать формат"
Continue=False
Exit Sub
End If
End Forall
End If
End If
но вкладываю файл не того формата, сохраняю файл и не ругается, открываю документ, пытаюсь сохранить ругается на вложение. Потом удаляю файл вкладываю верный - ОК, не вырный вкладываю после удаления файла из поля - ОК не ругается ?! Почему?
Как сделать, чтоб он проверял поле при удалении и при новом вложении
При удалении одного вложения и вставки нового переходит на строку If Isempty(rtitem.EmbeddedObjects) Then
Print "Вложения нет..."
 

savl

Lotus team
28.10.2011
2 136
105
#2
Изменения RT поля происходят после сохранения, прими это мой юный друг...

Сделай функцию с таким кодом:
Код:
Sub RefreshRT(pUIDoc As NotesUIDocument)
Dim doc As NotesDocument
Set doc = pUIDoc.Document
Dim rti As New NotesRichTextItem(doc, doc.UniversalID)
Call rti.CopyItemToDocument(doc, doc.UniversalID & "_")
Call rti.Remove()
Call doc.RemoveItem(doc.UniversalID & "_")
Dim ws As New NotesUIWorkspace
Call ws.EditDocument(True, doc)	
Call doc.ReplaceItemValue("SaveOptions", "0")
Call pUIDoc.Close()
End Sub
Вызывай ее после добавления вложения или перед проверкой, посмотри что получится.
 

RAJ

Well-known member
17.01.2007
440
0
#5
а если список вложений брать так:
Код:
Dim res as Variant
.....
'разрешенные расширения файлов doc и pdf
res = Evaluate({@RightBack(@AttachmentNames;".")*="doc":"pdf"}, BackEndDoc)
if res(0)<>1 then
Messagebox "нельзя использовать формат"
Continue=False 
end if
.....
 

k85

Well-known member
11.10.2011
158
0
#6
спасибо за ответы, но не могу все равно понять...
оставиляю на QuerySave:
Код:
Set rtitem = BackEndDoc.GetFirstItem( "Body" )
If Not (rtitem Is Nothing) Then
If ( rtitem.Type = RICHTEXT ) Then

Call RefreshRT(Source) 

If Isempty(rtitem.EmbeddedObjects) Then
Print "Вложения нет..."
Exit Sub
End If
Forall o In rtitem.EmbeddedObjects
If Right$(o.Name,4) = ".doc" Then
….
Else
Messagebox "нельзя использовать формат"
Continue=False
Exit Sub
End If
End Forall
End If
End If
и

Код:
Sub RefreshRT(pUIDoc As NotesUIDocument)
Dim doc As NotesDocument
Set doc = pUIDoc.Document
Dim rti As New NotesRichTextItem(doc, doc.UniversalID)
Call rti.CopyItemToDocument(doc, doc.UniversalID & "_")
Call rti.Remove()
Call doc.RemoveItem(doc.UniversalID & "_")
Dim ws As New NotesUIWorkspace
Call ws.EditDocument(True, doc)	
Call doc.ReplaceItemValue("SaveOptions", "0")
Call pUIDoc.Close()
End Sub
при неправ. формате должен меняться влож.файл?
 

NickProstoNick

Статус как статус :)
Lotus team
22.08.2008
1 809
21
#7
не можешь сделать так - сделай по другому.
Запрети вносить файлы напрямую RT-поле.
Опиши диалог выбора файлов. Укажи какие форматы файлов можно тянуть - и проверка в принципе не нужна.
Подошел файл - цепляй его в RT-поле.
А тот кто захочет подсунуть свой файл - он это сделает

А в твоем случае вполне подойдет проверка полей с именем $FILES
На момент сохранения нового документа RT-поля еще не существует, а вот поле $FILES уже есть (если вложили какой-то файл).
Так что делай обход по этим полям - и будет тебе счастье.
И не нужны никакие пересохранения и переоткрытия документа

Ну вот как-то так:
Код:
Sub Querysave(Source As Notesuidocument, Continue As Variant)
Dim BackEndDoc As NotesDocument

Set BackEndDoc = Source.Document

Forall item In BackEndDoc.Items

If Ucase(item.Name) = "$FILE" Then

If Right$( Lcase(item.Values(0) ),4) = ".doc" Then
....
Else
Messagebox "нельзя использовать формат"
Continue=False
Exit Sub
End If

End If

End Forall

End Sub
 

k85

Well-known member
11.10.2011
158
0
#8
NickProstoNick
спасибо! Такого варианта мне достаточно с головой!!!