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

مشكلة عند حذف آخر سجل

بدأه طلال بلال في 4 ديسمبر 2008 · 24 رد · 2,389 مشاهدة · في لغة Delphi
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

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

لدي جدولان مرتبطان بعملية master/detail واستخدم الكود التالي من أجل جمع قيمة حقلين وطرحهما من بعض , ثم تعرض النتائج في label

procedure Tamountf.calculate;
begin
// Calculate all revnue
dm.ADOQuery1.Close;
dm.ADOQuery1.SQL.Clear;
dm.ADOQuery1.SQL.Add('SELECT SUM(AmountR) AS TotalR FROM amountfour');
dm.ADOQuery1.Open;
LabelR.Caption := dm.ADOQuery1.FieldByName('TotalR').AsString;
// Calculate all expensess
dm.ADOQuery1.Close;
dm.ADOQuery1.SQL.Clear;
dm.ADOQuery1.SQL.Add('SELECT SUM(AmountE) AS TotalE FROM amountfour');
dm.ADOQuery1.Open;
LabelE.Caption := dm.ADOQuery1.FieldByName('TotalE').AsString;
LabelN.Caption := FloatToStr ( StrToFloat (LabelR.Caption) - StrToFloat (LabelE.Caption));
end;

ولكن عند حذف آخر سجل يعطيني رسالة الخطأ التالية

post-169385-1228419922_thumb.jpg

حتى بعد حذف عملية master/detail بقيت المشكلة

المشكلة كانت تقف عند التنفيذ على calculate

وهذا كود الحذف الذي استخدمته

if DM.tamountf.RecordCount=0 then
ShowMessage('áÇÊæÌÏ ÓÌáÇÊ áåÐÇ ÇáãæÑÏ , áÇíãßäß ÇáÍÐÝ')
else
 begin
if MessageDlg('åá ÊÑíÏ ÍÐÝ ÇáÓÌá  ',mtConfirmation,[mbYes,mbno],0)=mryes then
DM.tamountf.Delete
else
DM.Tamountf.Refresh;

مع العلم إن البرنامج شغال تماماً ويقوم بحساب القيمة بعد كل حذف إلا عند حذف السجل الأخير

فأين المشكلة

شكراً لكم

تم تعديل هذه المشاركة بواسطة طلال بلال في 5 ديسمبر 2008 في 04:33

#2

اخي طلال اعد كتابة نص

اقتباس
وهذا كود الحذف الذي استخدمته

عزيزي :

لاتنسى ان تصلي على حبيبنا و شفيعنا يوم لا ينفع مال ولا بنون .

فاللهمّ صّل وسّلم على سيدي و شفيعي وحبيبي محمد عليك الف صلاة وازكى تسليم

*****

2_header.png

#3

السلام عليكم

أخي الكريم - في أي حدث تستدعي الإجراء procedure Tamountf.calculate;

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

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

أرجوا من الله ان اكون قد وفقت

لو كتبت الكود التالي قبل تنفيذ كودك ممكن ان يحل المشكلة

ADOTABLE1.LAST;

خيركم من تعلم القرآن وعلمه

#4

أخ طلال يا ريت لو ترفق المثال

المشكلة أتصور ليست في حدث الحث فأنت تقوم بتحول string إلى float في السطر

abelN.Caption := FloatToStr ( StrToFloat (LabelR.Caption) - StrToFloat (LabelE.Caption));

و بما أن الرسالة تشير إلى خطأ في تحويل لا شيء إلى فلوت فهذا خاطئ و أتصور المشكلة من هنا

فيا ريت لو ترفق الكود

I'm Away For Sometimes

I'll Finish My Works

Come Back Soon

More Study > More Search > More Try > More Learning > Great Success

#6

انا ايضا اتفق مع الاخ Rober في ما قاله

اللهم علمنا ما ينفعنا وانفعنا بما علمتنا وانفع الناس بنا واغفر لنا وارحمنا

#7

أخ طلال

إن كانت المشكلة تظهر عند الحذف أتصور المشكلة في السطر

Htd:=StrToFloat(DBGrid1.Fields[1].Text)+Htd;
HTY:=StrToFloat(DBGrid1.Fields[2].Text)+HTY;

الله أعلم أنه يوجد قيمة فارغة في الكوري query و هو يقوم بتحويل القيمة الحالية في الأستعلام الفارغة إلى إلى float و لا يمكن تحويل لاشيء إلى float

أرجو أن أكون قد أصبت :blush:

I'm Away For Sometimes

I'll Finish My Works

Come Back Soon

More Study > More Search > More Try > More Learning > Great Success

#8

لا أخي روبير المشكلة لاتظهر عند الحذف

المشكلة تظهر عند الأنتقال إلى الصفحة مجموع حساب المورين , لآنني وضعت بها الأمر calculate في الحدث on show

وإذا استثنيت الأمر calculate ليس هناك مشكلة ,

المشكلة فقط عند حذف آخر سجل

