Вложения

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

Статус темы:
Закрыта.
  1. Гость

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

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

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

    Medevic Что это ? :)
    Lotus team

    Регистрация:
    10 дек 2004
    Сообщения:
    3.346
    Симпатии:
    2
    Для: Влад99
    В момент сохранения документа проверять на вложения и ставить пометку в специальное поле.
     
  4. allex

    allex Гость

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

    Код (Text):
    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 - таким вот образом пересчитать вложения
     
  5. Гость

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

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

    Medevic Что это ? :)
    Lotus team

    Регистрация:
    10 дек 2004
    Сообщения:
    3.346
    Симпатии:
    2
    Для: Влад99
    А зачем?
    В QuerySave проверяй.
     
  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
     
  8. Гость

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

    LuMee Well-Known Member

    Регистрация:
    2 май 2006
    Сообщения:
    477
    Симпатии:
    0
    Для: Влад99
    Документ новый в момент выполнения этого кода? Если да, то RT-поле еще не создано (добро пожаловать в мир удивительных особенностей Lotus :(). Надо сначала сохранить док, потом уже проверять его RT-поля.
     
  10. Кирилл Шваб

    Кирилл Шваб Well-Known Member

    Регистрация:
    30 июн 2006
    Сообщения:
    144
    Симпатии:
    4
    Кроме того, ты 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]

    Либо сразу инициализируй:
    либо потом
     
  11. Гость


    Привет =)

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

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

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

    fvoice Гость

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

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

    Код (Text):
    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
     
  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
    Подскажите где грабли?

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

    Так победил проверкой условия rtiitem.EmbeddedObjects = Null
    так как если файл не присоединен в поле то и массив ссылок на встроенные объекты нулевый.
     
  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
     
  16. Гость

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

    Medevic Что это ? :)
    Lotus team

    Регистрация:
    10 дек 2004
    Сообщения:
    3.346
    Симпатии:
    2
    Можно всё проверить в QuerySave без всяких агентов.
    Просто использовать Source.Refresh(True)
    Пример для поля Body:
    Код (Text):
    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
     
  18. sam58

    sam58 Гость

    между Set doc = uidoc.Document и Set rtitem= doc.GetFirstItem("PPasport") поставте для счастья строчку call uidoc.refresh(TRUE) и должно быть счастье.
     
Загрузка...
Статус темы:
Закрыта.

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