powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Не дать сохранится свойству типа Persistent
16 сообщений из 16, страница 1 из 1
Не дать сохранится свойству типа Persistent
    #35028992
=Dimon=
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть класс наследник от TPersistent. Он ссылается на другой Persistent класс. Когда мы сохраняем первый, он автоматически вызывает сохранение второго. Как можно повлиять на сохрание? То есть когда я хочу, что б она его сохраняла, когда не надо - не сохраняла. Возможно через RemoveFromSaveSet сделать?
...
Рейтинг: 0 / 0
Не дать сохранится свойству типа Persistent
    #35029009
logist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нужно вызывать Oref.%Save(0), тогда сохраняются только объекты-ссылки, которые
еще ни разу не сохранялись (т.е. у которых Oref.Link.%Id()=""). См. документацию
на %Library.Persistent, метод %Save

Любви.
logist (Сергей Шутов)
ООО Димас, Хабаровск
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Не дать сохранится свойству типа Persistent
    #35029029
=Dimon=
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вопрос не в том, что надо сохранять только те, кто не разу не сохранялись. А как не дать Каше вызвать %Save у свойств объекта. Или просто выкинуть их из очереди как это делает RemoveFromSaveSet.
...
Рейтинг: 0 / 0
Не дать сохранится свойству типа Persistent
    #35029039
logist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если сделать %Save(0), он, насколько я понял документацию, не будет вызываться.

Любви.
logist (Сергей Шутов)
ООО Димас, Хабаровск
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Не дать сохранится свойству типа Persistent
    #35029046
Socratdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В общем, уточню вопрос...

Есть persistent объект A, который ссылается на другой persistent объект B. Свойство трансиентное, инициализируется мною (создается новый объект). При сохранении объекта A система все свойства добавляет в очередь на сохранение и соответственно сохраняет объект В. Мне нужно, чтобы объект В сохранялся не когда этого хочет система, а когда хочу я. Т.е. при выполнении каких-либо действи при определенных условиях я сам сохранял этот объект, в ином случае при сохранении А - объект В не сохранялся.

Пробовали решить проблему следующим образом - когда приходит уведомление объекту В добавиться в очередь на сохранение - при определенных условиях убивали его из этой очереди (используя %RemoveFromSaveSet). При этом падает %Save объекта А -
Код: plaintext
<UNDEFINED>%Save+ 12 ^TEST.A. 1  *%objTX( 1 , 2 )%Save+ 27 ^TEST.А

Собственно сам вопрос - как решить эту проблему?
...
Рейтинг: 0 / 0
Не дать сохранится свойству типа Persistent
    #35029050
Socratdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
И вообще, есть ли какой-либо способ объявления свойства, чтобы ему не посылалось уведомление на сохранение?

Как работает %RemoveFromSaveSet() и когда его следует вызывать? Из-за чего падает %Save() в данном случае?
...
Рейтинг: 0 / 0
Не дать сохранится свойству типа Persistent
    #35029076
logist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Скинь исходники

=logist
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Не дать сохранится свойству типа Persistent
    #35029084
Socratdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Объект А
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
Class TEST.A Extends %Persistent
{

Property objectB As TEST.B;

Method %OnNew(initvalue As %CacheString) As %Status [ Private, ProcedureBlock =  1  ]
{
	s ..objectB=##class(TEST.B).%New()
	Quit $$$OK
}

}

Объект В
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
Class TEST.B Extends %Persistent
{

Property name As %String [ Transient ];

Method %OnAddToSaveSet(depth As %Integer =  3 , insert As %Integer =  0 , callcount As %Integer =  0 ) As %Status [ Private, ProcedureBlock =  1  ]
{
	d:..name="" ..%RemoveFromSaveSet()
	Quit $$$OK
}

}

Выполнение:
Код: plaintext
1.
2.
3.
s А=##class(TEST.A).%New()
w А.%Save()
ОШИБКА # 5002 : Ошибка: <UNDEFINED>%Save+ 12 ^TEST.A. 1  *%objTX( 1 , 2 )
...
Рейтинг: 0 / 0
Не дать сохранится свойству типа Persistent
    #35029086
Socratdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В классе TEST.А следует читать:
Код: plaintext
1.
Property objectB As TEST.B  [ Transient ];
...
Рейтинг: 0 / 0
Не дать сохранится свойству типа Persistent
    #35029189
Ptn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
Class TEST.A Extends %Persistent
{

Property objectB As TEST.B [ Transient ];

Property objectBCopy As %String [ Transient ];

Method %OnNew(initvalue As %CacheString) As %Status [ Private, ProcedureBlock =  1  ]
{
	s ..objectB=##class(TEST.B).%New()
	Quit $$$OK
}

Method %OnBeforeSave(ins As %Library.Boolean =  0 ) As %Status 
{
	s objectBCopy=..objectB
	s objectB=""
	Quit $$$OK
}

Method %OnAfterSave(ins As %Library.Boolean =  0 ) As %Status 
{
	s objectB=..objectBCopy
	s objectBCopy=""
	Quit $$$OK
}

}
...
Рейтинг: 0 / 0
Не дать сохранится свойству типа Persistent
    #35029194
Ptn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хотя код из %OnBeforeSave все таки лучше перенести в %OnAddToSaveSet.
...
Рейтинг: 0 / 0
Не дать сохранится свойству типа Persistent
    #35029265
logist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Похоже, что ход с обнулением свойства - единственный рабочий.

Думаю, что это можно отправить как ошибку в интерсистемс - после исполнения
%OnAddToSaveSet объект из очереди сохранения удаляется, но потом каким-то
чудесным образом опять туда засовывается.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Не дать сохранится свойству типа Persistent
    #35029428
servit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
Class TEST.A Extends %Persistent
{

//автор написал "следует читать как  [Transient]"
Property objectB As TEST.B;

Method %OnNew(initvalue As %CacheString) As %Status [ Private, ProcedureBlock =  1 , ServerOnly =  1  ]
{
	s ..objectB=##class(TEST.B).%New()
	Quit $$$OK
}

Method %OnAddToSaveSet(
	depth As %Integer =  3 ,
	insert As %Integer =  0 ,
	callcount As %Integer =  0 ) As %Status [ Private, ProcedureBlock =  1 , ServerOnly =  1  ]
{
        ;Ваше условие, когда (не)надо сохранять свойство
	set:..objectB.name="" ..objectB=""
	Quit $$$OK
}

}

Class TEST.B Extends %Persistent
{

Property name As %String [ Transient ];

}
...
Рейтинг: 0 / 0
Не дать сохранится свойству типа Persistent
    #35029434
Socratdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо, Ptn!

Подсказал интересную идею, по объявлению свойства как %String - в таком случае объекту не посылается уведомление на сохранение...

Таким образом, проблему полностью удалось решить.
...
Рейтинг: 0 / 0
Не дать сохранится свойству типа Persistent
    #35029448
Socratdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Обошлись без обнуления свойства - в данном случае это лишнее действие.
...
Рейтинг: 0 / 0
Не дать сохранится свойству типа Persistent
    #35029454
Ptn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ДЫк - основная бага работы с транзиентыми свойствами - если указан тип некий объект - в класс вкомпиляются методы доступа к нему - и ваша бага когда класс еще и хранимый.

Если с полем нет никакой хитрой обработки вроде ..objectBGetObjectId() - то типа поля неважен в декларации.
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Не дать сохранится свойству типа Persistent
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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