تم تعديل هذه المشاركة بواسطة طلال بلال في 5 ديسمبر 2008 في 00:32

#9

إذا عدنا إلى

abelN.Caption := FloatToStr ( StrToFloat (LabelR.Caption) - StrToFloat (LabelE.Caption));

حاول وضع نقطة توقف عند بداية calculate و عند الوصول لها نفذ خطوة بخطوة ولاحظ مكان التوقف

I'm Away For Sometimes

I'll Finish My Works

Come Back Soon

More Study > More Search > More Try > More Learning > Great Success

#10

وجدت هذا الحل

مارأيكم به ,

procedure TamountF.TabSheet4Show(Sender: TObject);
begin
dm.Tamountf.Edit;
dm.Tamountf.Post;
dm.Tamountf.Refresh;
calculate;

end;

end.

أصبح يعطي النتائج كاملة ,

هل يعتبر صحيح

تم تعديل هذه المشاركة بواسطة طلال بلال في 5 ديسمبر 2008 في 04:01

#11

أخ طلال هل طبقت الحل ؟

لا أعرف ما علاقة ما قمت بعمله بالمشكلة فرسالة الخطأ تشير إلى ما ذكر سابقا في المشاركة رقم 7

بصراحة لا أعرف إن كان الحل صحيح أم لا :blush:

تم تعديل هذه المشاركة بواسطة rober في 5 ديسمبر 2008 في 05:44

I'm Away For Sometimes

I'll Finish My Works

Come Back Soon

More Study > More Search > More Try > More Learning > Great Success

#12

أخي روبير لقد أعطاني رسالة خطأ أيضا أن الجدول ليس في وضع تعديل , فجربت بهذه الطريقة

المشكلة إن الجدول مرتبط بجدول أخر بالحقل no_four أعتقد من هنا أتت المشكلة

أنا جربت الحل وأعطى نتائج صحيحة .

ولايوجد أي خطأ في البرنامج, لكن لاأعرف إن كان الحل صحيح

post-169385-1228468961_thumb.jpg

هذه الصورة بعد حذف أخر سجل, وهنا قمت بإظهار الحقليى المخفيين no , no_four

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

#13

أخى طلال مشكلتك تكمن فى الأتى :-

ماذا يحدث عندما تقوم بحذف أخر سجل ؟ تصبح قيمة LabelR.Caption لا تحتوى على رقم صحيح أو اى رقم فبذلك لا تتم عملية الجمع وتظهر هذه الرسالة اعلاه

labelN.Caption := FloatToStr ( StrToFloat (LabelR.Caption) - StrToFloat (LabelE.Caption));

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

أو القيمة الموجودة فى Label غير صحيحة ككلمة أو الى أخرة

واذا واجهتك مشكلة ضعها

بالتوفيق

تم تعديل هذه المشاركة بواسطة Swift في 5 ديسمبر 2008 في 14:06 — السبب: اضافة

Comming Soon

#14

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

كلامك صحيح أخي سويفت وهذا أول حل فكرة به ولكنه غير فعال لسببين

إذا وضعت if في زر الحذف سوف لن يقوم بجمع القيمة وسيعطي خطأ في الحساب

ثانيا :إذا وضعت if عند جمع القيم في الكود الأساسي , أيضا هذا غير ممكن لأننا هنا نتعامل مع جدول مربوط بجدول أخر ,أي في هذا الجدول لن تظهر إلا بيانات مورد واحد , بينما الجدول الأساسي يحتوي على بيانات جميع الموردين , والمشكلة هي حذف آخر سجل لكل مورد

وهنا لن نستطيع أن نقول له إذا كان أخر سجل لاتجمع , وضع في label لاتوجد بيانات مثلاً

لآن label تجميع بيانات جميع الموردين.

أتمنى أن أكون وفقت في الشرح

بالتوفيق

#15

يبدوا إنني حملت المرفق الحطأ في المرة الأولى

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

أما عن الحل فهو الكود التالي وضعته قبل calculate في زر الحذف وفي الحدث onshow

dm.Tamountf.Edit;
dm.Tamountf.Post;
dm.Tamountf.Refresh;
calculate;

بالتوفيق

1.zip

تم تعديل هذه المشاركة بواسطة طلال بلال في 5 ديسمبر 2008 في 18:01

#16

أخ طلال جرب أن تقوم بوضع الشرط كما قال الأخ Swift على الشكل التالي

if (labelr.caption <> '') and (labele.caption <> '') then
  labeln.caption := floattostr(strtofloat(labelr.caption) - strtofloat(labele.caption));

I'm Away For Sometimes

I'll Finish My Works

Come Back Soon

More Study > More Search > More Try > More Learning > Great Success

#17

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

أخ روبير المرفق الجديد في المشاركة ماقبل الأخيرة

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

#18

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

1.rar

I'm Away For Sometimes

I'll Finish My Works

Come Back Soon

More Study > More Search > More Try > More Learning > Great Success

#19

