21.01.2002, 10:27 | #1 |
Moderator
|
Еще раз о Query
Чем больше разбираюсь с запросами, тем все непонятнее становится. (
Если с созданием запросов в АОТ еще все более-менее понятно то при создании из кода уже не все так гладко. 1. Куда возвращается результат выражений типа: select * from CustTable; В документации сказано: The result will always be returned in the table variable. Тогда почему следующий код вызывает ошибку: <pre> CustTable ct; ct = select * from CustTable; Eсли я делаю так: CustTable ct; select * from ct where .....; </pre> как я понимаю, результат сохраняется в ct. А что происходит в случае выборки из двух таблиц ? То есть, если я пишу: CustTable ct; VendTable vt; select * from ct,vt where ..... Где в данном случае сохранится результат ? 2. В Аксапте есть классы: Query, QueryBuildDataSource, QueryBuildRange, QueryBuildLink, QueryBuildDynalink, QueryRun. Почему я не вижу их в АОТ ? 3.<pre> QueryRun qr; Query NewQuery; QueryBuildDataSource bb; QueryBuildRange br; NewQuery = new Query ("MyQuery"); bb = NewQuery.AddDataSource (TableNum(CustTable)); br = bb.AddRange (fieldNum(CustTable, AccountNum)); br.value ("1500..2000"); qr = new QueryRun (NewQuery); </pre> Как я понимаю, выполнив этот код я должен получить в qr искомый набор данных. Почему же если я пытаюсь затем сделать следующее: <pre>if (qr.prompt()) { while (qr.next()) { print qr.AccountNum; // !!! Ошибка !!! } } </pre> компилятор сообщает об ошибке. Как обратиться к определенному полю в выборке? А как узнать количество записей возвращенных запросом ? Еще больше удивляет то, что запросы реализованны именно так и не иначе. (( Насколько я помню в рекламных проспектах Аксапты сообщалось о возможности использования SQL напрямую в коде программы. Вышеприведенный код, который, кстати, взят из справочной системы, свидетельсвует об обратном. Извините за столь обширный вопрос, но на службу поддержки особой надежды нет ((( <hr> <i>Отредактировал Роман Кошелев, используя тег <pre> см. http://www.axforum.info/forums/showt...=&threadid=177 |
|
21.01.2002, 11:44 | #2 |
сибиряк
|
_______
QueryRun qr; Query NewQuery; QueryBuildDataSource bb; QueryBuildRange br; // Slava, 21/01-02, --> CustTable cT; // Slava, 21/01-02, <-- ; NewQuery = new Query (); bb = NewQuery.AddDataSource (TableNum(CustTable)); br = bb.AddRange (fieldNum(CustTable, AccountNum)); br.value ("*"); qr = new QueryRun (NewQuery); if (qr.prompt()) { while (qr.next()) { // Slava, 21/01-02, --> cT = qr.get(tableNum(CustTable)); // Slava, 21/01-02, <-- print ct.AccountNum; // !!! Уже не ошибка !!! } } ______ Напрямую SQL - запрос можно выполнить вот так: Connection Con = new Connection(); Statement Stmt = Con.createStatement(); ResultSet R = Stmt.executeQuery('Select * From inventTable'); while ( R.next() ) { print R.getString(1); } Правда обращение к результату выборки только по номеру столбика _______ А вот такой код: CustTable ct; VendTable vt; select * from ct,vt where ..... ... мне повторить не удалось. Насколько я знаю синтаксис select'a не предусматривает такой конструкции, и компилятор справедливо ругается _______ А документацию по Query,QueryRun и т.д. в AOT можно посмотреть по адресу: AOT\System documentation\Classes\"интересующий тебя класс" Узнать бы где они спрятаны в AOT\Classes.
__________________
С уважением, Вячеслав. |
|
21.01.2002, 15:43 | #3 |
Участник
|
Re: Еще раз о Query
Цитата:
ct = select * from CustTable;
Цитата:
select * from ct where .....;
select ct where ....; Цитата:
select * from ct,vt where .....
Надо писать так: select ct join vt where ... Результат сохранится в табличных переменных ct и vt, если это inner join (по умолчанию) или outer join. Цитата:
2. В Аксапте есть классы: Query, QueryBuildDataSource, QueryBuildRange, QueryBuildLink, QueryBuildDynalink, QueryRun. Почему я не вижу их в АОТ ?
нет в AOT. Кажется, так... Цитата:
Еще больше удивляет то, что запросы реализованны именно так и не иначе. ((
|
|
21.01.2002, 20:19 | #4 |
Участник
|
Re: Еще раз о Query
Вроде уже ответили на все вопросы.
Хотелось бы добавить Цитата:
Изначально опубликовано Андре
2. В Аксапте есть классы: Query, QueryBuildDataSource, QueryBuildRange, QueryBuildLink, QueryBuildDynalink, QueryRun. Почему я не вижу их в АОТ ? Кроме того, бывают таблицы, которые не хранятся на сервере и не показаны в дереве AOT. Кстати, через этот раздел можно добраться до браузера у системных таблиц. Очень бывает интересно посмотреть на таблицы utilElements, utilIDElements. Это АОТ во внутреннем виде. Кроме того, тем кто пишет запросы напрямую к SQL будет полезна системная таблица SqlDictionary |
|
23.01.2002, 00:49 | #5 |
Участник
|
Привет!
1. В данном примере table variable это ct а CustTable это описание типа. В документации сказано правильно. Можно использовать: CustTable ct; select ct index AccountIdx where ct.AccountNum == "001"; // стиль используемый Navision 2. Они расположены в AOT/System Documentation/Classes. Правда, описания там очень мало, практически нет ничего 3. Результирующий набор записей можно обработать таким способом while (qr.next()) { ct = gr.get(tablenum(CustTable)); print ct.AccountNum; // Ok // print qr.AccountNum; // !!! Ошибка !!! } Количество записей : Counter total = SysQuery::CountTotal(qr); Прямой SQL можно использовать через CLS UserConnection но не удобно. |
|
24.01.2002, 11:22 | #6 |
Moderator
|
Во первых спасибо за помощь.
Хотелось бы уточнить несколько моментов: 1. Как я понял при создании Query из АОТ он будет возвращать все поля таблицы. По моему это не есть хорошо. А можно ли как-то ограничить количество возвращаемых полей. 2. Хотелось бы уточнить про выборку из двух и более связанных таблиц. Цитата:
Синтаксис встроенного SQL в Аксапте сильно отличается от привычного.
Надо писать так: select ct join vt where ... Результат сохранится в табличных переменных ct и vt, если это inner join (по умолчанию) или outer join. |
|
24.01.2002, 16:55 | #7 |
Участник
|
Цитата:
При выполнении данного запроса я ожидаю получить ОДИН результатирующий набор данных и мне не совсем понятно как "результат может сохраниться в двух переменных". Если Вас не затруднит, не могли бы Вы объяснить мне в чем здесь дело.
Чтобы "пробежаться" по всей выборке, используется оператор "while select": <pre> while select cT join vT where ... { // при каждом входе в тело цикла переменные cT и vT // принимают очередное значение из выборки } </pre> |
|
24.01.2002, 17:21 | #8 |
Участник
|
Цитата:
1. Как я понял при создании Query из АОТ он будет возвращать все поля таблицы. По моему это не есть хорошо. А можно ли как-то ограничить количество возвращаемых полей.
__________________
Дмитрий Чередниченко. |
|