• Курсы Академии Кодебай, стартующие в мае - июне, от команды The Codeby

    1. Цифровая криминалистика и реагирование на инциденты
    2. ОС Linux (DFIR) Старт: 16 мая
    3. Анализ фишинговых атак Старт: 16 мая Устройства для тестирования на проникновение Старт: 16 мая

    Скидки до 10%

    Полный список ближайших курсов ...

Attachments, Очень нужна помощь!

  • Автор темы OlyaZ
  • Дата начала
O

OlyaZ

мы его узнаем, когда пользователь ткнет

вот у этого выбранного дока мы унид и возьмем...
смотри NotesUIWorkSpace.PickListCollection, NotesCollection.GetFirstDocument

щас пример кода напишу... чего я такой добрый сегодня? ))

спасибочки-спасибочки огромнейшее!!!
жду с нетерпением!!!
 
A

Akupaka

комментил как мог подробно... ;) если будут вопросы, не стесняйся спрашивать...

Код:
Sub Click(Source As Button)
' я предполагаю, что этот код будет работать по кнопке, на форме текущего документа, куда вставляется шаблон
' (не важно новый или открытый для изменения)

On Error 4091 Resume Next ' чтобы перехватить исключение метода NotesDatabase.GetDocumentByUNID, если унид неверный
Dim ws As New NotesUIWorkspace
Dim s As New NotesSession

Dim templatesDb As NotesDatabase
Dim templateCol As NotesDocumentCollection
Dim templateDoc As NotesDocument
Dim templateAttach As NotesRichTextItem

Dim curuiDoc As NotesUIDocument
Dim newuiDoc As NotesUIDocument
Dim curDoc As NotesDocument
Dim curAttach As NotesRichTextItem


Const templateViewName = "AttachTemplates"
Const templateAttachName = "TemplateAttach"

' пытаемся открыть БД, которая с шаблонами
'Set templatesDb = s.GetDatabase("ServerName", "templatesDb.nsf", False)
' для простоты примера все работает в одной базе, но верхней строкой можно открыть любую БД,
' подставив соотв. значения сервера и пути
Set templatesDb = s.CurrentDatabase

' проверяем открылась ли БД
If Not(templatesDb.IsOpen) Then
Msgbox "Не удалось открыть БД шаблонов!"
Exit Sub
End If

' начинаем работать
' предполагаю, что документ с шаблоном будет выбираться из вида с именем/алиасом "AttachTemplates"
' причем выбираться за один раз будет только один шаблон
Set templateCol = ws.PickListCollection(3, False, templatesDb.Server, templatesDb.FilePath, templateViewName, "Выбор шаблона", "Укажите шаблон")
' если пользователь че-то выбрал, то оно будет в коллекции первым доком, иначе - он отказался
Set templateDoc = templateCol.GetFirstDocument
If templateDoc Is Nothing Then
' is - оператор сравнения объектов, Nothing - спец.объект, аналог NULL/nil
' таким образом мы проверяем содержит ли переменная templateDoc объект документа
Exit Sub
Else
' смотрим, есть ли в выбранном шаблоне поле "TemplateAttach",
' предположительно с вложением, но на наличие вложения мы проверять не станем,
' если надо будет, то см. NotesRichTextNavigator
If templateDoc.HasItem(templateAttachName) Then
Set templateAttach = templateDoc.GetFirstItem(templateAttachName)
' на всякий случай проверим тип поля, но это не обязательно, если код абсолютно наш
If templateAttach.Type = RICHTEXT Then
' теперь инициализируем наш текущий документ
Set curuiDoc = ws.CurrentDocument
Set curDoc = curuiDoc.Document
' теперь вытащим из текущег дока поле "Attach", которое будет получать нужные вложения
If curDoc.HasItem("Attach") Then
Set curAttach = curDoc.GetFirstItem("Attach")
' если в текущем доке есть такой итем и он не RichText, то поступим грубо - убъем нафик
If Not(curAttach.Type = RICHTEXT) Then
Set curAttach = Nothing
Call curDoc.RemoveItem("Attach")
End If
End If
' если после вышепроделанных манипуляций объекта нету, значит такого итема нет в документе, создадим!
If curAttach Is Nothing Then
Set curAttach = curDoc.CreateRichTextItem("Attach")
End If

