![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Нумерация записей [D5, D6, IB6.x, Paradox]
Dim!S © (2002-08-07 07:19:00)Уважаемые мастера, подскажите, пожалуйста, как в TDBGrid вывести номера записей в отфильтрованном наборе. Без фильтра это сделать легко (Поле вычисляемое создаем Table1Rec := Table1.RecNo). А в отфильтрованном НД нумерация скачет.
Спасибо.
Mike Kouzmine (2002-08-07 14:40:00) [1]Что интересно - работает
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, DB, DBTables, Grids, DBGrids, ADODB, StdCtrls, Mask, DBCtrls,
dbcgrids;
type
TForm1 = class(TForm)
Table1: TTable;
Table1SCLAD: TStringField;
Table1GROUP: TStringField;
Table1NNUM: TStringField;
Table1ED: TStringField;
Table1NAME: TStringField;
Table1KOLSCLAD: TFloatField;
Table1MESTOSCLAD: TStringField;
Table1KOLZAL: TFloatField;
Table1MASTOZAL: TStringField;
Table1KOLTEK: TFloatField;
Table1PRICE: TFloatField;
Table1COUNTRY: TStringField;
Table1GTD: TStringField;
Table1OPRIH: TFloatField;
Table1NUMREC: TIntegerField;
DataSource1: TDataSource;
Label1: TLabel;
DBGrid1: TDBGrid;
procedure Table1AfterOpen(DataSet: TDataSet);
procedure Table1CalcFields(DataSet: TDataSet);
procedure FormCreate(Sender: TObject);
procedure DataSource1DataChange(Sender: TObject; Field: TField);
private
{ Private declarations }
public
Cn: Integer;
RECNO: Integer;
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Table1AfterOpen(DataSet: TDataSet);
begin
Cn := 0;
RECNO := 0;
Table1.Filtered := True;
end;
procedure TForm1.Table1CalcFields(DataSet: TDataSet);
begin
if RECNO < Table1.RecNo then
Inc(Cn)
else
Dec(Cn);
Table1NUMREC.Value := Cn;
RECNO := Table1.RecNo;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Table1.Open;
end;
procedure TForm1.DataSource1DataChange(Sender: TObject; Field: TField);
begin
Cn := Table1NUMREC.Value;
end;
end.
3JIA9I CyKA (2002-08-07 12:14:00) [2]Пока нету.
В смысле есть, но не отличающиеся от Johnmen © (07.08.02 09:53)
Mike Kouzmine (2002-08-07 11:59:00) [3]Мочи ссучившихся! :) Если серьезно - есть идеи?
3JIA9I CyKA (2002-08-07 11:52:00) [4]2Mike Kouzmine
А что, в RX ничего для этого нету?
Johnmen (2002-08-07 11:47:00) [5]>Mike Kouzmine (07.08.02 11:39)
В том то и дело. Поскольку OnCalcFields вызывается каждый раз, когда необходимо перерисовать отображение этого поля...
Mike Kouzmine (2002-08-07 11:39:00) [6]При смене направления сбивается нумерация, но это можно поправить, отследив событие, я согласен, что это per rectum, но что делать если человеку надо, пусть думает.
Mike Kouzmine (2002-08-07 11:32:00) [7]Попробуй
Johnmen (2002-08-07 11:24:00) [8]>Mike Kouzmine (07.08.02 11:16)
Корректно работает ? При перемещении с пом.DBGrid"а ?
Не может того быть ! :)))))))))))
Mike Kouzmine (2002-08-07 11:16:00) [9]У меня работает.
Johnmen (2002-08-07 11:13:00) [10]>Mike Kouzmine (07.08.02 11:01)
>fnatali © (07.08.02 11:07)
>через вычисляемое поле
Да не будет так работать ! :)))
>fnatali © (07.08.02 11:07)
>сделать запросом с ограничением where ... и пронумеровать
>записи в запросе
С моей точки зр. это наиболее подходящее решение.
fnatali (2002-08-07 11:07:00) [11]>Johnmen © (07.08.02 10:21)
Я тут как-то в чате тоже пыталась выяснить необходимость такого подхода. Был приведён один резон (вполне имеющий право на существование, но я бы так делать не стала) - показывать пользователю "запись 4 из 200" для того, чтобы он мог ориентироваться какую часть работы он выполнил. Можно предложить решить задачу двумя вариантами - или через вычисляемое поле (пересчитывать после наложения фильтра), или отказаться от фильтра и сделать запросом с ограничением where ... и пронумеровать записи в запросе. По-моему оба способа не оптимальны. И я, например, с тобой совершенно согласна, что это избыточность, к тому же малопривлекательно и неизящно реализуемая.
Mike Kouzmine (2002-08-07 11:03:00) [12]Вдогонку. Отслеживай события и обнуляй Cn. Но как и Johnmen не вижу в этом смысла. Единственное применение этого в отчетах, но там есть свои способы
Mike Kouzmine (2002-08-07 11:01:00) [13]unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, DB, DBTables, Grids, DBGrids;
type
TForm1 = class(TForm)
Table1: TTable;
Table1SCLAD: TStringField;
Table1GROUP: TStringField;
Table1NNUM: TStringField;
Table1ED: TStringField;
Table1NAME: TStringField;
Table1KOLSCLAD: TFloatField;
Table1MESTOSCLAD: TStringField;
Table1KOLZAL: TFloatField;
Table1MASTOZAL: TStringField;
Table1KOLTEK: TFloatField;
Table1PRICE: TFloatField;
Table1COUNTRY: TStringField;
Table1GTD: TStringField;
Table1OPRIH: TFloatField;
Table1NUMREC: TIntegerField;
DataSource1: TDataSource;
DBGrid1: TDBGrid;
procedure Table1AfterOpen(DataSet: TDataSet);
procedure Table1CalcFields(DataSet: TDataSet);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
Cn: Integer;
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Table1AfterOpen(DataSet: TDataSet);
begin
Cn := 0;
Table1.Filtered := True;
end;
procedure TForm1.Table1CalcFields(DataSet: TDataSet);
begin
Inc(Cn);
Table1NUMREC.Value := Cn;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Table1.Open;
end;
end.
Johnmen (2002-08-07 10:21:00) [14]>VAleksey © (07.08.02 10:12)
>надо бы отказаться, но иногда надо. :))
Очень хотелось бы услышать резоны.
VAleksey (2002-08-07 10:12:00) [15]надо бы отказаться, но иногда надо. :))
> Dim!S
узнаешь как скинь мне на мыло.
Johnmen (2002-08-07 09:53:00) [16]Существует масса извращений на данную тему.
Подумай, может вообще отказаться от затеи, как не имеющей никакой смысловой нагрузки.