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

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

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

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

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

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

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

=logist
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
24.12.2007, 08:59
    #35029084
Socratdv
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не дать сохранится свойству типа Persistent
Объект А
Код: 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
24.12.2007, 09:01
    #35029086
Socratdv
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не дать сохранится свойству типа Persistent
В классе TEST.А следует читать:
Код: plaintext
1.
Property objectB As TEST.B  [ Transient ];
...
Рейтинг: 0 / 0
24.12.2007, 10:01
    #35029189
Ptn
Ptn
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не дать сохранится свойству типа Persistent
Код: 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
24.12.2007, 10:02
    #35029194
Ptn
Ptn
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не дать сохранится свойству типа Persistent
Хотя код из %OnBeforeSave все таки лучше перенести в %OnAddToSaveSet.
...
Рейтинг: 0 / 0
24.12.2007, 10:23
    #35029265
logist
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не дать сохранится свойству типа Persistent
Похоже, что ход с обнулением свойства - единственный рабочий.

Думаю, что это можно отправить как ошибку в интерсистемс - после исполнения
%OnAddToSaveSet объект из очереди сохранения удаляется, но потом каким-то
чудесным образом опять туда засовывается.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
24.12.2007, 11:12
    #35029428
servit
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не дать сохранится свойству типа Persistent
Код: 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
24.12.2007, 11:14
    #35029434
Socratdv
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не дать сохранится свойству типа Persistent
Спасибо, Ptn!

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

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

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


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