Не Сохраняется Документ. Создается Лишняя Копия.

Sanchezz86

Well-Known Member
16.06.2010
72
0
24
Москва
#1
Помогите решить проблему.

Есть агент, который создает документ копированием. После заполнения полей пытаюсь сохранить док, но сохраняется
еще одна копия документа, при этом половина полей заполнена в одном, половина в другом.
З.ы. Ранее агент работал корректно.

Вот часть кода.
Код:
Function CreateProcess(mgr_doc As NotesDocument, target_db As NotesDatabase) As NotesDocument
On Error GoTo er

Dim example_doc As NotesDocument
Dim Process As NotesDocument
Set example_doc = target_db.GetDocumentByUNID("4B8361C435F3454544257D5100437C8C") 
Set Process = example_doc.CopyToDatabase( target_db )

Process.Form = "Process"

' здесь просто заполение полей 
'даты 
'основные поля

'допонительная информация


Process.UniversalID = mgr_doc.MaimProccesID(0)
WriteLogToFile( "Process.UniversalID установлен: # " + Process.UniversalID)


Call Process.ComputeWithForm( False, False )
Call Process.Save( False, False )

Set CreateProcess = Process

Exit Function
 

savl

Well-Known Member
Lotus team
28.10.2011
2 116
157
32
#2
Где вызов функции и где инициализация второго параметра target_db
По коду:
Код:
Set example_doc = target_db.GetDocumentByUNID("4B8361C435F3454544257D5100437C8C") 
' Это получение в базе назначения документа по UNID

Set Process = example_doc.CopyToDatabase( target_db )
' А вот это уже в этой же базе назанчения создание копии документа.
Здесь нигде нет копирования из одной базы в другую, тут только копирование в пределах одной базы.
 

Sanchezz86

Well-Known Member
16.06.2010
72
0
24
Москва
#3
Где вызов функции и где инициализация второго параметра target_db
По коду:
Код:
Set example_doc = target_db.GetDocumentByUNID("4B8361C435F3454544257D5100437C8C") 
' Это получение в базе назначения документа по UNID

Set Process = example_doc.CopyToDatabase( target_db )
' А вот это уже в этой же базе назанчения создание копии документа.
Здесь нигде нет копирования из одной базы в другую, тут только копирование в пределах одной базы.
Все происходит в одной базе.
Я беру документ по UNID, делаю его копию, после меняю почти все поля, в том числе и UNID нового документа.
После пытаюсь сохранить, но при этом создается еще один документ.
Т. е. я имею в итоге исходный док, промежуточный, который создан командой CopyToDatabase и документ созданный после сохранения.
Ранее у меня все это работало. Получалось два дока. Исходный и новый с измененым UNID. Почему так происходит не могу понять уже 2 дня.
 

Sanchezz86

Well-Known Member
16.06.2010
72
0
24
Москва
#5
до замены унида сохранение есть?
Нет. Вся функция в первом сообщении. Удалил только кучу строк с Call Process.ReplaceItemValue("","")
При этом после вызова: Set Process = example_doc.CopyToDatabase( target_db ) в базе появляется документ


Недавно пересоздал базу. Может где настройка бд не правильная?
 

savl

Well-Known Member
Lotus team
28.10.2011
2 116
157
32
#6
CopyToDatabase - сама по себе уже сохраняет документ...
Новая копия создается только если меняется UniversalID проверял на 9-ке.
Если 2 дня назад работало, то недавно обновляли сервер/клиент?
Впрочем, может это так и в 8-ке работает.

Мой совет: заменить CopyToDatabase на CreateDocument.
Далее копируете необходимые поля и меняете UNID до первого сохранения.

Добавлено: OKEN
Ага, при CopyToDatabase
 

Sanchezz86

Well-Known Member
16.06.2010
72
0
24
Москва
#7
CopyToDatabase - сама по себе уже сохраняет документ...
Новая копия создается только если меняется UniversalID проверял на 9-ке.
Если 2 дня назад работало, то недавно обновляли сервер/клиент?
Впрочем, может это так и в 8-ке работает.

Мой совет: заменить CopyToDatabase на CreateDocument.
Далее копируете необходимые поля и меняете UNID до первого сохранения.

Добавлено: OKEN
Ага, при CopyToDatabase
Да, все логично. Поставил в тупик тот факт, что ранее агент работал. Вот и пытаюсь понять как он работал.
 

Andre

Well-Known Member
29.07.2004
108
0
#8
А параметра CopyToDatabase_New_UNID со значением "1" в ini-файле случаем нету ?

Если да - то вот эта строка создает и сохраняет док с новым UNID:
Set Process = example_doc.CopyToDatabase( target_db )

Вот эта строка меняет у созданного дока UNID на другой
Process.UniversalID = mgr_doc.MaimProccesID(0)

