powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / как выбрать данные???
25 сообщений из 29, страница 1 из 2
как выбрать данные???
    #36099572
Ymka2007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Помогите пожалуйста с решение задачки.

Дано: три переменных, в которых лежат:
а) а1 - имя класса
б) а2 - имя свойства, из класса
в) а3 - id записи
Нужно: получить данные из свойства указанного класса по указанному id
аналогия: &sql(select field1 from table1 where id=1)

как реализовать подобное на COS используя объектный доступ, или на худой конец прямое обращение к глобали?
повторяюсь: всё лежит в переменных
...
Рейтинг: 0 / 0
как выбрать данные???
    #36099586
Фотография ну я
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Функции $zobjXXX не подошли?
...
Рейтинг: 0 / 0
как выбрать данные???
    #36099761
Socratdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ymka2007,

Вижу 2 способа:
1) Поднимаем объект и берем свойство:
Код: plaintext
1.
2.
3.
4.
5.
ClassMethod getPropData(class, prop As %String, id As %Integer) As %String
{
	s obj=$zobjclassmethod(class,"%OpenId",id)
	q:$IsObject(obj) $zobjproperty(obj,prop)
	q ""
}

2) Берем напрямую из глобала через специальный метод свойства:
Код: plaintext
1.
2.
3.
ClassMethod getPropData(class, prop As %String, id As %Integer) As %String
{
	q $zobjclassmethod(class,prop_"GetStored",id)
}

2 способ, по-моему, предпочтительней...

ЗЫ: По хорошему надо еще проверить, что существует такой класс и хранимое свойство у класса.
...
Рейтинг: 0 / 0
как выбрать данные???
    #36100946
NMN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
NMN
Гость
"Прямой" доступ к данным

Set a1="^INST" ;имя массива из способа хранения
Set a2="5" ; номер свойства из описания способа хранения
Set a3="1477" ; идентификатор
Set str=@(a1_"("_a3_")") ; аналогично Set str=^INST(1477)
Set r=$Piece(str,"^",a2) ;

Доступ через объектную модель

Set a1="WRK.Instances" ;имя класса
Set a2="iCode" ;имя свойства
Set a3="1477" ; идентификатор
Set p=("##Class("_a1_").%OpenId("_a3_")") ;сформируем ##Class(WRK.Instances).%OpenId(1477)
Set @("obj="_p) ;открываем экземпляр класса
Set @("r=obj."_a2) ; вычитываем значение параметра
Do obj.%Close() ; закрываем объект
...
Рейтинг: 0 / 0
как выбрать данные???
    #36101052
Фотография DAiMor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NMN,

что-то вы используете какой-то неудобочитаемый способ объектного доступа
да и прямой доступ понять сложно

лучше $zobjXXX по моему нету
...
Рейтинг: 0 / 0
как выбрать данные???
    #36101258
NMN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
NMN
Гость
Если задавали карту хранения, то ничего сложного в прямом доступе нет.
Set r=^INST(1212)
Вычитает строку из глобала ^INST за номером 1212.
$Piece(строка,разделитель,номер подстроки)
Пример r="Вася^любит^Аню"
Set k=$Piece(r,"^",1) ;k=Вася
Т.е. поле в формате хранения нумеруются и разделяются разделителем, который вы задаете.

Насчет объектной модели - используются стандартные вызовы объекта прародителя %OpenId и метод закрытия %Close (освобождение). Я например вообще не использую $zobjXXX.
...
Рейтинг: 0 / 0
как выбрать данные???
    #36101320
NMN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
NMN
Гость
Трассировка показала, что Set obj=##Class(WRK.Instances).%OpenId(1477)
и Set obj=$zobjclassmethod("WRK.Instances","%OpenId",1477) вызывают один и тот же метод класса.
Разница = 0. С тем лишь интересным моментом, что произойдет с obj не в моем способе. Я-то его закрываю вроде по правилам, соответствующим методом. В частности чтобы сохранить изменения же приходится вызвать метод %Save, то и % Close должен быть, чтобы высвободить объект.

"
2) Берем напрямую из глобала через специальный метод свойства:

ClassMethod getPropData(class, prop As %String, id As %Integer) As %String
{
q $zobjclassmethod(class,prop_"GetStored",id)
}
"

