Форум программистов, компьютерный форум, киберфорум
HCL Notes: Программирование
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.88/131: Рейтинг темы: голосов - 131, средняя оценка - 4.88
0 / 0 / 0
Регистрация: 16.07.2007
Сообщений: 849

Связывание объектов Notesdocument

11.01.2011, 16:16. Показов 24096. Ответов 17
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Собственно проблема в чем:

Это некоторый кусок логики при самописном логировании

Есть агент вызываемый через Ajax под Web, в нем получаем (через GetDocumentByUNID) документ (DOC1) изменяем его (пока не сохраняем), передаем этот документ в некоторую функцию в библиотеке, в которой получаем (также через GetDocumentByUNID) этот же документ (DOC2).
Так вот как я понимаю, получается так что и в DOC1 и в DOC2 теперь хранится один и тот же документ, причем = DOC2.

Есть ли возможность избежать этого и иметь оба объекта и DOC1 (измененный агентом) и DOC2 тот же документ но агентом не низменный?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
11.01.2011, 16:16
Ответы с готовыми решениями:

послать сообщение Notesdocument -> Notesdocument
Подскажите пожалуйста как можно послать сообщение от одного NotesDocument другому конечная задача я делаю аналог DialogBox мне надо...

Notesdocument - MS Word - Notesdocument
Всем привет! Прошу помощи. Задача такая: проект (NotesDocument) прилетает на согласование юзеру. В проекте вложенный MS Word документ....

Связывание объектов
Можно ли как-то привязать объект listWidget и Textedit? Чтобы при нажатии на объект listwidget вылезал привязанный к нему textedit ? На ум...

17
0 / 0 / 0
Регистрация: 23.08.2008
Сообщений: 6,252
11.01.2011, 16:21
http://web3.inttrust.ru/Site/itforum.nsf/a...8F?OpenDocument
0
0 / 0 / 0
Регистрация: 19.04.2009
Сообщений: 2,219
11.01.2011, 16:24
М.б. поможет перед открытием DOC2 выполнить DOC1.UniversalID = "какое-то значение"
0
0 / 0 / 0
Регистрация: 16.07.2007
Сообщений: 849
11.01.2011, 17:07
Спасибо.
Помогло получение второго документа через представление.
Не очень красиво конечно, но с подменой ИД мне ещё меньше нравицо)
0
1 / 1 / 0
Регистрация: 04.08.2006
Сообщений: 2,950
11.01.2011, 17:32
Цитата Сообщение от nvy
М.б. поможет перед открытием DOC2 выполнить DOC1.UniversalID = "какое-то значение"
так ведь подмена ИД ведёт к созданию нового дока?!
0
1 / 1 / 0
Регистрация: 07.12.2009
Сообщений: 1,197
12.01.2011, 16:04
Цитата Сообщение от kizarek
Помогло получение второго документа через представление.
Не очень красиво конечно, но с подменой ИД мне ещё меньше нравицо)
Через представление необязательно.
Можно взять БД другим методом. Например, если она была получена по пути, то взять по ReplicaiD и наоборот, док, полученный из этой БД будет другим.
И ещё способ (я чаще всего так делаю) сделать объектам NotesDatabase и NotesSession Delete, а потом взять заново, "инстансы" будут другими и док соответственно тоже будет другим.
0
Tyo
12.01.2011, 18:38
Цитата Сообщение от VladSh
И ещё способ (я чаще всего так делаю) сделать объектам NotesDatabase и NotesSession Delete, а потом взять заново, "инстансы" будут другими и док соответственно тоже будет другим
Есть неприятные побочные эффекты. Все документы, виды и пр., полученные из NotesDatabase тоже обнулятся. Более щедящий подход -- делать Delete переполучаемому документу.
0 / 0 / 0
Регистрация: 19.04.2009
Сообщений: 2,219
13.01.2011, 08:07
Цитата Сообщение от Morpheus
так ведь подмена ИД ведёт к созданию нового дока?!



Цитата Сообщение от kizarek
получаем (через GetDocumentByUNID) документ (DOC1) изменяем его (пока не сохраняем)
Если не сохранять, то новый документ не создастся. Суть моего предложения — "испортить" юнид документа (разумеется, сперва сохранить оригинал в переменной или cfd-поле для последующего восстановления), чтобы открытие с диска не затирало документ. КМК, должно работать, но сам не проверял.
Delete doc в данном случае не поможет, т.к. "убьёт" документ в памяти, а он нам ещё нужен.
0
0 / 0 / 0
Регистрация: 19.04.2009
Сообщений: 2,219
13.01.2011, 09:13
Иллюстрация предложенного метода:
<div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">Код агента</div></div><div class="sp-body"><div class="sp-content">

LotusScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
Sub Initialize
Const fakeUnid = "00000000000000000000000000000000"
 
Dim session As New NotesSession
Dim db As NotesDatabase
Dim doc1 As NotesDocument
Dim doc2 As NotesDocument
Dim unid As String
 
Set db = session.CurrentDatabase
Set doc1 = db.CreateDocument
Call doc1.ReplaceItemValue("Field", "old value")
Call doc1.Save(True, True)
unid = doc1.UniversalID
Delete doc1
Set doc1 = db.GetDocumentByUNID(unid)
Call doc1.ReplaceItemValue("Field", "new value")
doc1.UniversalID = fakeUnid
Set doc2 = db.GetDocumentByUNID(unid)
doc1.UniversalID = unid
Print "doc1.Field=" + doc1.GetItemValue("Field")(0) + "; doc1.unid=" + doc1.UniversalID
Print "doc2.Field=" + doc2.GetItemValue("Field")(0) + "; doc2.unid=" + doc2.UniversalID
Call doc2.Remove(True)
End Sub
Можно завернуть в функцию вида:

LotusScript
1
2
3
4
5
6
7
8
Function getDocOnDisk(doc As Notesdocument) As Notesdocument
Const fakeUnid = "00000000000000000000000000000000"
Dim unid As String
unid = doc.UniversalID
doc.UniversalID = fakeUnid
Set getDocOnDisk = doc.ParentDatabase.GetDocumentByUNID(unid)
doc.UniversalID = unid
End Function
<div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">Пример использования функции</div></div><div class="sp-body"><div class="sp-content">

Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Sub Initialize
Dim session As New NotesSession
Dim db As NotesDatabase
Dim doc1 As NotesDocument
Dim doc2 As NotesDocument
Dim unid As String
 
Set db = session.CurrentDatabase
Set doc1 = db.CreateDocument
Call doc1.ReplaceItemValue("Field", "old value")
Call doc1.Save(True, True)
unid = doc1.UniversalID
Delete doc1
Set doc1 = db.GetDocumentByUNID(unid)
Call doc1.ReplaceItemValue("Field", "new value")
Set doc2 = getDocOnDisk(doc1)
Print "doc1.Field=" + doc1.GetItemValue("Field")(0) + "; doc1.unid=" + doc1.UniversalID
Print "doc2.Field=" + doc2.GetItemValue("Field")(0) + "; doc2.unid=" + doc2.UniversalID
Call doc2.Remove(True)
End Sub
Добавлено
Обнаружен побочный эффект — NoteID сбрасывается в 0, а он к сожалению read-only. Попытка сохранить модифицированный документ вызывает ошибку Notes error: Database already contains a document with thys ID (UNID).
0
1 / 1 / 0
Регистрация: 07.12.2009
Сообщений: 1,197
13.01.2011, 10:24
Цитата Сообщение от TIA
Есть неприятные побочные эффекты. Все документы, виды и пр., полученные из NotesDatabase тоже обнулятся.
Ага, то я, когда надо "чистый" объект (до всех изменений) вытянуть так делал.
Но и не все объекты там при Delete NotesDatabase чистятся, это была фича, я даже в коде всё вручную чищу, начиная с NotesDocumentов и поднимаясь выше.

А сейчас так:

Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
%REM
Function reloadDoc
Description: получение нового инстанса документа
%END REM
Static Function reloadDoc(ND As NotesDocument) As NotesDocument
Dim NDB As NotesDatabase
 
Server$ = ND.ParentDatabase.Server
RID$ = ND.ParentDatabase.ReplicaID
UNID$ = ND.UniversalID
 
Set NDB = New NotesDatabase("", "")
Call NDB.OpenByReplicaID(Server$, RID$)
 
