حل مشكل العمليات المتعددة على قواعد البيانات
#1
السلام عليكم ورحمة الله وبركاته

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

والمشكلة التي من الممكن ان تحدث قد يتم اضافة البيانات الاساسية مثل رقم الفاتورة وتاريخها ويحدث خطاء ما باضافة البضاعة في الجدول الثاني ويستمر البرنامج ويخصم البضاعة من المخزن في جدول ثالث.

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

والسؤال الان هل هناك طريقة مع مكونات ado لعمل شئ مشابه او فيها امكانية لفعل ذلك بطريقة مشابهةاو احد أخر له فكرة افضل ...؟

وشكرا
بين الانسان والكفر ترك الصلاة فمن تركها فقد كفر .
الرد
#2
السلام عليكم

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



.jpg   Untitled-1.jpg (الحجم : 99.87 ك ب / التحميلات : 188)


تركيب الكود كان بالشكل التالي

كود :
Test1,test2,test3:boolean try Test1:=true; except on E: Exception do // ShowMessage end; try Test2:=true; except on E: Exception do DeleteFatora// end; try Test3:=true; except on E: Exception do // ShowMessage end; if (test1=true ) and (test2=true) and (test3=true) then begin end;
بين الانسان والكفر ترك الصلاة فمن تركها فقد كفر .
الرد
#3
السلام عليكم

جرب بالـ transaction

http://www.delphi4arab.net/forum/showthr...ransaction

بالتوفيق
الرد
#4
كود :
اقوم بخصم البضاعة من المخزن

كود :
ويخصم البضاعة من المخزن في جدول ثالث.

على حسب ما فهمت انه يوجد جدول المخزون الذى يخزن فيه الكمية الموجودة فى المخزن ... و هذه الكمية يمكن حسابها (المدخلات - المخرجات).

قاعدة مهمة من قواعد (الخاصبة بقواعد البينات) تقول : لا تخـــزن اى شــىء يمكــن حسابــه .
و انت اهملت هذه القاعدة و بالتلى واجهتك مشكلة التعديل على جدول المخزون بعد كل تعديل على المدخلات او المخرجات , و كما قلت قد تفشل احدى هذه العمليات و يتم الخصم من جدول المخزون ... .

من الاحسن تعويض عمل جدول المخزون ب requêtes SQL (استعلام SQL) .

بالتوفيق .
الرد
#5
السلام عليكم

مرحبا بك hanipino

إقتباس :قاعدة مهمة من قواعد (الخاصبة بقواعد البينات) تقول : لا تخـــزن اى شــىء يمكــن حسابــه .

ربما لم تفهم القاعدة جيدا أخي hanipino فهي تعني ان لا تقوم بتخزين قيمة شئ يمكن حسابه من الجدول نفسه

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

ولو كانت القاعدة عامة اي لا تخزن اي شئ يمكن حسابه فلن يمكننا حساب اي شئ ولا معرفة اي شئ

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