' итак. у нас есть материалы для обработки!
' скопируем значение поля-шаблона и...
' сделаем финт ушами :)
Call curAttach.AppendRTItem(templateAttach)
Call curAttach.Update
' тут один важный момент! если документ новый, то он не будет иметь привязки к форме!
' поэтому для последующего финта, нужно самому эту привязку организовать
' я предполагаю, что документ, в который копируется шаблон, создается по форме "GetTemplateAttach"
If curDoc.GetItemValue("Form")(0) = "" Then
Call curDoc.ReplaceItemValue("Form", "GetTemplateAttach")
End If
' финт заключается в переоткрытии текущего документа без сохранения!
' очень важный финт и полезный :)
Call ws.EditDocument(True, curDoc)
Call curDoc.ReplaceItemValue("SaveOptions", "0")
Call curuiDoc.Close(True)

Else
Messagebox "Ай! Шаблон поломался..."
End If
Else
Messagebox "Шаблон не содержит ничего интересного :)"
End If
End If


End Sub

замечу только, что есть баг в этом способе.
если пользователь до выбора шаблона напишет какой-то текст в поле, куда шаблон приземлится, но не сохранит документ, то этот текст пропадет...
тут либо я что-то упустил, либо это прикол нотеса. если требуется, то, в принципе, никто не мешает где надо вставить вызов метода сохранения текущего документа, до вставки шаблона...
 
O

OlyaZ

Ничего себе, Akupaka!!!

Беру в оборот сий код, надеюсь, все удачно сложится. Еще отпишу.

СПАСИБО!!!
 
A

Akupaka

хех, избавился от глюка который описывал:
код:
Код:
	' сделаем финт ушами :)
Call curAttach.AppendRTItem(templateAttach)
Call curAttach.Update
дополнить, чтобы стало:
Код:
	' сделаем финт ушами :)
Call curDoc.ReplaceItemValue("SaveOptions", "0")
Call curuidoc.Refresh(True)
Call curAttach.AppendRTItem(templateAttach)
Call curAttach.Update
Call curDoc.RemoveItem("SaveOptions")
 
O

OlyaZ

комментил как мог подробно... ;) если будут вопросы, не стесняйся спрашивать...

ну, вроде бы пока все понятно из того, что ты написал. единственное что - у меня как раз вариант с двумя бд. надеюсь, не запуталась.
тока вот при попытке открытия окна выбора шаблона появляется ошибка (см. рис во вложении). что это может быть?
 

Вложения

  • error.jpg
    error.jpg
    7,4 КБ · Просмотры: 639
A

Akupaka

что это может быть?
мне кажется, что это твое приложение... я такой ошибки не встречал, гугл о ней тоже не слышал, похоже...

попробуй отладчик включить и поглядеть на какой строке кода это вылазит...
 
O

OlyaZ

мне кажется, что это твое приложение... я такой ошибки не встречал, гугл о ней тоже не слашал, похоже...

может, дело в том,что у меня 2 бд, и я что-нить непрально сделала.
посмотри, плз, код, кот у меня получился:
Код:
Sub Click(Source As Button)
On Error 4091 Resume Next 
Dim ws As New NotesUIWorkspace
Dim s As New NotesSession

Dim templatesDb As NotesDatabase
Dim templateCol As NotesDocumentCollection
Dim templateDoc As NotesDocument
Dim templateAttach As NotesRichTextItem

Dim curuiDoc As NotesUIDocument
Dim newuiDoc As NotesUIDocument
Dim curDoc As NotesDocument
Dim curAttach As NotesRichTextItem

