الانتقال إلى المحتوى
View in the app

A better way to browse. Learn more.

مجموعة مستخدمي أوراكل العربية

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

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

Featured Replies

بتاريخ:


السلام عليكم ، لدي الجداول التاليه :
1- جدول موردين
2- جدول خزينه
2- جدولين مشتريات (ماستر وديتيل) اكوادهم كالتالي :


1- جدول الموردين :



CREATE TABLE "NWARA"."IMPORTERS"(
"IMP_ID" NUMBER(7) NOT NULL,
"IMP_NAME" VARCHAR2(75) NOT NULL,
"IMP_ADRS" VARCHAR2(255) NOT NULL,
"IMP_PHONE" NUMBER(15) NOT NULL,
"IMP_CREDIT" NUMBER(10) NOT NULL);





2- جدول الخزينه :


CREATE TABLE "NWARA"."BURSARY"(
"B_DATE" DATE NOT NULL,
"CASH_IN" NUMBER(9) NOT NULL,
"CASH_OUT" NUMBER(9) NOT NULL,
"STOCK" NUMBER(9) NOT NULL);




3- أ- جدول المشتريات (ماستر) :


CREATE TABLE "NWARA"."BUY_MSTR"(
"B_DATE" DATE NOT NULL,
"B_NAME" VARCHAR2(75) NOT NULL,
"B_NO" NUMBER(10) NOT NULL,
"IMP_ID" NUMBER(7),
"B_TOTAL" NUMBER(10) NOT NULL,
"PAY_MTHD" VARCHAR2(13) NOT NULL,
CONSTRAINT "PK_BUY_MSTR" PRIMARY KEY("B_NO"));




3- ب - جدول المشتريات (ديتيل) :



CREATE TABLE "NWARA"."BUY_DTLS"(
"B_NO" NUMBER(10) NOT NULL,
"CAT_NAME" VARCHAR2(30) NOT NULL,
"CAT_TYPE" VARCHAR2(15) NOT NULL,
"STORE_NO" NUMBER(2) NOT NULL,
"PRICE" NUMBER(10) NOT NULL,
"CAT_QUANT" NUMBER(7) NOT NULL,
CONSTRAINT "FK_BUY_DTLS" FOREIGN KEY("B_NO") 
	REFERENCES "NWARA"."BUY_MSTR"("B_NO"));




وضعت Database Trigger يضيف جملة المشتريات (B_TOTAL) لحساب الموردين وفي نفس الوقت يخصم تلك القيمة من جدول الخزينه (يضيفها لحقل الصادر CASH_OUT ) و يحتوي على الكود التالي :


CREATE OR REPLACE  TRIGGER BURSARY_IMP_BALANCE_ADJ BEFORE  INSERT OR DELETE OR UPDATE  OF  B_TOTAL  ON   BUY_MSTR   FOR  EACH  ROW   
DECLARE  
V_DIFF  NUMBER;
BEGIN IF  INSERTING  THEN
UPDATE  IMPORTERS  SET   IMP_CREDIT = IMP_CREDIT + :NEW.B_TOTAL WHERE IMP_ID = :NEW.IMP_ID ;
UPDATE  BURSARY  SET   CASH_OUT = CASH_OUT + :NEW.B_TOTAL WHERE TRUNC(B_DATE) = :NEW.B_DATE ;
ELSIF  DELETING  THEN
UPDATE IMPORTERS SET IMP_CREDIT = IMP_CREDIT -  :OLD.B_TOTAL 	WHERE IMP_ID = :OLD.IMP_ID ;
UPDATE BURSARY SET CASH_OUT = CASH_OUT -  :OLD.B_TOTAL 	WHERE TRUNC(B_DATE) = :OLD.B_DATE ;
ELSE 
V_DIFF:=(:OLD.B_TOTAL-:NEW.B_TOTAL)*-1;
UPDATE  IMPORTERS  SET  IMP_CREDIT =  IMP_CREDIT + V_DIFF WHERE IMP_ID = :NEW.IMP_ID ;
UPDATE  BURSARY  SET  CASH_OUT =  CASH_OUT + V_DIFF WHERE TRUNC(B_DATE) = :NEW.B_DATE ;
END IF  ; END ; 
/






