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

دروس عن الTRIGGERS

رائج
بدأه aaab77 في 15 نوفمبر 2003 · 66 رد · 28,578 مشاهدة · في قسم لغةالاجرائات Pl/sql
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

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

اخواني / اخواتي مشرفي واعضاء المنتدى

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

وسوف اكون اول المشاركيين

وظيفة ال TRIGGER : اذا كان الموشر اخر سجل سوف يرجع الى اول سجل

مستوى الTRIGGER : على مستوى BLOCK

نوعه : KEY-DOWN

IF :SYSTEM.LAST-RECORD =’TRUE’ THEN

FIRST-RECORD;

ELSE

NEXT_RECORD;

END IF;

علي احمد

مبرمج اوراكل

aaab2000@hotmail.com

#2

والله ما تحمسوا الواحد يستمر !!!!!!!!!!!!!!!!!!!!!

علي احمد

مبرمج اوراكل

aaab2000@hotmail.com

#4

شكرا اخ ثامر

وظيفة ال Trigger : اظهار الساعة في الفورم

مستوى ال Trigger : الفورم

نوعه : when _new form_instance

DECLARE

T TIMER ;

BEGIN

T:=CREATE _TIMER ('TI',1000,REPEAT);

END;

ولازم يكون TRIGGER ثاني ينهي الاول وهو :

مستوى TRIGGER : الفورم

نوعه : WHEN_TIMER_EXPIRED

:CLOCK :=TO_CHAR(SYSDATE,'HH:MI:SS');

حيث CLOCK : اسم DISPLAY ITEM

علي احمد

مبرمج اوراكل

aaab2000@hotmail.com

#5

ياليت يا أبو أحمد أنك توقف شوي..

بالنسبة لل TRIGER الاول ..

هل يحتاج ألى

DECLARE

VARIBALE AA TYPEVARIBLE

BEGIN

END;

لأني جربته نفس ماكتبت و طلع لي خطا في الـــCOMBILE

وياليت الله لا يهينك .. أنك تشرح الثاني

بالنسبة للثاني ..

عندما أنسخ الكود .. ثم أضعه في الكومبايل يضهر لي خطا عند كلمة

T:=CREATE_TIMER ('T1',1000,REPEAT);

الله يوفقك لما يحب ويرضى

شكرا لك و أعذرنا أذا أخذنا من وقتك الثمين .. يا أبو أحمد

لك تحياتي

ثامر

#6

السلام عليكم

الله يعطيك العافية يا أخ علي (أبو أحمد)

نرجو ان تستمر في عرض كل التريقرات اذا ممكن

نحن بحاجه لها والله يجعل ذلك في ميزان حسناتك ان شاء الله

#7

شكرا اخ mamoa و ثامر على اهتمامكم للموضوع وياريت المشاركة وايضا دعوة للجميع

بالنسبة لسوال الاخ ثامر

الاول : مايحتاج ولكن لاحظ الاشارة - هي العلامة اللي تحت يعني _ (UNDER SCORE)

مثل LAST_RECORD و FIRST_RECORD

الثاني :

فاليك ملف من نوع FMB مشروح وجاهز

ان شاء اكون ما قصرت

وشكرا

CLOCK.fmb

1

علي احمد

مبرمج اوراكل

aaab2000@hotmail.com

#8

مشكور

ياخ على الامثلة

والى الامام

#9

السلام عليكم

جزاك الله خير يا أخ علي على المثال

ونطلب المزيد من التريقرات الاخرى

جعله الله في ميزان حسناتك

#10

وظيفة التريغر : تخزين وقت الخروج من الفورم داخل جدول قاعدة بيانات

مستوى التريغر : الفورم

نوعه أو إسمه : PRE-LOGOUT

Update follow_up_table

SET logout_from_system = SYSDATE

WHERE user_name = :GLOBAL.curr_user_name;

حيث :

Follow_up_table : هو جدول لمتابعة المستخدمين

Logout_from_system, user_name : حقلان في الجدول

:GLOBAL.curr_user_name اسم المستخدم الحالي

هذا التريغر ينطلق قبل تنفيذ البرنامج الفرعي logout . عندما يحتاج المستخدم أن يخرج من البرنامج . سواء كان هناك زر للخروج أو من خلال النقر على X التي على الزاوية اليمنى للشاشة . و هنا فائدته أكثر أعني الخروج عن طريق النقر على X

و الله ولي التوفيق .

#11

شكرا لجميع الاعضاء المشاركين