Const templateViewName = "Templates"
Const templateAttachName = "attache"

Set templatesDb = s.GetDatabase(" ", "сирек2.nsf", False)
Set dstDb = s.GetDatabase(" ", "IT Audit.nsf", False)
Set dstDb = s.CurrentDatabase

If Not(templatesDb.IsOpen) Then
Msgbox "Не удалось открыть БД шаблонов!"
Exit Sub
End If
If Not(dstDb.IsOpen) Then
Msgbox "Dest Db not open"
Exit Sub
End If

Set templateCol = ws.PickListCollection(3, False, templatesDb.Server, templatesDb.FilePath, templateViewName, "Выбор шаблона", "Укажите шаблон")
Set templateDoc = templateCol.GetFirstDocument
If templateDoc Is Nothing Then
Exit Sub
Else
If templateDoc.HasItem(templateAttachName) Then
Set templateAttach = templateDoc.GetFirstItem(templateAttachName)
If templateAttach.Type = RICHTEXT Then
Set curuiDoc = ws.CurrentDocument
Set curDoc = curuiDoc.Document
If curDoc.HasItem("attach_shablon") Then
Set curAttach = curDoc.GetFirstItem("attach_shablon")
If Not(curAttach.Type = RICHTEXT) Then
Set curAttach = Nothing
Call curDoc.RemoveItem("attach_shablon")
End If
End If
If curAttach Is Nothing Then
Set curAttach = curDoc.CreateRichTextItem("attach_shablon")
End If

Call curAttach.AppendRTItem(templateAttach)
Call curAttach.Update
If curDoc.GetItemValue("Form")(0) = "" Then
Call curDoc.ReplaceItemValue("Form", "GetTemplateAttach")
End If

Call ws.EditDocument(True, curDoc)
Call curDoc.ReplaceItemValue("SaveOptions", "0")
Call curuiDoc.Close(True)

Else
Messagebox "Ай! Шаблон поломался..."
End If
Else
Messagebox "Шаблон не содержит ничего интересного :)"
End If
End If
End Sub
 
A

Akupaka

1)
Код:
	Set templatesDb = s.GetDatabase(" ", "сирек2.nsf", False)
первый параметр GetDatabase должно быть имя сервера на котором лежит база. у тебя пробел. варум?

2)
Код:
	Set dstDb = s.GetDatabase(" ", "IT Audit.nsf", False)
Set dstDb = s.CurrentDatabase
это вообще зачем ты сюда добавила?..

3) имя поля "attach_shablon" рекомендую вынести в отдельную константу, чтобы удобно и памяти меньше жрать будет...

4) имя формы ("GetTemplateAttach") не забыла сменить на имя своей формы?
 
O

OlyaZ

1)
первый параметр GetDatabase должно быть имя сервера на котором лежит база. у тебя пробел. варум?

а если у меня БД не на сервере, а локально. по кр мере, пока локально сохранены??? как тогда быть?

2)
Код:
	Set dstDb = s.GetDatabase(" ", "IT Audit.nsf", False)
Set dstDb = s.CurrentDatabase

а как мне тогда обозначить, что у меня 2 бд: в первой -формы с шаблонами, во второй - форма, в которую требуется скопировать вложение

4) имя формы ("GetTemplateAttach") не забыла сменить на имя своей формы?

да, точно, забыла. ща исправлю ;)
 
A

Akupaka

а если у меня БД не на сервере, а локально. по кр мере, пока локально сохранены??? как тогда быть?
пустая строка, во всяком случае, на сколько мне хватает опыта ))

а как мне тогда обозначить, что у меня 2 бд: в первой -формы с шаблонами, во второй - форма, в которую требуется скопировать вложение
так! у тебя документ открыт на уи? ты же в него вставляешь вложение из шаблона? (ты так описала изначально задачу)
тогда тебе не нужен (для текущей задачи) никакая другая база

