إنتقال للمحتوى

  • تسجيل الدخول عبر الفيس بوك تسجيل الدخول عبر تويتر Log In with LinkedIn Log In with Google      تسجيل دخول    
  • إنشاء حساب

صورة
- - - - -

لدي مشكلة بالتريجر


10 رد (ردود) على هذا الموضوع

#1 Syrian Oracle

Syrian Oracle

    مشترك

  • الأعضــاء
  • 170 مشاركة

تاريخ المشاركة 09 February 2010 - 01:59 PM

السلام عليكم
أرجو منكم المساعدة في تعديل التريجر ، فعندما اقوم بعمل create فانه لا يظهر اي اخطاء او تحذيرات .
ولكن عندما اقوم بعملية ادخال حسب الشروط الموجودةفانه يعطينا رسالة الخطأ التالية :


Database error number 1 has occurred when operating on WOSTATUS WOSTATUSID=11,587.
ORA-00001: unique constraint (MAXIMO.TKSTATUS_NDX) violated
ORA-06512: at "MAXIMO.SR_STATUS", line 24
ORA-04088: error during execution of trigger 'MAXIMO.SR_STATUS

'




[left]CREATE OR REPLACE TRIGGER SR_STATUS
AFTER INSERT ON WOSTATUS
REFERENCING NEW AS NEW OLD AS OLD
FOR EACH ROW
----------------------
DECLARE
CURSOR WO_CUR IS
SELECT WONUM, STATUS, ORIGRECORDID
FROM WORKORDER WHERE ORIGRECORDID = (SELECT ORIGRECORDID FROM WORKORDER WHERE WONUM =:NEW.WONUM) ;
v1 number(2) ;
o1 number(10) ;
--X1 NUMBER(10) ;
--------------------------------
BEGIN --select TKSTATUSSEQ.nextval INTO X1 FROM DUAL ;
--------------------------
SELECT count(distinct STATUS)
INTO v1 FROM WORKORDER
WHERE ORIGRECORDID = (SELECT ORIGRECORDID FROM WORKORDER WHERE WONUM = :new.wonum) ;
----------------------------------
--select ORIGRECORDID into o1 from workorder where wonum = :NEW.WONUM ;
---------------------------------
IF :NEW.STATUS = 'CLOSE' and v1 =1 THEN
FOR WO_REC IN WO_CUR LOOP
IF WO_REC.STATUS = 'CLOSE' AND WO_REC.ORIGRECORDID IS NOT NULL THEN
UPDATE TICKET SET STATUS = 'CLOSED', changedate= sysdate WHERE TICKETID = WO_REC.ORIGRECORDID ;
[b] [u]INSERT INTO TKSTATUS ( TICKETID,CLASS,STATUS,CHANGEBY,CHANGEDATE,TKSTATUSID )[/b]
[b] VALUES( '1031', 'SR','CLOSED', 'MAXADMIN', SYSDATE, TKSTATUSSEQ.nextval );[/b]
[/u] END IF ;
END LOOP ;
END IF;
END SR_STATUS ;
/[/left]



علما بأني عندما اقوم بتنفيذ الادخال بشكل منفصل فانه يقبل ذلك

أرجو المساعدة وجزاكم الله خيرا

#2 mostfa_future

mostfa_future

    عضو مميز

  • الأعضــاء
  • 570 مشاركة
  • البـلـد: Country Flag

تاريخ المشاركة 09 February 2010 - 04:10 PM

IF :NEW.STATUS = 'CLOSE' and v1 =1 THEN
FOR WO_REC IN WO_CUR LOOP
IF WO_REC.STATUS = 'CLOSE' AND WO_REC.ORIGRECORDID IS NOT NULL THEN
UPDATE TICKET SET STATUS = 'CLOSED', changedate= sysdate WHERE TICKETID = WO_REC.ORIGRECORDID ;
INSERT INTO TKSTATUS ( TICKETID,CLASS,STATUS,CHANGEBY,CHANGEDATE,TKSTATUSID )
VALUES( '1031', 'SR','CLOSED', 'MAXADMIN', SYSDATE, TKSTATUSSEQ.nextval );
END IF ;
END LOOP ;
END IF;
END SR_STATUS ;

المشكله فى القطعه دى تاكد اخى الفاضل ان جمل UPDATE و انسيرت تكون مطبوطه من ناحيه الكونسترين
و عشان تاكد قبل ماتنفذ انسيرت خد قيم الى مقروض التريجر يعملها فى الجدوال دىTICKET ونفذها بعيد عن التريجر وشوف هتنفذ ولا لا اكيد انت حطط
كونسترين معين ومش واخد بالك لو موسلتش لحاجه يارت تعمل DESC لجدوال عشان نقدر نساعدك
وربنا معاك

