مشكل الترقيم التلقائي لقاعدة البيانات
#1
قمت بإنشاء قاعدة بيانات paradox وكان لديا حقل قمت بتعيين نوعه (+) كي يقوم بترقيمه أوتوماتيكيا
المشكلة التي واجهتني هي أنه عند حدف حقل مثلا رقم 5 عند إضافة حقل جديد يقوم بترقيمه بالرقم 6 وليس 5
الرد
#2
السلام عليكم
لا يمكن لأن الترقيم يضيف في تسجيلة رقم 1
لذا يمكنك جعل الحقل int والزيادة تكون برمجيا
وذلك بأخذ أكبر قيمة في الجدول وإصافة 1 لها
شكرا والسلام عليكم
الرد
#3
السلام عليكم

لقد واجهتني نفس المشكلة ولم أجد لها حلا

هل من شرح مفصل؟
الرد
#4
انا جربت طريقه ونجحت معى وهو كالاتى
عمل query لمعرفه اخر قيمه
SELECT nonoid
FROM enfant
WHERE nonoid=(
SELECT max(nonoid) FROM enfant
)
2- تعريف متغير وهو a :integer;

3- a:= Query1nonoid.AsInteger+1 ;
4- فتح ال table المراد الحفظ فيه
tbl1.Append;
tbl1Nonoid.AsInteger:=a;
tbl1.Post ;
ممكن تكون طويله ولكنها نجحت معى
الرد
#5
السلام عليكم...

تلك هي طريقة عمل الحقل من النوع "ترقيم تلقائي" (Auto-increment) حيث يبدأ الترقيم بالعدد 1 ثم يزداد بمقدار 1 مع كل سجل جديد (بعض قواعد البيانات تسمح بتحديد قيمة البداية و قيمة الزيادة). و ميدأ عمله أنه دائماً يزداد بمقدار الزيادة (غالباً 1) و لا يتم استعمال أي عدد تم استعماله سابقاً حتى و إن تم حذف السجل المرتبط به (مثل عداد يعمل في اتجاه واحد و لا يمكن إرجاعه إلى الخلف). وجود انقطاع في التسلسل (مثلاً 1 - 2 - 3 - 5 - 6 حيث لا يوجد 4) لا يحدث فقط بسبب الحذف، بل أيضاً بسبب عمليات الإضافة الفاشلة، أي عند حدوث خطأ يمنع حفظ السجل الجديد بعد أن تم توليد رقم تلقائي من أجله.

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

* ملاحظة: استعمال MAX للحصول على أكبر رقم تعطي نفس النتيجة، ففي المثال 1 - 2 - 3 - 5 - 6 ستعطي الرقم 7 للسجل الجديد و ليس 4.

نرجو الاستفادة و السلام.
الرد
#6
السلام عليكم
كنبت رد مفصل لكن Ctrl+Z
دهبت بكل شيئ
المشكل في اسنعلامك انه غير منطقي و ثانيا كارثي ان كان الجدول فارغ فسيعيد
Max:=null
a:= Query1nonoid.AsInteger+1 ===================OverFlow
a:=Null+1;
الحل بسيط
كود :
with AQMax do begin Close; SQL.Clear; SQL.Add('Select max(Cod_Cl+1) As Mx From Client); Open; end; if AQMax.FieldValues['Mx']=null then a:=1 else a:=FrmDM.AQMaxFieldByName('Mx').Assinteger;
الحكمة ضالة المؤمن أنى وجدها فهو أحق الناس بها
الرد
#7
السلام عليكم
كتبت رد مفصل لكن Ctrl+Z
دهبت بكل شيئ
المشكل في استعلامك انه غير منطقي و ثانيا كارثي ان كان الجدول فارغ فسيعيد
Max:=null
a:= Query1nonoid.AsInteger+1 ===================OverFlow
a:=Null+1;
الحل بسيط
كود :
with AQMax do begin Close; SQL.Clear; SQL.Add('Select max(nonoid+1) As Mx From Enfant); Open; end; if AQMax.FieldValues['Mx']=null then a:=1 else a:=AQMax.FieldByName('Mx').Asinteger;
الحكمة ضالة المؤمن أنى وجدها فهو أحق الناس بها
الرد
#8
قمت بعمل هذا الكود في برنامجي التجاري والحمد لله تعمل بكفائه

قريبا سأقوم بطرح نسخه تجريبيه منه


كود :
'select ' + field_name + ' from ' + table_name + ' order by ' + field_name + ' desc'
الرد


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


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