А вот эта приводит к созданию еще одного документа, т.к. UNID установленный при CopyToDatabase изменен
Call Process.Save( False, False )
 

Sanchezz86

Well-Known Member
16.06.2010
72
0
24
Москва
#9
А параметра CopyToDatabase_New_UNID со значением "1" в ini-файле случаем нету ?

Если да - то вот эта строка создает и сохраняет док с новым UNID:
Set Process = example_doc.CopyToDatabase( target_db )

Вот эта строка меняет у созданного дока UNID на другой
Process.UniversalID = mgr_doc.MaimProccesID(0)

А вот эта приводит к созданию еще одного документа, т.к. UNID установленный при CopyToDatabase изменен
Call Process.Save( False, False )
Параметра в notes.ini нет. Сейчас все происходит как описано. Интересно, почему ранее сохранялась одна копия?
 

savl

Well-Known Member
Lotus team
28.10.2011
2 116
157
32
#10
Andre
Ну данный параметр был нужен для исправления ошибки CopyToDatabase, по которой новый UNID как раз таки НЕ генерился.
Это исправили, начиная с 7-ки такого больше нет.
Так же данный параметр для сервера.
Может быть он и работает.

Добавлено:
Интересно, почему ранее сохранялась одна копия?
Изменения были?
Сервер переустанавливали? Клиентов? Машины меняли?
Код где отрабатывает?
 

Andre

Well-Known Member
29.07.2004
108
0
#11
Ну данный параметр был нужен для исправления ошибки CopyToDatabase, по которой новый UNID как раз таки НЕ генерился.
Это исправили, начиная с 7-ки такого больше нет.
А откуда такая информация, что начиная с 7 этого нет ?

Согласно вот этим ссылкам - очень даже есть, и в качестве фикса предлагается использовать переменную в notes.ini :
Documents copied using CopyToDatabase method reuse same UNID
Some documents created using the LotusScript CopyToDatabase method do not replicate as expected

Допускаю, что при установке клиента или сервера последних версий (или начиная например с 8) этот параметр прошивается автоматически в ini-шку.
Но чтобы менялось поведение метода на противоположное (создание нового UNID вместо сохранения оригинального), вроде информации не встречал.

P.S. Да и функциональность по умолчанию с "сохранением" оригинального UNID бывает очень полезной, например при архивации.
 

savl

Well-Known Member
Lotus team
28.10.2011
2 116
157
32
#12
Andre
Нет данного параметра на сервере, проверил на наших (правда у нас 8-9), так что если и прошивается, то где-то глубже.
Либо сам метод переопределили, за IBM это водится. Опять же, может настройка и работает, проверять не буду, так как это серверная часть.
Да и на локале это работает именно так - новый UNID, по факту тот же сервер.
Ну и SPR# ASHW4X9P8R
Однако, справедливости ради стоит отметить, что если документа с таким UNID в базе нет, то копирование таким образом - сохранит первоначальный UNID, но вот если уже есть - создаст новый.
Для первой архивации документа да, это хорошо, для второй (если был восстановлен) - нет.
Лучше использовать запасной вариант с CWC-полем UNID.
А для копирования: связку - CreateDocument + copyAllItems.


Добавлено:
Но чтобы менялось поведение метода на противоположное (создание нового UNID вместо сохранения оригинального), вроде информации не встречал
Да сам так же - опытным путем узнал.
 

Andre

Well-Known Member
29.07.2004
108
0
#13
Нет данного параметра на сервере, проверил на наших (правда у нас 8-9), так что если и прошивается, то где-то глубже.
Либо сам метод переопределили, за IBM это водится. Опять же, может настройка и работает, проверять не буду, так как это серверная часть.
Да и на локале это работает именно так - новый UNID, по факту тот же сервер.

Ну и SPR# ASHW4X9P8R
Спс, посмотрел.
Вроде, как все то же самое, поведение метода не меняли - ввели параметр в ini - хочешь включай, хочешь выключай. И это вроде-как единственный фикс по этому методу.

Однако, справедливости ради стоит отметить, что если документа с таким UNID в базе нет, то копирование таким образом - сохранит первоначальный UNID, но вот если уже есть - создаст новый.
Тут все логично, как в букваре и написано.
Хотя, на самом деле, при таком копировании сохраняются только последние 16 символов из UNID и ЕМНИП простое сравнение не покажет идентичноcть UNID. Но к теме топика это не относится

Для первой архивации документа да, это хорошо, для второй (если был восстановлен) - нет.
Лучше использовать запасной вариант с CWC-полем UNID.
А для копирования: связку - CreateDocument + copyAllItems.
Ну, если уж строить архивацию на этом методе, то и про подводные камни и варианты спасения в случае ЧП подумать заранее. Поле CWC обычно дублирует UNID - это да, есть такое дело.
Тут советов и рекомендаций не давал, просто привел в качестве возможного примера использования ;-)