لقد قمت بإيجاد الحل على ما أعتقد و لكن يتطلب من حقل النقاط أن يكون فهرس رئيسي بالإضافة مع فهرس رئيسي آخر، لأن الفهرسة الثانوية لا تسمح إلا بالقراءة من الجداول (أي لا تسمح بتعديل البيانات).
المثال يتطلب مكونين من TTable واحد للبحث و الآخر لترقية البيانات.
كود :
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
Grids, DBGrids, Db, DBTables, StdCtrls;
type
TForm1 = class(TForm)
Table1: TTable;
DataSource1: TDataSource;
Table2: TTable;
SmallintField1: TSmallintField;
FloatField1: TFloatField;
DBGrid1: TDBGrid;
Table1Num: TSmallintField;
Table1Note: TFloatField;
procedure FormCreate(Sender: TObject);
procedure Table1BeforePost(DataSet: TDataSet);
procedure Table2BeforeOpen(DataSet: TDataSet);
procedure Table1BeforeOpen(DataSet: TDataSet);
private
{ Déclarations privées }
public
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.FormCreate(Sender: TObject);
begin
Table1.Open;Table2.Open;
end;
procedure TForm1.Table1BeforePost(DataSet: TDataSet);
begin
Table2.IndexFieldNames:='Note';
if Table2.FindKey([Table1.FieldByName('Note').AsString]) then
Table1.FieldByName('Num').AsInteger:=Table2.fieldByName('Num').AsInteger
else Table1.FieldByName('Num').AsInteger:=StrToInt(Inputbox('إدخال الرقم','أدخل الرقم الجديد','0'));
end;
procedure TForm1.Table2BeforeOpen(DataSet: TDataSet);
begin
Table2.TableName:=ExtractFilePath(Application.exeName)+'data\notes.DB' ;
end;
procedure TForm1.Table1BeforeOpen(DataSet: TDataSet);
begin
Table1.TableName:=ExtractFilePath(Application.exeName)+'data\notes.DB' ;
end;
end.
و المثال التالي يقوم بإعطاء النقطة الأقل الرقم الأول و النقطة الأكبر الرقم الأخير.
كود :
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
Grids, DBGrids, Db, DBTables, StdCtrls;
type
TForm1 = class(TForm)
Table1: TTable;
DataSource1: TDataSource;
Table2: TTable;
SmallintField1: TSmallintField;
FloatField1: TFloatField;
DBGrid1: TDBGrid;
Table1Num: TSmallintField;
Table1Note: TFloatField;
procedure FormCreate(Sender: TObject);
procedure Table1AfterPost(DataSet: TDataSet);
procedure Table1BeforePost(DataSet: TDataSet);
procedure Table2BeforeOpen(DataSet: TDataSet);
procedure Table1BeforeOpen(DataSet: TDataSet);
procedure Table1AfterDelete(DataSet: TDataSet);
private
{ Déclarations privées }
public
procedure Tartib;
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.FormCreate(Sender: TObject);
begin
Table1.Open;Table2.Open;
end;
procedure TForm1.Tartib;
var Note: Real;
I: integer;
begin
Table2.IndexFieldNames:='Note';
Table2.First;
I:=1; Note:=Table2.FieldByName('Note').AsFloat;
While not Table2.Eof do
begin
Table2.Edit;
if Table2.FieldByName('Note').AsFloat=Note then
Table2.FieldByName('Num').AsInteger:=I
else begin
I:=I+1;
Table2.FieldByName('Num').AsInteger:=I;
end;
Note:=Table2.FieldByName('Note').AsFloat;
Table2.Post;
Table2.Next;
end;
Table1.Refresh;
end;
procedure TForm1.Table1AfterPost(DataSet: TDataSet);
begin
Tartib;
end;
procedure TForm1.Table1BeforePost(DataSet: TDataSet);
begin
Table2.IndexFieldNames:='Note';
if Table2.FindKey([Table1.FieldByName('Note').AsString]) then
Table1.FieldByName('Num').AsInteger:=Table2.fieldByName('Num').AsInteger;
end;
procedure TForm1.Table2BeforeOpen(DataSet: TDataSet);
begin
Table2.TableName:=ExtractFilePath(Application.exeName)+'data\notes.DB' ;
end;
procedure TForm1.Table1BeforeOpen(DataSet: TDataSet);
begin
Table1.TableName:=ExtractFilePath(Application.exeName)+'data\notes.DB' ;
end;
procedure TForm1.Table1AfterDelete(DataSet: TDataSet);
begin
Tartib;
end;
end.
و لكن إلى الآن لم أفهم ما الهدف من مثالك؟
المشروع الأول في الملحقات.