|  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 | 
| Участник | Цитата: 
		
			При выполнении данного запроса я ожидаю получить ОДИН результатирующий набор данных и мне не совсем понятно как "результат может сохраниться в двух переменных". Если Вас не затруднит, не  могли бы Вы объяснить мне в чем здесь дело.
		
	  Строка результирующей выборки состоит из всех полей таблицы CustTable и всех полей таблицы VendTable.  При выполнении оператора "select" считывается первая строка выборки, при этом в переменную cT попадут поля таблицы CustTable, а в переменную vT - соответственно поля таблицы VendTable. Чтобы "пробежаться" по всей выборке, используется оператор "while select": <pre> while select cT join vT where ... { // при каждом входе в тело цикла переменные cT и vT // принимают очередное значение из выборки } </pre> | 
|  | 
|  24.01.2002, 17:21 | #8 | 
| Участник | Цитата: 
		
			1. Как я понял при создании Query из АОТ он будет возвращать все поля таблицы. По моему это не есть хорошо. А можно ли как-то ограничить количество возвращаемых полей.
		
	 
				__________________ Дмитрий Чередниченко. | 
|  |