كود :
[color=Red]ADOConnection1.BeginTrans ;[/color] try [COLOR=Green] ADOTable1.Insert; ADOTable1.FieldByName('fatora').Value:=Edit1.Text; ADOTable1.FieldByName('mname').Value:=Edit2.Text; ADOTable1.FieldByName('age').Value:=Edit3.Text; ADOTable1.Post; [/COLOR] [COLOR=Blue] ADOTable2.Insert; ADOTable2.FieldByName('mname').Value:=Edit4.Text; ADOTable2.FieldByName('age').Value:=Edit5.Text; ADOTable2.Post; [/COLOR] [color=#ff0000]ADOConnection1.CommitTrans;[/color] except on E: Exception do [color=#ff0000]ADOConnection1.RollbackTrans;[/color] end;

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

إقتباس :من الاحسن تعويض عمل جدول المخزون ب requêtes SQL (استعلام SQL) .

بالتاكيد انا استخدم جمل الاستعلام لتحديث البيانات والا فكيف سيمكنني معرفة الصنف المطلوب بجدول المخازن
فالاوامر Locate وايضا Filtter الخاصة بالجدول لا اتكل عليها بهكذا امور


والله الموفق
بين الانسان والكفر ترك الصلاة فمن تركها فقد كفر .
الرد
#6
كود :
فهي تعني ان لا تقوم بتخزين قيمة شئ يمكن حسابه من الجدول نفسه

ما الفرق بينهما من نفس الجدول او من جدولين او اكثر
... (على كل حال) ربما عند حق .
--------------------------------
من الاحسن ? بعدل كل (حذف تعديل اضافة) على جدول المدخلات او المخراجات تقوم بالكتابة فى جدول المخزون .

ام

تنفذ استعلام عند الحاجة فقط ياتى بما هو موجود فى المخزن (حسابه) .
الرد
#7
السلام عليكم

مرحبا بك مرة أخرى هنا أخي

إقتباس :من الاحسن ? بعدل كل (حذف تعديل اضافة) على جدول المدخلات او المخراجات تقوم بالكتابة فى جدول المخزون .

أجل بالتاكيد ان اقوم بتعديل الكميات بجدول المخازن بعد كل عملية بيع او شراء او عملية تعديل على فاتورة بيع او شراء او عملية مسترجعة لمبيعات او مشتريات ( وجع رأس أخي )

صورة لنافذة المخزن والحقول التي تحتويها


.jpg   QQQQ.jpg (الحجم : 30.84 ك ب / التحميلات : 179)
بين الانسان والكفر ترك الصلاة فمن تركها فقد كفر .
الرد
#8
السلام عليكم ورحمة الله

كفكرتين:
1- تعمل بجداول مؤقتتة،
تحفظ بها كل معلومات الفاتورة وعند الانتهاء يتم حفظ كل شيئ بالجداول الحقيقية
2- لا تنقص الكمية من جدول المواد/الاصناف لانه يمكن حساب ذلك (تغير بالتصميم) وهذا احسن كونه يطبق القاعدة التي ذكرها اخي هاني
الرد
#9
السلام عليكم ورحمة الله

إقتباس :تنفذ استعلام عند الحاجة فقط ياتى بما هو موجود فى المخزن (حسابه) .

وكذلك

إقتباس : لا تنقص الكمية من جدول المواد/الاصناف لانه يمكن حساب ذلك (تغير بالتصميم) وهذا احسن كونه يطبق القاعدة التي ذكرها اخي هاني

ربما هذا صحيح بحال عدم طلب الزبون رغبته في انقاص الكمية من المخزن يدوي بكثير من الحالات .

وما فهمته منكم هو ان كمية المخزن تعتمد على فواتير الشراء وفواتير المبيعات تحدد كمية المخزن من المواد التي تم شراءها ويمكن هذا بواسطة استعلام من الجدولين .

ولكن كما قلت ان المشكلة التي تواجهني هي طلب الزبون ورغبته في تعديل الكمية يدوي وبخاصة عند اول استخدام ولذلك وجدت انه من الافضل جعل جدول يمثل الاصناف والمخزن .

إقتباس :- تعمل بجداول مؤقتتة،
تحفظ بها كل معلومات الفاتورة وعند الانتهاء يتم حفظ كل شيئ بالجداول الحقيقية

تقريبا هذا ما افعله اقوم باخذ نسخة من جدول المخزن والعمل عليها وحفظ البيانات في جدول مؤقت اخر أو بالذاكرة او في StringGrid وعند الانتهاء اقوم بحفظ البيانات
بين الانسان والكفر ترك الصلاة فمن تركها فقد كفر .
الرد
#10
كود :
ولكن كما قلت ان المشكلة التي تواجهني هي طلب الزبون ورغبته في تعديل الكمية يدوي وبخاصة عند اول استخدام ولذلك وجدت انه من الافضل جعل جدول يمثل الاصناف والمخزن

هذا التعديل من المستخدم له اسباب (ما الشىء الذى ادى به الى تغيير قيمة المخزون)
اما خطاء فى الفاتورة او ... . يقوم بالتعديل على الفاتورة فقط .
--------------------------
الا اذا ذهب الى المخزن و قام بالحساب يدويا .. و هذا ما يعرف بالجــــــــــرد و هذا الاخير ننشىء له جدول خاص نسجل فيه الكمية التى حسبت يدويا
(و هذا هو ربما سبب التعديل الكثير من المستخدم لان اجراء عملية الجرد تجرى عدة مرات للتاكد من الحساب)
--------------------------

بالنسبة للكمية الموجودة فى المخزن يمكن الاطلاع عليها من ناحيتين
1- الفرق بين المدخلات و المخرجات (المسجلة على اساس الفواتير) ---> استعلام من جدولين او اكثر .
2- عن طريق جدول الجرد (الذى يحسب يدويا) ---> استعلام من نفس الجدول
---
و قد يكون هناك فرق بينهما (و هذا ما يعرف ب فروقات الجرد) اى الفرق بين ما هو مسجل فى الفواتير و ما هو موجود حقيقتا فى المخزن و هذا الفرق يحتاجه المحاسب و يحضره مسير المخزون و له اسبابه التى يجب ان تفسر .
--------------------------

فى نضرى العمليات التى يقوم بها المستخدم هى
1- تسجيل المدخلات
2- تسجيل المخرجات
3- تسجيل الجرد
...
الباقى كله استعلامات sql فقط . و الله اعلم

بالتوفيــــــــــــق .
الرد


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


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