الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

كيف يمكننا عند حذف تسجلية من جدول تحذف جيع المعلومات المتعلقة بها في الجداول الأخرى

بدأه artistsa2005 في 13 مايو 2008 · 14 رد · 2,252 مشاهدة · في لغة Delphi
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم إخواني الأكارم

لدي مشروع تسيير مخزون ومبيعات و انا بصدد الخطوات الأخيرة إلا أن مشكلة صغيرة واجهتني وتتمثل في أنني إذا حذفت عميل من جدول العملاء لا تحذف معه تلقائيا المعاملات التي قمت بها مع هذا العميل من جدول المعاملات

أتمنى أن تكون الفكرة قد وصلت

موفقين يا أعضاء منتدانا الأغر

تم تعديل هذه المشاركة بواسطة artistsa2005 في 13 مايو 2008 في 10:37

#2

يمكن ان تستخدم الحدث BeforeDelete للجدول وتحذف به كل المعلومات المتعلقة به في الجداول الاخرى

d4baa0.gif
#3

السلام عليكم ورحمة الله وبركاته

ربما الأخ الكريم استعمل طريقة master/datail للربط بين الجدولين، حيث أنه إذا حذف سجلا من الجدول master يتم حذف السجلات المتعلقة به في الجدول detail تلقائيا، وهذا ما يحدث بالفعل في قاعدة البيانات، لكن البيانات تبقى موجودة في الذاكرة (لا أدري ما سبب ذلك)

والحل هو أن تقوم بعد كل عملية حذف بإغلاق الجدول detail ثم إعادة فتحه

detail_table.close;
detail_table.open;

والله الموفق

تم تعديل هذه المشاركة بواسطة mohamed.dz في 13 مايو 2008 في 11:02

بسم الله الرحمن الرحيم " وقل رب زدني علما"

#4

السلام عليكم

ادا كان هناك ربط بين الجدولين عن طريق Master source + MasterFields

procedure TF_EG1_GESTION_ACOR.BtnSAcClick(Sender: TObject);
 begin
	with data do
	begin
	   if ACOR_Table.IsEmpty then   // معناه اداكان الجدول فارغ
		  showmessage('Suppression invalide : il n''existe aucun ACOR à supprimer.')
	   else // ادا كانت هناك تسجيلات اعرض رسالة تأكيد عمليه الحدف
		  if MessageDlg('Voulez vous vraiment supprimer cet enregistrement?',mtConfirmation,[mbYes,mbNo], 0) = mrYes then
		  begin
			 DIR_Table.First; //  وضع المؤشر في التسجيلة الاول للجدول الابن
			 while not DIR_Table.Eof do DIR_Table.Delete;حلقة تكرارية لعمليه الحدف واحدة واحد مادامت هناك تسجيلات في هدا الاخبر
			 ACOR_Table.Delete;واخيرا حدف التسجبلة من جدول الاب
		  end;
	end;
 end;

هدا مثال بسيط

تم تعديل هذه المشاركة بواسطة زكيري عبد العالي في 14 مايو 2008 في 12:07

#5

إخواني الأكارم أشكر كل من أبدى اهتماما بالموضوع أو أضاف ردا عليه

أظن أن الاخ عبد العالي قد وفق إلى حد ما في الإجابة على تساؤلي إلا أن فكرته ليست مفهومة لدي 100/100 لذا أرجو منك أخي الكريم أن توضح الفكرة بمثال إذا تكرمت

"أعيد شكري إلى كل من شارك في الموضوع فـ "من لم يشكر الناس لم يشكر الله

#6

السلام عليكم

لقد وضعت شرح سريع على الكود ان كان هناك شيء غامد حدده وانا في الخدمت

#7

السلام عليكم

ربما الأخ artistsa2005 يعمل على قاعدة بيانات من نوع Paradox ، ويبحث على طريقة بحيث يتم تتالي تحديث الحقول المرتبطة و تتالي حذف الحقول المرتبطة وهذا بفرض التكامل المرجعي كما هو موجود في الأكسس.

post-34420-1210767284_thumb.png

إذا كان الأمر كذلك، فإنه يوجد شيء مشابه في الـ Paradox وهو ما يسمى بـ Intégrité référentielle

post-34420-1210767578_thumb.png

وهذا اقتباس من ملفات المساعدة:

اقتباس

Règle de mise à jour

Le Module Base de données fournit deux règles de mise à jour pour les tables qui utilisent l’intégrité référentielle. Les règles de mise à jour définissent ce qui arrive lorsqu’un utilisateur tente de mettre à jour ou de supprimer des données dans une table parent qui possède des enregistrements dépendants dans une table enfant.

Interdite

Si la case d’option Interdite est activée, vous ne pourrez pas modifier ou supprimer une valeur dans la clé parentale si des enregistrements correspondent à cette valeur dans la table enfant.

