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

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

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

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

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

  • Автор темы 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
 

savl

Lotus Team
28.10.2011
2 597
310
BIT
180
Где вызов функции и где инициализация второго параметра target_db
По коду:
Код:
Set example_doc = target_db.GetDocumentByUNID("4B8361C435F3454544257D5100437C8C") 
' Это получение в базе назначения документа по UNID

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

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

Sanchezz86

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

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

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

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

hosm

до замены унида сохранение есть?
 
S

Sanchezz86

до замены унида сохранение есть?

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


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

savl

Lotus Team
28.10.2011
2 597
310
BIT
180
CopyToDatabase - сама по себе уже сохраняет документ...
Новая копия создается только если меняется UniversalID проверял на 9-ке.
Если 2 дня назад работало, то недавно обновляли сервер/клиент?
Впрочем, может это так и в 8-ке работает.

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

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

Sanchezz86

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

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

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

Andre

Green Team
29.07.2004
114
1
BIT
1
А параметра 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 )
 
S

Sanchezz86

А параметра 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

Lotus Team
28.10.2011
2 597
310
BIT
180
Andre
Ну данный параметр был нужен для исправления ошибки CopyToDatabase, по которой новый UNID как раз таки НЕ генерился.
Это исправили, начиная с 7-ки такого больше нет.
Так же данный параметр для сервера.
Может быть он и работает.

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

Andre

Green Team
29.07.2004
114
1
BIT
1
Ну данный параметр был нужен для исправления ошибки CopyToDatabase, по которой новый UNID как раз таки НЕ генерился.
Это исправили, начиная с 7-ки такого больше нет.

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

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



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

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

savl

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


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

Andre

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

Ну и

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

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

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

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

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

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