Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Как создать @class / 21 сообщений из 21, страница 1 из 1
15.07.2017, 13:48
    #39489508
О-О-О
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как создать @class
Имеется БД в ней класс BDHistory2017.m06.TcenaH1

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


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



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



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

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

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
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>



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

.
...
Рейтинг: 0 / 0
15.07.2017, 17:16
    #39489544
DAiMor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как создать @class
О-О-О,

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

Откуда взялась уверенность что
Код: plaintext
@class(KillTcenaH1).%New()
это сработает?
class в данном случае просто переменная, и конечно он будет ругаться что UNDEFINED, потому что такая переменная не определена
...
Рейтинг: 0 / 0
15.07.2017, 17:34
    #39489546
О-О-О
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как создать @class
DAiMorОткуда взялась уверенность что
Код: plaintext
@class(KillTcenaH1).%New()
это сработает?
class в данном случае просто переменная, и конечно он будет ругаться что UNDEFINED, потому что такая переменная не определена

Код: sql
1.
@class(KillTcenaH1).%New()


Использовал потому что частенько в разных вариантах кода использовал оператор косвенности (@).
И потому что подумал что и здесь этот фокус так же пройдет.
Вариант
Код: sql
1.
##class(@KillTcenaH1).%New()

выдавал ошибку, вот и остановился на
Код: sql
1.
@class(KillTcenaH1).%New() 

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

Также я на 100%был уверен, что
Код: sql
1.
##class(XXX).%New() 

это служебная функция, так типа "Do" или "if"
...
Рейтинг: 0 / 0
15.07.2017, 20:40
    #39489593
О-О-О
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как создать @class
DAiMorпопробуй так

Код: plaintext
1.
Set obj = $classmethod(KillTcenaH1, "%New")


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

Код: sql
1.
2.
3.
4.
5.
Set NewBD.Vrema=VremaImport
Set NewBD.Data=DataImport
Set NewBD.H1Tc=.....
......
Do NewBD.%Save()



Это очень удобно плавающая\косвенная переменная в названии БД, когда код длинный и в нескольких местах встречается эта БД, а в процессе работы эти БД постоянно меняются. А так в начале кода меняешь и все ТИП-ТОП или вообще из файла со списком БД берешь нужную, делаешь все необходимые операции с ней и приступаешь к следующей.
.
...
Рейтинг: 0 / 0
15.07.2017, 21:25
    #39489601
Блок А.Н.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как создать @class
О-О-О,

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

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

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

И да, вы путаете понятия класса и объекта.
...
Рейтинг: 0 / 0
15.07.2017, 22:51
    #39489613
О-О-О
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как создать @class
Блок А.Н.
Вы какие-то просто чудовищные вещи пишете. Можно бы вам пожелать сопровождать всю жизнь такой код, но такое страшное проклятие в моих глазах вы еще не заслужили. Чем вас не устраивают обычные переменные? Что вы собираетесь делать дальше с переменными, имени которых даже не знаете?

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

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

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

.
...
Рейтинг: 0 / 0
15.07.2017, 22:59
    #39489615
DAiMor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как создать @class
О-О-О,

Какие интересные задачи вы решаете оказывается. Хотя я думаю что вы еще и БД с таблицами путаете. Как то я все таки сомневаюсь что у вас все таки 180 БД, может все таки это таблицы?
...
Рейтинг: 0 / 0
15.07.2017, 23:05
    #39489617
Блок А.Н.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как создать @class
О-О-О,
Мне кажется, вы ещё таблицу называете БД. Ну, положим, вам нужны для каждой котировки отдельная таблица. Для меня это сомнительно, так как структура данных все равно одинакова, но спорить с вами не буду. Но зачем вы переменные разные то используете?
...
Рейтинг: 0 / 0
15.07.2017, 23:05
    #39489618
О-О-О
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как создать @class
Есть еще один вопрос, но он больше вдогонку.
Раньше, когда я явно задавал им класса, я мог пользоваться определением последней строки

Код: sql
1.
2.
3.
4.
Set EndID=$Order(^BDcache.TcenaD1D(""),-1)
Set aaa=##class(BDcache.TcenaD1).%OpenId(EndID)
Set Data=aaa.Data
Set Vrema=aaa.Vrema



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

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

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

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
 	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)),!



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



Разница в 0,004 сек не напрягает, но это 1100 строк, а если их там 1'500'000, то это уже 5-6 сек на каждый класс, а это уже ощутимое время при обработке большого массива данных.
.
...
Рейтинг: 0 / 0
15.07.2017, 23:06
    #39489619
