powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / %OpenId и объекты в памяти
12 сообщений из 12, страница 1 из 1
%OpenId и объекты в памяти
    #34893934
Фотография u78
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ситуация:
> s Obj=##class(User).%OpenId(1)
> s Obj.SomeProperty = "New Value" //старое значение - Old Value
> s Obj2=##class(User).%OpenId(1)
> w Obj2.SomeProperty
New Value

Вопрос: как заставить Obj2 считать объект из базы а не "подключиться" к существующему объекту в памяти? (вариант c %Reload не предлагайте, т.к. он изменит Obj)
...
Рейтинг: 0 / 0
%OpenId и объекты в памяти
    #34894147
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Интересная фигня!
А я наивно полагал что пока не сделаеш
Код: plaintext
d Obj.%Save()
Другой экземпляр объекта будет использовать то, что в "БД"...
----------
Cache for Windows NT (Intel) 5.0.20 (Build 6305) Fri Sep 16 2005 11:54:10 EDT
...
Рейтинг: 0 / 0
%OpenId и объекты в памяти
    #34894238
Ptn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И восхвалим мы SYSTEM OREF и уверуем в него...

PS: Если это делать в разных процессах (соседних терминалах) - то будет OldValue
...
Рейтинг: 0 / 0
%OpenId и объекты в памяти
    #34894293
Фотография u78
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
krvsaА я наивно полагал что пока не сделаеш %Save
Другой экземпляр объекта будет использовать то, что в "БД"...
If a version of the specified object is already in memory, then %Open increments the object's reference count and returns the OREF value referring to this version. Конституция РФ, статья %Library.Persistent часть %Open
...
Рейтинг: 0 / 0
%OpenId и объекты в памяти
    #34894299
Ptn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Насколько я понимаю задача состоит в том что бы имет состояние объекта до изменения...

Навскидку есть несколько вариантов - первый использовать для второй выборки SQL
Код: plaintext
1.
2.
3.
4.
5.
6.
> s Obj=##class(User).%OpenId( 1 )
> s Obj.SomeProperty = "New Value" //старое значение - Old Value
>&SQL(SELECT SomeProperty INTO : Obj2("SomeProperty") FROM User WHERE %ID= 1 )
>set:SQLCODE'= 0  Obj2("SomeProperty")=""
> w Obj2("SomeProperty")
Old Value

Вариант второй сделать внутри объекта поле ссылку на самого себя - объявить его транзиентным.

И в обработчиках %OnNew() и %OnOpen() вставить создание клона
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
Class User {
...
Property Shadow As User [ Transient ];
Property ShadowIsLoad As %Boolean [ InitialExpression =  0 ,Transient ];
..
}

Method %OnOpen() As %Library.Status 
{
 set:i%ShadowIsLoad= 0  i%Shadow=..%ConstructClone(),i%ShadowIsLoad= 1 
}
После чего "должно" быть так
Код: plaintext
1.
2.
3.
4.
> s Obj=##class(User).%OpenId( 1 )
> s Obj.SomeProperty = "New Value" //старое значение - Old Value
> w Obj.Shadow.SomeProperty," -> ",Obj.SomeProperty,!
Old Value -> New Value
...
Рейтинг: 0 / 0
%OpenId и объекты в памяти
    #34894505
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мы используем SQL-ный вариант чтения данных... Классовый только для внесения изменений. Но и тут иной раз обходимся SQL-ем...
----------
Cache for Windows NT (Intel) 5.0.20 (Build 6305) Fri Sep 16 2005 11:54:10 EDT
...
Рейтинг: 0 / 0
%OpenId и объекты в памяти
    #34894612
Александр Коблов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть ещё такое GetStored
http://127.0.0.1:8972/csp/docbook/DocBook.UI.Page.cls?KEY=GCV1_developer#GCV1_C58486
Код: plaintext
1.
2.
3.
4.
5.
USER>s p=##class(User.EMP).%OpenId( 57 )
USER>s p.EMPNO= 100 
USER>s q=##class(User.EMP).%OpenId( 57 )
USER>w q.EMPNOGetStored( 57 )
 7934 
