السلام عليكم
انا عضو جديد سمعت كثير عن هذا المنتدى من مديح وشكر وموسوعة علمية في مجال البرمجة بأنواعها
وهو تجمع لكل المبرمجين المحترفين والذي اطمح واتمنى ان اكون واحداً منهم
فأتمنا ان تقبلوني معكم فأنا خبرتي متواضعة في مجال قواعد البيانات
عندي سؤال حيرني لم اقدر التوصل اليه وهو عن التريقر
عندما استدعي PACKAGE داخل التريقر وادخل هذا الباكج
ثلاثة اجراءات الاول حلقة دوران تأخذ كل طالب ثم يستدعي الثاني الذي يقوم بإجتساب المعدل فصلي والثاني يستدعي الثالث الذ يقوم بإحتساب المعدل التركمي للطالب وتعديل الجدول لإضافة المعدلات فيه
المشكلة
ان التريقر لا يقوم بالتعديل عندما اغير درجة للطالب في الجدول كأنه لم يرى هذه الاجراءات او لم يفهم انه يوجد اجراء داخل اجراء .والمفروض عند التعديل مباشرة في درجة للطالب يعيد احتساب المعدل مرة ثانية وتعديل الجدول
وهذا كود الباكج وفيه الاجراءات
المهم فيه هو كود التعديل لجدول term update
CREATE OR REPLACE PACKAGE BODY URS_CALC_AVG IS
-- Private type declarations
-- Private constant declarations
-- Private variable declarations
-- Function and procedure implementations
/*************************************************************************/
PROCEDURE Calc_avg (
P_STUD_ID NUMBER,
P_TERM_YYT NUMBER,
P_COLG_NO NUMBER,
P_SPEC_NO NUMBER,
P_TEACH_TYPE VARCHAR2
) IS
CURSOR ST IS
SELECT INFO.STUD_ID
FROM URS_STUD_INFO INFO,
URS_STUD_SPECS SPECS,
URS_STUD_STATUS STATUS
where INFO.STUD_ID = DECODE(P_STUD_ID,0,INFO.STUD_ID,P_STUD_ID)
AND INFO.COLG_NO = DECODE(P_COLG_NO,0,INFO.COLG_NO,P_COLG_NO)
AND SPECS.SPEC_NO = DECODE(P_SPEC_NO,0,SPECS.SPEC_NO,P_SPEC_NO)
AND SPECS.TEACH_TYPE = DECODE(P_TEACH_TYPE,0,SPECS.TEACH_TYPE,P_TEACH_TYPE)
AND SPECS.STUD_ID=INFO.STUD_ID
AND INFO.STUD_STATUS=STATUS.STUD_STATUS
AND INCLUDE_AVG=1
ORDER BY INFO.COLG_NO,SPECS.SPEC_NO,INFO.STUD_ID;
CURSOR YYT (STUDENT NUMBER) IS
SELECT TERM_YYT FROM URS_TERM
WHERE STUD_ID=STUDENT
AND TERM_YYT <= P_TERM_YYT
ORDER BY TERM_YYT;
B NUMBER(1) :=0;
BEGIN
FOR ST_REC IN ST LOOP
FOR YYT_REC IN YYT (ST_REC.STUD_ID) LOOP
B:=1;
URS_CALC_AVG.TERM_AVG (ST_REC.STUD_ID,YYT_REC.TERM_YYT);
END LOOP;
END LOOP;
--COMMIT;
END CALC_AVG;
/*************************************************************************/
PROCEDURE TERM_AVG (
P_STUD_ID NUMBER,
P_TERM_YYT NUMBER
) IS
TERM_AVERAGE NUMBER;
TERM_AVG_POINT NUMBER;
SPEC NUMBER;
BEGIN
-- 1> Calculate term average.
SELECT NVL(SUM( NVL(SR_MARK, 0) * C.CRS_CR_HOURS ) /
SUM( C.CRS_CR_HOURS ),0) INTO TERM_AVERAGE
FROM URS_STUD_REG R,URS_COURSE C,URS_REG_STATUS STATUS
WHERE STUD_ID = P_STUD_ID
AND CLASS_YYT = P_TERM_YYT
AND R.CRS_NO = C.CRS_NO
AND R.CRS_SEQ = C.CRS_SEQ
AND R.REG_STATUS=STATUS.REG_STATUS
AND INCLUDE_AVG=1;
-- 2> UPDATE TERM table.
SELECT SPEC_NO
INTO SPEC
FROM URS_STUD_SPECS
WHERE STUD_ID=P_STUD_ID;
/* BEGIN
SELECT GL_POINT
INTO TERM_AVG_POINT
FROM URS_SPEC_GRADE_LEVEL
WHERE ROUND(TERM_AVERAGE,2) BETWEEN GL_MIN_MARK AND GL_MAX_MARK
AND GL_SPEC_NO=SPEC;
EXCEPTION WHEN NO_DATA_FOUND THEN*/
BEGIN
SELECT GL_POINT
INTO TERM_AVG_POINT
FROM URS_GRADE_LEVEL
WHERE ROUND(TERM_AVERAGE,2) BETWEEN GL_MIN_MARK AND GL_MAX_MARK;
EXCEPTION WHEN NO_DATA_FOUND THEN
raise_application_error( -20001,'ÊÃßÏ ãä æÌæÏ ÈíÇäÇÊ Ýí äÙÇã ÇáÊÞÏíÑÇÊ' );
END;
-- END;
UPDATE URS_TERM
SET TERM_AVG = NVL(TERM_AVG_POINT,0),
TERM_AVG_DEGREE=ROUND(NVL(TERM_AVERAGE,0),2),
TERM_MARK_STATUS = '1',
TIME_STAMP = SYSDATE
WHERE STUD_ID = P_STUD_ID
AND TERM_YYT = P_TERM_YYT;
-- 3> Call accumlated average.
URS_CALC_AVG.TERM_ACUM_AVG ( P_STUD_ID , P_TERM_YYT);
-- COMMIT;
EXCEPTION
WHEN NO_DATA_FOUND THEN
raise_application_error( -20001,'ÊÃßÏ ãä æÌæÏ ÈíÇäÇÊ Ýí äÙÇã ÇáÊÞÏíÑÇÊ' );
WHEN TOO_MANY_ROWS THEN
raise_application_error( -20001,'åäÇß ÊßÑÇÑ Ýí ÈíÇäÇÊ äÙÇã ÇáÊÞÏíÑÇÊ' );
END TERM_AVG;
/*************************************************************************/
PROCEDURE TERM_ACUM_avg (
P_STUD_ID NUMBER,
P_TERM_YYT NUMBER
) IS
ALL_HOURS NUMBER;
ALL_POINTS NUMBER;
ACUM_AVG NUMBER;
ACUM_DEGREE NUMBER;
SPEC NUMBER;
BEGIN
SELECT NVL(SUM(NVL(SR_MARK,0)*C.CRS_CR_HOURS),0), NVL(SUM(C.CRS_CR_HOURS),0)
INTO ALL_POINTS,ALL_HOURS
FROM URS_STUD_REG R,URS_COURSE C,URS_REG_STATUS STATUS
WHERE CLASS_YYT <= P_TERM_YYT
AND STUD_ID = P_STUD_ID
AND R.REG_STATUS=STATUS.REG_STATUS
AND INCLUDE_AVG=1
AND R.CRS_NO = C.CRS_NO
AND R.CRS_SEQ = C.CRS_SEQ
AND CLASS_YYT =(SELECT MAX(CLASS_YYT) FROM URS_STUD_REG
WHERE STUD_ID = R.STUD_ID
AND CRS_NO = R.CRS_NO
AND CRS_SEQ = R.CRS_SEQ
AND CLASS_YYT<=P_TERM_YYT)
AND CRS_INCLUDE!=0;
IF NVL(ALL_HOURS,0) = 0 THEN
ACUM_AVG := 0;
ACUM_DEGREE:=0;
ELSE
ACUM_DEGREE := ROUND(ALL_POINTS / ALL_HOURS,2);
SELECT SPEC_NO
INTO SPEC
FROM URS_STUD_SPECS
WHERE STUD_ID=P_STUD_ID;
BEGIN
SELECT GL_POINT
INTO ACUM_AVG
FROM URS_GRADE_LEVEL
WHERE ACUM_degree BETWEEN GL_MIN_MARK AND GL_MAX_MARK;
EXCEPTION WHEN NO_DATA_FOUND THEN
raise_application_error( -20001,'ÊÃßÏ ãä æÌæÏ ÈíÇäÇÊ Ýí äÙÇã ÇáÊÞÏíÑÇÊ' );
END;
-- END;
END IF;
UPDATE URS_TERM
SET TERM_ACUM_AVG = ACUM_AVG,
TERM_ACUM_DEGREE = ACUM_DEGREE
WHERE STUD_ID=P_STUD_ID
AND TERM_YYT=P_TERM_YYT;
-- COMMIT;
EXCEPTION
WHEN NO_DATA_FOUND THEN
raise_application_error( -20001,'ÊÃßÏ ãä æÌæÏ ÈíÇäÇÊ Ýí äÙÇã ÇáÊÞÏíÑÇÊ' );
WHEN TOO_MANY_ROWS THEN
raise_application_error( -20001,'åäÇß ÊßÑÇÑ Ýí ÈíÇäÇÊ äÙÇã ÇáÊÞÏíÑÇÊ' );
WHEN others THEN
raise_application_error( -20001,'åäÇß ÎØÃ ÑÇÌÚ ãÓÆæá ÇáäÙÇã' );
END TERM_ACUM_AVG;
-- Initialization
/*************************************************************************/
end URS_CALC_AVG;
/
وهذا الترايقر
CREATE OR REPLACE TRIGGER EDUWARE.REG_TRANSACTION
BEFORE DELETE OR UPDATE
ON EDUWARE.URS_STUD_REG
REFERENCING NEW AS NEW OLD AS OLD
FOR EACH ROW
declare
spec number(5);
colg number(5);
teach varchar2(5);
BEGIN
select spec_no,colg_no,teach_type into spec,colg,teach--,stud
from urs_stud_info i,urs_stud_specs s
where i.stud_id=s.stud_id
and i.stud_id=:OLD.stud_ID;
IF UPDATING THEN
urs_calc_avg.calc_avg (:old.stud_ID ,:old.class_yyt ,COLG,SPEC,TEACH) ;
-- ELSIF DELETING THEN
urs_calc_avg.calc_avg (:old.stud_ID ,:old.class_yyt ,COLG,SPEC,TEACH) ;
END IF;
END;
طويل لكنه سهل
لا اعرف هل سيكون مفهوم