Вниз
Скачать: 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 вся ветка

Скачать: CL | DM;



Память: 0.46 MB
Время: 0.011 c
4-53344
Delphi5.01
2003-01-05 21:26
2003.02.17
При конекте TCPClinet к серверу программа зависает!


1-53102
antoniz
2003-02-07 09:57
2003.02.17
Как скрыть заголовок окна


1-52995
Дмитрий К.К.
2003-02-10 14:22
2003.02.17
Создание компонента в run-time


1-53094
UserL
2003-02-07 07:12
2003.02.17
Как сделать чтоб в TStringGrid-е сначала подсвечивалась бы строка


14-53226
Tornado
2003-01-31 15:41
2003.02.17
Опера 7




   Наверх