Насколько, правда, вам подойдет...
Это с версии 5.1
--------
Cache for Windows (Intel) 5.2.3 (Build 710U) Tue Dec 12 2006 10:15:11 EST
...
Рейтинг: 0 / 0
%OpenId и объекты в памяти
    #34902851
Фотография u78
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ptn
Вариант второй сделать внутри объекта поле ссылку на самого себя - объявить его транзиентным.
И в обработчиках %OnNew() и %OnOpen() вставить создание клона
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
Class User {
...
Property Shadow As User [ Transient ];
Property Prefix As %String [Required];
Property ShadowIsLoad As %Boolean [ InitialExpression =  0 ,Transient ];
..
}

Method %OnOpen() As %Library.Status 
{
 set:i%ShadowIsLoad= 0  i%Shadow=..%ConstructClone(),i%ShadowIsLoad= 1 
}


Так и сделал, осталась маленькая мелочь. При сохранении объекта User (обратите внимание на свойство Prefix), если у объекта Shadow его не заполнить, но сохранение не происходит, хотя Shadow - transient. Приходится в методе сохранения, очищать Shadow перед %Save, а затем восстанавливать. У Вас так же, или это я что то упустил?
...
Рейтинг: 0 / 0
%OpenId и объекты в памяти
    #34906267
Ptn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У нас такое вообще не используется :-) это был экспромт... проблема из-за Required поля - и возникает она в волидате методе...

Можно при помощи дополнителной тразиентой галки всегда заставить считать Shadow корректным... но учитывая IS ... стирать Shadow наверное лучше ...

Точне я бы сказал что ....
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
Method %OnAddToSaveSet(depth As %Integer =  3 , insert As %Integer =  0 , callcount As %Integer =  0 ) As %Status [ Private ]
{
 .....
 set i%Shadow="",i%ShadowIsLoad= 0 
 quit $$$OK
}

Method %OnBeforeSave(ins As %Library.Boolean =  0 ) As %Library.Status
{
 .....
 set i%Shadow="",i%ShadowIsLoad= 0 
 quit $$$OK
}

Method %OnAfterSave(ins As %Library.Boolean =  0 ) As %Library.Status
{
 .....
  set:i%ShadowIsLoad= 0  i%Shadow=..%ConstructClone(),i%ShadowIsLoad= 1 
}


в 5-ке половину того что делали в %OnBeforeSave приходится выполнять в %OnAddToSaveSet

ЗЫ: Кстате вариант Александр Коблов с GetStorted все таки выглядить привлекательнее IMXO
...
Рейтинг: 0 / 0
%OpenId и объекты в памяти
    #34906284
Ptn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Третий вариант :-))) сделать так ...

Код: plaintext
1.
2.
3.
Property Shadow As %String [ Transient ];
или
Property Shadow As %CacheString [ Transient ];

Типы свойств в Каше собсно только при сохранении и проверяются - а доступ при налиии в переменно OREF ссылки должен работать
...
Рейтинг: 0 / 0
%OpenId и объекты в памяти
    #34907131
Фотография u78
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PtnТретий вариант :-))) сделать так ...

Код: plaintext
1.
2.
3.
Property Shadow As %String [ Transient ];
или
Property Shadow As %CacheString [ Transient ];

Типы свойств в Каше собсно только при сохранении и проверяются - а доступ при налиии в переменно OREF ссылки должен работать
именно так всё работает.
А почему переносили в OnAddToSaveSet?
...
Рейтинг: 0 / 0
%OpenId и объекты в памяти
    #34907263
Ptn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
начиная с 5-ки что то изменилось.... и такое впечателение что после OnAddToSaveSet модификация полей не устанавливает бит IsModifed

В итоге если имелся в объекте например массив строк - то его изменение в OnBeforSave не сохранялась ... обычные (регулярные поля) вроде сохранялись ?

В ветке 4.x такого не было. Все что поменял в OnBeforSave все ушло в базу.
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / %OpenId и объекты в памяти
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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