بتاريخ: 19 نوفمبر 201312 سنة comment_243000 السلام عليكم انا دلوقتى عامل فورمه عبارة عن فاتورة مبيعات و عندى ايتم اسمه pay_type و دة عبارة عن radio group فيه (نقدا و اجل و... الخ) و كتبت فيه التريجر دة begin if :pay_type = 'cash' then update cash set cash.balance = cash.balance + :inv_detail.net_val; update store_item set store_item.quantity = store_item.quantity - :inv_detail.quantity where inv_detail.item_code = store_item.item_code; elsif :pay_type = 'debit' then update customer set customer.debit_val = customer.debit_val + :inv_detail.net_val; end if; end; انا دلوقتى مشكلتى مش عارف اعمل شرط ال whereفى انه لما يروح ينقص كميه الاصناف (اللى فى الفاتورة) من المخزن عايزه ينقصها بناء على كود الايتم و كود المخزن اللى موجودين فى الفاتورة مرفق صورة للجداول و علاقتها و لو حد يقدر يفيدنا نبقه شاكرين ليه وجزاة الله خيرا تم تعديل 21 نوفمبر 201312 سنة بواسطة ميسم الكرام تقديم بلاغ
بتاريخ: 20 نوفمبر 201312 سنة comment_243002 المشكلة لديك تكمن في هذا السطر set store_item.quantity = store_item.quantity - :inv_detail.quantity وليست في شرط WHERE كما تعتقد ..لا يمكنك طرح عمودين من جدولين مختلفين (هذا ما أعرفه عن لغة SQL في Oracle و SQL Server ) يمكنك حل هذه المشكلة برمجيا لاحقا ..ولكن عليك تصحيح بعض الأخطاء في الجداول: 1- من الخطأ أن يكون العمود item_code مفتاح رئيسي PK في جدول inv_detail ويجب أن يكون مفتاح ثانوي FK.السبب : أن الفاتورة قد تتضمن أكثر من item في نفس الوقت (الزبون قد يطلب كيبوردات وشاشات في نفس الطلبية). 2- يجب حذف العمود Item_name من جدول inv_detail . السبب: لا داعي لتكرار البيانات ويمكنك عرض اسم الItem والوصول إليه من خلال ربط الجدولين item و inv_detail في الاستعلام ... من أجل الجداول store والجدول inv_headre والجدول inv_details .. لدي بعض الاستفسارات لكي أحاول أن أساعدك بالوصول إلى حالة أقرب للمثالية : هل يمكن لزبون أن يشتري Items من مخازن مختلفة ؟ مثال: زبون يطلب 50 كيبورد من مخزن القاهرة .. ولكن مخزن القاهرة لا يحتوي إلا 30 كيبورد .. هل يمكن للزبون طلب 25 كيبورد المتوفرة في القاهرة وطلب 20 كيبورد أخرى من مخزن الاسكندرية مثلا؟ هناك بعض الأمور التي عليك معالجتها عند كتابة الTrigger مثل أن تتحقق من أن الكمية المطلوبة في الفاتورة أقل أو تساوي الكمية الموجودة في المخزن لكي لا تظهر لديك قيم سالبة ..كالمثال الذي طرحته : الطلبية =50 الكمية المتوفرة في المخزن =30 الكمية المتبقية في المخزن بعد البيع = 30-50=(-20 ) وهي قيمة مرفوضة ! تقديم بلاغ
بتاريخ: 20 نوفمبر 201312 سنة كاتب الموضوع comment_243003 مشكوور على ملاحظاتك و جارى التعديل بس بالنسبه لموضوع ال pk انا عايز اليوزر ميختارش ايتم هو مختارة قبل كدة عشان متبقاش الفاتورة فيها نفس الايتم مرتين فقولت اعمله pk اما بالنسبه لسؤالك ف انا عايز دلوقتى مبدئيا اربط الفاتورة بمخزن وااحد يعنى الطلبيه كلها من مخزن واحد وبالنسبه لشرط ال where انا معرفتش اكتب فيه ايه اصلا ف كتبت اى حاجه يعنى عشان اوضحلكو المشكله تقديم بلاغ
بتاريخ: 20 نوفمبر 201312 سنة comment_243067 بس بالنسبه لموضوع ال pk انا عايز اليوزر ميختارش ايتم هو مختارة قبل كدة عشان متبقاش الفاتورة فيها نفس الايتم مرتين فقولت اعمله pk حل هذه المشكلة يكون بوضع الItem_code و INVD_INVD_SIRIAL مع بعضهم كمفتاح رئيسي مزدوج . الحل الأقرب للأمثلية هو أن تربط الجداول كما في الصورة المرفقة ... بالنسبة لتعديل الكمية الموجدودة في المخزن فلا أعتقد أنك تستطيع إجراء هذا التعديل مباشرة دون كود برمجي .. أحد الحلول البرمجية هو أن تخزن كل الStore_Item_code الموجودة في الفاتورة بمصفوفة مثلا أو List ولتكن SITC وأن تخزن كل الكميات من كل Item الموجودة في الفاتورة في مصفوفة أخرى مع مراعاة الترتيب ولتكن ITQ ومن ثم يتم تطبيق الTrigger ضمن حلقة Update Store_Item [sET quantity = quantity - ITQ[i [WHERE store_item_code = [i تقديم بلاغ
انضم إلى المناقشة
يمكنك المشاركة الآن والتسجيل لاحقاً. إذا كان لديك حساب, سجل دخولك الآن لتقوم بالمشاركة من خلال حسابك.