Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Caché Новый топик    Ответить
 Как создать @class  [new]
О-О-О
Member

Откуда: Нижний Новгород
Сообщений: 170
Имеется БД в ней класс BDHistory2017.m06.TcenaH1

Стандартно мы делаем\создаем класс через
Set MoiKlass=##class(BDHistory2017.m06.TcenaH1).%New()

С этим проблем нет.
Также можно создать класс и так (во всяком случае он создается в видепеременной)
Set MoiKlass=##class("BDHistory2017.m06.TcenaH1").%New()


Но возникла задача создавать класс через переменную
Делаю так
Set KillTcenaH1="BDHistory2017.m06.TcenaH1"
Set MoiKlass=@class(KillTcenaH1).%New()


И вот так он не создаётся.
Пишет, что
<UNDEFINED> *class("BDHistory2017.m06.TcenaH1")
Хотя используются те же самые ковычки.

Всё бы ничего, но хочется автоматизировать замену классов через переменные.
В инструкциях через OREF получаю то же самое.

ZTESTBRENT>Set emL="@class(KillTcenaH1).%New()"
 
ZTESTBRENT>Set ZmIshem3="aaa="_emL,@ZmIshem3
 
SET ZmIshem3="aaa="_emL,@ZmIshem3
                        ^
<UNDEFINED> *class("BDHistory2017.m06.TcenaH1")
ZTESTBRENT>Set KillTcenaH1="BDHistory2017.m06.TcenaH1"
 
ZTESTBRENT>Set emL=##class(@KillTcenaH1).%New()
 
SET emL=##CLASS(@KillTcenaH1).%New()
^
<SYNTAX>
ZTESTBRENT>Set emL=@class(KillTcenaH1).%New()
 
SET emL=@class(KillTcenaH1).%New()
^
<UNDEFINED> *class("BDHistory2017.m06.TcenaH1")
ZTESTBRENT>Set aaa=##class("BDHistory2017.m06.TcenaH1").%New()
 
ZTESTBRENT>


Обратите внимание на последнюю запись.

.
15 июл 17, 13:48    [20646836]     Ответить | Цитировать Сообщить модератору
 Re: Как создать @class  [new]
DAiMor
Member

Откуда: Volzhsky -> Moscow -> CZ, Brno
Сообщений: 2366
О-О-О,

попробуй так

Set obj = $System.OBJ.New(KillTcenaH1)
а еще можно с использованием $classmethod, так и имя метода тоже может быть в переменной

Set obj = $classmethod(KillTcenaH1, "%New")

Откуда взялась уверенность что
@class(KillTcenaH1).%New()
это сработает?
class в данном случае просто переменная, и конечно он будет ругаться что UNDEFINED, потому что такая переменная не определена
15 июл 17, 17:16    [20647125]     Ответить | Цитировать Сообщить модератору
 Re: Как создать @class  [new]
О-О-О
Member

Откуда: Нижний Новгород
Сообщений: 170
DAiMor
Откуда взялась уверенность что
@class(KillTcenaH1).%New()
это сработает?
class в данном случае просто переменная, и конечно он будет ругаться что UNDEFINED, потому что такая переменная не определена


@class(KillTcenaH1).%New()

Использовал потому что частенько в разных вариантах кода использовал оператор косвенности (@).
И потому что подумал что и здесь этот фокус так же пройдет.
Вариант
##class(@KillTcenaH1).%New()
выдавал ошибку, вот и остановился на
@class(KillTcenaH1).%New() 
как как ошибки при таком варианте не было, значит двигался в верном направлении.

Также я на 100%был уверен, что
##class(XXX).%New() 
это служебная функция, так типа "Do" или "if"
15 июл 17, 17:34    [20647130]     Ответить | Цитировать Сообщить модератору
 Re: Как создать @class  [new]
О-О-О
Member

Откуда: Нижний Новгород
Сообщений: 170
DAiMor
попробуй так


Set obj = $classmethod(KillTcenaH1, "%New")


Мне этот вариант понравился больше. По мне так он понятнее.
Хочу только сделать одно уточнение.
obj может иметь любое название. К примеру NewBD или НоваяБД
А затем как обычно :

Set NewBD.Vrema=VremaImport
Set NewBD.Data=DataImport
Set NewBD.H1Tc=.....
......
Do NewBD.%Save()


Это очень удобно плавающая\косвенная переменная в названии БД, когда код длинный и в нескольких местах встречается эта БД, а в процессе работы эти БД постоянно меняются. А так в начале кода меняешь и все ТИП-ТОП или вообще из файла со списком БД берешь нужную, делаешь все необходимые операции с ней и приступаешь к следующей.
.
15 июл 17, 20:40    [20647391]     Ответить | Цитировать Сообщить модератору
 Re: Как создать @class  [new]
