• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

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

    Запись на курс до 25 апреля. Получить промодоступ ...

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

  • Автор темы kilcher
  • Дата начала
K

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)
 
O

Omh

Профильный документ - это профайл (getProfileDocument) или именно документ настроечный?
Как я вижу из кода именно документ.

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

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)

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

Medevic

Что это ? :)
Green Team
10.12.2004
3 334
1
BIT
4
Что значит при создании нового документа? Интересует, что такое doc и что с ним потом происходит. Дай код полностью.
 
K

kilcher

Что значит при создании нового документа? Интересует, что такое doc и что с ним потом происходит. Дай код полностью.

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
 

Medevic

Что это ? :)
Green Team
10.12.2004
3 334
1
BIT
4
doc нужно переоткрывать после операций с ричтекстом.


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

kilcher

doc нужно переоткрывать после операций с ричтекстом.


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

Medevic

Что это ? :)
Green Team
10.12.2004
3 334
1
BIT
4
В коде нет сохранения документа doc.
Если оно есть, то важно не сохранять открытый документ(uidoc) потом. Нужно переоткрыть его без сохранения.
 
K

kilcher

В коде нет сохранения документа doc.
Если оно есть, то важно не сохранять открытый документ(uidoc) потом. Нужно переоткрыть его без сохранения.


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

Medevic

Что это ? :)
Green Team
10.12.2004
3 334
1
BIT
4
Ну а почему оно не будет пустым, если ты сохранение не делаешь?
 
O

Omh

Код:
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?
 
K

kilcher

Код:
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?


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

Omh

Не должен save не отрабатывать.
У тебя первый параметр (который force) - тру.
 

NickProstoNick

Статус как статус :)
Lotus Team
22.08.2008
1 851
27
BIT
0
kilcher
а не совсем скромное замечание...
почему так?
Dim rtitem As Variant,rtitem1 As Variant

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

Omh

Посмотрел внимательнее код link removed - скажу честно, тихий ужас.
Естественно, никаких variant'ов там быть не должно.
Естественно, что в PostOpen это работать не будет :)

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

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

kilcher

Посмотрел внимательнее код link removed - скажу честно, тихий ужас.
Естественно, никаких variant'ов там быть не должно.
Естественно, что в PostOpen это работать не будет :)

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

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


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

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

Akupaka

Посмотрел внимательнее код вот этот (из пятого сообщения) - скажу честно, тихий ужас.
Естественно, никаких variant'ов там быть не должно.
Естественно, что в PostOpen это работать не будет smile.gif
Омх, ты не прав!
Ты что не знаешь, что такое динамическое приведение типов? или как там эта пурга называется, когда переменная объявлена одним общим типом, а ее содержимое во время исполнения воспринимается правильным типом...
да хоть все переменные объяви вариантами и все будет работать, кроме случаев, где компилятор затребует явное приведение типа, и кроме случаев где "машина исполнения" кода запутается с автоматическим приведением...
Все твои замечания можно отнести лишь к некорректному синтаксису...
doc.Save еще как умеет не отрабатывать в нескольких случаях, например, когда ничего не изменилось %)

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

вот, сравни:
Код:
	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! видишь, сама и запуталась :)
 
O

Omh

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

Akupaka

Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!