20.12.2011, 18:02 | #1 |
Участник
|
QueryRun, получить field квери по имени
Вечер добрый.
Есть большая QueryRun в АОТ, состоящая из 5 таблиц. Есть табличка с пользовательскими форматами (для различных экспортов), где определяются поля из той большой квери и их порядок вывода. Табличку заполняли руками Вопрос: как в цикле получить поле из квери зная имя поля и имя DS, чтобы не писать switch и не обрабатывать руками? Спасибо. |
|
20.12.2011, 18:40 | #2 |
Участник
|
Спасибо _scorp_ подсказал что есть замечательный способ доступа к полям курсора через
X++: cursor.(fieldname2id(tablenum(Table), 'ItemId')); |
|
20.12.2011, 21:04 | #3 |
Молодой, подающий надежды
|
Можно проще:
X++: cursor.(fieldnum(Table, Field)) |
|
|
За это сообщение автора поблагодарили: alvares (1). |
21.12.2011, 08:14 | #4 |
Участник
|
Это только если на этапе компиляции знаешь имя поля.
Но если это так, то тогда можно ещё проще X++: cursor.Field Последний раз редактировалось S.Kuskov; 21.12.2011 в 08:35. |
|
21.12.2011, 10:37 | #5 |
MCITP
|
Цитата:
Возможно - это Common. Смотря как организовать цикл - автор не уточняет...
__________________
Zhirenkov Vitaly |
|
21.12.2011, 11:52 | #6 |
Участник
|
Цитата:
X++: MyTable MyTable; MyTable = common; // типизируем "обезличенный" курсор MyTable.Field // вуаля P.S.: Кроме может быть обхода ошибки компиляции "Поле должно быть элементом данных, допускающим использование в операторе присвоения." при присваивании значений системным полям |
|
21.12.2011, 12:19 | #7 |
MCITP
|
Просто как я понял ситуацию автора:
- есть квериРан с рядом таблиц и есть настроечная таблица в которой есть данные типа Таблица+Поле - данные поля должны быть взяты из нашего квериРана и куда-то выведены - есть цикл по этим таблицам внутри цикла по квериРану, т.к. автор не хочет писать явных свитчей, то соответсвенно он не хочет писать и явной типизации курсоров. т.е. он последовательно получит ряд нетипизированных курсоров. Сравнит TableId. Выведет поле. И в общем случае большого кол-ва таблиц в квере вероятно он прав. Как-то так. Upd: Т.е. в данном случае понятно, что функция fieldnum в чистом виде ему не нужна, а скорее понадобится fieldName2Id или что-то в этом роде, зависит от реализации. Но сути это сильно не меняет...
__________________
Zhirenkov Vitaly Последний раз редактировалось ZVV; 21.12.2011 в 12:23. |
|
|
За это сообщение автора поблагодарили: S.Kuskov (2), alvares (1). |
21.12.2011, 19:10 | #8 |
Участник
|
Цитата:
Сообщение от ZVV
Просто как я понял ситуацию автора:
- есть квериРан с рядом таблиц и есть настроечная таблица в которой есть данные типа Таблица+Поле - данные поля должны быть взяты из нашего квериРана и куда-то выведены - есть цикл по этим таблицам внутри цикла по квериРану, т.к. автор не хочет писать явных свитчей, то соответсвенно он не хочет писать и явной типизации курсоров. т.е. он последовательно получит ряд нетипизированных курсоров. Сравнит TableId. Выведет поле. И в общем случае большого кол-ва таблиц в квере вероятно он прав. Как-то так. Upd: Т.е. в данном случае понятно, что функция fieldnum в чистом виде ему не нужна, а скорее понадобится fieldName2Id или что-то в этом роде, зависит от реализации. Но сути это сильно не меняет... Ведь к DS мы может обратиться через его имя (строку), X++: qbds = query.dataSourceName('NameDS'); X++: cursor.fieldName('Field1'); |
|
21.12.2011, 19:55 | #9 |
Молодой, подающий надежды
|
fieldName2Id() возможен, если во всех таблицах поля имеют одинаковое название. Если в названии по сути одинаковых полей имеются вариации (возможно не сейчас, но в будущее тоже стоит смотреть), то лучше наверное создать Map с необходимым набором полей и замапить все необходимые таблицы. В цикле присваивать значение мапу и делать просто:
X++: cursor.Field |
|