Par exemple, si la valeur 1356 est présente dans le champ No_client de la table Commandes, vous ne pourrez pas modifier cette valeur dans le champ No_client de la table Clients. Vous ne pourrez modifier cette valeur dans Clients que si vous modifiez ou supprimez d’abord tous les enregistrements de Commandes qui contiennent cette valeur. Cependant, si la valeur n’existe pas dans les enregistrements de la table enfant, vous pouvez modifier la table parent.

Cascade

Lorsque la case d’option Cascade est activée, toute modification d’une valeur dans la clé de la table parent est automatiquement répercutée dans la table enfant. Si vous supprimez une valeur dans la clé de la table parent, les enregistrements dépendants de la table enfant sont aussi supprimés. Cascade est la règle de mise à jour par défaut.

Pour effectuer une mise à jour en cascade à travers les tables, le Module Base de données doit placer un verrou sur la table cible. Si le verrou est refusé (car un autre utilisateur a déjà placé un verrou), le Module Base de données ne peut exécuter la mise à jour en cascade.

Si vous travaillez avec des tables SQL, la disponibilité des suppressions et des mises à jour en cascade varie en fonction du type de table et de la version du logiciel.

غير أنه ومن خلال التجربة فإنه عند إختيار Cascade من قواعد التحديث :

فإنه في حالة ما إذا كان الجدول الفرعي به سجلات وقمنا بتغيير المفتاح الأساسي في الجدول الرئيسي فإنه سوف تتغير جميع قيمه في الجدول الفرعي.

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

وهو الأمر الذي يتم بنجاح في حال كانت قاعدة البينات من نوع الأكسس.

هذا والله أعلم، ربما أكون فهمت كل الأمر على غير مقصده.

من دواعي فلسفة السخط في الطبائع الخيرة أن يكون الإنسان مجبولا على الإحساس بالواجب والشعور باللياقة . ذلك أن الذي يجبل على هذا الخلق يرى الأشياء كما هي كائنة ثم يراها كما يجب أن تكون فلا يلبث أن يجد في كل شيء نقصا ولا يلبث أن يجد في كل شيء باعثا للأسى و الأسف وداعيا إلى النقد والمذمة . فيكون غضبه أكثر من رضاه وحزنه أعم من فرحه ، ويكون إلى التنفير والقول بالتشاؤم أميل منه إلى التبشير والقول بالتفاؤل - العقاد

#8

لكم جزيل الشكر أخواني على مجهوداتكم

اتمنى أن تكون الفائدة قد عمت الجميع

تم تعديل هذه المشاركة بواسطة artistsa2005 في 14 مايو 2008 في 19:31

#9
زكيري عبد العالي كتب:
السلام عليكم

لقد وضعت شرح سريع على الكود ان كان هناك شيء غامد حدده وانا في الخدمت

الاستاذ الفاضل / زكيري عبد العالي

شكرا لك على اهتمامك بالاعضاء الذين يحتاجون للمساعده

انا عندى برنامج به فاتورة العميل وانا عامل ربط لجدول العملاء مع الفاتوره فى هذه الحاله

لايعمل الحفظ ويعطينى رساله تفيد بانه يشتكى من العلاقات

وبعد حذف العلاقات بين الجدولين تم حفظ الفاتوره علما بان قاعده البيانات اكسيس

فماذا افعل ارجو التصحيح

وهذا الكود الذى استخدمه

  1.  
  2. rocedure TInvoiceSaleForm.btnSaveClick(Sender: TObject);
  3. var i :integer;
  4. begin
  5. Module1.ADOConnection1.Connected := true;
  6. Module1.T_Invoice.Connection := Module1.ADOConnection1;
  7. Module1.T_Invoice.TableName :='InvoiceSaleCredit';
  8. Module1.T_Invoice.Active := true ;
  9. for i := 1 to InvoiceSaleForm.grid1.RowCount -1 do
  10. begin
  11.  
  12. module1.T_Invoice.Append ;
  13. Module1.T_Invoice.fieldbyname('invoice_code').AsString :=InvoiceSaleForm.edit1.text;
  14. Module1.T_Invoice.fieldbyname('name').AsString :=InvoiceSaleForm.Combo_Cust_Name.text;
  15. Module1.T_Invoice.fieldbyname('date_invoice').AsString :=InvoiceSaleForm.edit4.text;
  16. Module1.T_Invoice.fieldbyname('document_code').AsString :=InvoiceSaleForm.edit3.text;
  17. Module1.T_Invoice.fieldbyname('total_invoice').value := strtoint(InvoiceSaleForm.edit5.te
    xt);
  18. Module1.T_Invoice.fieldbyname('discount_invoice').value := strtoint(InvoiceSaleForm.edit6
    .text);
  19. Module1.T_Invoice.fieldbyname('nett_invoice').value :=strtoint(InvoiceSaleForm.edit7.text
    );
  20.  
  21. Module1.T_Invoice.fieldbyname('item_code').AsString :=InvoiceSaleForm.grid1.Cells[0,i];
  22. Module1.T_Invoice.fieldbyname('item_sub_name').AsString :=InvoiceSaleForm.grid1.Cells[1
    ,i];
  23. Module1.T_Invoice.fieldbyname('unit').AsString :=InvoiceSaleForm.grid1.Cells[2,i];
  24. Module1.T_Invoice.fieldbyname('quantity').Value :=strtoint(InvoiceSaleForm.grid1.Cells
    [3,i]);
  25. Module1.T_Invoice.fieldbyname('price').value := strtoint(InvoiceSaleForm.grid1.Cells[4,
    i]);
  26. Module1.T_Invoice.fieldbyname('total_item').value :=strtoint(InvoiceSaleForm.grid1.Cell
    s[5,i]);
  27.  
  28. if i = InvoiceSaleForm.grid1.RowCount then exit;
  29. module1.T_Invoice.Post;
  30. end;
  31. end;
  32.  

