المساعد الشخصي الرقمي

مشاهدة النسخة كاملة : مشكل ترتيب قاعدة بيانات


xinofix
29-03-2008, 10:56 AM
السلام عليكم

هذه قاعدة بيانات بها مجموعة من انقاط والحقول هي كاالتاي
Num, Note
نريد القيام بعمية جعل كل النقا المتشابهة لها نفس الرقم
الصورة

http://awa2il.com/up/uploads/download-349acc8995.jpg


من لها؟

merouane
29-03-2008, 05:09 PM
نريد القيام بعمية جعل كل النقا المتشابهة لها نفس الرقم


على أي أساس تتم العملية، الترتيب / نفس الرقم لأول عدد مشابه ؟

لا بد أن نذكر شروط العملية، حتى لا نبقى بين فهمتني و لم تفهني

xinofix
29-03-2008, 06:26 PM
الصورة غنية عن كل توظيح اخي
تبدأ من الأول إلى آخر قاعدة البيانات
كل مجموعة من النقاط المتساوية يكون لها رقم واحد وهو رقم السجل الاول

مثال:
عندنا مجموعة من الطلبة تحصلوا على معدلات متفاوتة
نريد ان نرتب الطلبة حسب أكبر نقطة، فمثلا وجدنا طالبين أو أكثر لهما نفس المعدل، إذا لابد وان يكونوا في نفس
الرتبة، أي يحملون رتبة واحدة.

B.M.AbdelAziZ
29-03-2008, 07:08 PM
بسم الله الرحمن الرحيم

بسيطة جدا :

1- تنشأ Index ثانوي متناقص لحقل المعدل وتستخدمه
2- ترتبهم يدويا - اي برمجيا حسب المعدل

والسلام عليكم ورحمة الله

merouane
29-03-2008, 07:22 PM
لا ليست غنية عن كل توظيح

فإذا أردت ترتيب الطلبة فأين الرتبة 4 ، 5 و 7 ؟؟؟؟؟؟؟؟

المهم ..

هذا هو طرحي بالإعتماد على خوارزمية الترتيب :

ستكون النتيجة كما كالآتي

http://up102.arabsh.com/my/559d3b3.gif

procedure Sorting;
var NoteTable : Array[1..8]of real;
NumTable : Array[1..8]of integer;
i : integer;
Temp : Real;
Found : Boolean;
begin

with Grid1 do
begin
NoteTable[1] := StrToFloat(Cells[0,1]);
NoteTable[2] := StrToFloat(Cells[0,2]);
NoteTable[3] := StrToFloat(Cells[0,3]);
NoteTable[4] := StrToFloat(Cells[0,4]);
NoteTable[5] := StrToFloat(Cells[0,5]);
NoteTable[6] := StrToFloat(Cells[0,6]);
NoteTable[7] := StrToFloat(Cells[0,7]);
NoteTable[8] := StrToFloat(Cells[0,8]);
end;

repeat
Found := False;
For i := 1 To length(NoteTable)-1 do
If NoteTable[i] < NoteTable[i+1] Then // ترتيب تنازلي
// If NoteTable[i] > NoteTable[i+1] Then // ترتيب تصاعدي
begin
Temp := NoteTable[i];
NoteTable[i] := NoteTable[i+1];
NoteTable[i+1] := Temp;
Found := True;
end;
until Found=false;

NumTable[1]:=1;

For i := 1 To length(NoteTable)-1 do
If NoteTable[i] = NoteTable[i+1] Then
NumTable[i+1]:= NumTable[i]
else NumTable[i+1]:= NumTable[i]+1;

with Grid2 do
begin
Cells[0,1] := inttostr(NumTable[1]);
Cells[0,2] := inttostr(NumTable[2]);
Cells[0,3] := inttostr(NumTable[3]);
Cells[0,4] := inttostr(NumTable[4]);
Cells[0,5] := inttostr(NumTable[5]);
Cells[0,6] := inttostr(NumTable[6]);
Cells[0,7] := inttostr(NumTable[7]);
Cells[0,8] := inttostr(NumTable[8]);
end;

