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

  • Автор темы Автор темы Sanchezz86
  • Дата начала Дата начала
S

Sanchezz86

Помогите решить проблему.

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

Вот часть кода.
Код:
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
 
Где вызов функции и где инициализация второго параметра target_db
По коду:
Код:
Set example_doc = target_db.GetDocumentByUNID("4B8361C435F3454544257D5100437C8C") 
' Это получение в базе назначения документа по UNID

Set Process = example_doc.CopyToDatabase( target_db )
' А вот это уже в этой же базе назанчения создание копии документа.

Здесь нигде нет копирования из одной базы в другую, тут только копирование в пределах одной базы.
 
Где вызов функции и где инициализация второго параметра target_db
По коду:
Код:
Set example_doc = target_db.GetDocumentByUNID("4B8361C435F3454544257D5100437C8C") 
' Это получение в базе назначения документа по UNID

Set Process = example_doc.CopyToDatabase( target_db )
' А вот это уже в этой же базе назанчения создание копии документа.

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

Все происходит в одной базе.
Я беру документ по UNID, делаю его копию, после меняю почти все поля, в том числе и UNID нового документа.
После пытаюсь сохранить, но при этом создается еще один документ.
Т. е. я имею в итоге исходный док, промежуточный, который создан командой CopyToDatabase и документ созданный после сохранения.
Ранее у меня все это работало. Получалось два дока. Исходный и новый с измененым UNID. Почему так происходит не могу понять уже 2 дня.
 
до замены унида сохранение есть?

Нет. Вся функция в первом сообщении. Удалил только кучу строк с Call Process.ReplaceItemValue("","")
При этом после вызова: Set Process = example_doc.CopyToDatabase( target_db ) в базе появляется документ


Недавно пересоздал базу. Может где настройка бд не правильная?
 
CopyToDatabase - сама по себе уже сохраняет документ...
Новая копия создается только если меняется UniversalID проверял на 9-ке.
Если 2 дня назад работало, то недавно обновляли сервер/клиент?
Впрочем, может это так и в 8-ке работает.

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

Добавлено: OKEN
Ага, при CopyToDatabase
 
CopyToDatabase - сама по себе уже сохраняет документ...
Новая копия создается только если меняется UniversalID проверял на 9-ке.
Если 2 дня назад работало, то недавно обновляли сервер/клиент?
Впрочем, может это так и в 8-ке работает.

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

Добавлено: OKEN
Ага, при CopyToDatabase
Да, все логично. Поставил в тупик тот факт, что ранее агент работал. Вот и пытаюсь понять как он работал.
 
А параметра 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 )
 
А параметра 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 нет. Сейчас все происходит как описано. Интересно, почему ранее сохранялась одна копия?
 
Andre
Ну данный параметр был нужен для исправления ошибки CopyToDatabase, по которой новый UNID как раз таки НЕ генерился.
Это исправили, начиная с 7-ки такого больше нет.
Так же данный параметр для сервера.
Может быть он и работает.

Добавлено:
Интересно, почему ранее сохранялась одна копия?
Изменения были?
Сервер переустанавливали? Клиентов? Машины меняли?
Код где отрабатывает?
 
Ну данный параметр был нужен для исправления ошибки CopyToDatabase, по которой новый UNID как раз таки НЕ генерился.
Это исправили, начиная с 7-ки такого больше нет.

А откуда такая информация, что начиная с 7 этого нет ?

Согласно вот этим ссылкам - очень даже есть, и в качестве фикса предлагается использовать переменную в notes.ini :



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

P.S. Да и функциональность по умолчанию с "сохранением" оригинального UNID бывает очень полезной, например при архивации.
 
Andre
Нет данного параметра на сервере, проверил на наших (правда у нас 8-9), так что если и прошивается, то где-то глубже.
Либо сам метод переопределили, за IBM это водится. Опять же, может настройка и работает, проверять не буду, так как это серверная часть.
Да и на локале это работает именно так - новый UNID, по факту тот же сервер.
Ну и
Однако, справедливости ради стоит отметить, что если документа с таким UNID в базе нет, то копирование таким образом - сохранит первоначальный UNID, но вот если уже есть - создаст новый.
Для первой архивации документа да, это хорошо, для второй (если был восстановлен) - нет.
Лучше использовать запасной вариант с CWC-полем UNID.
А для копирования: связку - CreateDocument + copyAllItems.


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

Ну и

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

Однако, справедливости ради стоит отметить, что если документа с таким UNID в базе нет, то копирование таким образом - сохранит первоначальный UNID, но вот если уже есть - создаст новый.

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

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

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

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