ارجو منك التصحيح او النصيحه

وشكرا

تم تعديل هذه المشاركة بواسطة زكيري عبد العالي في 26 سبتمبر 2009 في 12:52

#10

تأكد من بناء العلاقة بالشكل الصيحح : اذا كان المفتاح الاساسي للعلاقة int يجب ان يكون المفتاح الثاني من نفس خاصية الحقل int وهكذا

#11

السلام عليكم

اولا شكرا على احترامك لي بارك الله فيك .

ثانيا الكود الذي وضعته صحيح حسب ما الا حظه

ثالثا كما قال الاستاذ طلال تاكد من طريقة الرط الت يقمت بها و ان اردت ان تعمل على الربط فلا تحذفه برماجيا لانك ستجد اختلاط البيانات بعد فترة عليك اما ان اتربط برمجبا او تربط في القاعدة + برمجبا.

يجب ان تراجع من الاول كيف فعلت الربط و حدة وحدة و تعطينا رسالة الخطأ .

شكرا

#12

شكرا جزيلا للاخ العزيز / طلال والاخ الفاضل / زكيرى

على الاهتمام بالرد على سؤالى

فعلا قمت بالتعديل مثل ماقولت وتم الحفظ والحمد لله

وارجو منكم سعه الصدر

لى طلب اخر

وهو عاوز اجمع عمود فى الجريد

ونا كتبت هذا الكود وارجو تصحيحه

var

i:integer;

sum: double;

begin

case grid1.Col of

4:

begin

sum:=0;

for i:=1 to 4 do

sum:=sum+StrToFloat(Grid1.Cells[3,i]);

Edit5.Text:=FloatToStr(sum);

end;

end

end;

========

وطلب اخر

عاوز اكتب فى عمود الكميه مثلا الرقم 5 وعمود السعر الرقم 3

كيف يكون ضرب الكميه × السعر فى عمود اجمالى

==========

فيه طلب تانى معلش اعزرونى

فى حال الحفظ

اذا كان اى خليه من الجريد فارغه يعمل مشكله

او تكست من التكستات فارغ يعمل مشكله

فكيف ذلك

مع العلم اننى استخدم string grid

وشكرا

#14

ومن اجل الطلب الثاني الامثلة كثيرة في المنتدى , راجع برنامج تسيير مخزون بسيط في فورم الطلبيات والفواتير

ومن اجل الطلب الاخير

ضع القيمة الافتراضية للحقل في قاعدة البيانات <0>وانتبه ان لاتكون فارغة

#15

اخى العزيز طلال

تحيه واحترام

الامثله التى اطلعت عليها فى الرابط هى خاصه

بتجمع من الجدول باستخدام كويرى

-----

اما انا اطلب الاتى

ان الجريد يكون فى حاله اضافه فاتورة جديده انا اقوم بوضع الاصناف واكتب الكميه واكتب السعر ليكن الناتج فى عمود الاجمالى

وهكذا فى الجريد

انا اريد تجميع عمود اجمالى الصنف فى تكست خارج الجريد

ليكون اسمه اجمالى الفاتوره

وهذا قبل الحفظ ----اى ليس لها بيانات فى الجدول الموجود فى الداتا بيز

يعنى لسه البيانات مادخلتش للجدول

وبعد ذلك اعمل حفظ للفاتوره

لعلى قد اوضحت طلبى

وشكر لسعه صدركم

اما من ناحيه برنامج تسيير المخازن فكله مبنى بدبى جريد وديبى كومبو وكهله مكونات مبنيه على الجداول

ولكن انا استخدم سترينج جريد وكومبو ايدت وهذه الكونات ليس بها الاضافات الموجده فو الدى بى

يعنى لازم اكتب لها اكواد

تم تعديل هذه المشاركة بواسطة سلامه بيومى في 27 سبتمبر 2009 في 02:08

مواضيع مشابهة

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…