وان شاء الله نكمل بعد العيد

وكل عام وانتم بخير (اعاده اللع علينا وعليكم )

والله الموفق

علي احمد

مبرمج اوراكل

aaab2000@hotmail.com

#13

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

وان شاء الله نساعدك قدر الاستطاعة

#14

الف شكر aaab77 للفكره الرائعه ولكل من شارك ونتمنى ان نشاهد المزيد من التواصل من باقي الاعضاء

#15

شكرا على هذا الجهد الطيب

..........

#16

هذا التريجر يقوم بعمل الرقم التلقائي autonumber fore primary key

الكود التالي منقول و يتكون من 4 خطوات:

1- انشاء اي جدول جديد وليكن التالي:

CREATE TABLE departments (
  ID           NUMBER(10)    NOT NULL,
  DESCRIPTION  VARCHAR2(50)  NOT NULL);

ALTER TABLE departments ADD (
  CONSTRAINT dept_pk PRIMARY KEY (ID));

ومن ثم ننشئ سيكونس كالتالي:

CREATE SEQUENCE dept_seq;

ومن ثم نقوم بكتابة التريجر ال1ي سيعمل قبيل ادخال اي قيمة جديدة كالتالي:

CREATE OR REPLACE TRIGGER dept_bir 
BEFORE INSERT ON departments 
FOR EACH ROW
BEGIN
  SELECT dept_seq.NEXTVAL
  INTO   :new.id
  FROM   dual;
END;

واخيرا ندخل قيمة في العمود الذي لايحوي البرايمري كي:

INSERT INTO departments (description)
VALUES ('Development');

تم تعديل هذه المشاركة بواسطة monadi في 28 نوفمبر 2003 في 18:49

#17

السلام عليكم

كل عام وانتم بخير

عيد مبارك على مشرفي واعضاء المنتدى وجميع الامة الاسلامية

شكرا

monadi وORACLE/MASTER،رهف

وجميع المشاركين

Dynami list

وهي تحديث للقائمة وذلك مجرد ما ينضاف اي حاجة في الجدول يتم التحديث في اللقائمة

وظيفة التريغر :تحديث القائمة في الفورم

نوع التريغر :when_new_form_instance

مستوى التريغر :form

declare

rg recordgroup;

n number;

begin

rg:=create_group_from_query('g1','select dname ,to_char(deptno) from dept');

n:=populate_group('g1');

populate_lsit('deptno,rg);

end ;

علي احمد

مبرمج اوراكل

aaab2000@hotmail.com

#18

السلام عليكم

اسم التريغر : تشغيل التقرير من داخل الفورم عن طريق ازرار

نوعه : when_button_pressed

مستواه : على الزر

declare

pl_id number;

begin

run_product(reports,'emp.rep',synchronous,runtime,filesystem,pl_id,null);

end;

حيث

emp =report name

والله الموفق

علي احمد

مبرمج اوراكل

aaab2000@hotmail.com

#19

و إنت بألف خير يا أخ ثامر ، أعذرني على التأخير في الرد و تمنايتي لك بالتوفيق

و يعطيك العافية يا أخ أحمد

وظيفة التريغر : وضع وصف لفورين كي foreign key بعد الاستعلام

اسم التريغير : post-query

المستوى : block

لنفترض عندنا داتا بلوك اسمه customers يحتوي على اسم الزبون و معلومات خاصة عنه ورقم المدينة التي يقطن بها (city_number) foreign key

و يوجد هناك جدول (master table) خاص بأرقام المدن و أسمائها ، cities_table (city_no, city_name)

المطلوب : نريد عرض اسم المدينة مع الرقم في بلوك الزبائن عند كل استعلام

أولا : ننشئ display item داخل بلوك الزباين و نسميه c_name و ندخل على خصائصه و نعمل database item = No

ثم نكتب التريغر post-query

DECLARE

CURSOR c1 IS SELECT city_name FROM cities_table WHERE city_no = :customers.city_number

BEGIN

OPEN c1;

FETCH c1 INTO :customers.c_name;

IF c1%NOTFOUND THEN

:customers.c_name := 'not available' ;

END IF;

CLOSE c1;

END;

ملاحظات

1) جدول الزباين يكون به فقط رقم المدينة و لا يكون به اسم المدينة

2) عند اضافة زبون لا يتم عرض اسم المدينة من خلال هذا التريغر ، و لكن يجب استخدام طريقة أخرى مثل list of value أو when-validate-item trigger