Блок А.Н.
Member

Откуда: Новосибирск
Сообщений: 3531
О-О-О,

оно, конечно, здорово, когда язык позволяет всякое, но можно узнать, для чего все эти извращения?

автор
Это очень удобно плавающая\косвенная переменная в названии БД, когда код длинный и в нескольких местах встречается эта БД, а в процессе работы эти БД постоянно меняются. А так в начале кода меняешь и все ТИП-ТОП или вообще из файла со списком БД берешь нужную, делаешь все необходимые операции с ней и приступаешь к следующей.
Вы какие-то просто чудовищные вещи пишете. Можно бы вам пожелать сопровождать всю жизнь такой код, но такое страшное проклятие в моих глазах вы еще не заслужили. Чем вас не устраивают обычные переменные? Что вы собираетесь делать дальше с переменными, имени которых даже не знаете?

автор
когда код длинный
Когда код длинный, надо его переписывать, чтобы он был коротким и понятным, а не запутывать его еще больше.

И да, вы путаете понятия класса и объекта.
15 июл 17, 21:25    [20647444]     Ответить | Цитировать Сообщить модератору
 Re: Как создать @class  [new]
О-О-О
Member

Откуда: Нижний Новгород
Сообщений: 170
Блок А.Н.

Вы какие-то просто чудовищные вещи пишете. Можно бы вам пожелать сопровождать всю жизнь такой код, но такое страшное проклятие в моих глазах вы еще не заслужили. Чем вас не устраивают обычные переменные? Что вы собираетесь делать дальше с переменными, имени которых даже не знаете?


Секрета нет.
Я этими вещами - переменными в названии БД еще не пользовался, хотя косвенными переменными работал и в моём случае - они существенно ускорят обработку данных.
Но возникла необходимость анализа котировок нефти. А она имеет странную особенность каждый месяц продолжать фьючерс, но на другой период.
Практика показывает, что сшивание графиков разных фьючерсов смысла не имеет, поэтому, под каждый месяц-фьючерс необходима своя БД котировок за предшествующий период от 1 до 6 месяцев. Всего их набегает 180 Баз Данных и это по минимуму. Такая же ерунда по золоту, по меди и по другим мировым спекулятивным инструментам.
Для анализа стратегии требуется на каждые новые правила проанализировать историю.
Теперь представьте мою работу вручную, если я буду менять каждый раз в коде названия всех этих 180 БД. и это хорошо, если при этом я ещё и не ошибусь!
А теперь подумайте, насколько упростилась моя жизнь с обработкой такого массива БД с этой косвенной переменной. Создаёшь отдельный файл с перечнем этих БД и вуаля, обработка автоматом пошла.

Надеюсь - что аргумент весомый.

И да, вы путаете понятия класса и объекта.
Скорее всего да, но я пишу на специфическом\обывательском уровне, в котором замешано куча всего от Каше до HTML с CSS и SVG фрэймами.
Слишком специфичны у меня требования, но я точно знаю что я хочу получить от того или иного кода - и в этом меня большое преимущество, т.к. заказчики очень часто сами не знают чего хотят.

.
15 июл 17, 22:51    [20647587]     Ответить | Цитировать Сообщить модератору
 Re: Как создать @class  [new]
DAiMor
Member

Откуда: Volzhsky -> Moscow -> CZ, Brno
Сообщений: 2366
О-О-О,

Какие интересные задачи вы решаете оказывается. Хотя я думаю что вы еще и БД с таблицами путаете. Как то я все таки сомневаюсь что у вас все таки 180 БД, может все таки это таблицы?
15 июл 17, 22:59    [20647601]     Ответить | Цитировать Сообщить модератору
 Re: Как создать @class  [new]
Блок А.Н.
Member

Откуда: Новосибирск
Сообщений: 3531
О-О-О,
Мне кажется, вы ещё таблицу называете БД. Ну, положим, вам нужны для каждой котировки отдельная таблица. Для меня это сомнительно, так как структура данных все равно одинакова, но спорить с вами не буду. Но зачем вы переменные разные то используете?
15 июл 17, 23:05    [20647610]     Ответить | Цитировать Сообщить модератору
 Re: Как создать @class  [new]
О-О-О
Member

Откуда: Нижний Новгород
Сообщений: 170
Есть еще один вопрос, но он больше вдогонку.
Раньше, когда я явно задавал им класса, я мог пользоваться определением последней строки

Set EndID=$Order(^BDcache.TcenaD1D(""),-1)
Set aaa=##class(BDcache.TcenaD1).%OpenId(EndID)
Set Data=aaa.Data
Set Vrema=aaa.Vrema