У меня таких методов вообще нет у класса. Скорее всего из-за способа хранения.
...
Рейтинг: 0 / 0
как выбрать данные???
    #36101550
Фотография DAiMor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в том то и дело зачем строить сложные конструкции с использованием косвенности
если можно напрямую обращаться через спец функции

если не ошибаюсь %Close оставлен для совместимости и давно аннулирован
а объект закрывается и удаляется по kill

GetStored полагаю появился только с версией 5.1, у меня его тоже нет, а в документации к 2009.1 нашел упоминание про нее

_________________________________
Cache for Windows NT (AMD64) 5.0.21 (Build 6408) Tue Jan 3 2006 13:37:41 EST
...
Рейтинг: 0 / 0
как выбрать данные???
    #36101635
Ptn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
хм... нужно будет посмотреть что за GetStored такой объявился.

У нас в продукте в одном из абстрактных базовых классов просто напросто объявлен метод, назовем его для простоты "GetFieldByID".

Внутри у него не неонка, а генератор простого статического SQL запроса по "всем" полям - пропускаются коллекции и временные поля.

В итоге к любому хранимому классу можно обратиться
Код: plaintext
1.
set fullname=##class(SomeClass).GetFieldByID( 10 ,"fullname")

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

Код: plaintext
1.
2.
d ##class(SomeClass).GetFieldByID( 10 ,"",.field)
set fullname=$g(field("fullname"))
...
Рейтинг: 0 / 0
как выбрать данные???
    #36101697
servit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Метод GetStored() появился уже в версии 5.1.
...
Рейтинг: 0 / 0
как выбрать данные???
    #36101997
Socratdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ptnхм... нужно будет посмотреть что за GetStored такой объявился.

Метод довольно-таки старый и очень полезный. Только хранение должно быть стандартным.
Мы в связанных классах/таблицах объявляем калькулируемые свойства/поля с помощью этого метода и выбираем потом данные из одной таблицы - работает быстро.

Пример класса "Город"
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
Class City Extends %Persistent
{

Property CountryItem As Country [ Private ];

Property Name As %String;

Property Country As %String [ Calculated, SqlComputed, SqlComputeCode = {s {*}=##class(Country).NameGetStored({CountryItem})} ];

}
Ptn
У нас в продукте в одном из абстрактных базовых классов просто напросто объявлен метод, назовем его для простоты "GetFieldByID".

Внутри у него не неонка, а генератор простого статического SQL запроса по "всем" полям - пропускаются коллекции и временные поля.


У нас тоже есть в базовых классах такой метод. Но мы им практически не пользуемся в силу выше сказанного.
...
Рейтинг: 0 / 0
как выбрать данные???
    #36102001
Socratdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
NMN"Прямой" доступ к данным

Set a1="^INST" ;имя массива из способа хранения
Set a2="5" ; номер свойства из описания способа хранения
Set a3="1477" ; идентификатор
Set str=@(a1_"("_a3_")") ; аналогично Set str=^INST(1477)
Set r=$Piece(str,"^",a2) ;

Для такого "прямого" доступа к данным нужно точно знать описание хранения. Выдернуть эти данные довольно-таки долго и не просто.
Кащей же сам делает это при генерации метода "GetStored".

Если такого метода у Вас нет, то его можно генерировать самостоятельно, указав для класса PropertyClass.

Самый нормальный вариант по быстродействию - прямой доступ, используя специальный метод.
Следующим идет вариант через SQL доступ.
И потом уже объектный.
Что, в общем-то и так понятно...
...
Рейтинг: 0 / 0
как выбрать данные???
    #36102156
logist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Следующим идет вариант через SQL доступ.
> И потом уже объектный.

В данном случае наоборот, объектный способ предпочтительнее т.к. для решения
задачи можно использовать только dynamic sql, коий тормознее.

Самый правильный вариант - GetStored, но он падает по Undefined, если подсунуть
неправильный ID.

=Сергей Шутов
ООО Димас, Хабаровск
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
как выбрать данные???
    #36102317
NMN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
NMN
Гость
Да где же долго? Каше на MUMPS база?
То тогда и работа с глобалами быстрее, когда используется обычный MUMPS
И куда же проще и быстрей, если у Вас будет описан формат хранения использовать
Set r=$Piece(^INST(1277),"^",2) , для получения значения 2-го свойства?
Из плюсов описания формата хранения я вижу использование индексных глобалов, использование которых кстати "ускоряет" выполнение sql запросов по полям участвующим в этом описании
Пример.

Глобал
^Глобал1(id) = код^наименование^документ

Индексный глобал с именем "глобалинд"
^глобалинд(Код,id)=""

Итак можно "пробегать" для одного кода все записи глобала Глобал1
Set id=$Order(^глобалинд(""))
While id'="" {
Set $Piece(^Глобал1(id),"^",2)="Новое наименование"
Set id=$Order(^глобалинд(id))
}

И 100% этот код выполняется для миллионных записей секунд 10 максимум на 2,5 ГГц и 1 Гиге оперативы.
...
Рейтинг: 0 / 0
как выбрать данные???
    #36102326
NMN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
NMN
Гость
Set id=$Order(^глобалинд( код, ""))
While id'="" {
Set $Piece(^Глобал1(id),"^",2)="Новое наименование"
Set id=$Order(^глобалинд(id))
}

