Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / NO CURRENT OBJECT / 9 сообщений из 9, страница 1 из 1
24.05.2006, 14:58
    #33748706
SLIVER
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
NO CURRENT OBJECT
При создание класса командой CREATE TABLE и добавления в него
следующего триггера:

Class User.NewClass1 Extends (%Library.Persistent, %Populate) [ ClassType = persistent, SqlRowIdPrivate, StorageStrategy = ]
{

Property NAME As %Library.String(MAXLEN = 50);

Trigger TBI1 [ Event = INSERT, Order = 4 ]
{
set {NAME} = ##class(%Dictionary.ClassDefinition).%OpenId(..%ClassName(1)).SqlTableName
}

}
При срабатывании триггера ругается NO CURRENT OBJECT
Ругается на любой точечный синтаксис вообще.

Как это можно исправить?
...
Рейтинг: 0 / 0
24.05.2006, 16:25
    #33749124
CJIECAPb
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
NO CURRENT OBJECT
Попробуй так:
Код: plaintext
1.
set {NAME} = ##class(%Dictionary.ClassDefinition).%OpenId(##class(User.NewClass1).%OpenId({ID}).%ClassName( 1 )).SqlTableName
...
Рейтинг: 0 / 0
24.05.2006, 17:16
    #33749327
SLIVER
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
NO CURRENT OBJECT
Дело в том что мне нужно именно так, здесь как мне кажется, проблема в описании класса или в STORAGE. Поскольку на классах в SAMPLES этот триггер нормально работает. Я пробовал сравнивать но ничего не нашол.
...
Рейтинг: 0 / 0
24.05.2006, 17:51
    #33749472
Maksim UM
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
NO CURRENT OBJECT
У меня сработало (версия 5.0.20),
только нужно у класса прописать SqlTableName
тогда {NAME} не будет пустым
...
Рейтинг: 0 / 0
25.05.2006, 09:29
    #33750272
Ptn
Ptn
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
NO CURRENT OBJECT
NO CURRENT OBJECT если я ничего не путаю появляеться из-за
использования
..%ClassName(1)
Это метод экземляра , а не метод класса.
Мы для этих целей пишем на генераторе дополнительный класс метод.

ClassMethod GetClassName() As %Library.String [ CodeMode = generator ]
{
s %code=0 $$$GENERATE(" q """_%class_"""") q $$$OK
}

Начиная с 5.0.10 кажеться в триггерах есть возможность обращаться через двуточечный синтаксис к методам класса.

и тогда есть возможность писать

set {P1}=$zojbclassmethod(..GetClassName(),"GetP1Value",{%%ID}).

Далее уже 5.0.5, правда не по документации, в триггере доступно {%%CLASSNAME} - подставляет имя класса - но не как строку!!!
и можно писать что то вроде :

set {P1}=##class({%%CLASSNAME}).GetP1Value({%%ID}).

В более поздних версиях есть так же:
{%%CLASSNAMEQ} - тоже самое но в виде строки

и даже помоему есть

{%%TABLENAME}

Так что поищите в документации по слову %%CLASSNAME - там будет и остальные возможности. Искать лучше в версиях > 5.0.15.
В той же 5.0.5 нет никаких упоминаний из работает только {%%CLASSNAME} и{%%ID}.
...
Рейтинг: 0 / 0
25.05.2006, 14:51
    #33751656
SLIVER
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
NO CURRENT OBJECT
В этом случае:
set {P1}=$zojbclassmethod(..GetClassName(),"GetP1Value",{%%ID})
тот же NO CURRENT OBJECT
а в этом:
set {P1}=##class({%%CLASSNAME}).GetP1Value({%%ID})
METOD DO NOT EXIST
что за метод GetP1Value?
Насчет {%%CLASSNAMEQ} {%%TABLENAME} вызывают ошибку компиляции,
а {%%CLASSNAME} во время выполнения UNDIFINED.
Возможно нужно менять версию.
...
Рейтинг: 0 / 0
25.05.2006, 20:00
    #33752642
Ptn
Ptn
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
NO CURRENT OBJECT
Э-э

В этом случае:
set {P1}=$zojbclassmethod(..GetClassName(),"GetP1Value",{%%ID})
тот же NO CURRENT OBJECT

Это работает только с 5.0.10.

а в этом:
set {P1}=##class({%%CLASSNAME}).GetP1Value({%%ID})
METOD DO NOT EXIST
что за метод GetP1Value?
Блин :) это метод для примера от балды - естественно у тебя его нет, но {%%CLASSNAME} работает - уже неплохо


Насчет {%%CLASSNAMEQ} вызывают ошибку компиляции,
а {%%CLASSNAME} во время выполнения UNDIFINED.

В твоем примере ты вроде выясняешь имя таблицы - так вот вполне возможно хватить указания {%%TABLENAME}

Возможно нужно менять версию.
Явно нужно - свою можеш выяснить выполнив в терминалие
>w $ZV
...
Рейтинг: 0 / 0
26.05.2006, 09:12
    #33753127
SLIVER
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
NO CURRENT OBJECT
У меня 5.012 и есть 5.015 но не на одной из них не работает {%%TABLENAME}
Может быть для нее нужно что то наследовать кроме Persistent?
...
Рейтинг: 0 / 0
26.05.2006, 15:40
    #33754660
SLIVER
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
NO CURRENT OBJECT
Получилось сделать так:

ClassMethod GetClassName() As %Library.String [ CodeMode = generator ]
{
s %code=0 $$$GENERATE(" q """_%class_"""") q $$$OK
}

Trigger TAD1 [ Event = DELETE, Order = 1, Time = AFTER ]
{
set CL = ##class({%%CLASSNAME}).GetClassName()
set SQLTN = ##class(%Dictionary.ClassDefinition).%OpenId(CL).SqlTableName
if SQLTN '= "" {set TN = SQLTN } else {set TN = CL}

Set result = ##class(%Library.ResultSet).%New()
set sql = "UPDATE "_TN_" SET CCOUNT = CCOUNT - 1 WHERE ID = "_{PARENT*O}
do result.Prepare(sql) do result.Execute() do result.Close()
}

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


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