09.04.2004, 13:05 | #1 |
MCTS
|
Курсоры
Интересует такой вопрос .
Есть курсор после выполнения чего-нибудь (запроса, select'a и т.д.) Можно ли как-нибудь узнать текущую запись (номер) и кол-во записей в курсоре, не выполняя запрос еще раз. |
|
09.04.2004, 17:28 | #2 |
Lean Six Sigma
|
нельзя.
|
|
09.04.2004, 18:02 | #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)); } |
|
09.04.2004, 20:41 | #4 |
Lean Six Sigma
|
Согласен. Так - можно. Нужно ли?
|
|
12.04.2004, 09:31 | #5 |
Участник
|
Иногда бывает нужно. Удобно может быть, когда выбирается небольшое количество записей, а не вся InventTable, или еще лучше InventTrans ...
|
|
12.04.2004, 10:01 | #6 |
MCTS
|
Класс! То что надо.
Спасибо большое. А чтобы в обратном порядке бегать, есть какая-нибудь команда? |
|
12.04.2004, 11:20 | #7 |
Участник
|
Не знаю такого
|
|
12.04.2004, 12:11 | #8 |
Участник
|
Цитата:
Изначально опубликовано CDR
А чтобы в обратном порядке бегать, есть какая-нибудь команда? SELECT REVERSE IT; хотя, полученный результат для меня был несколько неожиданным)) |
|
12.04.2004, 14:43 | #9 |
Участник
|
В случае select reverse ... будет новый запрос на сервер. Записи отбираются в курсор в порядке, указанном в запросе, как бегать в обратном направлении по записям курсора не знаю... Может стоит поискать другое решени, зависит от конкретной задачи, БП и его реализации.
|
|
12.04.2004, 15:26 | #10 |
Участник
|
Хотите сказать, что если будет такой код
PHP код:
А если использовать тот же код но с параметром Reverse в Select: PHP код:
|
|
12.04.2004, 17:57 | #11 |
Участник
|
Уж и не знаю, что ответить....
|
|
12.04.2004, 18:03 | #12 |
Участник
|
france ваше замечание оторвано от контекста темы, вопрос был в переборе записей, уже отобранных в курсор, а не в различных способах выборки записей из БД...
|
|
12.04.2004, 19:11 | #13 |
Участник
|
будем считать, что вне контекста и закроем вопрос.
|
|
12.04.2004, 19:51 | #14 |
Участник
|
Не выполняя никакого запроса еще раз не получится.
Если вы используете query, можно сильно сократить перебор в запросе за счет использования агреггирующих функций http://forum.mazzy.ru/index.php?showtopic=300 В select агрегирующие функции надо вписывать вручную. |
|
13.04.2004, 11:28 | #15 |
Участник
|
Согласен, Query и QueryRun гораздо удобнее, когда не все параметры известны до момента исполнения логики. При этом, запрос к БД будет формироваться при первом исполнении QueryRun.next() для построенного Query. После изменения Query для уже существующего QueryRun, при первом QueryRun.next() снова будет запрос к БД.
|
|
13.04.2004, 14:50 | #16 |
MCTS
|
Да, однако класс QueryRun также имеет только метод .next().
Получается, что если в курсоре необходимо обратиться к предыдущим записям, выполняй запрос заново? |
|
02.07.2004, 16:25 | #17 |
Участник
|
Если не ошибаюсь, то возможность перебирать выборку в одном направлении сделана из соображений производительности.
Так как в сиквеле есть несколько видов курсоров - один может перебирать запись и только в одном направлении, а другой в обоих. Но последний работает значительно медленнее. В принципе если запись уже выбрана один раз, то для того чтобы к ней вернуться, стоит организовать некое подобие массива ? Получится быстрее. |
|
02.07.2004, 16:59 | #18 |
Модератор
|
Сомневаюсь.. Или Вы в памяти будете весь массив держать? Приемлемый вариант - временная таблица. А если на диске, то снова запросы...
|
|
02.07.2004, 17:06 | #19 |
Участник
|
Цитата:
Изначально опубликовано George Nordic
Приемлемый вариант - временная таблица. Надеюсь это шутка? |
|
02.07.2004, 17:08 | #20 |
Модератор
|
Временная таблица заполняется оттуда, где будет вставлена 1 запись. Причем не факт, что она будет создана на диске - скорее всего в памяти.
А Вы предлагаете массив? |
|