зы: ты отладчиком (debuger) умеешь пользоваться? проверь с пом. отладчика где ошибка возникает и почему, какие значения в переменных и т.п.?..
 
O

OlyaZ

пустая строка, во всяком случае, на сколько мне хватает опыта ))
то есть "пустая строка" ??? ОООх, у меня скоро взрыв мозга будет!!! :)
Да, и в твоем опыте нисколько не сомневаюсь, а вот собственного, можно сказать, почти нет ;)

так! у тебя документ открыт на уи?
Пардон, а это что значит??? меня просто с лотусом судьба свела 2 месяца назад по великой необходимости, так что пока не совсем владею местным слэнгом

ты отладчиком (debuger) умеешь пользоваться? проверь с пом. отладчика где ошибка возникает и почему, какие значения в переменных и т.п.?..
и отладчиком, к сожалению, еще ни разу не пользовалась.... :(
 
A

Akupaka

help! help! help!

нет, это не призыв о помощи, это призыв читать справку :) к счастью все необходимое там есть

пустая строка = "", пробел = " ", слово Мама = "Мама"
в лотусе локальный сервер (он же клиент) указывается с помощью пустой строки

уи - User Interface, когда ты создаешь или изменяешь документ в лотусе (как и в других программах), ты работаешь с информацией через ее отображение. инофрмация - backend, ее отображение - user interface.

отладчик - File / Tools / Debug LotusScript
 
H

hosm

уи - User Interface, когда ты создаешь или изменяешь документ в лотусе (как и в других программах), ты работаешь с информацией через ее отображение. инофрмация - backend, ее отображение - user interface.
вроде должно быть понятно, но не запутаешь, может, примеры из кода помогут? :)
Если в лотусе открыт документ из БД dstDb, то работу с dstDb в коде можно вообще убрать, ты его получишь напрямую через код ниже:
Set curuiDoc = ws.CurrentDocument - собственно, получение текущего документа, открытого в уи.
и дальше
Set curDoc = curuiDoc.Document - получить его бекендовый документ.

Set templatesDb = s.GetDatabase("", "сирек2.nsf", False) - получение БД Шаблонов с локального сервера. Это тебе нужно, там у тебя вроде шаблоны лежат.

отладчик - File / Tools / Debug LotusScript
Ой, мож зря ты под отладчик послал, может, пока простого обработчика ошибок в коде хватит? ;)

добавить в код кусочек в начале и в конце:
Sub Click(Source As Button)
On Error Goto errhand ' сперва добавить переход на обработчик
On Error 4091 Resume Next ' оставить так, как есть в исходном коде
...
' и тут в конце немного строчек добавить до строки End Sub
exiting:
Exit Sub
errhand:
Msgbox "Ошибка:" & Error & " в строке " & Erl
Resume exiting
End Sub
 
O

OlyaZ

Ураааа! у меня получилось! все работает
учла все замечания, воспользовалась-таки отладчиком, и исправила ошибки...и вот - вложение копируется!!!

тока вот теперь почему-то созданные документы проектов не отображаются в представлении "Проекты" как ответы (раньше все работало). вроде бы уже все настройки представления проверила...пока не нашла, в чем дело...

а за вложения - большущий респект!!!
 
H

hosm

тока вот теперь почему-то созданные документы проектов не отображаются в представлении "Проекты" как ответы (раньше все работало). вроде бы уже все настройки представления проверила...пока не нашла, в чем дело...
Насколько я поняла, нужные документы вообще в представлении есть, проблема лишь в правильном отображении.
Давай сначала проверь, в чем причина - в дизайне представления или в документах-ответах.
Может быть 2 варианта, думаю, скорее всего будет 2й вариант:
Не обижайсь, если расписала слишком подробно :)

