[FONT=Arial]هذه قاعدة بيانات بها مجموعة من انقاط والحقول هي كاالتاي
[FONT=Arial]Num, Note
[FONT=Arial]نريد القيام بعمية جعل كل النقا المتشابهة لها نفس الرقم
[FONT=Arial]الصورة
الصورة غنية عن كل توظيح اخي
تبدأ من الأول إلى آخر قاعدة البيانات
كل مجموعة من النقاط المتساوية يكون لها رقم واحد وهو رقم السجل الاول
مثال:
عندنا مجموعة من الطلبة تحصلوا على معدلات متفاوتة
نريد ان نرتب الطلبة حسب أكبر نقطة، فمثلا وجدنا طالبين أو أكثر لهما نفس المعدل، إذا لابد وان يكونوا في نفس
الرتبة، أي يحملون رتبة واحدة.
لقد قمت بإيجاد الحل على ما أعتقد و لكن يتطلب من حقل النقاط أن يكون فهرس رئيسي بالإضافة مع فهرس رئيسي آخر، لأن الفهرسة الثانوية لا تسمح إلا بالقراءة من الجداول (أي لا تسمح بتعديل البيانات).
المثال يتطلب مكونين من 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.
الإخوة: مهدي، مروان، ودلتا عزيز تحية طيبة وبعد:
نشكركم على الردود والمشاركة ويؤسفني أن أقول لكم بأنه لا أحد منكم فهمني ولا عليكم
نرجوا اننا لم نقم بإزعاجكم وإشغالكم أكثر
تقبلوا تحياتنا الحارة جدا
xinofix كتب :ويؤسفني أن أقول لكم بأنه لا أحد منكم فهمني
يؤسفني ان اقول لك انك لم توفق في طرح المشكل
انظر ماذا كتبت:
إقتباس : نرتب الطلبة حسب أكبر نقطة،
يفهم من هذا ان ترتيب من ياخذ اكبر نقطة يكون اقل من ترتيب من ياخذ اصغر نقطة
لكن هذا ليس ما الجدول
ترتيب المعدل 18 هو 6
ترتيب المعدل 13 هو 3
ترتيب المعدل 15 هو 8
هذا ليس ترتيب حسب اكبر نقطة
هذا ليس ترتيب حسب اصغر نقطة
هذا ترتسب حسب الظهور في الجدول
الدواء مرفق، طبعا ليس احسن دواء لكنه شافي ان شاء الله
والسلام عليكم ورحمة الله