НЕ сказать, что этот кусок кода критичен для меня, но я к нему уж как то привык (при сшивании потока данных).

Теперь же у меня возникла проблема. С косвенной переменной названия класса я не могу запустить этот код, перепробовал разные варианты, залез в документацию. Ничего не нашёл.

Как вариант, придумал костыль-замену, но он меня немного напрягает:

 	Set id=900
EndH1p2	
	// Без кода анализа последней записи = дата+время
	// обработка кода длится 0,168251 сек
	// а если включить анализ на поиск последней записи и вытаскивания оттуда даты и времени
	// то у нас уйдет 0,171904 сек. То есть разница составит менее 0,004 сек
	Set id=id+1
	Set aaa=$System.OBJ.OpenId(ImaFilesH1,id)
	if aaa'="" {Goto EndH1p2}
	Set aaa=$System.OBJ.OpenId(ImaFilesH1,(id-1))
	Set DatainBD=aaa.Data
	Set VremainBD=aaa.Vrema
	w "   Конец H1: Дата=",($ZDate(DatainBD,8)),"   Время Лондон=",($ZTime(VremainBD)),!


Вопрос в следующем - можно ли как то с косвенной переменной названия класса использовать
Set EndID=$Order(^BDcache.TcenaD1D(""),-1)


Разница в 0,004 сек не напрягает, но это 1100 строк, а если их там 1'500'000, то это уже 5-6 сек на каждый класс, а это уже ощутимое время при обработке большого массива данных.
.
15 июл 17, 23:05    [20647611]     Ответить | Цитировать Сообщить модератору
 Re: Как создать @class  [new]
О-О-О
Member

Откуда: Нижний Новгород
Сообщений: 170
DAiMor,
Да, таблицы.
Баз Данных 3-4. Хотя рабочих 2.
15 июл 17, 23:06    [20647615]     Ответить | Цитировать Сообщить модератору
 Re: Как создать @class  [new]
О-О-О
Member

Откуда: Нижний Новгород
Сообщений: 170
Блок А.Н.
О-О-О,
Мне кажется, вы ещё таблицу называете БД. Ну, положим, вам нужны для каждой котировки отдельная таблица. Для меня это сомнительно, так как структура данных все равно одинакова, но спорить с вами не буду. Но зачем вы переменные разные то используете?


Да, отдельные таблицы, я их для себя обзываю БД - так как они несут отдельные законченные данные для меня.

Но зачем вы переменные разные то используете?

не совсем понимаю вопрос.
как же еще обрабатывать если разные таблицы между собою никак не связаны и каждая таблица обрабатывается отдельно. Често говоря они раньше были объеденены но толку от этого ноль, так что я их разъединил.

Но зачем вы переменные разные то используете?

Разные таблицы = разный код. Данные то берутся из разных мест. Или есть вариант как это сшить-исправить-упростить?

Вот так примерно выглядит новая структура таблиц.

К сообщению приложен файл. Размер - 17Kb
15 июл 17, 23:12    [20647627]     Ответить | Цитировать Сообщить модератору
 Re: Как создать @class  [new]
О-О-О
Member

Откуда: Нижний Новгород
Сообщений: 170
интересует вот этот вопрос, точнее ответ на него

http://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1266064&msg=20647611
15 июл 17, 23:20    [20647635]     Ответить | Цитировать Сообщить модератору
 Re: Как создать @class  [new]
DAiMor
Member

Откуда: Volzhsky -> Moscow -> CZ, Brno
Сообщений: 2366
О-О-О
Вопрос в следующем - можно ли как то с косвенной переменной названия класса использовать
Set EndID=$Order(^BDcache.TcenaD1D(""),-1)

например как то так
 set bd="BDHistory2017.m06.TcenaH1"
 set global="^"_bd_"D"
 set end=$o(@global@(""), -1)
15 июл 17, 23:28    [20647638]     Ответить | Цитировать Сообщить модератору
 Re: Как создать @class  [new]
О-О-О
Member

Откуда: Нижний Новгород
Сообщений: 170
DAiMor,

Ваш код работает, но Можно проще

 set bd="^BDHistory2017.m06.TcenaH1D"
 set end=$Order(@bd@(""), -1)

Проверил - работает и возвращает корректный\реальный результат.

Я только не совсем понимаю, почему код
 set end=$Order(@bd(""), -1)
или 
 set end=$Order(bd(""), -1)


Не работает? Особенно с одним @.
.
15 июл 17, 23:43    [20647652]     Ответить | Цитировать Сообщить модератору
 Re: Как создать @class  [new]
eduard93
Member

Откуда:
Сообщений: 129
Глобал с данными можно автоматически по названию класса получать. Пример.
16 июл 17, 00:28    [20647666]     Ответить | Цитировать Сообщить модератору
 Re: Как создать @class  [new]