3) نستطيع استخدام نفس الكود في تريغر when_validate_item على مستوى : :customers.city_number و ذلك لعرض اسم المدينة عند اضافة زبون أو عند تغيير رقم المدينة لزبون موجود أصلا

4) نستطيع الاستغناء عن post-query & when-validate-item باستخدام تريغر واحد فقط يقوم بعمل التريغرين السابقين في نفس الوقت و هو :

post-change ، و لكن جماعة أوراكل لا ينصحون باستخدامه حيث أنه موجود لغاية الان لغرض التوافق مع برامج أوراكل القديمة، حيث يوجد عليه قيود.

و شكرا

#20

عفوا تصحيح لما أعلاه

يعطيك العافية يا أخ علي أحمد و تحياتي لجميع المشاركين

#21

يعطيك العافية اخ maen

وممكن هناك طريقة مبسطة اخرى

SELECT city_name into :c_name from cities_table WHERE city_no = :customers.city_number;

والله الموفق

علي احمد

مبرمج اوراكل

aaab2000@hotmail.com

#22

السلام عليكم

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

الجدول التفصيلي للفواتير =inv_d

الجدول للاصناف =items

على سبيل المثال

وظيفة التريغر =طرح الكمية المباعة من جدول الاصناف تلقائيا

نوعه = pre_insert

مستواه= data block

declare

a number ;

begin

select items.qty into a from item where items.item_no=:inv_d.item_no;

if :inv_d.qty>a then

message('الكمية في المخزن لاتكفي ');

raise form_trigger_failure;

else

update items set qty=qty-:inv_d.qty where item_no=:inv_d.item_no ;

end if;

end;

والله الموفق

علي احمد

مبرمج اوراكل

aaab2000@hotmail.com

#23

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

من طول الغيبة جاب الغنايم

يعطيك ألف عافية أخو maen

والأخ الأستاذ علي أحمد ...

حقيقة أنكم ماقصرتوا...

والله يوفقوا لما يحب ويرضى ...

تحياتي

أخوكم

ثامر

#24

كل الشكر الى الاخوة على المشاركات الفعالة

والى الامام

#25

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

أقدم لكم في هذا الرد درس PASING PARAMETER BETWEEN FORMS

نريد أن نعمل شاشة للجدول DEPT بحيث أنه أذا عرضنا البيانات اللتي بالدائرة رقم 20 ونقرنا على زر ينتقل بنا إلى شاشة

EMPوبها أسماء لموظفين اللذين يعملون في هذه الدائرة

ننشئ شاشة للــDEPT ومن ثم نضع بها زر ومن ثم نظغط على F3ونذهب ألى PARAMETERSونعمل له أنشاء

ثم نغير أسم الباراميتر ألى NO ثم نغير PARAMETER DATA TYPE ألىNUMBER

لأن الباراميتر هنا هو الحقل DEPTNO وكما هو معروف فأن هذا الحقل نوعه رقم .نغلق الشاشة نحفظها بأسم DEPT

ثم ننشئ شاشة EMP ونعملها TABULAR بعد أن عملناها نحفظها بأسم EMP ..

نعود ألى الشاشة لأولى ثم نذهب ألى الزر ونختار الحدث WHEN_BUTTON_PREESED ونكتب الكود التالي

DECLARE

A PARAMLIST;

BEGIN

A:=CREATE_PARAMETER_LIST('THA');

ADD_PARAMETER(A,'NO',TEXT_ITEM,PARAMETER,:DEPTNO);

RUN_PRODUCT(FORMS,'EMP',ASYNCHRONOUS,RUNTIME,FILESYSTEM,A,'');

EXIT_FORM;

END;

طبعا هذا الكود مشروح في المرفقات..

ثم نغلق الشاشة

ونعود إلى الشاشة الأخرى ونذهب ألى TRIGEER على مستوى الفورم زنختار الحدث التالي WHEN_NEW_FORM_INSTANCE

ونكتب الكود التالي :

DECLARE

B BLOCK;

BEGIN

B:=FIND_BLOCK('EMP');

IF(:PARAMETER.NO IS NOT NULL)THEN

SET_BLOCK_PROPERTY(B,DEFAULT_WHERE,'DEPTNO='||:PARAMETER.NO);

GO_BLOCK('EMP');

EXECUTE_QUERY;

END IF;

END;

أيضا هذا الكود مشروح في الكومبايل الخاص بالPL/SQL

DEPT.FMB

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