Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
как выбрать данные???
|
|||
|---|---|---|---|
|
#18+
Помогите пожалуйста с решение задачки. Дано: три переменных, в которых лежат: а) а1 - имя класса б) а2 - имя свойства, из класса в) а3 - id записи Нужно: получить данные из свойства указанного класса по указанному id аналогия: &sql(select field1 from table1 where id=1) как реализовать подобное на COS используя объектный доступ, или на худой конец прямое обращение к глобали? повторяюсь: всё лежит в переменных ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.07.2009, 21:46 |
|
||
|
как выбрать данные???
|
|||
|---|---|---|---|
|
#18+
Функции $zobjXXX не подошли? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.07.2009, 21:59 |
|
||
|
как выбрать данные???
|
|||
|---|---|---|---|
|
#18+
Ymka2007, Вижу 2 способа: 1) Поднимаем объект и берем свойство: Код: plaintext 1. 2. 3. 4. 5. 2) Берем напрямую из глобала через специальный метод свойства: Код: plaintext 1. 2. 3. 2 способ, по-моему, предпочтительней... ЗЫ: По хорошему надо еще проверить, что существует такой класс и хранимое свойство у класса. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.07.2009, 02:23 |
|
||
|
как выбрать данные???
|
|||
|---|---|---|---|
|
#18+
"Прямой" доступ к данным 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() ; закрываем объект ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.07.2009, 14:49 |
|
||
|
как выбрать данные???
|
|||
|---|---|---|---|
|
#18+
NMN, что-то вы используете какой-то неудобочитаемый способ объектного доступа да и прямой доступ понять сложно лучше $zobjXXX по моему нету ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.07.2009, 15:26 |
|
||
|
как выбрать данные???
|
|||
|---|---|---|---|
|
#18+
Если задавали карту хранения, то ничего сложного в прямом доступе нет. Set r=^INST(1212) Вычитает строку из глобала ^INST за номером 1212. $Piece(строка,разделитель,номер подстроки) Пример r="Вася^любит^Аню" Set k=$Piece(r,"^",1) ;k=Вася Т.е. поле в формате хранения нумеруются и разделяются разделителем, который вы задаете. Насчет объектной модели - используются стандартные вызовы объекта прародителя %OpenId и метод закрытия %Close (освобождение). Я например вообще не использую $zobjXXX. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.07.2009, 16:24 |
|
||
|
как выбрать данные???
|
|||
|---|---|---|---|
|
#18+
Трассировка показала, что 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) } " У меня таких методов вообще нет у класса. Скорее всего из-за способа хранения. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.07.2009, 16:46 |
|
||
|
как выбрать данные???
|
|||
|---|---|---|---|
|
#18+
в том то и дело зачем строить сложные конструкции с использованием косвенности если можно напрямую обращаться через спец функции если не ошибаюсь %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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.07.2009, 18:17 |
|
||
|
как выбрать данные???
|
|||
|---|---|---|---|
|
#18+
хм... нужно будет посмотреть что за GetStored такой объявился. У нас в продукте в одном из абстрактных базовых классов просто напросто объявлен метод, назовем его для простоты "GetFieldByID". Внутри у него не неонка, а генератор простого статического SQL запроса по "всем" полям - пропускаются коллекции и временные поля. В итоге к любому хранимому классу можно обратиться Код: plaintext 1. или, получить за одно обращение все свойства в массив и дальше самостоятельно Код: plaintext 1. 2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.07.2009, 18:56 |
|
||
|
как выбрать данные???
|
|||
|---|---|---|---|
|
#18+
Метод GetStored() появился уже в версии 5.1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.07.2009, 19:32 |
|
||
|
как выбрать данные???
|
|||
|---|---|---|---|
|
#18+
Ptnхм... нужно будет посмотреть что за GetStored такой объявился. Метод довольно-таки старый и очень полезный. Только хранение должно быть стандартным. Мы в связанных классах/таблицах объявляем калькулируемые свойства/поля с помощью этого метода и выбираем потом данные из одной таблицы - работает быстро. Пример класса "Город" Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. У нас в продукте в одном из абстрактных базовых классов просто напросто объявлен метод, назовем его для простоты "GetFieldByID". Внутри у него не неонка, а генератор простого статического SQL запроса по "всем" полям - пропускаются коллекции и временные поля. У нас тоже есть в базовых классах такой метод. Но мы им практически не пользуемся в силу выше сказанного. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.07.2009, 02:36 |
|
||
|
как выбрать данные???
|
|||
|---|---|---|---|
|
#18+
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 доступ. И потом уже объектный. Что, в общем-то и так понятно... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.07.2009, 02:46 |
|
||
|
как выбрать данные???
|
|||
|---|---|---|---|
|
#18+
> Следующим идет вариант через SQL доступ. > И потом уже объектный. В данном случае наоборот, объектный способ предпочтительнее т.к. для решения задачи можно использовать только dynamic sql, коий тормознее. Самый правильный вариант - GetStored, но он падает по Undefined, если подсунуть неправильный ID. =Сергей Шутов ООО Димас, Хабаровск Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.07.2009, 09:37 |
|
||
|
как выбрать данные???
|
|||
|---|---|---|---|
|
#18+
Да где же долго? Каше на 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 Гиге оперативы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.07.2009, 10:51 |
|
||
|
как выбрать данные???
|
|||
|---|---|---|---|
|
#18+
Set id=$Order(^глобалинд( код, "")) While id'="" { Set $Piece(^Глобал1(id),"^",2)="Новое наименование" Set id=$Order(^глобалинд(id)) } Тьфу пропустил ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.07.2009, 10:53 |
|
||
|
как выбрать данные???
|
|||
|---|---|---|---|
|
#18+
Версия кащея 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. Так что засада. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.07.2009, 11:12 |
|
||
|
как выбрать данные???
|
|||
|---|---|---|---|
|
#18+
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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.07.2009, 11:21 |
|
||
|
как выбрать данные???
|
|||
|---|---|---|---|
|
#18+
SocratdvYmka2007, Вижу 2 способа: 1) Поднимаем объект и берем свойство: Код: plaintext 1. 2. 3. 4. 5. 2) Берем напрямую из глобала через специальный метод свойства: Код: plaintext 1. 2. 3. 2 способ, по-моему, предпочтительней... ЗЫ: По хорошему надо еще проверить, что существует такой класс и хранимое свойство у класса. ClassMethod getPropData(class, prop As %String, id As %Integer) As %String в этой строке class уже как объект должен фигурировать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.07.2009, 11:32 |
|
||
|
как выбрать данные???
|
|||
|---|---|---|---|
|
#18+
Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.07.2009, 11:57 |
|
||
|
как выбрать данные???
|
|||
|---|---|---|---|
|
#18+
кстати по словам "не работает" сложно определить ошибку пробуйте так Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.07.2009, 12:12 |
|
||
|
как выбрать данные???
|
|||
|---|---|---|---|
|
#18+
Как быть, если класс отображен из внешней таблицы через SQL-Шлюз, например, из Oracle? Как быть, если свойство класса вычисляемое, временное? Как я понимаю, Zen-компонент должен уметь работать с такими классами/свойствами. Остается вариант 1), предложенный Socratdv , немного мною доработанный: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. Вариант с косвенностью уступает в быстродействии варианту с $zobjXXX . К тому же, с косвенностью возникают нюансы с контекстом переменных, что Ymka2007 успел подтвердить. Чтобы метод a заработал, добавьте [ ProcedureBlock = 0 ] к его описанию. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.07.2009, 12:20 |
|
||
|
как выбрать данные???
|
|||
|---|---|---|---|
|
#18+
DAiMorкстати по словам "не работает" сложно определить ошибку пробуйте так Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 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 мог работать с данными ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.07.2009, 12:21 |
|
||
|
как выбрать данные???
|
|||
|---|---|---|---|
|
#18+
servitЧтобы метод a заработал, добавьте [ ProcedureBlock = 0 ] к его описанию. что означает [ ProcedureBlock = 0 ] ? мне что б знать, на будущее с загрузкой данных для dataCombomMS закончил, приступаю к отработке чекбоксов при начальной загрузке ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.07.2009, 13:12 |
|
||
|
как выбрать данные???
|
|||
|---|---|---|---|
|
#18+
Ymka2007что означает [ ProcedureBlock = 0 ] ? мне что б знать, на будущее с загрузкой данных для dataCombomMS закончил, приступаю к отработке чекбоксов при начальной загрузке ProcedureBlock , ProcedureBlock управляют областью видимости переменных. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.07.2009, 13:30 |
|
||
|
как выбрать данные???
|
|||
|---|---|---|---|
|
#18+
Про область видимости переменных можно почитать здесь . Далее следуйте по ссылкам. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.07.2009, 13:37 |
|
||
|
|

start [/forum/topic.php?fid=39&msg=36099572&tid=1558415]: |
0ms |
get settings: |
6ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
39ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
59ms |
get tp. blocked users: |
1ms |
| others: | 224ms |
| total: | 357ms |

| 0 / 0 |
