Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.02.17;
Скачать: CL | DM;

Вниз

Нумерация строк TDataSet.   Найти похожие ветки 

 
kaif ©   (2003-01-31 14:01) [0]

Часто нужно бывает поддерживать простую нумерацию строк, например, если редактируется документ типа накладной.
Здесь есть 2 решения:
1. Ввести поле где-то на сервере - в саму таблицу или нумеровать записи при каждом Fetch с помощью хранимой процедуры или еще каких-то серверных средств (такого типа средства есть в MSSQL).
2. Ввести вычисляемое поле на уровне TDataSet и вписать в обработчик OnCalcFields что-то вроде DataSet.FieldByName("N").AsInteger := DataSet.RecNo;
--------------
Однако проблема состоит в следующем. Как наилучшим образом перенумеровать строки, если юзер удалил строку? В обоих случаях придется перезапросить весь набор. Я понимаю, почему это так в 1-м случае. Но зачем перезапрашивать набор во 2-м случае? К сожалению, не предусмотрено никакого метода в TDataSet, могущего вызвать перерасчет всех ftCalculated полей для всего набора. По крайней мере, я такого метода не нашел...
Допустим, даже, я вызову DisableControls, пройдусь по набору и руками присвою новые значения вычисляемому полю. Но это приведет к возникновению событий редактирования (Post), что совершенно нежелательно. Можно ради этого использовать CachedUpdates, отказавшись от самих Updates, и в общем... и так постепенно отказыватья от функциональности DataSet как такового.
--------------
Кто знает наилучшее решение?


 
Danilka ©   (2003-01-31 14:08) [1]

если нумерация строк нужна только для отображения в гриде, то может просто сделать пустой столбец, и рисовать в нем самому что-то по событию: OnDrawColumnCell


 
kaif ©   (2003-01-31 14:27) [2]

2 Danilka © (31.01.03 14:08)
Мне эта идея нравится. Но неужели нет другого решения?


 
MsGuns ©   (2003-01-31 15:35) [3]

OnGetText для любого НЕОТОБРАЖАЕМОГО поля НД, куда пишешь:
Text := IntToStr(TIDataSet1.RecNo);

Далее после любой "перетряски" НД номера пересчитываеются автоматически.


 
MsGuns ©   (2003-01-31 15:39) [4]

Поправка к MsGuns © (31.01.03 15:35)
Поле, конечно, должно быть связано с колонкой грида (скорее всего, с самойлевой). Под словом "Неотображаемого" я понимал то, что данные этого поля не нужны в гриде. Хотя можно использовать для этих целей и калькулируемое поле.


 
Sergey13 ©   (2003-01-31 18:12) [5]

2kaif © (31.01.03 14:01)
Можно попробовать таблицф в памяти, типа RxMemoryData. Копируешь туда датасет, добавляешь свое поле, нумеруешь и вперед. При этом конечно слегка усложнится обратная связь.
Но для документа типа накладной, ИМХО, имеет смысл держать реальное поле в базе.


 
Anatoly Podgoretsky ©   (2003-01-31 18:28) [6]

Нафиг тебе нужны номера в гриде, другое дело в накладной, а там для этого есть все средства.



Страницы: 1 вся ветка

Текущий архив: 2003.02.17;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.014 c
8-53133
ResTec
2002-10-28 23:31
2003.02.17
FFT, DSP и т.п.


14-53281
igorr
2003-02-01 14:44
2003.02.17
Реклама на ТВ


7-53316
der
2002-12-15 17:24
2003.02.17
shift+page_down в dbgrid


4-53333
Anatoliy P
2003-01-07 15:58
2003.02.17
Форма на таскбаре


14-53273
Карлсон
2003-02-02 00:27
2003.02.17
забавный сегодня день - 01.02.03 :)