Тьфу пропустил
...
Рейтинг: 0 / 0
как выбрать данные???
    #36102380
NMN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
NMN
Гость
Версия кащея 5.0.21.%
Получается GetStored() только снится мне и плюс "A new property method is now implemented for all storable properties of persistent classes that are using default storage (%CacheStorage)." . А у нас используется только Cache' SQL Storage. Так что засада.
...
Рейтинг: 0 / 0
как выбрать данные???
    #36102409
Ymka2007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
NMN"Прямой" доступ к данным

Set a1="^INST" ;имя массива из способа хранения
Set a2="5" ; номер свойства из описания способа хранения
Set a3="1477" ; идентификатор
Set str=@(a1_"("_a3_")") ; аналогично Set str=^INST(1477)
Set r=$Piece(str,"^",a2) ;


Set a2="5" ; номер свойства из описания способа хранения - неизвестен, нужно его как то вытаскивать, как не знаю

всем спасибо, сейчас буду пробовать
это честно говоря для нужд нового компонента dataComboMS
...
Рейтинг: 0 / 0
как выбрать данные???
    #36102444
Ymka2007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SocratdvYmka2007,

Вижу 2 способа:
1) Поднимаем объект и берем свойство:
Код: plaintext
1.
2.
3.
4.
5.
ClassMethod getPropData(class, prop As %String, id As %Integer) As %String
{
	s obj=$zobjclassmethod(class,"%OpenId",id)
	q:$IsObject(obj) $zobjproperty(obj,prop)
	q ""
}

2) Берем напрямую из глобала через специальный метод свойства:
Код: plaintext
1.
2.
3.
ClassMethod getPropData(class, prop As %String, id As %Integer) As %String
{
	q $zobjclassmethod(class,prop_"GetStored",id)
}

2 способ, по-моему, предпочтительней...

ЗЫ: По хорошему надо еще проверить, что существует такой класс и хранимое свойство у класса.

ClassMethod getPropData(class, prop As %String, id As %Integer) As %String
в этой строке class уже как объект должен фигурировать?
...
Рейтинг: 0 / 0
как выбрать данные???
    #36102538