DAiMor
Member

Откуда: Volzhsky -> Moscow -> CZ, Brno
Сообщений: 2366
О-О-О
Я только не совсем понимаю, почему код
 set end=$Order(@bd(""), -1)
или 
 set end=$Order(bd(""), -1)



Не работает? Особенно с одним @.

Ой, какой интересный неожиданный вопрос.
а что вообще делает оператор косвенности @?
в первом случае он пытается получить значение из переменной bd("") и конечно он не получит ответ, будет ошибка SUBSCRIPT, но еще и $order требует чтобы переменная была с индексом, чтобы было понятно от чего получить следующий индекс.
а вторая строка, рабочая, но только она обходит на глобал а локальную переменную bd и пытается вернуть последний индекс для нее.
16 июл 17, 00:46    [20647673]     Ответить | Цитировать Сообщить модератору
 Re: Как создать @class  [new]
Блок А.Н.
Member

Откуда: Новосибирск
Сообщений: 3531
О-О-О
Это очень удобно плавающая\косвенная переменная в названии БД.
Извиняюсь, я вас, кажется, неправильно понял.
Думал, что вы хотите сделать что-то вроде
Set @BdName = $classmethod(KillTcenaH1, "%New")
16 июл 17, 06:11    [20647720]     Ответить | Цитировать Сообщить модератору
 Re: Как создать @class  [new]
П.С.М.
Member

Откуда: Из СССР
Сообщений: 376
О-О-О
DAiMor,

Ваш код работает, но Можно проще

 set bd="^BDHistory2017.m06.TcenaH1D"
 set end=$Order(@bd@(""), -1)

Проверил - работает и возвращает корректный\реальный результат.

Хм, DAiMor предположил, что в переменной у Вас будет имя класса. Затем он Вам показал как из имени класса получить имя глобала с помощью конкатенации. А затем уже полученное имя глобала использовать для необходимых действий.

Вы показываете пример кода, где переменной сразу присваиваете имя глобала и заявляете, что так проще. Конечно проще, если имя глобала сразу известно Но Вы ранее об этом не упоминали, речь шла только о имени класса в переменной.

Отсюда вопрос: где имя глобала брать будете, чтобы было "...но Можно проще"? Либо чего-то недоговариваете, либо есть проблема с логикой.
16 июл 17, 10:22    [20647808]     Ответить | Цитировать Сообщить модератору
 Re: Как создать @class  [new]
О-О-О
Member

Откуда: Нижний Новгород
Сообщений: 170
П.С.М.

Отсюда вопрос: где имя глобала брать будете, чтобы было "...но Можно проще"? Либо чего-то недоговариваете, либо есть проблема с логикой.


НОЧЬ, вечер, ВЫХОДНОЙ.

Я ответами остался доволен. Получил ответы на вопросы, которые позволили существенно оптимизировать код.
С учётом того, что я не являюсь проф программистом, я позволяю себе использовать определения, которые комфортны для меня. И так уж получилось, что они расходятся с общепринятыми. Так БД для меня и "каноническое определение" имеют совершенно разные смыслы.

Что касается непосредственно поставленной задачи:
Есть куча таблиц (они же для меня классы (так их обзывает Каше) они же для меня БД (так как носят завершенную структурированную информацию)) исторических данных (см скриншот выше).
Их нужно было поочереди обработать и выдать определённый результат.
Вручную менять имена классов было очень неудобно, долго и с большой вероятностью ошибки при замене имени класса.
Требовалось автоматизировать этот процесс через переменную, которую я обзывал косвенной,
т.к. использовался оператор косвенности = @

Ну вот в целом и вся задачка.

.
17 июл 17, 10:18    [20649359]     Ответить | Цитировать Сообщить модератору
 Re: Как создать @class  [new]
О-О-О
Member

Откуда: Нижний Новгород
Сообщений: 170
А вот почему именно такая структура - каждый видит поставленную задачу по своему.
Это уже 8, 12 или 18 вариант логического построения. Все предыдущие терпимы для Российской биржи (акции на ММВБ Российских эмитентов) и напрочь не годятся для "Круглосуточников".
.
17 июл 17, 10:21    [20649372]     Ответить | Цитировать Сообщить модератору
 Re: Как создать @class  [new]
Блок А.Н.
Member

Откуда: Новосибирск
Сообщений: 3531
О-О-О
я не являюсь проф программистом, я позволяю себе использовать определения, которые комфортны для меня. И так уж получилось, что они расходятся с общепринятыми.
Скажите, как зайти к вам на фьючерсы, чтобы прикупить форексов?
17 июл 17, 13:25    [20650092]     Ответить | Цитировать Сообщить модератору
Все форумы / Caché Ответить