03.09.2008, 12:36 | #1 |
Участник
|
While select.... и итерация
Такой вопрос для укрепления знаний
Например, я могу получить всех клиентов: X++: CustTable custTable;
;
select custTable; Насколько я понимаю, если написать X++: while select custTable{} |
|
03.09.2008, 12:40 | #2 |
Участник
|
можно написать next custtable; - так нового запроса не будет
а "while select custtable" - Будет новый запрос к БД |
|
|
За это сообщение автора поблагодарили: vadimiron (1). |
03.09.2008, 12:50 | #3 |
Участник
|
А еще лучше просто сразу написать
X++: CustTable custTable; ; while select custTable { } |
|
|
За это сообщение автора поблагодарили: vadimiron (1). |
03.09.2008, 13:02 | #4 |
Участник
|
А в случае "next custtable" нужно делать сбрасывание курсора, если я хочу с начала итерацию начать??
Дело в том, что запрос (select custTable where....) происходит в одной функции, а вот итерация по результату запроса происходит в нескольких других - то есть мне нужно несколько раз пройтись по результату запроса без повторного обращения к базе данным |
|
03.09.2008, 13:02 | #5 |
Ищущий знания...
|
можно конечно вот так:
X++: CustTable custTable; ; select custTable; while(custTable) { print custTable.AccountNum; next custTable; } 1. Самое первое и главное можно забыть про NEXT и тогда уйдем в бесконечный цикл! 2. Менее читабельно. Так что самый правильный вариант, это как советует kashperuk
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с) С Уважением, Елизаров Артем |
|
03.09.2008, 13:06 | #6 |
Участник
|
lev - мне надо запрос и итерацию по результату разделить в разные функции
|
|
03.09.2008, 13:06 | #7 |
Участник
|
А зачем так сделали? Ещё можно воспользоваться Query, если нужно какие-то параметры запроса использовать несколько раз. Но, чтобы чётко сказать, что лучше, нужно знать задачу.
|
|
03.09.2008, 13:11 | #8 |
Ищущий знания...
|
Цитата:
X++: queryRun.reset();
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с) С Уважением, Елизаров Артем |
|
03.09.2008, 13:11 | #9 |
Member
|
Цитата:
Сообщение от vadimiron
...
Например, я могу получить всех клиентов: X++: CustTable custTable;
;
select custTable; Цитата:
Сообщение от vadimiron
...
Насколько я понимаю, если написать X++: while select custTable{} Отправляя в БД запрос вы как-бы формируете множество записей, которые вам выдаст БД. По этому списку вы можете двигаться взад-вперед. Реально в СУБД создается некий объект, дергая который вы можете получать следующую запись, и, при необходимости, обновлять или удалять ее. Данные из БД в Аксапте вы всегда получаете по одной записи. Между клиентом и АОСом действует уже иной механизм. Т.о. получение следующей записи не порождает новый запрос, а работает с изначальным. Почитайте про механизм курсоров в документации по MS SQL Server.
__________________
С уважением, glibs® |
|
|
За это сообщение автора поблагодарили: vadimiron (1). |
03.09.2008, 13:16 | #10 |
Ищущий знания...
|
Вот полный пример работы с query:
X++: static void AEliz_test(Args _args) { Query query = new Query(); QueryRun queryRun; QueryBuildDataSource qbds; CustTable custTable; ; qbds = query.addDataSource(tableNum(CustTable)); queryRun = new QueryRun(query); while(queryRun.next()) { print custTable.AccountNum; } queryRun.reset(); while(queryRun.next()) { print custTable.AccountNum; } } P.S. кстати, в случае с query не нужно думать про NEXT всё делается само автоматически, а это огромный плюс.
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с) С Уважением, Елизаров Артем Последний раз редактировалось lev; 03.09.2008 в 13:17. Причина: P.S. |
|
03.09.2008, 13:28 | #11 |
Member
|
Более правильная версия полного примера.
X++: static server void glibs(Args _args) { Query query = new Query(); QueryRun queryRun; QueryBuildDataSource qbds; CustTable custTable; ; qbds = query.addDataSource(tableNum(CustTable)); queryRun = new QueryRun(query); while(queryRun.next()) { custTable = queryRun.get(tablenum(CustTable)); print custTable.AccountNum; } queryRun.reset(); while(queryRun.next()) { custTable = queryRun.get(tablenum(CustTable)); print custTable.AccountNum; } pause; }
__________________
С уважением, glibs® |
|
03.09.2008, 13:34 | #12 |
Ищущий знания...
|
Да действительно, забыл про инициализацию таблицы, сорри
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с) С Уважением, Елизаров Артем |
|
03.09.2008, 14:39 | #13 |
Участник
|
|
|