powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / вопрос по копированию объекта
6 сообщений из 6, страница 1 из 1
вопрос по копированию объекта
    #36775300
Ymka2007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
есть хранимый класс
хочу сделать новую запись и скопировать в нее все свойства одной из предыдущих записей
вопрос как возможно это сделать?
может что то типа merge есть?

Код: plaintext
1.
2.
3.
4.
5.
6.
s o1=##(t1).%OpenId( 1 )
s o2=##(t2).%New()
/// в o2 копируем o1
s o2=o1 ///получается что работаем через o2 c объектом o1
s o2.f1="new"
d o2.%Save()
Приведенный код работает не так как нужно, новая запись не появляется, изменения вносятся в запись .%OpenId(1)
...
Рейтинг: 0 / 0
вопрос по копированию объекта
    #36775312
servit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Посмотрите метод %ConstructClone у класса %Library.RegisteredObject
...
Рейтинг: 0 / 0
вопрос по копированию объекта
    #36775332
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ymka2007 , %Library.Persistent наследуется от %SwizzleObject... А тот в свою очередь от %RegisteredObject... Так вот у этого самого %RegisteredObject есть метод %ConstructClone.

Я в аглицком не очень... Но возможно это то, что нужно.

автор• method %ConstructClone(deep As %Boolean = 0, ByRef cloned As %String, location As %String) as %RegisteredObject
Clone the current object to a new object. If deep is 1 then this does a deep copy which will also copy any subobjects and if deep is 0 then it will create another reference to any subobjects and increment the reference count appropriately. It returns the new cloned object.
Note that even if deep=0 when you clone a parent object in a parent child relationship or a one object of a one to many relationship then it will construct clones of all the child/many objects. This is because a child/many object can only point at a single parent and so if we did not create a clone of these then you would have a relationship with zero items in it. If you really just want to clone the object without these child/many objects then pass deep=-1 to this method.

After the clone is constructed it will call %OnConstructClone(deep,.cloned) if it is defined so that you can perform any additional steps e.g. taking out a lock. This works just the same way as %OnNew() does.

The cloned array is just used internally when doing a deep clone to prevent recursive loops, do not pass anything in at all for this parameter on the initial call. If you write a %OnConstructClone and from here you wish to call %ConstructClone on another object pass in the cloned array, e.g. 'Do oref.%ConstructClone(1,.cloned)' so that it can prevent recursive loops.

The location is used internally to pass the new location for stream objects.
...
Рейтинг: 0 / 0
вопрос по копированию объекта
    #36775346
Фотография DAiMor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ymka2007,

s o2=o1
это не копирование объекта, это копирование ссылки
таким образом ты получаешь 2 ссылки на один объект

для копирования необходимо пользоваться %ConstructClone()
получается вот так
Код: plaintext
1.
2.
3.
4.
5.
6.
s o1=##(t1).%OpenId( 1 )
s o2=o1.%ConstructClone()
/// в o2 копируем o1
///s o2=o1 ///получается что работаем через o2 c объектом o1
s o2.f1="new"
d o2.%Save()
...
Рейтинг: 0 / 0
вопрос по копированию объекта
    #36775394
Ymka2007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
всем спасибо
сработало
дальше %Persistent не удосужился копать )))
...
Рейтинг: 0 / 0
вопрос по копированию объекта
    #36776779
Ptn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нужно только отметить что %ConstructClone на базах 2008 и выше может странно ввести себя с объектами в схеме parent-child.

Я не буду 100% давать гарантию что это именно баг/фича %ConstructClone, но результат такой. При копировании child-а, очищается ссылка на parent-а. И Нужно вручную его еще раз записать
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / вопрос по копированию объекта
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]