|  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 запись. Причем не факт, что она будет создана на диске - скорее всего в памяти. А Вы предлагаете массив?   | 
|  |