![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Порядковый номер записи [D5, IB5.x]
stalexo © (2002-06-18 21:19:00)Уважаемые мастера!
Каким образом, работая с таблицами InterBase,
создать в DBGrid поле, показывающее номер
записи по порядку. RecNo,работающий
в Paradox здесь не работает.
Спасибо!
Леха_ (2002-06-19 18:47:00) [1]ответ с форума королевства примерно плутора годовой давности:
Задачка классическая!!!
Имеем исходный запрос (без нумерации):
SELECT MY_COLUMN FROM MY_TABLE ORDER BY 1
ORDER BY важен, без него не получится. MY_COLUMN предполагаем сортируемым
и уникальным, т.е. нет двух записей с повторяющимися MY_COLUMN. Далее делаем
финт ушами:
SELECT COUNT(*), t1.MY_COLUMN
FROM MY_TABLE t1, MY_TABLE t2
WHERE t1.MY_COLUMN >= t2.MY_COLUMN
GROUP BY t1.MY_COLUMN
ORDER BY t1.MY_COLUMN
Т.е. просто подсчитываем количество записей, стоящих согласно порядку сортировки
ранее текущей. Я не уверен, что вариант оптимален :)) Но работает. Проверил
только что.
Peter Taran
Val (2002-06-19 18:24:00) [2]>MishGan` (19.06.02 18:21)
спасибо, объяснять не нужно, я лишь обращаю внимание на использование RecNo, из-за которого, собственно, проблема и возникла.
MishGan` (2002-06-19 18:21:00) [3]2 val
>>DBGrid1.Canvas.TextOut(Rect.Left+2,Rect.Top+1,IntToStr
>>(DBGrid1.DataSource.DataSet.RecNo));
Что здесь не понятно? Готов объяснить.
Зы:
И еще - если RecNo не работает (или работает не так как нужно), то можно его и не использовать. А использовать что-нибудь другое, например какой-нибудь свой счетчик.
Val (2002-06-19 18:10:00) [4]>stalexo © (19.06.02 18:04)
RecNo,работающий
в Paradox здесь не работает.
MishGan` (19.06.02 17:46)
DBGrid1.Canvas.TextOut(Rect.Left+2,Rect.Top+1,IntToStr(DBGrid1.DataSource.DataSet.RecNo));
???
stalexo (2002-06-19 18:04:00) [5]Спасибо всем, что не бросаете в беде!
Mishgan"у - персонально.За текст!
Сейчас буду пробовать.
MishGan` (2002-06-19 17:46:00) [6]Могу предолжить такой вариант:
В тексте запроса добавляешь дополнительное псевдополе,
например так:
SELECT 1 as "N",t.* FROM ALL_TABLES t
У грида делаешь обработчик события OnDrawDataCell или OnDrawColumnCell, и в нем отрисовываешь нужный номер:
procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
if Column.Field.FullName="N" then
begin
DBGrid1.Canvas.FillRect(Rect);
DBGrid1.Canvas.TextOut(Rect.Left+2,Rect.Top+1,IntToStr(DBGrid1.DataSource.DataSet.RecNo));
end;
end;
При желании можно добавить FixedCol и в нем отображать номер строки.
Praco (2002-06-19 17:39:00) [7]stalexo © (19.06.02 16:23)
Дык нет у меня такого грида. В DBGridEh не нашел. Другие навороченные гриды не изучал.
Я действовал при помощи процедур. Конечно, каждый раз писать процедуры для простых запросов напряжно. С другой стороны все запросы к базе делать только через процедуры - хороший тон.
koks (2002-06-19 16:33:00) [8]из 3-х вариантов 2-ой очень сложный, 3-й просто убийственный...
остается 1-й.
Это хорошо, что у тебя IB. На этом форуме пару раз обсуждали тоже самое, только для DBase/Paradox... такого там нагородили - я понял тогда, что это мне не надо. А вот если есть возможность использовать хранимую процедуру то все выглядит просто и красиво...
stalexo (2002-06-19 16:23:00) [9]Praco, буду очень признателен за
твой грид!
Спасибо!
С уважением, stalexo.
Praco (2002-06-19 09:13:00) [10]3. Написать свой грид или поискать готовый.
Praco (2002-06-19 09:11:00) [11]1.При помощи хранимой процедуры. В For Select вставляешь счетчик и возвращаешь его значение.
2.Можно поизвращаться с вычисляемыми полями, но там все непонятно.