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

ساعدوني ولكم مني الدعاءبالخير

مغلق
بدأه smh390 في 13 يناير 2003 · 10 رد · 1,129 مشاهدة · في قواعد بيانات Oracle
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

عاجل اخواني ... كيف اعدل باستخدام pre-insert,pre-update...

بسم الله الرحمن الرحيم

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

اخواني انا مشترك وعضو جديد اشتركت فقط من اجل مساعدتي في مشكلة

وان شاء الله ماتخيبون رجائي فيكم

انا لدي مشروع وهو جدول العقارات وما يتبعة من جدول ملحقة

واريد اذا سجلت نوع العقد(بيع وايجار) في جدول العقود يتغير نوع العقد في جدول العقارات الى النوع الذي اخترته في جدول العقود (طبعاً هذا بستخدام

pre-insert,pre-delete,pre-update)

كذلك كيف اعرض تقرير عن العقارت التي تنتهي بتاريخ معين

علماً بان جدولي العقارات واعقود هي :

جدول العقار

create table house(

House_no number(5) CONSTRAINT house_pk primary key,

Hdesc varchar2(50) not null,

Area number(8,2) not null,

Htype number(1) default 1 not null,

Reg_date date not null,

Floor_Count number(2) default 0,

Aprt_Count number(2) default 0,

Location varchar2(50),

HStatus number(1) default 1,

Build_date date,

notes varchar2(100),

required number(1) default 1,

north number(1),

nlen number(7,2) default 0,

south number(1),

slen number(7,2) default 0,

east number(1) ,

elen number(7,2) default 0,

west number(1),

wlen number(7,2) default 0,

chart_no number(5) ,

dist_no number(3) ,

req_price number(9,2) default 0 CONSTRAINT house_req_price_check check(req_price>=0),

init_price number(9,2) default 0 CONSTRAINT house_init_price_check check(init_price>=0),

rent_price number(9,2) default 0 CONSTRAINT house_rent_price_check check(rent_price>=0),

phone varchar2(14),

HStatus2 number(2) default 1,

ELectricity number(1) default 1,

Water number(1) default 1,

Family number(1) default 1 ,

Furnatured number(1) default 1);

---------------------

جدول العقود

CREATE TABLE Contracts (

Contr_no Number(5) CONSTRAINT Contr_pK Primary key ,

Contr_date date NOT NULL ,

Renter_no Number(5) ,

House_no Number(5) ,

Start_date date NOT NULL ,

CType Number(1) DEFAULT (1) NOT NULL ,

Period Number(2) DEFAULT (1) NOT NULL ,

Part_Count Number(2) DEFAULT (1),

CPrice Number(9,2) DEFAULT (0) CONSTRAINT Contracts_CPrice_CHECK CHECK(CPrice >=0),

Comm Number(9,2) DEFAULT (0) CONSTRAINT Contracts_Comm_CHECK CHECK(COMM >=0 ),

Discount Number(9,2) DEFAULT (0) CONSTRAINT Contracts_Discount_CHECK CHECK(Discount >=0),

conditions VARCHAR2(100),

notes varchar2(100) );

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

ارجوكم لا تبخلوا على

تقبلوا فائق احترامي وتقديري

#2

شوف اخوي انا بخدمك مع اني الى الان ماني متخصص

ولا اعرف شي عن الى انت كاتبه

بس بالنسبة لسؤال

اذا سجلت نوع العقد(بيع وايجار)

سهلها على نفسك وحط ارقام

يعني

1 معناه بيع

2 مناه اجار

واعتقد انه يدخل فيها

if وغيرها

#3

شكر حبيبي

انا فاهم طريقة الارقام بس ابغى احد يعلمني كيف اكتب triggers

اعني الاضافة والتعديل والحذف

pre -insert,pre-delete,pre-update

#4

السلام عليكم

أخي العزيز صراحة مافهمت ايش تبغى بالضبط بس لكتابة triggers على مستوى البلوك :-

ندخل على ال triggers التي على مستوى البلوك ونختار مثلا pre-insert

ونكتب الكود لنفرض انه عند عمل insert على جدول ال emp نريد ان نحفظ رقم الموظف الجديد في جدول آخر اسمه emp2 :

insert into emp2(empno)

values(:emp.empno);

ونفس العملية على ال pre-update

update emp2

set empno=:emp.empno

where empno=:emp.empno;

وهكذ يمكن عمل تريقر على مستوى البلوك ان شاء الله اكون قربتك من الحل ..

تحياتي للجميع

محمد الشنقيطي:rolleyes:

#5

شكراً اخوي محمد فعلاً قربتني من الحل , زمازالت انتضر المزيد من اخواني

لتوضيح الفكرة

------------

-------------

اعرض لكم حل مثال عندي لجدولين

انا مثلا عندي جدول اصناف(item) وجدول فواتير(orders)

جدول الاصناف item

ITEM_NO NOT NULL NUMBER(5)

ITEM_NAME NOT NULL VARCHAR2(50)

QTY NUMBER(12,2)

رقم الصنف

اسم الصنف

الكمية

-----------------------------------------------------------------------

جدول الفواتير orders

ORD_NO NUMBER(6)

ITEM_NO NUMBER(5)

QTY NUMBER(7,2)

رقم الفاتورة

رقم الصنف

الكمية

