powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Calculated поля при наследовании.
10 сообщений из 10, страница 1 из 1
Calculated поля при наследовании.
    #35695153
=Dimon=
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть 3 класса
class A Extends %Persistent
{
Property name As %String [Calculated, SQLComputeCode={s {*}="Привет A"},SQLComputed];
}

class B Extends A
{
Property name As %String [Calculated, SQLComputeCode={s {*}="Привет B"},SQLComputed];
}

class C Extends B
{
Property name As %String [Calculated, SQLComputeCode={s {*}="Привет C"},SQLComputed];
}

Создаем объект класса C и сохраняем.

Теперь, если мы будет выбирать данные sql-запросом из таблицы A, то значение calculated поля для строк класса С, будет "Привет А", а надо "Привет С". Что сделать чтоб работало корректно?
...
Рейтинг: 0 / 0
Calculated поля при наследовании.
    #35695200
Блок А.Н.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нужно попробовать проверить, правильно ли работает свойсво %ClassName (или %CLASSNAME). Или метод это, не помню :-)

В общем, определяете тип класса и выражение вычисляете исходя из имени класса.
...
Рейтинг: 0 / 0
Calculated поля при наследовании.
    #35695566
servit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Например, так:
Код: plaintext
1.
2.
3.
4.
class A Extends %Persistent
{
Property name As %String [ Calculated, SqlComputeCode = {s {*}="Привет "_##class(A).%OpenId({ID}).%ClassName( 0 )}, SqlComputed ];
}
...
Рейтинг: 0 / 0
Calculated поля при наследовании.
    #35695850
=Dimon=
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
servitНапример, так:
Код: plaintext
1.
2.
3.
4.
class A Extends %Persistent
{
Property name As %String [ Calculated, SqlComputeCode = {s {*}="Привет "_##class(A).%OpenId({ID}).%ClassName( 0 )}, SqlComputed ];
}

Если данных у меня очень много, то поднятие на память объекта будет существенно тормозить выборку.
...
Рейтинг: 0 / 0
Calculated поля при наследовании.
    #35696026
servit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
=Dimon=...
Если данных у меня очень много, то поднятие на память объекта будет существенно тормозить выборку.
Это всего лишь пример.
Вы можете использовать уровень глобалов (самый первый индекс) для ускорения.
Следующему примеру требуется доработка:
Код: plaintext
Property name As %String [ Calculated, SqlComputeCode = {s {*}="Привет "_$$$ClassCompatibleName($li(^test.AD({ID}), 1 ))}, SqlComputed ];
...
Рейтинг: 0 / 0
Calculated поля при наследовании.
    #35697531
Фотография kolesov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
=Dimon=,

я определяю метод расчета только на основном классе, и юзаю что-то вроде
s {*}="Привет "_{x__classname}
...
Рейтинг: 0 / 0
Calculated поля при наследовании.
    #35698994
=Dimon=
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вообще, мне не имя класса нужно, я хотел показать, что calculated поля при наследовании ведут себя в таблице так, как это определено в таблице, из которой мы выбираем данные.
То есть я могу вообще переделать реализацию классов примерно так:
class A Extends %Persistent
{
Property subName As %String;

Property fullName As %String [Transient, SQLComputeCode={s {*}={subName}_" "_{name}},SQLComputed];

Property name As %String;
}

class B Extends A
{
Property fullName As %String [Transient, SQLComputeCode={s {*}={name}},SQLComputed];
}

class C Extends B
{
Property fullName As %String; // здесь свойство хранимое
}

Теперь при запросе, напрмер, к таблице "А", вся идеология наследования и полиморфизма идет в "печь" :(
...
Рейтинг: 0 / 0
Calculated поля при наследовании.
    #35699097
servit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
To =Dimon=

У Вас вычисляемые поля представлены лишь для SQL. А разве SQL к ООП имеет отношение?
...
Рейтинг: 0 / 0
Calculated поля при наследовании.
    #35699193
=Dimon=
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
servitTo =Dimon=

У Вас вычисляемые поля представлены лишь для SQL. А разве SQL к ООП имеет отношение?
А разве нет? Не проблемы вычислимые поля сделать для объектов, перекрыв геттеры.
SQL - это всего лишь один из доступов к данным, как это описано на сайте Intersystems. Существует 3 механизма доступа к данным: SQL, прямой и объектный. Я так думаю, что каждый механизм должен обеспечивать правильный результат. То есть, если значение свойства объекта хранится в глобале, то хоть прямым, хоть объектным, хоть SQL результат должен быть один.
...
Рейтинг: 0 / 0
Calculated поля при наследовании.
    #35701036
servit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
=Dimon=
А разве нет? Не проблемы вычислимые поля сделать для объектов, перекрыв геттеры.
SQL - это всего лишь один из доступов к данным, как это описано на сайте Intersystems.
Существует 3 механизма доступа к данным: SQL, прямой и объектный.
Я так думаю, что каждый механизм должен обеспечивать правильный результат. То есть, если значение свойства объекта хранится в глобале, то хоть прямым, хоть объектным, хоть SQL результат должен быть один.

Хотя доступа к данным три, они не всегда равнозначны (взаимозаменяемы):
1) Trigger <> Callback method
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
ClassMethod %OnDelete(oid As %ObjectIdentity) As %Status [ Private, ServerOnly =  1  ]
{
  Quit $$$ERROR($$$GeneralError,"Доступ запрещен1")
}

Trigger NewTrigger1 [ Event = DELETE ]
{
  set %ok= 0 
  set %msg="Доступ запрещен2"
}
Попробуйте удалить данные объектно, а потом реляционно.
2) Вычисляемое поле через SQL <> Вычисляемое поле через геттер
Код: plaintext
1.
2.
3.
4.
5.
6.
Property name As %String [ Calculated, SqlComputeCode = {s {*}="Привет"}, SqlComputed ];

Method nameGet() As %String
{
  Quit "Пока"
}
Попробуйте посмотреть значение поля "name" объектно, а потом реляционно.
3) Вы можете через "CREATE TABLE" создать две таблицы, при этом чтобы одна наследовалась от другой?
4) Безопасность
5) другое

PS: как Вы думаете, а триггеры наследуются?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
class A Extends %Persistent
{
Property name As %String [Calculated, SQLComputeCode={s {*}="Привет A"},SQLComputed];

Trigger NewTrigger1 [ Event = DELETE, Time = BEFORE ]
{
  set ^test($H)=$lb({%%CLASSNAMEQ},{%%TABLENAME},{%%ID})
}
}
...
Поскольку да, то попробуйте так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
class A Extends %Persistent
{
Property name As %String;
Property fullname As %String [SQLComputeCode={s {*}="Привет"_{%%CLASSNAMEQ}},SQLComputed];
}
Class B Extends A
{
}
Class C Extends B
{
}
Two Types of Computed SQL Fields
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Calculated поля при наследовании.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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