Вложения

  • Автор темы Guest
  • Дата начала
Статус
Закрыто для дальнейших ответов.
G

Guest

#1
Вопрос следующий можно ли используя язык формул определить, вложен ли файл в конкретное rtf поле документа ?
 
G

Guest

#2
Смысл всей этой канетели в следующем, нужно отобразить виды с разной выборкой. Критерием отбора является наличие прикрепленного файла в одном из нескольких полей.

Нашел @Attachments - можно узнать общее количество прикрепленных файлов к документу, но как определить в каких именно полях прикреплены документы ???
 

Medevic

Что это ? :)
Lotus team
10.12.2004
3 346
1
#3
Для: Влад99
В момент сохранения документа проверять на вложения и ставить пометку в специальное поле.
 
A

allex

#4
А вот по такому примеру ...

Код:
Dim doc As NotesDocument
Dim rtitem As Variant
Dim fileCount As Integer
Const MAX = 100000
fileCount = 0	
'...set value of doc...
Set rtitem = doc.GetFirstItem( "Body" )
If ( rtitem.Type = RICHTEXT ) Then
Forall o In rtitem.EmbeddedObjects
If ( o.Type = EMBED_ATTACHMENT ) _
And ( o.FileSize > MAX ) Then
fileCount = fileCount + 1
Call o.ExtractFile _
( "c:\reports\newfile" & Cstr(fileCount) )
Call o.Remove
Call doc.Save( True, True )
End If
End Forall
End If
fileCount = fileCount + 1 - таким вот образом пересчитать вложения
 
G

Guest

#5
ОК, тогда вопрос другой, нужна так сказать "защита от дурака".
Сделать кнопку и обработчик для вложения в каждой конкретное поле не вопрос.

А если юзверь использует функцию вложить через панель самой Lotus Notes, как это можно перехватить или встроить выполнение своего кода при этом? Есть такие возможности?
 
G

Guest

#7
<!--QuoteBegin-Medevic+11:07:2007, 10:43 -->
<span class="vbquote">(Medevic @ 11:07:2007, 10:43 )</span><!--QuoteEBegin-->зачем?
В QuerySave проверяй.
[snapback]71995" rel="nofollow" target="_blank[/snapback]​
[/quote]

написал такое
Dim ws As NotesUIWorkspace
Dim uidoc As NotesUIDocument
Dim doc As NotesDocument
Dim rtitem As Variant
Dim things As Variant

Set uidoc = ws.CurrentDocument
Set doc = uidoc.Document

Set rtitem= doc.GetFirstItem("PPasport")
Forall things In rtitem.EmbeddedObjects
' If things.type = EMBED_ATTACHMENT Then
' doc.SPOrders(0)="2"
' Elseif things.type = EMBED_OBJECT Then
' doc.SPOrders(0)="2"
' Else
' doc.SPOrders(0)="3"
' End If
' Call doc.Save(True,True)
'Messagebox message
End Forall

На строчку Forall ругается Object variable not set
 
G

Guest

#8
И так и эдак, кто нить подскажите где я туплю....
 

LuMee

Well-known member
02.05.2006
477
0
#9
Для: Влад99
Документ новый в момент выполнения этого кода? Если да, то RT-поле еще не создано (добро пожаловать в мир удивительных особенностей Lotus :(). Надо сначала сохранить док, потом уже проверять его RT-поля.
 

Кирилл Шваб

Well-known member
30.06.2006
145
4
#10
Кроме того, ты ws не инициализировал.

<!--QuoteBegin-Влад99+11:07:2007, 12:51 -->
<span class="vbquote">(Влад99 @ 11:07:2007, 12:51 )</span><!--QuoteEBegin-->написал такое
Dim ws As NotesUIWorkspace
Dim uidoc As NotesUIDocument
Dim doc As NotesDocument
Dim rtitem As Variant
Dim things As Variant

Set uidoc = ws.CurrentDocument
Set doc = uidoc.Document
[snapback]71998" rel="nofollow" target="_blank[/snapback]​
[/quote]

Либо сразу инициализируй:
Dim ws As New NotesUIWorkspace
либо потом
Dim ws As NotesUIWorkspace
...
Set ws = New NotesUIWorkspace
 
G

Guest

#11
Кроме того, ты ws не инициализировал.
Либо сразу инициализируй:
либо потом

Привет =)

не катит и с инициализацией.

Выдает ошибку как при создании нового документа, так и при редактировании старого.

Если при создании документа поле RT не редактируется оно создается или нет в документе?
 
F

fvoice

#12
имхо в PostSave нужно писать, а то он не увидет содержимое поля...

код немного подправил:

Код:
Sub Postsave(Source As Notesuidocument)
Dim ws As New NotesUIWorkspace
Dim doc As NotesDocument
Dim rtitem As NotesRichTextItem

Set doc = source.Document

Set rtitem= doc.GetFirstItem("PPasport")
Forall things In rtitem.EmbeddedObjects
If things.type = EMBED_ATTACHMENT Then
doc.SPOrders="2"
Elseif things.type = EMBED_OBJECT Then
doc.SPOrders="2"
Else
doc.SPOrders="3"
End If
Call doc.Save(True,True)
End Forall
End Sub
 
