![]() |
|
مشكل ترتيب قاعدة بيانات - نسخة قابلة للطباعة +- delphi4arab منتديات دلفي للعرب (https://delphi4arab.net/forum) +-- قسم : منتديات دلفي للعرب التعليمية (https://delphi4arab.net/forum/forumdisplay.php?fid=3) +--- قسم : سؤال و جواب حول دلفي (https://delphi4arab.net/forum/forumdisplay.php?fid=15) +--- الموضوع : مشكل ترتيب قاعدة بيانات (/showthread.php?tid=116) |
مشكل ترتيب قاعدة بيانات - xinofix - 29-03-2008 [FONT=Arial]السلام عليكم
[FONT=Arial]هذه قاعدة بيانات بها مجموعة من انقاط والحقول هي كاالتاي [FONT=Arial]Num, Note [FONT=Arial]نريد القيام بعمية جعل كل النقا المتشابهة لها نفس الرقم [FONT=Arial]الصورة ![]() من لها؟ مشكل ترتيب قاعدة بيانات - merouane - 29-03-2008 إقتباس :نريد القيام بعمية جعل كل النقا المتشابهة لها نفس الرقم على أي أساس تتم العملية، الترتيب / نفس الرقم لأول عدد مشابه ؟ لا بد أن نذكر شروط العملية، حتى لا نبقى بين فهمتني و لم تفهني مشكل ترتيب قاعدة بيانات - xinofix - 29-03-2008 الصورة غنية عن كل توظيح اخي تبدأ من الأول إلى آخر قاعدة البيانات كل مجموعة من النقاط المتساوية يكون لها رقم واحد وهو رقم السجل الاول مثال: عندنا مجموعة من الطلبة تحصلوا على معدلات متفاوتة نريد ان نرتب الطلبة حسب أكبر نقطة، فمثلا وجدنا طالبين أو أكثر لهما نفس المعدل، إذا لابد وان يكونوا في نفس الرتبة، أي يحملون رتبة واحدة. مشكل ترتيب قاعدة بيانات - محمد عبد العزيز - 29-03-2008 بسم الله الرحمن الرحيم بسيطة جدا : 1- تنشأ Index ثانوي متناقص لحقل المعدل وتستخدمه 2- ترتبهم يدويا - اي برمجيا حسب المعدل والسلام عليكم ورحمة الله مشكل ترتيب قاعدة بيانات - merouane - 29-03-2008 لا ليست غنية عن كل توظيح فإذا أردت ترتيب الطلبة فأين الرتبة 4 ، 5 و 7 ؟؟؟؟؟؟؟؟ المهم .. هذا هو طرحي بالإعتماد على خوارزمية الترتيب : ستكون النتيجة كما كالآتي ![]() كود : 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 // ترتيب تنازلي
[color=Blue]// If NoteTable[i] > NoteTable[i+1] Then // ترتيب تصاعدي[/color]
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 لقد قمت بإيجاد الحل على ما أعتقد و لكن يتطلب من حقل النقاط أن يكون فهرس رئيسي بالإضافة مع فهرس رئيسي آخر، لأن الفهرسة الثانوية لا تسمح إلا بالقراءة من الجداول (أي لا تسمح بتعديل البيانات).
المثال يتطلب مكونين من 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 - 31-03-2008 الإخوة: مهدي، مروان، ودلتا عزيز تحية طيبة وبعد: نشكركم على الردود والمشاركة ويؤسفني أن أقول لكم بأنه لا أحد منكم فهمني ولا عليكم نرجوا اننا لم نقم بإزعاجكم وإشغالكم أكثر تقبلوا تحياتنا الحارة جدا مشكل ترتيب قاعدة بيانات - مهدي - 31-03-2008 إقتباس :نرجوا اننا لم نقم بإزعاجكم وإشغالكم أكثربالنسبة لي لا يوجد إزعاج بالعكس أنا معجب جدا من طرحك، لقد إستفدت كثيرا من التجارب التي قمت بها لحل المشكل، فأكمل شرح مشكلتك إلى الآخر. لا تنسى أنه يجب علينا التعود على بعضنا لحلول المشاكل التي تواجهنا، فلعلنا في المستقبل ننشئ مشاريع كبرى. مشكل ترتيب قاعدة بيانات - محمد عبد العزيز - 31-03-2008 xinofix كتب :ويؤسفني أن أقول لكم بأنه لا أحد منكم فهمني يؤسفني ان اقول لك انك لم توفق في طرح المشكل انظر ماذا كتبت: إقتباس : نرتب الطلبة حسب أكبر نقطة،يفهم من هذا ان ترتيب من ياخذ اكبر نقطة يكون اقل من ترتيب من ياخذ اصغر نقطة لكن هذا ليس ما الجدول ترتيب المعدل 18 هو 6 ترتيب المعدل 13 هو 3 ترتيب المعدل 15 هو 8 هذا ليس ترتيب حسب اكبر نقطة هذا ليس ترتيب حسب اصغر نقطة هذا ترتسب حسب الظهور في الجدول الدواء مرفق، طبعا ليس احسن دواء لكنه شافي ان شاء الله والسلام عليكم ورحمة الله |