EasyDelphi Q&A
0 تصويتات
59 مشاهدات

السلام عليكم 
في هذا المثال عند الضغط على زر االاضافة .يعمل setfocus تركيز على حقل الكود زاءد ظهور الرقم 1 
التركيز يتم بكود dbedit2.SetFocus 
لكن كيف اظهر الرقم اي value ?

سُئل في تصنيف vcl بواسطة (880 نقاط) | 59 مشاهدات
سؤالك غير واضح ... هل تبحث عن طريقة لتوليد مفتاح للسجلات الجديدة أوتوماتيكيا مع مراعات جميع الحالات الممكنة للحذف المسبق ؟ أم ماذا تقصد بكيف أظهر الرقم ؟
توليد المفتاح يتم اتوماتكيا لكن لا يضهر عند الضغط على زر الاضافة  ف يالحقل المخصص له .يبقا فارغا حتى عمل  بوست فيضهر في db grid
أصلا أنت لا تحتاج لتظهره أصلا مادام المفتاح من نوع AutoInc ... و لا حتى تسند له قيمة ... فهذا غير منطقي في الحقول ذات النوع AutoInc .
و الحل المنطقي لهذه السجلات التي يكون فيها مفتاحها من نوع AutoInc هو عدم إسناد لها أي قيمة مادامت قاعدة المعطيات هي من ستعطيه القيمة في الأخير (بالطبع بعد أمر Post) و لكن أنصحك بعدم ترك هذه الأمور لقاعدة المعطيات لتفادي عدة مشاكل مستقبلية أهمها معالجة مشكل السجلات المحذوفة و ترك قيم في حقل المفتاح في الجدول شاغرة و الكاونتر الخاص بترتيب قيم المفتاح في سجلات الجدول لا يراعي هذه الأشياء و هذا يخلق عدة مشاكل أيضا أثناء تحويل البيانات أو باكاب و ثم محاولة إسترجاعها ...
المهم خاصية AutoInc هي مشكلة جد عويصة في قواعد البيانات مالم تعالج أو على الأقل تستعمل في المكان أو الجداول المناسبة لها فعلا.

2 إجابة

0 تصويتات
أفضل إجابة
dbedit2.SetFocus
dbedit2.Text := '1';

 

تم الرد عليه بواسطة (15,110 نقاط)
مختارة بواسطة
لنفرض أن القيمة "1" للمفتاح موجودة من قبل ؟
أنا اجبت على قدر السؤال
تصبح هكذا
dbedit2.SetFocus
dbedit2.Text := +1
لكن في قاعدة بيانات اذا ما حذفت تسجيل
واعيد الاضافة لا يعود من الصفر بل يكمل
لنفترض ادخلت سجل برقم 1 . ثما حذفته .عندما اضيف سجل جديد يجب ان ياخذ القيمة 1 .
لكن في الاكسس يكمل يضهرلي 2 .
بالنسبة للأستاذ زاهر أنا أعرف جيدا ما كنت تقصد بجوابك السريع هذا ... و فعلا لقد كان على حسب السؤال فهو لم يوضح سؤاله جيدا و إجابتك لسؤاله كانت جد منطقية.
بالنسبة للأخ (الألم المتخفي):
قاعدة :
لا تجعل دوما المفتاح يتولد أوتوماتيكيا بواسطة قاعدة البيانات مهما كان نوع هذه القاعدة و تطورها و وووو فأنصحك بجعل المحتوى عادي إما نصي أو رقمي و لا تستعمل خاصية AutoInc
السيد hidenpain :
عند حذف سجل لن يعود للصفر وسيكمل .. هذا هو الوضع الافتراضي والاساسي والصحيح . لانك تستخدم حقل مفتاح .
حقل المفتاح الاساسي لا يستخدم في واجهة البرنامج وقيمته لا تسخدم في اي شيء له معنى في البيانات .
هو ليس رقم فاتورة . ولا رقم مادة . ولا تسلسل . ولا اي شيء اخر . هو مجرد رقم لا معنى له ولا يدل على اي شيء .
هو فقط رقم يميز هذا السجل عن غيره .
لا يفترض العبث به ولا تغير قيمته مهما كان السبب وبدون اي استثناء .
هذه من اساسيات تصميم قواعد البيانات .
تريد حل مشكلتك . ضع حقل خاص للتسلسل . لا تستخدم حقل المفتاح الاساسي
السيد bravesofts :
القاعدة التي قلتها ( لا تجعل دوما المفتاح يتولد اوتوماتيكيا بواسطة قاعدة البيانات ..... )  هذا الكلام خطأ وغير منطقي وحتى يعتبر غير مقبول . على ما يبدو انك استنتجت هذا واعتبرته قاعدة . لا وجود لمثل هذا في تصميم قواعد البيانات نهائيا .
المفتاح الاساسي ليكون مفتاح يجب ضمان عدم تكراره . والتزايد الاوتوماتيكي هو لضمان هذا .
المشكلة ان الجميع يستخدم المفتاح الاساسي في اشياء ليست من مهامه . مثل اعتباره رقم فاتورة . او رقم عميل . .. هنا الخطأ .
المفتاح الاساسي لا يجب ان يكون له معنى او مدلول على البيانات .. هو مجرد رقم يميز السجل فقط .
بمجرد ربطه بمعنى او مدلول . اعرف انه تم استخدامه خطأ وسيسبب مشاكل لا حصر لها مستقبلا .
0 تصويتات
لنفرض مثلا أن جدول المنتوجات يحمل الحقول التالية
Table_Product = (Code_Prod, Description, Unit_Price, Quantity); 
Code_Prod   = Field Type = ftInteger;
Description = Field Type = ftString;
Unit_Price  = Field Type = ftSingle;
Quantity    = Field Type = ftSingle;