G

Guest

#13
Сделал немного по другому:
в Postsave:

Dim s As NotesSession
Dim db As NotesDatabase
Dim agent As NotesAgent
Set s = New NotesSession
Set db = s.CurrentDatabase
Set agent = db.GetAgent("SetFlags")
Call agent.Run

в агенте проверяются все рт-поля на предметвложений и установка полей флагов при наличии хоть одного вложенного файла:
Dim s As NotesSession
Dim db As NotesDatabase
Dim view As NotesView
Dim doc As NotesDocument
Dim item As NotesItem
Dim rtitem As Variant
Dim k As Integer
Set s = New NotesSession
Set db = s.CurrentDatabase
Set view = db.GetView("AllProject")
k=0
Set doc = view.GetFirstDocument()
While Not(doc Is Nothing)
Set rtitem = doc.GetFirstItem( "PPassport" )
If ( rtitem.Type = RICHTEXT ) Then
Forall o In rtitem.EmbeddedObjects
If ( o.Type = EMBED_ATTACHMENT ) Then
k=k+1
End If
End Forall
If k>0 Then
Call doc.ReplaceItemValue("SPPassport", "1")
Call doc.Save(True,True)
Else
Call doc.ReplaceItemValue("SPPassport", "0")
Call doc.Save(True,True)
End If
End If
Set doc = view.GetNextDocument(doc)
Wend

k=0
Set doc = view.GetFirstDocument()
While Not(doc Is Nothing)
Set rtitem = doc.GetFirstItem( "PConcept" )
If ( rtitem.Type = RICHTEXT ) Then
Forall o In rtitem.EmbeddedObjects
If ( o.Type = EMBED_ATTACHMENT ) Then
k=k+1
End If
End Forall
If k>0 Then
Call doc.ReplaceItemValue("SPConcept", "1")
Call doc.Save(True,True)
Else
Call doc.ReplaceItemValue("SPConcept", "0")
Call doc.Save(True,True)
End If
End If
Set doc = view.GetNextDocument(doc)
Wend

но чевонто во первых при удалении файла из рт-поля флаг в ноль не сбрасывается
и при запуске агента самостоятельно выдает ошибку во втором блоке на строке
Forall o In rtitem.EmbeddedObjects
Подскажите где грабли?

ЗЫ ошипка в строке вываливается если в поле нет прикрепленного файло, хм собственно енто и пытаюсь проверить нето условие?!?!???
 
G

Guest

#14
Так победил проверкой условия rtiitem.EmbeddedObjects = Null
так как если файл не присоединен в поле то и массив ссылок на встроенные объекты нулевый.
 
G

Guest

#15
Не прокатило то что выше, в агенте определил критерий поднятия флагов по размеру рт-поля.
но терь выдает ошипку при сохранении документа типа одновременное сохранение, возникает конфликт, как нить мона это решить?
вроде все в quaresave прописал правильно, сохранил документ и вызвал агента после, почемуже конфликт??

Sub Querysave(Source As Notesuidocument, Continue As Variant)
Dim s As NotesSession
Dim db As NotesDatabase
Dim doc As NotesDocument
Dim agent As NotesAgent
Set doc = Source.Document
Call doc.Save (True,True)
Set s = New NotesSession
Set db = s.CurrentDatabase
Set agent = db.GetAgent("SetFlags")
Call agent.Run
End Sub
 
G

Guest

#16
Прописал этот же код только в процедуре Postsave. Сохранятся стало нормально.
Уважаемые гуру прошу совета корректно ли я решил проблему или все таки возможны конфликты???
 

Medevic

Что это ? :)
Lotus team
10.12.2004
3 346
1
#17
Можно всё проверить в QuerySave без всяких агентов.
Просто использовать Source.Refresh(True)
Пример для поля Body:
Код:
Sub Querysave(Source As Notesuidocument, Continue As Variant)
Dim rtitem As NotesRichTextItem

Call Source.Refresh(True)
Set rtitem = Source.Document.GetFirstItem("Body")

If Isempty(rtitem.EmbeddedObjects) Then 'нет объектов
End Sub
 
S

sam58

#18
написал такое
Dim ws As NotesUIWorkspace
Dim uidoc As NotesUIDocument
Dim doc As NotesDocument
Dim rtitem As Variant
Dim things As Variant

Set uidoc = ws.CurrentDocument
Set doc = uidoc.Document

Set rtitem= doc.GetFirstItem("PPasport")
Forall things In rtitem.EmbeddedObjects
' If things.type = EMBED_ATTACHMENT Then
' doc.SPOrders(0)="2"
' Elseif things.type = EMBED_OBJECT Then
' doc.SPOrders(0)="2"
' Else
' doc.SPOrders(0)="3"
' End If
' Call doc.Save(True,True)
'Messagebox message
End Forall

На строчку Forall ругается Object variable not set
между Set doc = uidoc.Document и Set rtitem= doc.GetFirstItem("PPasport") поставте для счастья строчку call uidoc.refresh(TRUE) и должно быть счастье.
 
Статус
Закрыто для дальнейших ответов.