30.01.2006, 10:25 | #1 |
Участник
|
Вложенный while select
вырезка из кода:
while (queryRunPosition.next()) { ... while select RAssetStandards where RAssetStandards.AssetId==RAsset.AccountNum {excel.cellValue(i,q+7,RAssetStandards.AcquisitionPrice);q++;} -здесь проходит в цикле 2 раза q=0; ... }- весь запрос также проходит в цикле 2 раза, хотя надо 1 Подскажите как сделать так чтобы queryRunPosition считывал только одну запись. |
|
30.01.2006, 10:39 | #2 |
Участник
|
Цитата:
Сообщение от Aslan
Подскажите как сделать так чтобы queryRunPosition считывал только одну запись.
Однако, логичнее поместить в запрос нужное количество записей, например сгруппировав. |
|
30.01.2006, 11:03 | #3 |
Moderator
|
Уважаемый Aslan, уточните, пож-та, в двух словах на человеческом языке (не кодом!) что Вы хотите получить? В частности, сколько у Вас моделей основных средств?
|
|
30.01.2006, 11:09 | #4 |
Участник
|
Без, имеется ввиду тут:
while (queryRunPosition.next()) т.е. просто queryRunPosition.next(); Но это, так к Вашему вопросу: Цитата:
Сообщение от Aslan
вырезка из кода:
while (queryRunPosition.next()) { ... ... }- весь запрос также проходит в цикле 2 раза, хотя надо 1 Подскажите как сделать так чтобы queryRunPosition считывал только одну запись. |
|
30.01.2006, 11:13 | #5 |
Участник
|
Ок....моделей учёта...два..(бух,налог)..на человеческом языке делаю отчёт по ОС. Теперь мне надо бы считать начисленный износ налогового учёта и бухгалтерского одновременно одним запросом.Поэтому приходится делать вложенный цикл. После прочтения первой записи в цикле во второй раз меняется колонка....вот и весь замысел, может можно сделать как то по другому, но искать другого выхода просто нет времени. При запросе одного ОС отчёт выводит его 3 раза.
|
|
30.01.2006, 11:19 | #6 |
Участник
|
если в Query, на основе которого был создан QueryRun, существуют связанные датасорсы, то запись основого датасорса будет выбираться до тех пор, пока существуют удовлетворяющие связям и рэйнджам записи в связанном датасорсе. Мне кажется в этом здесь проблема. Для этого у объекта класса QueryRun существует метод public boolean changed(tableId _table [, int _occurrence=1] ), который сообщает выбиралась ли после вызова next() новая запись в соответствующем датасорсе.
Последний раз редактировалось Artild; 30.01.2006 в 11:25. |
|
30.01.2006, 11:33 | #7 |
Участник
|
странно все это Changed перекрывать не надо, его надо вызывать
Хочу уточнить... В query у вас один датасорс и queryRun несколько раз выбирает одну и ту же запись? Попробуйте перед выполненим всего что вложено в основной цикл проверить с помощью changed изменение записи то есть если queryRunPosition.changed(tableNum(RAssetTable)) == true, то выполнем, если нет, то не выполняем цикл. |
|
30.01.2006, 11:39 | #8 |
Участник
|
Спасибо Artild.Точнее спасибо всем за отклик. И вправду сделал проверку на выбор queryRunPosition.changed(tableNum(RAssetTable)) всё стало на свои места.
|
|
30.01.2006, 11:43 | #9 |
Участник
|
Не за что. Только я все равно в непонятках остался Как это QueryRun на одну и ту же запись несколько раз выпадал, если связанных датасорсов нету. Не могет тако быть, имхо
|
|
30.01.2006, 12:50 | #10 |
Участник
|
Цитата:
Сообщение от Aslan
Ок....моделей учёта...два..(бух,налог)..на человеческом языке делаю отчёт по ОС.
Цитата:
Сообщение от Aslan
Теперь мне надо бы считать начисленный износ налогового учёта и бухгалтерского одновременно одним запросом. Поэтому приходится делать вложенный цикл.
Цитата:
Сообщение от Aslan
При запросе одного ОС отчёт выводит его 3 раза.
Цитата:
Сообщение от Aslan
...но искать другого выхода просто нет времени.
|
|
30.01.2006, 12:53 | #11 |
Moderator
|
Да. Будем ждать. Я так понял, что есть внешний цикл по RAssetTable, т.е. по кодам основных средств. И есть внутрений по RAssetStandards, т.е. по моделям ОС внутри одного кода. Поскольку моделей две, то и на каждое ОС выводится по две строки с одним и тем же AssetId и с разными AssetStandardId.
|
|
30.01.2006, 15:52 | #12 |
Участник
|
"Не верю!" (c) Станиславский.
Аслан, Вы ошибаетесь, так быть не может. Скорей всего у вас RAssetStandards уже выбирается в QueryRun. побробуйте полчить запись: queryRunPostioin.get(tableNum(RAssetStandards)). |
|