لا تحسبن المجد تمرا أنت اكله *** لن تبلغ المجد حتى تلعق الصبر


صورةصورة


#3 Syrian Oracle

Syrian Oracle

    مشترك

  • الأعضــاء
  • 170 مشاركة

تاريخ المشاركة 10 February 2010 - 03:51 PM

أخي المشكلة في في تعليمة Update لأنه عندما اقوم الغيها من التريجر واقوم بتنفيذه لا اواجه اي مشكلة ولكن عندما اضيفها للتريجر فانه يعطيني خطا بالتنفيذ

هل انا قادر على استخدام KSTATUSSEQ.nextval بداخل التريجر ام ان هناك طريقة اخرى لاستخدامها وتنفيذ عملية الادخال ؟؟؟

وشكراجزيلا على اهتمامكم

#4 mostfa_future

mostfa_future

    عضو مميز

  • الأعضــاء
  • 570 مشاركة
  • البـلـد: Country Flag

تاريخ المشاركة 10 February 2010 - 05:18 PM

هل انت جربت الجماه من غير ماتستخدم KSTATUSSEQ.nextval اى انك تدخل القيمه يدوى من غير سيكزنس واشتغلت
لو اشتغلت ممكن تعمل بروستدر يحمل اى فريبول بقيمه KSTATUSSEQ.nextva وتعملها كول داخال التريجر وتستخدم الفريبول بدل من KSTATUSSEQ.nextva
بس انا مفتكرش ان ده السبب لان سيكونس مكن تستخدما فى اى مكان بدل انت عملها على نفس السكيمه
على عموم ركز عاى ان جمله Update مش بتنتهك اى كونستران
وبالتوفيق

تم التعديل بواسطة mostfa_future, 10 February 2010 - 05:20 PM.

لا تحسبن المجد تمرا أنت اكله *** لن تبلغ المجد حتى تلعق الصبر


صورةصورة


#5 Syrian Oracle

Syrian Oracle

    مشترك

  • الأعضــاء
  • 170 مشاركة

تاريخ المشاركة 10 February 2010 - 09:50 PM

عفوا اخي الكريم في المشاركة سبقت قصدت ان المشكلة ليست من update بل المشكلة من insert
فعندما الغي تعليمة insert و ابقي على جملة update فقط فان التريجر لا يعطيني اي رسالة خطأ عند التطبيق ولكن عند اضافة Insert فانه يعطيني الرسالة السابقة

وبنفس الوقت عندما اقوم بتنفيذ نفس تعليمة ال insert بشكل منفصل فانها تقبل ذلك ولا تعطيني اي خطأ

#6 mostfa_future

mostfa_future

    عضو مميز

  • الأعضــاء
  • 570 مشاركة
  • البـلـد: Country Flag

تاريخ المشاركة 11 February 2010 - 01:47 AM

INSERT INTO TKSTATUS ( TICKETID,CLASS,STATUS,CHANGEBY,CHANGEDATE,TKSTATUSID )
VALUES( '1031', 'SR','CLOSED', 'MAXADMIN', SYSDATE, TKSTATUSSEQ.nextval );
تاكد من كل الكونستران الى موجد على الجدول البداخل فى البيانات لان رساله الخطاء متعلقه بنتهاك كونسترين اسمه MAXIMO.TKSTATUS_NDX
ORA-00001: unique constraint (MAXIMO.TKSTATUS_NDX) violated
اكيد الكولم ده STATUS نت حطط عليه كونسترين unique
اتاكد من كل كنوسترين الى موجد على الجدوال لو موصلتش لحاجه ابعت لينا DESC لجدوال عشان نقدر نساعدك
و بالتوفيق

لا تحسبن المجد تمرا أنت اكله *** لن تبلغ المجد حتى تلعق الصبر


صورةصورة


#7 Syrian Oracle

Syrian Oracle

    مشترك

  • الأعضــاء
  • 170 مشاركة

تاريخ المشاركة 11 February 2010 - 11:35 AM

عزيزي مصطفى
هذه الكونستراينت الموجودة على الجدول والتريجر الموجود عليه
select INDEX_OWNER,INDEX_NAME,TABLE_OWNER,TABLE_NAME,COLUMN_NAME,COLUMN_POSITION  
from all_ind_columns where index_name='TKSTATUS_NDX';

INDEX_OWNER INDEX_NAME TABLE_OWNER TABLE_NAME COLUMN_NAME COLUMN_POSITION
MAXIMO TKSTATUS_NDX MAXIMO TKSTATUS TKSTATUSID 1




select INDEX_OWNER,INDEX_NAME,TABLE_OWNER,TABLE_NAME,COLUMN_NAME,COLUMN_POSITION
from all_ind_columns where index_name='TKSTATUS_NDX1';

