powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Как создать @class
21 сообщений из 21, страница 1 из 1
Как создать @class
    #39489508
О-О-О
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Имеется БД в ней класс 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
Как создать @class
    #39489544
Фотография DAiMor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
О-О-О,

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

Откуда взялась уверенность что
Код: plaintext
@class(KillTcenaH1).%New()
это сработает?
class в данном случае просто переменная, и конечно он будет ругаться что UNDEFINED, потому что такая переменная не определена
...
Рейтинг: 0 / 0
Как создать @class
    #39489546
О-О-О
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
Как создать @class
    #39489593
О-О-О
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
Как создать @class
    #39489601
Блок А.Н.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
О-О-О,

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

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

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

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

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

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

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

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

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

Код: 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
Как создать @class
    #39489619
О-О-О
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
DAiMor,
Да, таблицы.
Баз Данных 3-4. Хотя рабочих 2.
...
Рейтинг: 0 / 0
Как создать @class
    #39489620
О-О-О
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Блок А.Н.О-О-О,
Мне кажется, вы ещё таблицу называете БД. Ну, положим, вам нужны для каждой котировки отдельная таблица. Для меня это сомнительно, так как структура данных все равно одинакова, но спорить с вами не буду. Но зачем вы переменные разные то используете?

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

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

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

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

http://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1266064&msg=20647611
...
Рейтинг: 0 / 0
Как создать @class
    #39489624
Фотография DAiMor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
О-О-ОВопрос в следующем - можно ли как то с косвенной переменной названия класса использовать
Код: 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
Как создать @class
    #39489627
О-О-О
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
Как создать @class
    #39489628
eduard93
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Глобал с данными можно автоматически по названию класса получать. Пример .
...
Рейтинг: 0 / 0
Как создать @class
    #39489629
Фотография DAiMor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
О-О-ОЯ только не совсем понимаю, почему код
Код: sql
1.
2.
3.
 set end=$Order(@bd(""), -1)
или 
 set end=$Order(bd(""), -1)




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

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

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


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

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

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

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

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

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

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

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

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


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