24-06-2009, 04:45 PM
إقتباس :حسنا ساساعدك لايجاد الحل دون اعطائك اياه (تجده بنفسك)بارك الله فيك أستاذ وجزاك خيرا، سأفعل ما بوسعي.
شكرا كثيرا محمد نسمان على التدخل، مع افتراض استعمال TADOTable (باستبعاد الاستعلامات SQL) ودون استعمال محرك SQL Server (أي لا توجد Stored Proc).
شكرا كثيرا أخي Prince على الدالة (ينقصها DisableControls و EnableControls لتسريع الفحص
) ، لكن انتبه في استعمال First و Next عند استدعاء الدالة في BeforePost أو ما يشبهها، كود تفحص الجدول بهذه الطريقة هو آخر حل، كتبت دالة CheckKeyID(DataSet: TDataSet): Boolean بنفس الطريقة، للتحقق من وجود المفتاح ثم حذفتها
.حسنا...
إقتباس : إنسى RecordCount ولاتستخدمها - فكريبقى لدينا:
1- استعمال RecNo بدلا عنها
، بشيء مثل:PHP كود :
private
MaxRec: Integer;
...
procedure TForm2.ADOTable1BeforeInsert(DataSet: TDataSet);
begin
MaxRec := DataSet.RecNo + 1;
end;
procedure TForm2.ADOTable1BeforePost(DataSet: TDataSet);
begin
if not (DataSet.State = dsInsert) then Exit;
DataSet.FieldByName('BookID').AsString := 'BK'+ Format('%0.4d',[MaxRec+1]);
end;
2- حساب أكبر قيمة بشكل يدوي، مثال ( MaxRec هو integer لتخزين أعلى قيمة):
PHP كود :
procedure TForm2.ADOTable1BeforeInsert(DataSet: TDataSet);
begin
MaxRec := StrToInt(Copy(DataSet.fieldbyname('BookID').asString, 3,5));
end;
procedure TForm2.ADOTable1BeforePost(DataSet: TDataSet);
begin
DataSet.FieldByName('BookID').AsString := 'BK'+ Format('%0.4d',[MaxRec+1]);
end;
في هذه الحالة نكون قد تخلصنا من إشكالية تكرار نفس القيمة عند حذف قيم سابقة، لأن الخلية ستأخذ العدد الموالي لآخر عدد في الجدول، يبقى إشكال صغير وهو عند إضافة تسجيل عند وسط الجدول، هذا يمكن تفاديه بإضافة DataSet.Last في الحدث BeforeInsert، وبذلك نجبر المستعمل على إضافة تسجيلاته في آخر الجدول.
وبهذا أظن المشكلة حلت، لكن ماذا لو أراد المستعمل إضافة تسجيل في وسط الجدول :confused: هل سنقنعه بألا يفعل ذلك

شكرا كثيرا لكم، بارك الله فيكم جميعا، وجزاك الله خيرا أستاذ.

