powered by simpleCommunicator - 2.0.50     © 2025 Programmizd 02
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Transient + %IsModified
8 сообщений из 8, страница 1 из 1
Transient + %IsModified
    #38184445
sigmov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Проблема следующая:
Есть некий класс в нем транзиентное поле, которое рассчитывается при запросе

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
/// Цена С НДС
Property priceWithTax As %Double(MINVAL = 0) [ Final, Required, SqlComputeCode = {Set {*} = {price}*(1+{tax})}, SqlComputed, Transient ];

/// Получить цену с НДС
Method priceWithTaxGet() As %Double [ Final ]
{
	Set:(i%priceWithTax = "") i%priceWithTax = (i%price)*(1+(i%tax))
	Quit i%priceWithTax
}



Проблема в том что просечивание транзиентного свойства вызывает проставление объекту Modified флага, чего очень очень хотелось бы избежать.

Есть ли возможность как то указывать поля, изменение которых будет игнорироваться Modified флагом ?
...
Рейтинг: 0 / 0
Transient + %IsModified
    #38184661
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sigmov , вчем смысл применения именно поля, а например не метода?
Метод бы такой проблемы не создал...
...
Рейтинг: 0 / 0
Transient + %IsModified
    #38184697
servit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sigmov ,

Какая версия $zv?
PS: в последних версиях код можно существенно упростить.
...
Рейтинг: 0 / 0
Transient + %IsModified
    #38184888
sigmov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
krvsa sigmov , вчем смысл применения именно поля, а например не метода?
Метод бы такой проблемы не создал... Потому что есть еще и Set'ер и кроме того клиент-серверное взаимодействие запилено именно на связывание со свойствами
А так и [Calculated] бы проблем не создало (собственно с Calculated и работали).

Со временем некоторые поля стали настолько "тяжелыми" что пересчитывать их при каждом ..Get() - дорогое удовольствие.

авторКакая версия $zv?
PS: в последних версиях код можно существенно упростить.Интересно. 2013.1
...
Рейтинг: 0 / 0
Transient + %IsModified
    #38185001
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sigmovСо временем некоторые поля стали настолько "тяжелыми" что пересчитывать их при каждом ..Get() - дорогое удовольствие.
Фигасе у вас поля!
...
Рейтинг: 0 / 0
Transient + %IsModified
    #38185050
sigmov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
krvsaФигасе у вас поля! Знаю. Лучше было бы обойтись без подобных полей, у вас прикладной код Г*(мнение WRC), нужно кодить по другому и тд и тп.
Однако я имею то что имею, мои возможности рефакторинга сильно ограничены.
Поэтому прошу помочь с решением конкретной проблемы без предложений "сменить мозги и кодить по-людски" ))))
...
Рейтинг: 0 / 0
Transient + %IsModified
    #38185173
servit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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.
USER>d ##class(del.c).test()
=      30
До     0
=      30
После  0

Если всё-таки хотите оставить вариант 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() - дорогое удовольствие.Почему бы не воспользоваться хранимыми вычисляемыми полями?
...
Рейтинг: 0 / 0
Transient + %IsModified
    #38186613
sigmov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо за ответ servit

Век живи, век учись - не знал что можно проверить какое конкретно поле модифицировано через ..<property>IsModified()
Полезная вещь - внедрю для логгирования. Сейчас свойство на памяти сравнивается с <property>getStored для детекции изменений.

Однако в остальном смысл примера от меня ускользнул: "заглушить" priceWithTax сеттер и затем сетить это поле и в результате оно не просетится, к чему это?

авторЕсли всё-таки хотите оставить вариант priceWithTaxGet() с присваиванием в i%priceWithTax, то тогда так:....Собственно тоже об этом задумывался, но думал есть вариант красивее. Что ж нет - буду юзать что есть.

авторПочему бы не воспользоваться хранимыми вычисляемыми полями?
Потому что многие из таких полей
Слишком тяжелы для хранения, скажем (%ListOfObjects) на 80 элементов - зачем хранить такую портянку?

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


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