أخي روبير يبدوا إنك لم تفهم قصدي

الـlabel هنا تمثل حساب جميع الموردين وليس المورد الموجود فقط , فبنهاية أخر سجل للمورد تعطي القيم صفر , بينما هناك سجلات لموردين تحتوي دفعات

هذه الطريقة صحيحة في حال جدول واحد فقط , بينما الجدول هنا مرتبط بعملية master/detail

جرب هذا الحل وأخبرني ماالخطأ به

شكرا لك

1.zip

#20

أخ طلال

الحل الذي قمت به يقوم بإضافة سجل عند حذف أخر سجل و يعطي قيمة صفر للخلايا التي تقوم بجمعها بالأستعلام

بالتالي الجدول لن يكون فارغ و سيكون هناك سجل فارغ لكل مورد ( من وجهة نظري القاصرة هذا حل خاطئ و لابد من وجود طريقة أخرى أفضل للحل ) :blush:

و لاحظ أن الشرط

if DM.tamountf.RecordCount=0 then
ShowMessage('لاتوجد سجلات للحذف....')

ليس منه فائدة أليس كذلك ؟

بتصوري المشكلة تبدأ من طريقة الجمع و يمكن تلافي المشكلة

ماذا لو أستبدلنا

dm.Tamountf.Edit;
dm.Tamountf.Post;
dm.Tamountf.Refresh;

بـ

if dm.Tamountf.RecordCount > 0 then

إن شاء الله هذا هو الحل أنظر الملف المرفق و بعون الله يكون هو الحل المناسب

1.rar

I'm Away For Sometimes

I'll Finish My Works

Come Back Soon

More Study > More Search > More Try > More Learning > Great Success

#21

شكرألك أخي روبير على هذا المجهود وبارك الله بك

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

أما غير ذلك فلا ,

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

أما بخصوص

if tamountf.recordcount=0 كنت قد حولتها إلى

if tamountf.recourdcount=1

ليس حلا صحيحا أكيد ,

شكرا لك مرة أخرى أخي روبير

#22

اخ طلال بعد الأطلاع

قم بوضع Label ليقرأ القيمة قبل حذفها بمعنى قم بوضع بوضع هذا الكود فى الحدث Onclick للDBGride

Labelx.caption := dbgrid1.Columns[2].Field.AsString;

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

فانك سوف تكون محتفظ بها داخل Label أو داخل String

بالتوفيق

Comming Soon

#23

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

شكراً لك أخ سويفت على الإهتمام

لاأعرف إن كنت فهمت قصدك

أريد أن أوضح لك نقطة

أنا أريد أن آخذ القيمة من قاعدت البيانات , لأن الجدول لايعرض إلا بيانات مورد واحد , وأنا أساساً أجمعها وأعرضها في edit عن طريق الحدثOnClick1 للDBGRID , راجع الحدث لتتأكد

أخ سويفت عند الضغط على اسم مورد من القائمة المنسدلة يقوم بجمع حسابه فقط وعرضه في edit ويقوم بحسابه من جديد عند الحذف

procedure TamountF.DBGrid2CellClick(Column: TColumn);
begin
Htd:=0;
HTY:=0;
DM.tamountf.First;
while not DM.tamountf.Eof do
begin
Htd:=StrToFloat(DBGrid1.Fields[1].Text)+Htd;
HTY:=StrToFloat(DBGrid1.Fields[2].Text)+HTY;



end;
Edit5.Text:=FloatToStr(htd);
EDIT6.Text:=FLOATTOSTR(HTY);
EDIT7.Text:=Floattostr(htd-hty);
end;

فعندما أضع label في الحدث لن تجمع إلا البيانات الموجودة في الجدول الظاهر في الأسفل

أما label فتجمع حساب جميع الموردين , من أجل عملية الموازنة

post-169385-1228610438_thumb.jpg

شكراً لك أخ سويفت مجدداُ وأتمنى أن تكون فهمت قصدي

بالتوفيق

تم تعديل هذه المشاركة بواسطة طلال بلال في 7 ديسمبر 2008 في 03:52

#24

فهمت عليك

مشكلتى انة لا يوجد الدلفى هنا على هذا الجهاز

لكن ما استطيع ان اقولة لك "حاول ان تقوم بتخزين قيمة الحقل المطلوب مسحة أو وضع قيمتة فى label قبل مسحة لأن البروسيدر Calculate يقوم بطرح القيمة بعد مسح السجل وبذلك لا يوجد قيمة من الاساس للطرح منها لأن السجل بالفعل اتمسح لكن أذا قمنا بتخزينة فاننا يمكننا طرحة بعد حذفة لأنة مخزن داخل Label "

حاول ترجمة كلامى أخى طلال , الموضوع بسيط جداً بس احيانا نقف حائرين امام معادلة بسيطة :)

اتمنى لك التوفيق

Comming Soon

#25

مشكور أخ سويفت سأحاول كما قلت

شكراً لك

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

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

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

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

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