Проблема с копирование вложений

Тема в разделе "Lotus - Программирование", создана пользователем kilcher, 6 мар 2009.

  1. kilcher

    kilcher Гость

    Всем доброго дня!
    Эта тема поднималась не один раз уже. Но у меня почему то не срабатывает код при создании нового документа.Существует профильный документ,из которого я копирую richtext поля во вновь создаваемый додокумент. Как копировать richtext поля я знаю. код уже отработан на нескольких задачах. Но почему же он не работает в данном случае? Есть предположения в чем ошибка. Вот часть кода

    Set dc1 = db.Search("form=""Attachments""", dt, 0)
    Set doc1 = dc1.GetFirstDocument()

    Set rtitem = doc1.GetFirstItem("Body")
    Call rtitem.CopyItemToDocument(doc, "Body")
    Call doc.Save(True,True,True)
     
  2. Omh

    Omh Lotus team
    Lotus team

    Регистрация:
    4 июл 2007
    Сообщения:
    2.210
    Симпатии:
    0
    Профильный документ - это профайл (getProfileDocument) или именно документ настроечный?
    Как я вижу из кода именно документ.

    Ну и в любом случае тебе Body из последнего документа на форме "Attachment" перетрёт всё, что там было накопировано до этого.
    Тебе надо RTI.AppendRTItem использовать, если есть желание собрать аттачи из нескольких документов в одном.
     
  3. kilcher

    kilcher Гость

    Профильный документ-просто документ. И он один. Попробовала так
    Dim rtitem As Variant,rtitem1 As Variant

    Set dc1 = db.Search("form=""Attachments""", dt, 0)

    Set doc1 = dc1.GetFirstDocument()
    Set rtitem= doc1.GetFirstItem( "Body" )
    Set rtitem1 = doc.GetFirstItem( "Body" )
    Call rtitem.AppendRTItem( rtitem1)

    Опять ничего :)
     
  4. Medevic

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

    Регистрация:
    10 дек 2004
    Сообщения:
    3.346
    Симпатии:
    2
    Что значит при создании нового документа? Интересует, что такое doc и что с ним потом происходит. Дай код полностью.
     
  5. kilcher

    kilcher Гость

    doc это новый документ,doc1-настроечный документ

    Пользователь создает новый документ,а вложения уже автоматически должны появится . Код в Postopen

    Dim workspace As New NotesUIWorkspace
    Dim uidoc As NotesUIDocument
    Set uidoc = workspace.CurrentDocument
    Dim doc As NotesDocument
    Set doc=uidoc.document
    Dim viewdoc As NotesDocument
    Dim view As NotesView
    Dim session As New NotesSession
    Dim db As NotesDatabase
    Set db = session.CurrentDatabase
    Dim rtitem As Variant,rtitem1 As Variant
    Dim dt As New NotesDateTime("07/15/97")
    Dim dc As NotesDocumentCollection
    Dim doc1 As NotesDocument



    If uidoc.IsNewDoc Then

    'счетчик номеров
    If doc.Form(0) ="plan" Then
    Set View = db.GetView(doc.Form(0))
    Set viewdoc = view.GetFirstDocument
    doc.Num=viewdoc.Num(0)+1
    Else
    Dim collection As NotesDocumentCollection
    Dim dateTime As New NotesDateTime( "12/01/94" )
    Set collection = db.Search( {Form="plan"}, dateTime, 0 )
    doc.Num=collection.count+1

    End If

    doc.date_order_begin=""
    doc.date_order_end=""
    doc.Status="Черновик"
    doc.tasks=""

    Set dc1 = db.Search("form=""Attachments""", dt, 0)

    Set doc1 = dc1.GetFirstDocument()
    Set rtitem= doc1.GetFirstItem( "Body" )
    Set rtitem1 = doc.GetFirstItem( "Body" )
    Call rtitem.AppendRTItem( rtitem1)

    End If
     
  6. Medevic

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

    Регистрация:
    10 дек 2004
    Сообщения:
    3.346
    Симпатии:
    2
    doc нужно переоткрывать после операций с ричтекстом.


    А если нормально делать, то копировать вложения надо в коде создания документа.
     
  7. kilcher

    kilcher Гость

    При переоткрытии документа поле так же остается пустым
     
  8. Medevic

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

    Регистрация:
    10 дек 2004
    Сообщения:
    3.346
    Симпатии:
    2
    В коде нет сохранения документа doc.
    Если оно есть, то важно не сохранять открытый документ(uidoc) потом. Нужно переоткрыть его без сохранения.
     
  9. kilcher

    kilcher Гость


    Все таки мне необходимо использовать CopyItemToDocument. Ну так вот,сохранения в коде я не делаю.Но после того,как закрываю и открываю документ поле пустое!!!! Почему то вдругих случая такого не было.Может быть проблема в объеме вложений?
     
  10. Medevic

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

    Регистрация:
    10 дек 2004
    Сообщения:
    3.346
    Симпатии:
    2
    Ну а почему оно не будет пустым, если ты сохранение не делаешь?
     
  11. kilcher

    kilcher Гость


    Хорошо,я делать пробовала только толку 0. Мистика какая-то!
     
  12. Omh

    Omh Lotus team
    Lotus team

    Регистрация:
    4 июл 2007
    Сообщения:
    2.210
    Симпатии:
    0
    Код (Text):
    Set dc1 = db.Search("form=""Attachments""", dt, 0)
    if dc1.Count > 0 then
    dim DstRTItem as NotesRichTextItem
    Set DstRTItem = doc.getFirstItem("Body")
    if DstRTItem is Nothing then Set DstRTItem = New NotesRichTextItem(doc, "Body")

    dim SrcRtiItem as NotesRichTextItem

    Set doc1 = dc1.GetFirstDocument()
    Set SrcRtiItem = doc1.GetFirstItem("Body")
    if Not SrcRtiItem is Nothing then Call DstRTItem.AppendRTItem(SrcRtiItem)
    Set doc1 = dc1.GetNextDocument(doc1)
    end if

    Call DstRTItem.Update
    Call DstRTItem.Compact

    Call doc.Save(True,True,True)
    Писал в нотепаде, не обессудь :)
    И избавляйся от этих тупых суффиксов 1, 2 и т.д.
    Нельзя было называть dc1 как-нибудь вроде AttDc?
     
  13. kilcher

    kilcher Гость


    Спасибо за совет. :) Я кажется поняла в чем проблема. doc.Save не срабатывает
     
  14. Omh

    Omh Lotus team
    Lotus team

    Регистрация:
    4 июл 2007
    Сообщения:
    2.210
    Симпатии:
    0
    Не должен save не отрабатывать.
    У тебя первый параметр (который force) - тру.
     
  15. NickProstoNick

    NickProstoNick Статус как статус :)

    Регистрация:
    22 авг 2008
    Сообщения:
    1.766
    Симпатии:
    39
    kilcher
    а не совсем скромное замечание...
    почему так?
    Dim rtitem As Variant,rtitem1 As Variant

    Может просто тип не правильно указан был?
     
  16. Omh

    Omh Lotus team
    Lotus team

    Регистрация:
    4 июл 2007
    Сообщения:
    2.210
    Симпатии:
    0
    Посмотрел внимательнее код вот этот (из пятого сообщения) - скажу честно, тихий ужас.
    Естественно, никаких variant'ов там быть не должно.
    Естественно, что в PostOpen это работать не будет :)

    Желательно почитать какие-нить редбуки, или best practices, что бы понять как код писать не надо.
    Потому что так, как написано там - писать не надо.

    Обидеть не хотел, просто так есть...
     
  17. kilcher

    kilcher Гость


    Спасибо,конечно. А что должно быть? Item или NotesRichTextItem?

    Так вот,первоначально я так и писала. Только вот проблема совсем не в этом. Вот так
     
  18. Akupaka

    Akupaka А че я?.. О.о

    Регистрация:
    4 окт 2007
    Сообщения:
    3.373
    Симпатии:
    2
    Омх, ты не прав!
    Ты что не знаешь, что такое динамическое приведение типов? или как там эта пурга называется, когда переменная объявлена одним общим типом, а ее содержимое во время исполнения воспринимается правильным типом...
    да хоть все переменные объяви вариантами и все будет работать, кроме случаев, где компилятор затребует явное приведение типа, и кроме случаев где "машина исполнения" кода запутается с автоматическим приведением...
    Все твои замечания можно отнести лишь к некорректному синтаксису...
    doc.Save еще как умеет не отрабатывать в нескольких случаях, например, когда ничего не изменилось %)

    kilcher, а тебе двойка за синтаксис! ну не красиво писать в разнобой объявления переменных и остальной код
    двойка за не использование дебагера и невнимательность!
    посмотри аккуратно свой код из поста №5!
    ты ведь содержимое Body не из настроечного дока, а в настроечный пихать пытаешься! кроме того, не хватает RTItem.Update, ну и переоткрытия документа!

    вот, сравни:
    Код (Text):
        Dim ws As New NotesUIWorkspace
    Dim uidoc As NotesUIDocument
    Dim doc As NotesDocument
    Dim session As New NotesSession
    Dim db As NotesDatabase
    Dim rtitem As Variant, rtitem1 As Variant
    Dim dc As NotesDocumentCollection
    Dim doc1 As NotesDocument

    Set uidoc = ws.CurrentDocument
    Set doc=uidoc.document 
    Set db = session.CurrentDatabase

    If uidoc.IsNewDoc Then
    Set dc = db.Search("form=""AttachCopy""", Nothing, 0)
    If dc.Count > 0 Then
    Set doc1 = dc.GetFirstDocument()
    Set rtitem1= doc1.GetFirstItem("Body")

    Set rtitem = doc.GetFirstItem("Body")
    If rtitem Is Nothing Then
    Set rtitem = doc.CreateRichTextItem("Body")
    End If
    Call rtitem.AppendText("bbb")
    Call rtitem.AppendRTItem(rtitem1)
    Call rtitem.Update
    Call doc.ReplaceItemValue("Form", "AttachCopy")
    Call ws.EditDocument(True, doc)
    Call doc.ReplaceItemValue("SaveOptions", "0")
    Call uidoc.Close(True)
    End If
    End If
    зы: еще Options Declare рекомендую всегда использовать!

    зы2: вот тут я немного забыл, что Омх прав в именовании переменных, нефиг использовать эти индексы rtitem1, rtitem2! видишь, сама и запуталась :)
     
  19. Omh

    Omh Lotus team
    Lotus team

    Регистрация:
    4 июл 2007
    Сообщения:
    2.210
    Симпатии:
    0
    Работать-то с variant'ами будет, я не спорю.
    Но, во-первых, с какой скоростью?
    Во-вторых, я не завидую тому прогеру, который будет сидеть на поддержке программы, написанной на variant'ах :)
    В-третьих, тут можно и нужно избавиться от variant'ов.
    Если мы чётко знаем, что rtitem у нас будет NotesRichTextItem'ом и, по задаче его тип не будет переопределятся, задем декларить его как variant?
    Это удар и по перфомансу, и по читабельность кода.
     
  20. Akupaka

    Akupaka А че я?.. О.о

    Регистрация:
    4 окт 2007
    Сообщения:
    3.373
    Симпатии:
    2
    эээ, товарищ, тут я с тобой спорить не собираюсь! правду говоришь! тяжело с таким кодом...
    но! кто ж тогда писал это?!

    :)
     
Загрузка...
Похожие Темы - Проблема копирование вложений
  1. AgniXRudra
    Ответов:
    2
    Просмотров:
    54
  2. Zloikaktus
    Ответов:
    0
    Просмотров:
    31
  3. c0de3r
    Ответов:
    5
    Просмотров:
    153
  4. DobermannTT
    Ответов:
    10
    Просмотров:
    160
  5. SoulPaladin
    Ответов:
    4
    Просмотров:
    145

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