Главная страница
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.015 c
1-53076
MARcoDEN
2003-02-04 12:22
2003.02.17
Ограничение по перемещению формы


14-53237
Сатир
2003-01-31 13:47
2003.02.17
Фанатам Гарри Поттера и Путина В.В. посвящается%)


1-53038
Stan
2003-02-11 01:00
2003.02.17
Работа с реестром


1-52907
Makhanev A.S.
2003-02-06 23:04
2003.02.17
Как работать отдельно с старшими и младшими байтами Cardinal?


1-52845
158963
2003-02-06 12:05
2003.02.17
Помогите с алгоритмом пожалуйста