A: If the dataset is based upon a Paradox or dBASE table then the record number can be determined with a couple of calls to the BDE (as shown below). The BDE doesn't support record numbering for datasets based upon SQL tables, so if your server supports record numbering you will need to refer to its documentation.
The following function takes as its parameter any component derived from TDataset (i.e. TTable, TQuery, TStoredProc) and returns the current record number (greater than zero) if it is a Paradox or dBASE table. Otherwise, the function returns zero.
NOTE: for dBASE tables the record number returned
is always the physical record number. So, if your dataset is a TQuery
or you have a range set on your dataset then the number returned won't
necessarily be relative to the dataset being viewed, rather it will be
based on the record's physical position in the underlying dBASE table.
unit Unit1;
interface
uses
SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,
Forms, Dialogs, ExtCtrls, DBCtrls, Grids, DBGrids, DB, DBTables,
DbiProcs, DbiTypes, DbiErrs;
type
TForm1 = class(TForm)
DataSource1: TDataSource;
Table1: TTable;
DBGrid1: TDBGrid;
DBNavigator1: TDBNavigator;
function RecordNumber(Dataset: TDataset): Longint;
procedure DataSource1DataChange(Sender: TObject;
Field: TField);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
function TForm1.RecordNumber(Dataset: TDataset): Longint;
var
CursorProps: CurProps;
RecordProps: RECProps;
begin
{ Return 0 if dataset is not Paradox or dBASE }
Result := 0;
with Dataset do
begin
{ Is the dataset active? }
if State = dsInactive then
ShowMessage('Cannot perform this operation
on a closed dataset');
{ We need to make this call to grab the cursor's
iSeqNums }
Check(DbiGetCursorProps(Handle, CursorProps));
{ Synchronize the BDE cursor with the Dataset's cursor
}
UpdateCursorPos;
{ Fill RecordProps with the current record's properties
}
Check(DbiGetRecord(Handle, dbiNOLOCK, nil, @RecordProps));
{ What kind of dataset are we looking at? }
case CursorProps.iSeqNums of
0: Result := RecordProps.iPhyRecNum;
{ dBASE }
1: Result := RecordProps.iSeqNum;
{ Paradox }
end;
end;
end;
procedure TForm1.DataSource1DataChange(Sender: TObject; Field: TField);
begin
if (Sender as TDataSource).State = dsBrowse then
caption := 'Record number = ' + IntToStr(RecordNumber(Datasource1.Dataset));
end;
end.