INDEX_OWNER INDEX_NAME TABLE_OWNER TABLE_NAME COLUMN_NAME COLUMN_POSITION

MAXIMO TKSTATUS_NDX1 MAXIMO TKSTATUS TICKETID 1 1
MAXIMO TKSTATUS_NDX1 MAXIMO TKSTATUS CLASS 2
MAXIMO TKSTATUS_NDX1 MAXIMO TKSTATUS STATUS 3
MAXIMO TKSTATUS_NDX1 MAXIMO TKSTATUS CHANGEDATE 4



CREATE OR REPLACE TRIGGER "MAXIMO".TKSTATUS_T BEFORE INSERT OR UPDATE ON TKSTATUS FOR EACH ROW
DECLARE NEXTVAL INTEGER; BEGIN SELECT MAXSEQ.NEXTVAL INTO NEXTVAL FROM DUAL; :NEW.ROWSTAMP := NEXTVAL; END;

ولكم جزيل الشكر

#8 mostfa_future

mostfa_future

    عضو مميز

  • الأعضــاء
  • 570 مشاركة
  • البـلـد: Country Flag

تاريخ المشاركة 11 February 2010 - 02:03 PM

استخدم الجمله دى عشان تعرض الكونسترين
SELECT constraint_name , constraint_type
FROM user_constraints
WHERE table_name = 'اسم الجدول الى بيعمل مشكاه فى الانسريت' ;
وهات الناتج بتاعه
بالتوفيق

لا تحسبن المجد تمرا أنت اكله *** لن تبلغ المجد حتى تلعق الصبر


صورةصورة


#9 Syrian Oracle

Syrian Oracle

    مشترك

  • الأعضــاء
  • 170 مشاركة

تاريخ المشاركة 13 February 2010 - 09:11 AM

[left]SELECT constraint_name , constraint_type
FROM user_constraints WHERE table_name = 'TKSTATUS' ;
[/left]

CONSTRAINT_NAME CONSTRAINT_TYPE
SYS_C006387 C
SYS_C006388 C
SYS_C006389 C
SYS_C006390 C
SYS_C006391 C
SYS_C006392 C
SYS_C006393 C

#10 mostfa_future

mostfa_future

    عضو مميز

  • الأعضــاء
  • 570 مشاركة
  • البـلـد: Country Flag

تاريخ المشاركة 13 February 2010 - 02:46 PM

SELECT constraint_name , constraint_type
FROM user_constraints
WHERE constraint_name = 'MAXIMO.TKSTATUS_NDX ' ;
وجرب شوف هيطلع كونستران بالاسم ده مع مرعاء انك تكتب اسم الكونستران كابتل
وبعدين تاكد انك مدى قيمه لكل قبم الجدول لان عندك 7 كونستران TYPE بتاعهم c يعنى لما CHECK او NOT NULL فلو 7 كلهم NOT NULL فانت عامل فى الانسريت 6 قيم بس ممكنتكون المشكله هنا
و بالتوفيق

لا تحسبن المجد تمرا أنت اكله *** لن تبلغ المجد حتى تلعق الصبر


صورةصورة


#11 Syrian Oracle

Syrian Oracle

    مشترك

  • الأعضــاء
  • 170 مشاركة

تاريخ المشاركة 16 February 2010 - 04:47 PM

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


CREATE OR REPLACE TRIGGER MAXIMO.SR_STATUS
AFTER INSERT ON MAXIMO.WOSTATUS
REFERENCING NEW AS NEW OLD AS OLD
FOR EACH ROW
--------------------------------
DECLARE
V1 number(2) ;
O1 number(10) ;
TKTID number (10);
--------------------------------
BEGIN SELECT ORIGRECORDID INTO TKTID FROM WORKORDER WHERE WONUM = :NEW.WONUM;
SELECT COUNT(ORIGRECORDID) INTO O1 FROM WORKORDER WHERE ORIGRECORDID =TKTID;
SELECT COUNT(DISTINCT STATUS) INTO V1 FROM WORKORDER WHERE ORIGRECORDID =TKTID;

--------------------------------
IF :NEW.STATUS='CLOSE' and O1>1 AND V1=1 THEN

UPDATE TICKET SET STATUS = 'CLOSED', changedate = sysdate WHERE TICKETID = TKTID ;
-----------------
INSERT INTO TKSTATUS (TICKETID,CLASS,STATUS,CHANGEBY, CHANGEDATE,MEMO,SITEID,ORGID,TKSTATUSID,ROWSTAMP)
VALUES(TKTID, 'SR', 'CLOSED', 'MAXADMIN', SYSDATE, NULL, NULL, NULL, TKSTATUSSEQ.nextval, '1') ;
-----------------
END IF ;
--------------------------------
END SR_STATUS ;
/
--------------------------------