Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Порядковый номер записи [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.Можно поизвращаться с вычисляемыми полями, но там все непонятно.


Наверх

Титульная страница Поиск, карта сайта Написать письмо