|
Transient + %IsModified
|
|||
---|---|---|---|
#18+
Проблема следующая: Есть некий класс в нем транзиентное поле, которое рассчитывается при запросе Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9.
Проблема в том что просечивание транзиентного свойства вызывает проставление объекту Modified флага, чего очень очень хотелось бы избежать. Есть ли возможность как то указывать поля, изменение которых будет игнорироваться Modified флагом ? ... |
|||
:
Нравится:
Не нравится:
|
|||
14.03.2013, 18:00 |
|
Transient + %IsModified
|
|||
---|---|---|---|
#18+
sigmov , вчем смысл применения именно поля, а например не метода? Метод бы такой проблемы не создал... ... |
|||
:
Нравится:
Не нравится:
|
|||
14.03.2013, 20:07 |
|
Transient + %IsModified
|
|||
---|---|---|---|
#18+
sigmov , Какая версия $zv? PS: в последних версиях код можно существенно упростить. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.03.2013, 20:29 |
|
Transient + %IsModified
|
|||
---|---|---|---|
#18+
krvsa sigmov , вчем смысл применения именно поля, а например не метода? Метод бы такой проблемы не создал... Потому что есть еще и Set'ер и кроме того клиент-серверное взаимодействие запилено именно на связывание со свойствами А так и [Calculated] бы проблем не создало (собственно с Calculated и работали). Со временем некоторые поля стали настолько "тяжелыми" что пересчитывать их при каждом ..Get() - дорогое удовольствие. авторКакая версия $zv? PS: в последних версиях код можно существенно упростить.Интересно. 2013.1 ... |
|||
:
Нравится:
Не нравится:
|
|||
15.03.2013, 01:40 |
|
Transient + %IsModified
|
|||
---|---|---|---|
#18+
sigmovСо временем некоторые поля стали настолько "тяжелыми" что пересчитывать их при каждом ..Get() - дорогое удовольствие. Фигасе у вас поля! ... |
|||
:
Нравится:
Не нравится:
|
|||
15.03.2013, 08:23 |
|
Transient + %IsModified
|
|||
---|---|---|---|
#18+
krvsaФигасе у вас поля! Знаю. Лучше было бы обойтись без подобных полей, у вас прикладной код Г*(мнение WRC), нужно кодить по другому и тд и тп. Однако я имею то что имею, мои возможности рефакторинга сильно ограничены. Поэтому прошу помочь с решением конкретной проблемы без предложений "сменить мозги и кодить по-людски" )))) ... |
|||
:
Нравится:
Не нравится:
|
|||
15.03.2013, 09:24 |
|
Transient + %IsModified
|
|||
---|---|---|---|
#18+
sigmov , Если делать обычное вычисляемое поле, то можно было бы весь код выше свести к одной строке:Property priceWithTax As %Double [ Calculated, Final, SqlComputeCode = {Set {*} = {price}*(1+{tax})}, SqlComputed ]; Но поскольку у Вас не совсем "обычное" вычисляемое поле, то можно сделать так: Пример кодаClass del.c Extends %Persistent { Property price As %Integer; Property tax As %Integer; /// Цена С НДС Property priceWithTax As %Double(MINVAL = 0) [ Final, Required, SqlComputeCode = {Set {*} = {price}*(1+{tax})}, SqlComputed, Transient ]; /// Получить цену с НДС Method priceWithTaxGet() As %Double [ Final, ServerOnly = 1 ] { Quit (i%price)*(1+(i%tax)) } Method priceWithTaxSet(Arg As %Double) As %Status [ Final, ServerOnly = 1 ] { Quit $$$OK } ClassMethod test() { Do ..%KillExtent() &sql(insert into del.c(price,tax)values(5,5)) Set p=##class(del.c).%OpenId(1) Write "= ",?7,p.priceWithTax,!,"До ",?7,p.priceWithTaxIsModified(),! Set p.priceWithTax=2 Write "= ",?7,p.priceWithTax,!,"После ",?7,p.priceWithTaxIsModified(),! } } Результат: Код: plaintext 1. 2. 3. 4.
Если всё-таки хотите оставить вариант priceWithTaxGet() с присваиванием в i%priceWithTax , то тогда так:/// Получить цену с НДС Method priceWithTaxGet() As %Double [ Final, ServerOnly = 1 ] { Quit:(i%priceWithTax '= "") i%priceWithTax Set Modified=..%IsModified() Set i%priceWithTax = (i%price)*(1+(i%tax)) Do ..%SetModified(Modified) Quit i%priceWithTax } sigmovСо временем некоторые поля стали настолько "тяжелыми" что пересчитывать их при каждом ..Get() - дорогое удовольствие.Почему бы не воспользоваться хранимыми вычисляемыми полями? ... |
|||
:
Нравится:
Не нравится:
|
|||
15.03.2013, 10:46 |
|
Transient + %IsModified
|
|||
---|---|---|---|
#18+
Спасибо за ответ servit Век живи, век учись - не знал что можно проверить какое конкретно поле модифицировано через ..<property>IsModified() Полезная вещь - внедрю для логгирования. Сейчас свойство на памяти сравнивается с <property>getStored для детекции изменений. Однако в остальном смысл примера от меня ускользнул: "заглушить" priceWithTax сеттер и затем сетить это поле и в результате оно не просетится, к чему это? авторЕсли всё-таки хотите оставить вариант priceWithTaxGet() с присваиванием в i%priceWithTax, то тогда так:....Собственно тоже об этом задумывался, но думал есть вариант красивее. Что ж нет - буду юзать что есть. авторПочему бы не воспользоваться хранимыми вычисляемыми полями? Потому что многие из таких полей Слишком тяжелы для хранения, скажем (%ListOfObjects) на 80 элементов - зачем хранить такую портянку? За время хранения данные в хранимом поле могут "критически" устареть. (например в товаре список клиентов которые приобретали данный товар за последний месяц + поле должно пересчитываться в зависимости от выбираемых настроек... хранить - бессмысленно) ... |
|||
:
Нравится:
Не нравится:
|
|||
16.03.2013, 13:21 |
|
|
start [/forum/topic.php?fid=39&msg=38185173&tid=1557209]: |
0ms |
get settings: |
11ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
146ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
54ms |
get tp. blocked users: |
1ms |
others: | 249ms |
total: | 495ms |
0 / 0 |