![]() |
#1 |
MCTS
|
![]()
Интересует такой вопрос .
Есть курсор после выполнения чего-нибудь (запроса, select'a и т.д.) Можно ли как-нибудь узнать текущую запись (номер) и кол-во записей в курсоре, не выполняя запрос еще раз. |
|
![]() |
#2 |
Lean Six Sigma
|
нельзя.
|
|
![]() |
#3 |
Участник
|
static void cursorTest(Args _args)
{ InventTable it; int i = 0; ; select it; while (it.recId != 0) { i++; print(strFmt("%1", it.RecId)); next it; } print(strFmt("Всего- %1", i)); } |
|
![]() |
#4 |
Lean Six Sigma
|
Согласен. Так - можно. Нужно ли?
|
|
![]() |
#5 |
Участник
|
![]()
Иногда бывает нужно. Удобно может быть, когда выбирается небольшое количество записей, а не вся InventTable, или еще лучше InventTrans
![]() |
|
![]() |
#6 |
MCTS
|
Класс! То что надо.
Спасибо большое. А чтобы в обратном порядке бегать, есть какая-нибудь команда? |
|
![]() |
#7 |
Участник
|
Не знаю такого
![]() |
|
![]() |
#8 |
Участник
|
Цитата:
Изначально опубликовано CDR
А чтобы в обратном порядке бегать, есть какая-нибудь команда? SELECT REVERSE IT; хотя, полученный результат для меня был несколько неожиданным)) |
|
![]() |
#9 |
Участник
|
В случае select reverse ... будет новый запрос на сервер. Записи отбираются в курсор в порядке, указанном в запросе, как бегать в обратном направлении по записям курсора не знаю... Может стоит поискать другое решени, зависит от конкретной задачи, БП и его реализации.
|
|
![]() |
#10 |
Участник
|
Хотите сказать, что если будет такой код
PHP код:
А если использовать тот же код но с параметром Reverse в Select: PHP код:
|
|
![]() |
#11 |
Участник
|
![]()
Уж и не знаю, что ответить....
![]() |
|
![]() |
#12 |
Участник
|
france ваше замечание оторвано от контекста темы, вопрос был в переборе записей, уже отобранных в курсор, а не в различных способах выборки записей из БД...
![]() |
|
![]() |
#13 |
Участник
|
будем считать, что вне контекста и закроем вопрос.
![]() |
|
![]() |
#14 |
Участник
|
Не выполняя никакого запроса еще раз не получится.
Если вы используете query, можно сильно сократить перебор в запросе за счет использования агреггирующих функций http://forum.mazzy.ru/index.php?showtopic=300 В select агрегирующие функции надо вписывать вручную. |
|
![]() |
#15 |
Участник
|
Согласен, Query и QueryRun гораздо удобнее, когда не все параметры известны до момента исполнения логики. При этом, запрос к БД будет формироваться при первом исполнении QueryRun.next() для построенного Query. После изменения Query для уже существующего QueryRun, при первом QueryRun.next() снова будет запрос к БД.
|
|
![]() |
#16 |
MCTS
|
Да, однако класс QueryRun также имеет только метод .next().
Получается, что если в курсоре необходимо обратиться к предыдущим записям, выполняй запрос заново? ![]() |
|
![]() |
#17 |
Участник
|
Если не ошибаюсь, то возможность перебирать выборку в одном направлении сделана из соображений производительности.
Так как в сиквеле есть несколько видов курсоров - один может перебирать запись и только в одном направлении, а другой в обоих. Но последний работает значительно медленнее. В принципе если запись уже выбрана один раз, то для того чтобы к ней вернуться, стоит организовать некое подобие массива ? Получится быстрее. |
|
![]() |
#18 |
Модератор
|
Сомневаюсь.. Или Вы в памяти будете весь массив держать? Приемлемый вариант - временная таблица. А если на диске, то снова запросы...
|
|
![]() |
#19 |
Участник
|
Цитата:
Изначально опубликовано George Nordic
Приемлемый вариант - временная таблица. ![]() Надеюсь это шутка? |
|
![]() |
#20 |
Модератор
|
Временная таблица заполняется оттуда, где будет вставлена 1 запись. Причем не факт, что она будет создана на диске - скорее всего в памяти.
А Вы предлагаете массив? ![]() |
|