with Grid2 do
begin
Cells[1,1] := floattostr(NoteTable[1]);
Cells[1,2] := floattostr(NoteTable[2]);
Cells[1,3] := floattostr(NoteTable[3]);
Cells[1,4] := floattostr(NoteTable[4]);
Cells[1,5] := floattostr(NoteTable[5]);
Cells[1,6] := floattostr(NoteTable[6]);
Cells[1,7] := floattostr(NoteTable[7]);
Cells[1,8] := floattostr(NoteTable[8]);
end;

end;

في الشيفرة أعلاه أعرض المبدأ وهو خوارزمية الترتيب، واعتمدت الجداول الوسيطة لوضوح الشيفرة

تحياتي :)

مهدي
31-03-2008, 01:42 PM
لقد قمت بإيجاد الحل على ما أعتقد و لكن يتطلب من حقل النقاط أن يكون فهرس رئيسي بالإضافة مع فهرس رئيسي آخر، لأن الفهرسة الثانوية لا تسمح إلا بالقراءة من الجداول (أي لا تسمح بتعديل البيانات).

المثال يتطلب مكونين من 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.fieldB yName('Num').AsInteger
else Table1.FieldByName('Num').AsInteger:=StrToInt(Inpu tbox('إدخال الرقم','أدخل الرقم الجديد','0'));
end;

procedure TForm1.Table2BeforeOpen(DataSet: TDataSet);
begin
Table2.TableName:=ExtractFilePath(Application.exeN ame)+'data\notes.DB' ;
end;

procedure TForm1.Table1BeforeOpen(DataSet: TDataSet);
begin
Table1.TableName:=ExtractFilePath(Application.exeN ame)+'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.fieldB yName('Num').AsInteger;
end;

procedure TForm1.Table2BeforeOpen(DataSet: TDataSet);
begin
Table2.TableName:=ExtractFilePath(Application.exeN ame)+'data\notes.DB' ;
end;

procedure TForm1.Table1BeforeOpen(DataSet: TDataSet);
begin
Table1.TableName:=ExtractFilePath(Application.exeN ame)+'data\notes.DB' ;
end;

procedure TForm1.Table1AfterDelete(DataSet: TDataSet);
begin
Tartib;
end;

end.
و لكن إلى الآن لم أفهم ما الهدف من مثالك؟

المشروع الأول في الملحقات.

xinofix
31-03-2008, 07:32 PM
الإخوة: مهدي، مروان، ودلتا عزيز تحية طيبة وبعد:
نشكركم على الردود والمشاركة ويؤسفني أن أقول لكم بأنه لا أحد منكم فهمني ولا عليكم
نرجوا اننا لم نقم بإزعاجكم وإشغالكم أكثر
تقبلوا تحياتنا الحارة جدا

مهدي
31-03-2008, 08:26 PM
نرجوا اننا لم نقم بإزعاجكم وإشغالكم أكثر
بالنسبة لي لا يوجد إزعاج بالعكس أنا معجب جدا من طرحك، لقد إستفدت كثيرا من التجارب التي قمت بها لحل المشكل، فأكمل شرح مشكلتك إلى الآخر.

لا تنسى أنه يجب علينا التعود على بعضنا لحلول المشاكل التي تواجهنا، فلعلنا في المستقبل ننشئ مشاريع كبرى.

B.M.AbdelAziZ
31-03-2008, 08:36 PM
ويؤسفني أن أقول لكم بأنه لا أحد منكم فهمني

يؤسفني ان اقول لك انك لم توفق في طرح المشكل

انظر ماذا كتبت:
نرتب الطلبة حسب أكبر نقطة،
يفهم من هذا ان ترتيب من ياخذ اكبر نقطة يكون اقل من ترتيب من ياخذ اصغر نقطة
لكن هذا ليس ما الجدول
ترتيب المعدل 18 هو 6
ترتيب المعدل 13 هو 3
ترتيب المعدل 15 هو 8

هذا ليس ترتيب حسب اكبر نقطة
هذا ليس ترتيب حسب اصغر نقطة
هذا ترتسب حسب الظهور في الجدول

الدواء مرفق، طبعا ليس احسن دواء لكنه شافي ان شاء الله
والسلام عليكم ورحمة الله