1. Неправильно построенное представление. В дизайнере открой это представление и в его свойствах View проверь сразу установку галки Show response documents in hierarchy (на 2-й закладке).
2. Ответный документ потерял ссылку на родителя. Проверяется из клиента лотуса. Выбери неправильный документ ответа в представлении, посмотри его свойства (выбери File - Document properties) и на 2-й закладке увидишь список items (полей) документа. Нужно проверить наличие поля $REF (спец. поле ссылки на родительский документ) и убедиться в корректности информации в нем (должен содержить унид родительского документа). Если это твой вариант, то будем уточнять давльше - возможно, придется такую ссылку сделать кодом (с помощью MakeResponse).
Кстати, ответный документ создается по форме Response? (в дизайнере открыть его форму и посмотреть в свойствах Type на 1й закладке)
 
O

OlyaZ

2. Ответный документ потерял ссылку на родителя.

Да, как раз второй случай, по всей видимости, потому как $REF в свойствах вообще отсутствует. А настройки представлений и форм все есть, проверила уже не один раз.
Созданные документы есть в представлении, тока они теперь все в конце списка, в виде пустой строки. но при при двойном щелчке форма открывается на просмотр.
За подробное описание наоборот спасибо, мне как раз это куда полезнее, хоть понимаю, что и как, а не просто наугад тыкаю :)
 
H

hosm

Как ты создаешь ответный и как сохраняешь?
Часть твоего кода, приведенного выше, это и есть работа с ответом (т.е. текущий документ - это ответный) или с ответом работает другой код? Нужно уяснить, что делается с документом от создания ответа до сохранения и закрытия документа, из-за чего он не становится ответом.
Собственно, от этого зависит, что тебе нужно сделать в твоем коде - добавить
Call docResponse.MakeResponse( docMain )
или просто в нужном месте добавить Call notesUIDocument.Save.
Может, предыдущий подсказчик понятней объяснит, он хорошо объясняет :)
 
A

Akupaka

я раньше писал об одном глюке и как его полечить
исправь свой код в соотв. с описанием и дочерние доки будут нормально создаваться
хех, избавился от глюка который описывал:
код:
Код:
	' сделаем финт ушами :)
Call curAttach.AppendRTItem(templateAttach)
Call curAttach.Update
дополнить, чтобы стало:
Код:
	' сделаем финт ушами :)
Call curDoc.ReplaceItemValue("SaveOptions", "0")
Call curuidoc.Refresh(True)

Call curAttach.AppendRTItem(templateAttach)
Call curAttach.Update

Call curDoc.RemoveItem("SaveOptions")
 
O

OlyaZ

Как ты создаешь ответный и как сохраняешь?
Часть твоего кода, приведенного выше, это и есть работа с ответом (т.е. текущий документ - это ответный) или с ответом работает другой код?

ответ создается кнопкой на представлении. выделяем нужный проект, кликаем кнопку "Создать из шаблона" -> открывается форма, на которой выбираю этап, автоматически беру название выбранного проекта (родительского типа), копирую вложение нужное из бд шаблонов (предыдущий трабл, кот успешно решен), сохраняю. а после закрытия формы, он не отображается как "ответ".
код кнопки "Создать из шаблона":
Код:
Form := @If(@IsResponseDoc; "attach_shablon"; " ");@Command([Compose]; "attach_shablon")
в форме родительского дока в свойствах указан тип "Документ", в форме ответа: тип "Ответ", на второй вкладке галочка на "Формулы наследуют значения из выделенного документа"

В представлении: столбец безымянный с шириной 1, "показывать только ответы", "выводить знак развертки, если строка расширяемая", значение - поле "form_name" (это название формы ответа, кот вычисляется как "название прикрепленного дока + еще одно поле с формы")
столбец "Проект": отмечено "выводить знак развертки, если строка расширяемая", сортировка по возрастанию, с учетом акцентов, значение - поле "name"? содержащее название проекта
 
H

hosm

Проверь вариант выше :)
Если не поможет, ответь на вопрос:
является ли текущий документ вновь созданным документом, как и когда производится его сохранение (до добавления шаблона или после)?
 
Мы в соцсетях:

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