Set reloadDoc = NDB.GetDocumentByUNID(UNID$)
End Function
0
0 / 0 / 0
Регистрация: 19.04.2009
Сообщений: 2,219
13.01.2011, 10:54
VladSh
Можно получить неприятный побочный эффект, если потребуется в одном скрипте получить документы с диска из разных баз. Впрочем, вероятность такой необходимости невелика.
Другим недостатком предлагаемой функции являются статичные локальные переменные (тогда уж объявить статичной только NDB).
0
1 / 1 / 0
Регистрация: 07.12.2009
Сообщений: 1,197
13.01.2011, 14:43
nvy
По первому - траблов не встречал, хотя получаю таким образом доки именно из разных баз.
По второму - какие статичные локальные переменные? Они грохаются при выходе из функции, статичный только возвращаемый результат, который дополнительным параметром возвращать мне неудобно.
0
0 / 0 / 0
Регистрация: 19.04.2009
Сообщений: 2,219
13.01.2011, 15:17
Цитата Сообщение от VladSh
Они грохаются при выходе из функции, статичный только возвращаемый результат, который дополнительным параметром возвращать мне неудобно.
Все переменные, объявленные внутри статической функции, являются статическими, т.е. их значения сохраняются между вызовами, в том числе база данных. Именно поэтому данная функция возвращает документ, а не пустоту. Попробуйте убрать Static в объявлении функции, и она начнёт возвращать Nothyng. Попробуйте добавить в начало функции строку Print "UNID=" + UNID$ и вызовите функцию два раза подряд — в первом случае получите пустой unid, во втором — имеющий значение. Логичнее было бы внутри функции объявить статической только NDB (Static NDB As NotesDatabase).
Что касается первой проблемы, то она, кмк, может возникнуть, когда в ходе исполнения одного скрипта переоткрываются документы из разных баз. В этом случае после второго вызова NDB теряет значение первой базы и, соответственно, должен теряться первый полученный документ. Опытов не ставил, но уверен, что это будет так.

Добавлено Это действительно так, причём даже если брать второй документ из той же базы — NDB затирается и прощай первый документ. Можно добавить второй параметр типа NotesDatabase и передавать в функцию переменную, объявленную в вызывающей процедуре, в этом случае можно и от Static избавиться.
0
1 / 1 / 0
Регистрация: 07.12.2009
Сообщений: 1,197
13.01.2011, 17:29
nvy
Всё верно, так и произошло.
Т.е. для 2-х и более документов в пределах одной базы все эти "конструкции" на катят. Для одного дока, чтобы его взять заново, достаточно.
0
0 / 0 / 0
Регистрация: 23.08.2008
Сообщений: 6,252
13.01.2011, 18:35
ну и в итоге, в общем случае - возвращаемся к варианту byKey ?!
0
1 / 1 / 0
Регистрация: 07.12.2009
Сообщений: 1,197
13.01.2011, 19:00
Цитата Сообщение от lmike
ну и в итоге, в общем случае - возвращаемся к варианту byKey ;) ?!
В общем случае, да, - byKey
А в итоге (по условиям задачи) хватит и одинарной перезагрузки (мне, кстати этого всегда хватало), конечно лучше модифицировав, как предложил nvy
0
Tyo
16.01.2011, 10:43
Цитата Сообщение от lmike
ну и в итоге, в общем случае - возвращаемся к варианту byKey wink.gif ?!
Не, лучше функция nvy с подменой UNID
0 / 0 / 0
Регистрация: 19.04.2009
Сообщений: 2,219
16.01.2011, 11:00
Цитата Сообщение от TIA
Не, лучше функция nvy с подменой UNID
Если нужно сохранять doc1 — не лучше. Эксперименты показали, что подмена unid делает документ "новым", т.е. сбрасывает NoteID в "0", попытка сохранить документ под старым unid вызывает ошибку "Notes error: Database already contains a document with thys ID (UNID)". Для сохранения изменений придётся либо предварительно удалять документ с диска, например, doc2.Remove(True) (и плодить окурки), либо копировать изменения в doc2 и сохранять его. В любом случае танцы с бубном. КМК, лучше использовать доработанный вариант функции от VladSh. Для себя решил взять на вооружение такой вариант:

LotusScript
1
2
3
4
5
6
Function getDocOnDisk(doc As NotesDocument, db As NotesDatabase) As NotesDocument
возвращает сохранённый на диске документ doc, db — переменная для сохранения нового экземпляра бд
Set db = New NotesDatabase("", "")
Call db.OpenByReplicaID(doc.ParentDatabase.Server, doc.ParentDatabase.ReplicaID)
Set getDocOnDisk= db.GetDocumentByUNID(doc.UniversalID)
End Function
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
16.01.2011, 11:00
Помогаю со студенческими работами здесь

Связывание объектов OLE
В объектах OLE есть таблица Экзель, можно ли ее связать с другой таблицей Экзеля? Или наоборот, тоесть если в книге1 (Экзеля) листе1....

Связывание объектов - сервера и библиотеки
Написал библиотеку асинхронного сервера, там у меня имеется класс, описывающий каждое подключение. public class ConnectionInfo ...

Связывание и внедрение объектов MS Word и MS Excel
Связывание и внедрение объектов MS Word и MS Excel. Помогите сделать чёт неполучается

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

Связывание значений полей и свойств объектов разных классов
Здравствуйте. Нужен совет. Имеется переменная типа SolidColorBrush. Есть объект другого класса, и я хочу связать соответствующее его...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Новые блоги и статьи
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при изменении наименования справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере изменения наименования типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru