28.09.2006, 08:45 | #1 |
Участник
|
Существование следующей записи в запросе
Добрый день! Подскажите как можно узнать о наличии или отсутствии следующей записи в запросе? При этом ее(слудующую запись) выбирать не нужно.
|
|
28.09.2006, 09:19 | #2 |
Участник
|
насколько я могу догадываться, необходимо произвести какие-то действия с текущей записью запроса в зависимости от того существует ли следующая запись.
я бы использовал для этих целей какую-то временную запись и все таки выбирал следующую запись. можно еще так сделать: Код: QueryRun qr, qr2; ; ... while(qr.next()) { qr2 = qr; if(qr2.next()) { ... } } |
|
28.09.2006, 09:26 | #3 |
Участник
|
Цитата:
В java все переменные являются ссылками. qr2 = qr не копирует сам курсор, копируется только ссылка на него. Кроме того, запрос все равно остается. По-моему нет способа узнать есть ли следующая запись, не сделав попытку ее получить. |
|
28.09.2006, 09:39 | #4 |
Участник
|
ой. не выспался туплю
|
|
28.09.2006, 09:44 | #5 |
Участник
|
Nu esli nehochetsja vibirat' zapis' + delaetsja zapros iz koda (gde mozno vstavit svoj kod), to mozno po nomeru stroki opredelit', est'li ese zapis
Код: Query q2; QueryRun qr; QueryRun qr2; // Schitajem skoka strok q2 = new Query(q); // q = vas zapros q2.dataSourceTable(tableNum(...)).fields().clearFieldList(); q2.dataSourceTable(tableNum(...)).addSelectionField(fieldNum(...,recId),selectionfield::Count); qr2 = new QueryRun(q); qr2 .next(); Common = qr2.getNum(1); cnt = Common.recId; while (qr.next()) { if (... & i < cnt) { // delajem sto-to ili nicego nedelajem } i++; } PS: metod rabotajushij,... ispolzujem v odnoj forme dlja podscheta strok + rabotajut vse filtri (tak kak berjotsa sam Query iz Formi) Последний раз редактировалось Delfins; 28.09.2006 в 09:46. |
|
28.09.2006, 09:48 | #6 |
Участник
|
Хорошо, допустим я предприму попытку проверить наличие следующей записи путем ее выбора, а как потом вернуть запрос в то состояние в котором он был до этого?
|
|
28.09.2006, 09:48 | #7 |
Участник
|
|
|
28.09.2006, 09:50 | #8 |
Moderator
|
PavelSR, а что за задачка, если не секрет? Какое-нибудь скользящее среднее вычисляете? Может быть стоит кардинально алгоритм перетряхнуть? Ну... сделайте там... два запроса, смещенных относительно друг друга на одну запись
_ 1 1 2 2 3 3 4 4 _ |
|
28.09.2006, 09:53 | #9 |
Участник
|
Цитата:
До того, как передвигать, скопируйте запись в другую переменную (например, при помощи Buf2Buf. Кроме того, почитайте книжку Еременко и/или BestPractice. Там советуют выборку делать без модификатора forupdate, а для изменения найти запись еще раз но уже с модификатором forupdate. В общем случае так уменьшается вероятность блокировки. Сделайте поиск в коде переменной first или found. Там есть примеры использования. |
|
28.09.2006, 09:55 | #10 |
Участник
|
|
|
28.09.2006, 09:56 | #11 |
Участник
|
|
|
28.09.2006, 10:08 | #12 |
Участник
|
|
|
28.09.2006, 10:12 | #13 |
Участник
|
два запроса не обязательно. надо просто буферизовать нужное количество значений и вычислять только когда точно известно два последний значения
|
|
28.09.2006, 10:13 | #14 |
Участник
|
|
|
28.09.2006, 10:21 | #15 |
Участник
|
Esli takoj gemoroj s pereschetami, ja obichno ispolzuju MAP/Container, gde hranju tolko to shto mne nuzno. Potom sootvetstvenno mozhno polzat' po dannim bez ispolzovanija DB.
Konechno vse zavisit ot zadachi - skolko zapisej i t.d. PS: takze esli mnogo zapisej i nado uznat'tolko nekotorie polja, luce delat' viborku na nekotorie polja select recId, Qty from.. i kak uze skazal Mazzy - dlja update - zanovogo delat' polnuju viborku. |
|
28.09.2006, 10:27 | #16 |
Участник
|
Тут надо помнить об одном - MAP|Container "живет" там, где его создали.
Поэтому создавать и обрабатывать такие контейнеры надо на AOS. К сожалению, об этом часто забывают. Работа с подобными структурами на клиенте резко уменьшает производительность и увеличивает трафик между AOS и клиентом. |
|
28.09.2006, 10:33 | #17 |
злыдень
|
Цитата:
Сообщение от mazzy
Тут надо помнить об одном - MAP|Container "живет" там, где его создали.
Поэтому создавать и обрабатывать такие контейнеры надо на AOS. К сожалению, об этом часто забывают. Работа с подобными структурами на клиенте резко уменьшает производительность и увеличивает трафик между AOS и клиентом. Забавно это слышать от представителя компании специализирущейся одно время на оптимизации производительности )) Попробуйте на досуге измерить насколько "резко снизится производительность" от создания мапа на клиенте. В абсолютных и относительных величинах.
__________________
Ибо зло есть лучшая сила человека. "Человек должен становиться все лучше и злее" -- так учу я. /Ф. Ницше/ Последний раз редактировалось Recoilme; 28.09.2006 в 10:38. |
|
28.09.2006, 10:40 | #18 |
Участник
|
Цитата:
Сообщение от Recoilme
Эээээ.... (c) Не верю.
Забавно это слышать от представителя компании специализирущейся одно время на оптимизации производительности )) Попробуйте на досуге измерить насколько "резко снизится производительность" от создания мапа на клиенте. В абсолютных и относительных величинах. Всегда думайте самостоятельно. Даю маячок: МАП надо не только создавать, но и заполнять чем-то. |
|
28.09.2006, 11:06 | #19 |
Участник
|
Цитата:
Сообщение от mazzy
А зачем ее возвращать?
До того, как передвигать, скопируйте запись в другую переменную (например, при помощи Buf2Buf. Кроме того, почитайте книжку Еременко и/или BestPractice. Там советуют выборку делать без модификатора forupdate, а для изменения найти запись еще раз но уже с модификатором forupdate. В общем случае так уменьшается вероятность блокировки. Сделайте поиск в коде переменной first или found. Там есть примеры использования. Пытаюсь с помощью метода setCursor класса QueryRun но что то не получается: X++: tempTable1 = QueryRun.getNo(1); select firstonly * from tempTable2 where tempTable2.RecId == tempTable1.RecId; if (!QueryRun.next()) { // что то делаем element.execute(33); } QueryRun.setCursor(tempTable2); Последний раз редактировалось PavelSR; 28.09.2006 в 11:17. |
|
28.09.2006, 11:18 | #20 |
Участник
|
Цитата:
- Ну, а как ты спишь? Сидя, что ли? - спросила Черепаха. |
|
|
|