Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Вычислимые поля / 9 сообщений из 9, страница 1 из 1
23.05.2008, 07:09
    #35330196
Socratdv
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вычислимые поля
Ни фига не могу найти в документации толковых примеров по вычислимым полям в SQL Cache.

Проблема в следующем: Есть класс с сылкой на parent (тот же самый класс).
Нужно создать вычислимое поле fullName = parent.fullName_name

Обратиться нарямую через SQL к свойствам parent при вычислении свойств не получается - ругается матом при выполнении SQL выражения:
Код: plaintext
Property fullName As %String [ Calculated, SqlComputeCode = { Set {fullName}={parent->fullName}_{name}}, SqlComputed ];
Пробовал еще так:
Код: plaintext
Property fullName As %String [ Calculated, SqlComputeCode = { Set {fullName}={parent.fullName}_{name}}, SqlComputed ];
Выводит просто name. Если написать {parent.name}_{name}, то результат выдаст {name}_{name}.

Есть ли какой-нибудь способ быстрого вычисления таких полей?

Я смог решить проблему только вызовом метода класса, в который передаю parent, там поднимаю объект на память, забираю св-во и возвращаю. Это совсем не айс. Хотелось бы обойтись без поднятия объекта и вызова метода класса.
...
Рейтинг: 0 / 0
23.05.2008, 07:17
    #35330199
Tosh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вычислимые поля
Если я правильно все понимаю - не сильно-то и получится сделать по-другому. Если делать так, как хотите вы - эти же действия произведет за вас Cache' - не более того
...
Рейтинг: 0 / 0
23.05.2008, 07:55
    #35330214
Ptn
Ptn
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вычислимые поля
В методе класса совсем не обязательно использовать объектный доступ.

Напишите туда SQL запрос --- ну или нужен совсем айс - обращение на прямом доступе - только к методу нужно будет прикрепить БОООЛЬШУЮ табличу, мол если меняете структуру хранения - пожулусто исправьте этот метод
...
Рейтинг: 0 / 0
23.05.2008, 11:06
    #35330598
Александр Коблов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вычислимые поля
Может не очень изящно, но как-то так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
Class User.DUMMY Extends %Persistent [ ClassType = persistent, DdlAllowed, Owner = gillan, ProcedureBlock, SqlRowIdPrivate, SqlTableName = DUMMY, StorageStrategy = "" ]
{

Property A As DUMMY;

Property B As %String [ Calculated, SqlComputeCode = { set b=##class(User.DUMMY).%OpenId({A}),{B}=$case(b,"":"",:b.C)  }, SqlComputed ];

Property C As %String;

--------
Cache for Windows (x86-32) 2008.1 (Build 401U) Tue Feb 26 2008 11:46:52 EST
...
Рейтинг: 0 / 0
26.05.2008, 01:31
    #35334186
Tosh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вычислимые поля
Socratdv
Код: plaintext
Property fullName As %String [ Calculated, SqlComputeCode = { Set {fullName}={parent->fullName}_{name}}, SqlComputed ];
Пробовал еще так:
Код: plaintext
Property fullName As %String [ Calculated, SqlComputeCode = { Set {fullName}={parent.fullName}_{name}}, SqlComputed ];

Не пробовал, но может статься, что все дело в том, что вы не указали ##this или ..
...
Рейтинг: 0 / 0
26.05.2008, 04:31
    #35334211
Socratdv
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вычислимые поля
На основе предидущего примера сделал без метода класса:
Код: plaintext
Property fullName As %String [ Calculated, SqlComputeCode = { s  parent=##class(CLASSNAME).%OpenId({parent}) s {fullCode}=$case(parent,$$$NULLOREF:"",:parent.fullName)_{name}}, SqlComputed ];

Все же хотелось бы вычислять поля без поднятия объекта.
...
Рейтинг: 0 / 0
26.05.2008, 08:40
    #35334288
Ptn
Ptn
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вычислимые поля
Мдя.... %OpenId без параметров, хотя следовало бы писать %OpenId({parent},0) что бы на блокировки не напоротся. parent за собой опять же никто не закрывает ... ляпота.

Кто мешает в методе класса использовать SQL ?
У нас так вообще у каждой таблицы есть специальный класс-метод PropertyByID(ID,NameProperty) - c одним единственным SQL. Очень полезно порой.

Поле соответственно выглядиит так
Код: plaintext
1.
2.
Property fullName As %String [ Calculated, SqlComputeCode = { 
Set {fullName}=##class(Имя парент класса).PropertyByID({%ID},"fullname") }, SqlComputed ];
...
Рейтинг: 0 / 0
26.05.2008, 12:36
    #35334834
logist
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вычислимые поля
> У нас так вообще у каждой таблицы есть специальный класс-метод
> PropertyByID(ID,NameProperty) - c одним единственным SQL. Очень полезно
> порой.
>
> Поле соответственно выглядиит так
>
> Property fullName As %String [ Calculated, SqlComputeCode = {
> Set {fullName}=##class(Имя парент класса).PropertyByID({%ID},"fullname") }, SqlComputed ];

А смысл? Что этот метод делает?
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
26.05.2008, 15:05
    #35335271
Ptn
Ptn
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вычислимые поля
Как я уже описал он выдает - по ID Объекта знаечение его поля, может возращать как указанное значение, так и все поля скопом в виде подмассива, с названием полей в качестве узлов (что можно использовать для "дампа" записи).

Нужен - для того что бы в различных местах не прибегать к открытию объектов, и тем более к использованию встроенного SQL - который в случае изменения конечного класса, еще и перекомпилировать можно.

SQL запрос там внутри один - написан на генераторе, встроен в базовый системный класс и каши не просит.

При использовании этого метода вы понижаете вероятность получения ошибки UNDEFINED или NULLOREF - в ситуациях, подобной описанной. Плюс уровень блокировки у вас известен заранее.

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


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