المشكلة انني اريد وضع آليه لطريقه الدفع اعتمادا على حقل في جدول المشتريات الماستر يسمي (PAY_MTHD) كالتالي :

- اذا كان الدفع (نقدا=PAY_MTHD) فإن جملة المشتريات (B_TOTAL) تخصم من الخزينه ولا تضاف لحساب المورد.
- اذا كان الدفع (آجل=PAY_MTHD) فإن جملة المشتريات (B_TOTAL) تضاف لحساب المورد ولا تخصم من الخزينه.
- اذا كان الدفع (شيكات=PAY_MTHD) فإن جملة المشتريات (B_TOTAL) لا تخصم من الخزينه ولا تضاف لحساب المورد ولكن تذهب كسجل لفورم.


اذا امكن التعديل في الـDatabase Trigger اعلاه او اي طريقه اخري ، وجزاكم الله خير
في انتظار ردودكم !!!

بتاريخ:

ممكن اقترح على حضرتك شيى ممكن يكون هو الحل للموضوع اللى انت طالبه
اولا ممكن نعمل check constrain pay_mthd وهو ان يتم ادخال ثلاثه رموز لطرق الدفع اى ثلاث طرق للدفع

check(pay_mthd in ('cash','defered','chek'));


تكون هذه القيم الثلاثه الواجب ادخالها فى هذا الحقل

يتم التعديل داخل trigger bursary_imp_adj

paymeth buy_mstr.pay_methd%type;
begin
select pay_meth
into paymeth 
from buy_mstr;
if inserting then

if pay_meth is 'cash' then
--minus from bursary
update Bursary set cash_out=cash_out+:new.b_total
where trunc(B_date)=:new.b_date;
elsif pay_meth is 'defered' then
-- add to importer count
update importers set imp_credit=imp_credit+:new.b_total
where imp_id=:new.emp_id;
elsif pay_meth is 'chek' then
--add to form record
end if;


elsif deleting then
--make chek as first statment to paymeth
else
--make chek as first statment to paymeth
end if;
end trigger_name;


يتم كتابه هذا الكود مع عمل تكمله له حيث ان هذا الكود به فكره لحل هذا الموضوع

بتاريخ:
  • كاتب الموضوع

اشكرك جدا خي المهندس ، وسأجرب فكرتك وان شاء الله تظبط معي ، بس ممكن شرح الكود
paymeth buy_mstr.pay_methd%type;

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

بتاريخ:
  • كاتب الموضوع

لو سمحت وين ممكن نعمل الـ check constrain pay_mthd اللي تقول عليه ؟

بتاريخ:

paymeth buy_mstr.pay_methd%type;


معنى هذا الكلام ان هناك متغير اسمه paymeth له نفس نوع البيانات الموجوده فى عمود pay_meth الموجود فى جدول buy_mstr

اما بالنسبه لاضافه constraint فيتم انشاءه بطريقتين
اولا عند عمل انشاء للجدول فى البدايه يتم اضافه constraint على العمود الموجود فى هذا الجدول