Ymka2007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
ClassMethod a(className As %String, colName As %String, val As %String) As %String
{
	s:$g(val)="" val="36,2"
	s className="hndb.balls"
	s colName="bFirm"
	s tDisplay=""
	f i= 1 : 1 :$l(val,",") {
		Set o=("##Class("_className_").%OpenId("_$p(val,",",i)_")")
		Set @("obj="_o) ;открываем экземпляр класса
		;w obj,!
		;Set @("r=obj."_colName) ; вычитываем значение параметра
		s tDisplay=tDisplay_$s(tDisplay'="":",", 1 :"")_ @("obj."_colName) 
		Do obj.%Close() ; закрываем объект
		d o.%Close()
	}
	q tDisplay
}
не работает
...
Рейтинг: 0 / 0
как выбрать данные???
    #36102588
Фотография DAiMor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
кстати по словам "не работает" сложно определить ошибку
пробуйте так
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
ClassMethod a(className As %String, colName As %String, val As %String) As %String
{
	s:$g(val)="" val="36,2"
	s className="hndb.balls"
	s colName="bFirm"
	s tDisplay=""
	f i= 1 : 1 :$l(val,",") {
		Set o=$zobjclassmethod(className,"%OpenId",$p(val,",",i))
		s r=$zobjproperty(o,colName) ; вычитываем значение свойства
		s tDisplay=tDisplay_$s(tDisplay'="":",", 1 :"")_r
		; Do o.%Close() ; закрываем объект  - ненужно		
	}
	q tDisplay
}


PS использовать разделители в строках думаю не лучший способ версиях выше 5.0
есть уже $LISTFROMSTRING ($LFS) и $LISTTOSTRING ($LTS)
и уже ходить по листбилду, или лучше сразу такие строки в листбилде собирать, и нет необходимости помнить разделители
_________________________________
Cache for Windows NT (AMD64) 5.0.21 (Build 6408) Tue Jan 3 2006 13:37:41 EST
...
Рейтинг: 0 / 0
как выбрать данные???
    #36102610
servit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как быть, если класс отображен из внешней таблицы через SQL-Шлюз, например, из Oracle?
Как быть, если свойство класса вычисляемое, временное?

Как я понимаю, Zen-компонент должен уметь работать с такими классами/свойствами.

Остается вариант 1), предложенный Socratdv , немного мною доработанный:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
ClassMethod getPropData(class As %String, prop As %String, id As %String) As %String
{
  try{
    set r=$zobjproperty($zobjclassmethod(class,"%OpenId",id),prop)
  }catch{
    set r=""
  }
  q r
}

>w ##class(...).getPropData("Имя класса","имя поля","ID записи")


Вариант с косвенностью уступает в быстродействии варианту с $zobjXXX . К тому же, с косвенностью возникают нюансы с контекстом переменных, что Ymka2007 успел подтвердить.
Чтобы метод a заработал, добавьте [ ProcedureBlock = 0 ] к его описанию.
...
Рейтинг: 0 / 0
как выбрать данные???
    #36102616
Ymka2007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
DAiMorкстати по словам "не работает" сложно определить ошибку
пробуйте так
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
ClassMethod a(className As %String, colName As %String, val As %String) As %String
{
	s:$g(val)="" val="36,2"
	s className="hndb.balls"
	s colName="bFirm"
	s tDisplay=""
	f i= 1 : 1 :$l(val,",") {
		Set o=$zobjclassmethod(className,"%OpenId",$p(val,",",i))
		s r=$zobjproperty(o,colName) ; вычитываем значение свойства
		s tDisplay=tDisplay_$s(tDisplay'="":",", 1 :"")_r
		; Do o.%Close() ; закрываем объект  - ненужно		
	}
	q tDisplay
}


PS использовать разделители в строках думаю не лучший способ версиях выше 5.0
есть уже $LISTFROMSTRING ($LFS) и $LISTTOSTRING ($LTS)
и уже ходить по листбилду, или лучше сразу такие строки в листбилде собирать, и нет необходимости помнить разделители
_________________________________
Cache for Windows NT (AMD64) 5.0.21 (Build 6408) Tue Jan 3 2006 13:37:41 EST

спасибо заработало: как раз то что нужно !!!
на этапе формирования забыл какие бывают функции $ZOBJXXX (блин, а ведь знал)
формирую через разделитель для того чтобы JS мог работать с данными
...
Рейтинг: 0 / 0
как выбрать данные???
    #36102775
Ymka2007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
servitЧтобы метод a заработал, добавьте [ ProcedureBlock = 0 ] к его описанию.

что означает [ ProcedureBlock = 0 ] ? мне что б знать, на будущее
с загрузкой данных для dataCombomMS закончил, приступаю к отработке чекбоксов при начальной загрузке
...
Рейтинг: 0 / 0
как выбрать данные???
    #36102826
servit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ymka2007что означает [ ProcedureBlock = 0 ] ? мне что б знать, на будущее
с загрузкой данных для dataCombomMS закончил, приступаю к отработке чекбоксов при начальной загрузке
ProcedureBlock , ProcedureBlock управляют областью видимости переменных.
...
Рейтинг: 0 / 0
как выбрать данные???
    #36102845
servit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Про область видимости переменных можно почитать здесь . Далее следуйте по ссылкам.
...
Рейтинг: 0 / 0
25 сообщений из 29, страница 1 из 2
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / как выбрать данные???
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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