Table_Product = هو إسم المكون أدوتايبل في الوحدة داتا موديول

و إسم الجدول داخل قاعدة البيانات 
TProduct

dm = إسم الفورم داتاموديول


و ليكن هذا الجدول مربوط بالمكون
AdoCon_Sells = هو إسم المكون آدوكوناكشن
======================================
uses 
    ......., Data.Win.ADODB;
....
....
    procedure FormActivate(Sender: TObject);
    procedure Btn_AddClick(Sender: TObject);
	procedure Btn_CancelClick(Sender: TObject);
  private	
    function Generate_ID(AConnction: TADOConnection; ATableName, AField_KeyName: String): Integer;
  public
    { Public declarations }
  end;

var
  FrmADD: TFrmADD;

implementation

uses UMain;

{$R *.dfm}

function TFrmADD.Generate_ID(AConnction: TADOConnection; ATableName, AField_KeyName: String): Integer;
var
  I, AIndex: Integer;
  AQuery: TADOQuery;
begin
  AQuery := TADOQuery.Create(nil);
  AQuery.Connection := AConnction;
  AQuery.SQL.Add('Select '+ AField_KeyName + ' From '+ ATableName);
  AQuery.Open;

  if AQuery.RecordCount = 0 then //إذا كانت هناك سجلات في الجدول بمعنى هل الجدول فارغ أم لا ؟
  Result := 1;

  AIndex := AQuery.RecordCount + 1; // عدد السجلات في الجدول زائد رقم واحد

  if not AQuery.Locate(AField_KeyName, AIndex, []) then // إذاكانت القيمة غير موجودة في كل سجلات الجدول نضيف القيمة كمفتاح جديد للسجل الجديد
  begin
    Result := AIndex;
  end else
  begin
    AQuery.First;
    AIndex := 1;

    for I := 1 to AQuery.RecordCount do
    begin
      if AIndex = AQuery.FieldByName(AField_KeyName).AsInteger then
      begin
        Inc(AIndex);
        AQuery.Next;
      end else
      Break;
    end;
  end;
  AQuery.Free;
  Result := AIndex;
end;

procedure TFrmADD.FormActivate(Sender: TObject);
begin   
  dm.Table_Product.Insert;
    dbedit2.SetFocus;
	dbedit2.Text := Generate_ID(dm.AdoCon_Sells, 'TProduct', 'Code_Prod').ToString; 
end;
  
procedure TFrmADD.Btn_AddClick(Sender: TObject);
begin
  dm.Table_Product.Post;
  Close;  
end;

procedure TFrmADD.Btn_CancelClick(Sender: TObject);
begin
  dm.Table_Product.Cancel;
  Close;  
end;

 

تم الرد عليه بواسطة (18,030 نقاط)
عُدل بواسطة
هذا الكود لانتاج قيمة جديدة
شكراا
نعم هذا الكود لمعالجة تكرار أو تخطي أو فوضى القيم الخاصة بحقل مفتاح لأي جدول كان شرط أن يكون هذا الحقل من نوع رقمي و ليس AutoInc . كما بالأمكان إستعمال هذا الكود في أي نوع من تقنيات التسيير لقواعد البيانات مثل الأبسولوت أو فايرداك أو أنتربايز أو الستندارد داتا بايز فقط نغير إسم الكلاسات التي تخص قاعدة البيانات التي نستعملها بكلاسات الآدو.
و حظا طيبا لك و لمن يهمه الأمر.
رجاءا . عندما تضع كود . ضع فقط ما يكفي للاجابة .. لا تنسخ كل الـ unit وتضعه هنا ..
لا حاجة لوضع الـ uses كلها
لاح حاجة لكتابة اجراء اغلاق النافذة .
لا حاجة ...
اجعل اجابتك مختصر وكافية وواضحة ..
نعم معك الحق أستاذ سامر ..

اسئلة متعلقة

0 تصويتات
1 إجابة
سُئل فبراير 8 في تصنيف vcl بواسطة Amar Gozim (10,690 نقاط) | 44 مشاهدات
+3 تصويتات
1 إجابة
سُئل أغسطس 13، 2018 في تصنيف vcl بواسطة bravesofts (18,030 نقاط) | 59 مشاهدات
0 تصويتات
1 إجابة
0 تصويتات
1 إجابة
سُئل مايو 1 في تصنيف vcl بواسطة hidenpain (880 نقاط) | 21 مشاهدات
0 تصويتات
1 إجابة
سُئل يناير 18 في تصنيف vcl بواسطة fares (220 نقاط) | 92 مشاهدات
ادعُ اصدقائك في الفايسبوك لمشاركتك
Comodo SSL

مرحبًا بك إلى EasyDelphi Q&A، حيث يمكنك طرح الأسئلة والحصول على الإجابة عليها من المستخدمين الآخرين.

لا يسمح بطلب او السؤال عن كراك او تفعيل او كسر او فك او اي شيء يخالف اتفاقيات الترخيص  مهما كان السبب ومهما كان البرنامج ونوعه. ولا حتى نشر روابط تحتوي على مثل هذه الاشياء لا في الاسئلة ولا في الاجابات ولا التعليقات . نهائيا

396 سؤال
634 إجابة
1,130 تعليق
237 مستخدم