create table buy_mstr(col1,col2,col3,....,constraint constain_name check(pay_methd in ('cash','defered','shek'));



او عن طريق اضافته اذا كان الجدول تم انشاءه من قبل

alter table buy_mstr
add constraint constain_name check(pay_methd in ('cash','defered','shek'));

تم تعديل بواسطة al_mohands

بتاريخ:

الحل بسيط يا اخي الكريم
هي إتشاء حقل جديد تحدد فية نوع عملية الدفع كما ذكرت فى السابق وعند الدفع تحدد العملية اذا كان نقدي تغيير كما قلت فى السابق واذا كان اجل تغيير كما تريد فى الجداول الاخري وهكذا
اى ان الحقل الجديد يكون LIST VALUE قيمة 1 تعني نقدي 2 تعني اجل 3 تعني شيك
وحسب النوع العملية يعطي نتيجة
والسلام عليكم
وكل عام وانتم بخير

بتاريخ:
  • كاتب الموضوع


قمت بالتعديل في التريقر BURSARY_IMP_BALANCE_ADJ كالتالي :


CREATE OR REPLACE  TRIGGER BURSARY_IMP_BALANCE_ADJ BEFORE  INSERT OR DELETE OR UPDATE  OF  B_TOTAL  ON   BUY_MSTR   FOR  EACH  ROW   
DECLARE
V_DIFF  NUMBER;
PAYMETH BUY_MSTR.PAY_MTHD%TYPE;
BEGIN SELECT PAY_MTHD INTO PAYMETH FROM BUY_MSTR; IF INSERTING THEN
IF PAYMETH = 'CASH' THEN
UPDATE  BURSARY  SET   CASH_OUT = CASH_OUT + :NEW.B_TOTAL
WHERE TRUNC(B_DATE) = :NEW.B_DATE ;
ELSIF PAYMETH = 'DEFERED' THEN
UPDATE  IMPORTERS  SET   IMP_CREDIT = IMP_CREDIT + :NEW.B_TOTAL
WHERE IMP_ID = :NEW.IMP_ID ;
END IF;
ELSIF DELETING THEN
IF PAYMETH = 'CASH' THEN
UPDATE BURSARY SET CASH_OUT = CASH_OUT -  :OLD.B_TOTAL
WHERE TRUNC(B_DATE) = :OLD.B_DATE ;
ELSIF PAYMETH = 'DEFERED' THEN
UPDATE IMPORTERS SET IMP_CREDIT = IMP_CREDIT -  :OLD.B_TOTAL
WHERE IMP_ID = :OLD.IMP_ID ;
END IF;
ELSE
V_DIFF:=(:OLD.B_TOTAL-:NEW.B_TOTAL)*-1;
IF PAYMETH = 'CASH' THEN
UPDATE  BURSARY  SET  CASH_OUT =  CASH_OUT + V_DIFF
WHERE TRUNC(B_DATE) = :NEW.B_DATE ;
ELSIF PAYMETH = 'DEFERED' THEN
UPDATE  IMPORTERS  SET  IMP_CREDIT =  IMP_CREDIT + V_DIFF
WHERE IMP_ID = :NEW.IMP_ID ;
END IF;
END IF;
END;
/




ولكن عند تعبئة الفورم والحفظ تظهر الرساله التالية :


INSERT INTO BUY_MSTR(B_DATE,B_NO,B_NAME,IMP_ID,PAY_MTHD,B_TOTAL) VALUES (:B_DATE,:B_NO,:B_NAME,:IMP_ID,:PAY_MTHD,:B_TOTAL)



ورقم الخطاء :


ORA-01403: no data found



مرفق صورة للفورم اثناء التنفيذ ادناه


a><br>


ملاحظة :
قام الاخ khalideed باقتراح التعديل في الجدول BUY_MSTR كالتالي :


alter table buy_mstr
add constraint constain_name check(pay_methd in ('cash','defered','shek'));




فهل يمكن ان يكون الخطاء من التعديل
في انتظار ردودكم ، وجزاكم الله خيرا

بتاريخ:

السلام عليكم ورحمه الله وبركاته
بالنسبه لهذا الخطأ حدث بسبب الاستعلام عن طريقه الدفع فى حاله اضافه فاتوره insert اى انه لايمكن معرفه طريقه الدفع لفاتوره ليست مخزنه بالجدول اصلا فيجب فى حاله الاضافه insert ان يكون الشرط على القيمه الموجوده او التى اختارها المستخدم لطريقه الدفع من داخل item الموجود على الفورم

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

 
SELECT PAY_MTHD 
INTO PAYMETH 
FROM BUY_MSTR
where B_NO=:old.B_NO;


اما فى حاله الاضافه يتم عمل

 
if :item_value='chek' then ........end if;



اولا :- بالنسبه لاضافه constraint على حقل طريقه الدفع لكى يتم تخزيين احدى الثلاث طرق فقط ولكن يجب مراعاه عمل list داخل الفورم تكون بها ثلاث اختيارات تحدد من خلالها طريقه الدفع مع اعطاء values لها تساوى نفس القيم المضافه اثناء عمل constraint
اى انه عند تخزيين قيم غير 'check'او 'defered' او 'shek' يحدث exception وهذا يفيد فى ان طريقه الدفع تخزن داخل الجدول وتكون متاحه لكى نحدد عن طريقها ما يحدث من تعديل او اضافه او حذف فى الجداول الاخرى
ثانيا: يجب مراعاه ان المستخدم لا يدخل رقم فاتوره وان هذه الارقام تكون متاحه اوتوماتيكى من داخل الجدول
كل عام وانتم بخير

تم تعديل بواسطة al_mohands

بتاريخ:
  • كاتب الموضوع

شكرا اخي al_mohands على الرد ، على حد علمي المتواضع ان الصيغة item_value : تعمل على PL/SQL او في الفورم وليس في Dtabase Trigger (اعذرني ان كنت مخطئة) لاني قمت بالتعديل في التريقر يقوم بالحفظ مع رسالة خطا :
Warning: Trigger created with compilation errors.
وعند فتح التريقر من خلال الفورم ومحاوله الحفظ هناك فإنه تظهر رسالة الخطاء التاليه
PLS-00049: bad bind variable 'ITEM_VALUE'
فهل يمكن التعديل في الصيغة (if :item_value='CASH' THEN) بحيث يعمل التريقر بصورة سليمة ؟
وجزاكم الله خيرا

بتاريخ:

السلام عليكم ورحمه الله وبركاته
بالنسبه لموضع التريجر هلى هو على مستوى الفورم ام على مستوى البلوك او انه موجود على مستوى ايتم ممكن حضرتك تخلى التريجر على مستوى الفورم لانه اذا كان التريجر على مستوى الفورم اعتقد انه سيتعرف على اسماء العناصر الموجوده بالفورم
اما بالنسبه item_value: هو اسم القائمه التى يتم من خلالها اختيار طريقه الدفع يعنى الاسم ده على حسب اسم list الموجوده فى الفورم

اما لو ان التريجر الموجود على قاعده البيانات لا تتعرف على bind varaible من الممكن التغلب على هذا بانشاء function وهذه التى يتم استعمالها داخل التريجر وبالتأكيد هذه function تتعرف على bind variable الموجود بالفورم ويكون لها return typeوليكن رقم 1 او 2 او 3 ويشير كل رقم الى طريقه دفع ويتم داخل التريجر استخدام هذه function بدل من item_value:
وان شاء الله هاجربها عملى وارد عليك فى اقرب وقت لان فعلا ما جربتهاش
وشكرا

تم تعديل بواسطة al_mohands

بتاريخ:
  • كاتب الموضوع

شكرا مجددا للاخ al_mohands على التفاعل مع الموضوع وجزاك الله خير الثواب على مساعدتكك ، في سياق حوارك ذكرت شيكا عن تريقر على مستوي الفورم وكما تعلم فإن التريقر الذي نركز عليه هنا هو DataBase Trigger ، هل كنت تعني تريقر آخر يقوم بالعمليه ككل ام يقوم باستدعاء الداله (التي وصفت ) ؟

بتاريخ:
  • كاتب الموضوع

في انتظار الـ function الي ذكرها الاخ المهندس ومرسي خالص ليه ، بس كنت عايزه اذا في طرق اخري ممكن يعرفوها الاخوه الاعضاء

انضم إلى المناقشة

يمكنك المشاركة الآن والتسجيل لاحقاً. إذا كان لديك حساب, سجل دخولك الآن لتقوم بالمشاركة من خلال حسابك.

زائر
أضف رد على هذا الموضوع...

برجاء الإنتباه

بإستخدامك للموقع فأنت تتعهد بالموافقة على هذه البنود: سياسة الخصوصية

Account

Navigation

البحث

إعداد إشعارات المتصفح الفورية

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.