مشكل ترتيب قاعدة بيانات
#1
[FONT=Arial]السلام عليكم

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

[صورة: download-349acc8995.jpg]


من لها؟
الرد
#2
إقتباس :نريد القيام بعمية جعل كل النقا المتشابهة لها نفس الرقم

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

لا بد أن نذكر شروط العملية، حتى لا نبقى بين فهمتني و لم تفهني
الرد
#3
الصورة غنية عن كل توظيح اخي
تبدأ من الأول إلى آخر قاعدة البيانات
كل مجموعة من النقاط المتساوية يكون لها رقم واحد وهو رقم السجل الاول

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

بسم الله الرحمن الرحيم

بسيطة جدا :

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

والسلام عليكم ورحمة الله
الرد
#5
لا ليست غنية عن كل توظيح

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

المهم ..

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

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


[صورة: 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 // ترتيب تنازلي [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;

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

تحياتي Smile
الرد
#6
لقد قمت بإيجاد الحل على ما أعتقد و لكن يتطلب من حقل النقاط أن يكون فهرس رئيسي بالإضافة مع فهرس رئيسي آخر، لأن الفهرسة الثانوية لا تسمح إلا بالقراءة من الجداول (أي لا تسمح بتعديل البيانات).

المثال يتطلب مكونين من 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.
و لكن إلى الآن لم أفهم ما الهدف من مثالك؟

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


الملفات المرفقة
.rar   Classe1.rar (الحجم : 7.09 ك ب / التحميلات : 42)
الرد
#7
الإخوة: مهدي، مروان، ودلتا عزيز تحية طيبة وبعد:
نشكركم على الردود والمشاركة ويؤسفني أن أقول لكم بأنه لا أحد منكم فهمني ولا عليكم
نرجوا اننا لم نقم بإزعاجكم وإشغالكم أكثر
تقبلوا تحياتنا الحارة جدا
الرد
#8
إقتباس :نرجوا اننا لم نقم بإزعاجكم وإشغالكم أكثر
بالنسبة لي لا يوجد إزعاج بالعكس أنا معجب جدا من طرحك، لقد إستفدت كثيرا من التجارب التي قمت بها لحل المشكل، فأكمل شرح مشكلتك إلى الآخر.

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

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

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

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

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


الملفات المرفقة
.rar   Delphi_NoFix.rar (الحجم : 268.47 ك ب / التحميلات : 106)
الرد


التنقل السريع :


يقوم بقرائة الموضوع: بالاضافة الى ( 1 ) ضيف كريم