---------------------------------------------------------------------

والمطلوب واحد هو:

عندما ابيع سلعة معينة فاني اخصم من جدول الفواتيركمية معينة من هذه السلعة.

وتلقائياً يخصم نفس الكمية من السلعة في جدول الاصناف

باستخدام التريقرين( pre-(insert,delete

وهذا هو الكود لكلاهما:

يكتب في تراقير pre- insert

update item set qty=qty-:orders.qty

where ietm_no=:orders.item_no;

يكتب في ترايقر pre-delete

update item set qty=qty+:orders.qty

where ietm_no=:orders.item_no;

مع ملا حظة ان الفرق فقط في علامتي(+و-)

والمطلوب الثاني هو :

عندما يشتري شخص كمية معينة من سلعة ثم يريد ان يرجع بعض الكمية

فاني اضيف للفواتير (الكمية المباعة)ثم اعدل مااضفته(الكمية المرجعة من العميل) وذلك باستخدام ترايقر pre-update

ونكتب فيه هذا الكود

declare

x number(7,2);

begin

select qty into x from orders

where ord_no=:orders.ord_no

and item_no=:orders.item_no;

update item set qty=qty-x+:orders.qty

where ietm_no=:orders.item_no;

------------

------------

اتمنى وضحت فكرة السؤال اخواني ؟!

طيب انا اريد نفس حل هذا المثال لكن الفرق ان بدل (الكمية) هو نوع العقود

انا بانتظار مساعدتكم

وجزاكم الله خيرا

#6

هلا اخوي

ياليت لو توضح اسماء الحقول المراد تغيرها.

يعني ابغى اسم حقل نوع العقد في جدول العقار

+

اسم حقل نوع العقد في جدول العقود

وإن شاء الله ؤاح نحل مشكلتك

وانا انتظر ردك

اخوك

شبيـــــــه الريح

#7

هلا اخوي

انت لم توضح اسم حقل نوع العقد في جدول العقار

ولكن انا افترظت ان اسمها (Contracts_type)

وواضح انه يأخذ احدى هاتان القيمتان

القيمه الاولى ( 0 ) وتعني ( بيع )

القيمة الثانيه ( 1) وتعني ( إجار ).

=====

وايضا لم توضح اي حقل يربط بين الجدولين

ولكن من الواضح انه رقم العقار ( House_no ).

واذا كانت افتراظاتي خاطئه اصلحها انت بمعرفتك.:D:D

==========

شوف يوجد طريقتين لحل مشكلتك

وهما :

1 - FORM trigger

2- data base trigger ( وهذى ما افضلة )

======

الطريقه الاولى ( FORM TRIGGER ):

وتنقسم إلى 3 خطوات :

الخطوة الاولى : اذا تم ادخال عقد جديد

وهذى هو الTRIGGER من نوع ( pre-insert )

BEGIN
UPDATE house 
SET  Contracts_type = :Contracts.CType
WHERE house.House_no = :Contracts.House_no;
END;

=======

الخطوة الثانية : إذا تم تعديل على عقد موجود

نفس الTRIGGER السابق ولكن تغير النوع إلى ( pre-insert )

========

الخطوة الثالثة : إذا تم حذف عقد موجود .

ونفترظ ان نوع العقد الافتراظي هو بيع ويأخذ قيمه ( 1 )

وهذى هو الTRIGGER من نوع ( pre-DELETE )

BEGIN
UPDATE house 
SET  Contracts_type = 1
WHERE house.House_no = :Contracts.House_no;
END;

===================================

===================================

النوع الثاني ( data base trigger )

وهذى هو الTRIGGER :

CREATE OR REPLACE TRIGGER Check_Type_Contracts
BEFORE INSERT OR UPDATE OF CType OR DELETE ON Contracts
FOR EACH ROW
BEGIN
 IF DELETING
 THEN 
  BEGIN
   UPDATE house 
   SET  Contracts_type =1
   WHERE House_no = :OLD.House_no;
  END;
 ELSE 
  BEGIN    
    UPDATE house 
    SET  Contracts_type =:NEW.CType
    WHERE House_no = :NEW.House_no;
  END;
 END IF;
END;
/

==========

إن شاء الله يكون هذى المطلوب ويكون فهمي لسؤالك صحيح

وبأنتظار تعليقك

واي استفسار انا بالخدمه

اخوك

شبيـــــه الريح

SBEH_ALREAH@HOTMAIL.COM

#8

يعطيك الف عافية اخوي شبيه الريح ماعليش انا

انا توي افتح الانترنيت وايضاعلى عجل لكن بكرةبتفرغ

واشوف الحل الي حطيتة وارد لك

شكرا جزيلاً

#9

اوكي اخوي

انا بأنتظارك

اخوك

شبيــــــه الريح

#10

اخوي شبيه الريح

ماقصرت كفيت ووفيت والله يجعل ماعملت في موازين حسناتك

تحياتي لك ولجميع من حاول ولم يستطع

اخوك

صالح

بريدي لاي استفسار

sa_mod@yahoo.com

#11

هلا اخوي صالح

ماسوينى إلى الواجب

والحمدلله انه اشتغل معاك زي ما تحب.

واي خدمه احنى حاظرين

تحياتي لك

اخوك

شبيـــــه الريح

هذا الموضوع مغلق.

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

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

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

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

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