О-О-О
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как создать @class
DAiMor,
Да, таблицы.
Баз Данных 3-4. Хотя рабочих 2.
...
Рейтинг: 0 / 0
15.07.2017, 23:12
    #39489620
О-О-О
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как создать @class
Блок А.Н.О-О-О,
Мне кажется, вы ещё таблицу называете БД. Ну, положим, вам нужны для каждой котировки отдельная таблица. Для меня это сомнительно, так как структура данных все равно одинакова, но спорить с вами не буду. Но зачем вы переменные разные то используете?

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

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

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

Вот так примерно выглядит новая структура таблиц.
...
Рейтинг: 0 / 0
15.07.2017, 23:20
    #39489622
О-О-О
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как создать @class
интересует вот этот вопрос, точнее ответ на него

http://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1266064&msg=20647611
...
Рейтинг: 0 / 0
15.07.2017, 23:28
    #39489624
DAiMor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как создать @class
О-О-ОВопрос в следующем - можно ли как то с косвенной переменной названия класса использовать
Код: sql
1.
Set EndID=$Order(^BDcache.TcenaD1D(""),-1)


например как то так
Код: sql
1.
2.
3.
 set bd="BDHistory2017.m06.TcenaH1"
 set global="^"_bd_"D"
 set end=$o(@global@(""), -1)
...
Рейтинг: 0 / 0
15.07.2017, 23:43
    #39489627
О-О-О
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как создать @class
DAiMor,

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

Код: sql
1.
2.
 set bd="^BDHistory2017.m06.TcenaH1D"
 set end=$Order(@bd@(""), -1)


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

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



Не работает? Особенно с одним @.
.
...
Рейтинг: 0 / 0
16.07.2017, 00:28
    #39489628
eduard93
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как создать @class
Глобал с данными можно автоматически по названию класса получать. Пример .
...
Рейтинг: 0 / 0
16.07.2017, 00:46
    #39489629
DAiMor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как создать @class
О-О-ОЯ только не совсем понимаю, почему код
Код: sql
1.
2.
3.
 set end=$Order(@bd(""), -1)
или 
 set end=$Order(bd(""), -1)




Не работает? Особенно с одним @.
Ой, какой интересный неожиданный вопрос.
а что вообще делает оператор косвенности @?
в первом случае он пытается получить значение из переменной bd("") и конечно он не получит ответ, будет ошибка SUBSCRIPT, но еще и $order требует чтобы переменная была с индексом, чтобы было понятно от чего получить следующий индекс.
а вторая строка, рабочая, но только она обходит на глобал а локальную переменную bd и пытается вернуть последний индекс для нее.
...
Рейтинг: 0 / 0
16.07.2017, 06:11
    #39489638
Блок А.Н.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как создать @class
О-О-ОЭто очень удобно плавающая\косвенная переменная в названии БД.Извиняюсь, я вас, кажется, неправильно понял.
Думал, что вы хотите сделать что-то вроде
Код: sql
1.
Set @BdName = $classmethod(KillTcenaH1, "%New")
...
Рейтинг: 0 / 0
16.07.2017, 10:22
    #39489655
П.С.М.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как создать @class
О-О-ОDAiMor,

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

Код: sql
1.
2.
 set bd="^BDHistory2017.m06.TcenaH1D"
 set end=$Order(@bd@(""), -1)


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

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

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

Отсюда вопрос: где имя глобала брать будете, чтобы было "...но Можно проще"? Либо чего-то недоговариваете, либо есть проблема с логикой.
...
Рейтинг: 0 / 0
17.07.2017, 10:18
    #39489977
О-О-О
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как создать @class
П.С.М.
Отсюда вопрос: где имя глобала брать будете, чтобы было "...но Можно проще"? Либо чего-то недоговариваете, либо есть проблема с логикой.

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

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

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

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

.
...
Рейтинг: 0 / 0
17.07.2017, 10:21
    #39489982
О-О-О
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как создать @class
А вот почему именно такая структура - каждый видит поставленную задачу по своему.
Это уже 8, 12 или 18 вариант логического построения. Все предыдущие терпимы для Российской биржи (акции на ММВБ Российских эмитентов) и напрочь не годятся для "Круглосуточников".
.
...
Рейтинг: 0 / 0
17.07.2017, 13:25
    #39490144
Блок А.Н.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как создать @class
О-О-Оя не являюсь проф программистом, я позволяю себе использовать определения, которые комфортны для меня. И так уж получилось, что они расходятся с общепринятыми.Скажите, как зайти к вам на фьючерсы, чтобы прикупить форексов?
...
Рейтинг: 0 / 0
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Как создать @class / 21 сообщений из 21, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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