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

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

صورة
- - - - -

كيف وضع كود يقوم بحساب الزيادة والنقصان


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

#16 sonic

sonic

    مشترك

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

تاريخ المشاركة 13 March 2009 - 01:31 PM

ما بعرف بس الكومبايلر عم يقلك ما عم يلاقي عامود اسمو ID بجدول BloodType
جرب نفذ هي التعليمة:

desc BloodType;

حاولت مسح ال ID ووضعت بدلا منه BLOOD_TYPE_ID (لا اعرف هل الذي عملته صح ام خطأ)

واصبحت التريجر سليمة الكود بالصورة
ملف مرفق  trigger6.PNG   22.8كيلو   37 عدد مرات التحميل


ولكن بعد ما ادخلت البيانات بجدول ال Operations اظهرت لي هذه الرسالة
ملف مرفق  trigger5.PNG   10.19كيلو   38 عدد مرات التحميل
اسف على كثرة الاسئلة والازعاج

تم التعديل بواسطة sonic, 13 March 2009 - 01:33 PM.

سبحان الله والحمد لله ولا اله الا الله والله أكبر
استغفر الله الذي لا إله إلا هو الحي القيوم وأتوب اليه
اللهم اغفر لي ولوالدي ولجميع المسلمين والمسلمات والمؤمنين والمؤمنات الاحياء منهم والاموات
اللهم صل وسلم على النبي محمد
اللهم أعطي الناس ضعف ما يتمنوه لي من خير

#17 TROYMAN

TROYMAN

    مشترك

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

تاريخ المشاركة 13 March 2009 - 02:18 PM

ولا يهمك..ما في مشكلة
الخطأ عندك بالسطر السادس عند أول If
شو قصدك بـالعامود Stauts_ID كأنك معرفو Number و المفروض يكون varchar2 تأكد من المشكلة و إذا ما مشي الحال حط كود إنشاء الجداول و كود الإدخال للجدول Operations


<<اللهم لا علـم لنا إلا ما علّمتنا إنك أنت العليــم الحكيــم>>
<<اللهم علّمنا ما ينفعنا و انفعنا بما علّمتنا و ازدنا علماً>>



Programmer (C#.Net,C++,ASP) & Oracle Developer


#18 sonic

sonic

    مشترك

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

تاريخ المشاركة 13 March 2009 - 06:34 PM

شكراً لك اخي على تحملي، والسخاء النبيل منك

نجحت الطريقة مثلما وضحت لي، بفضل الله ثم بفضلك، جزاك الله كل خير وبارك فيك

ولدي سؤال اخر لو سمحتوا، وجداً محرج من كثرة الاسئلة

يمكن عمل طريقة حساب فيها الدم الذي لم يستخدم لمدة مثلاً 3 سنوان وما زال في المخزون اي عمل له مسح من قاعدة البيانات؟ لان كأني قرات ان الدم من الممكن ان تنتهي صلاحيته ولكن لا اعرف كم المدة؟

تم التعديل بواسطة sonic, 13 March 2009 - 06:36 PM.

سبحان الله والحمد لله ولا اله الا الله والله أكبر
استغفر الله الذي لا إله إلا هو الحي القيوم وأتوب اليه
اللهم اغفر لي ولوالدي ولجميع المسلمين والمسلمات والمؤمنين والمؤمنات الاحياء منهم والاموات
اللهم صل وسلم على النبي محمد
اللهم أعطي الناس ضعف ما يتمنوه لي من خير

#19 sonic

sonic

    مشترك

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

تاريخ المشاركة 13 March 2009 - 11:26 PM

حاولت مع كود العمر وبدلا من قسمته على 12 استخدمت الضرب في 2

اي تاريخ اليوم*2 =التاريخ القادم

واستخدمته بهذه الصيغة ولكن لم ينجح :(

begin select trunc(months_between(PROCESS_DATE)*2) into :new.NEXTF from dual;
end;

تم التعديل بواسطة sonic, 13 March 2009 - 11:27 PM.

سبحان الله والحمد لله ولا اله الا الله والله أكبر
استغفر الله الذي لا إله إلا هو الحي القيوم وأتوب اليه
اللهم اغفر لي ولوالدي ولجميع المسلمين والمسلمات والمؤمنين والمؤمنات الاحياء منهم والاموات
اللهم صل وسلم على النبي محمد
اللهم أعطي الناس ضعف ما يتمنوه لي من خير

#20 sonic

sonic

    مشترك

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

تاريخ المشاركة 14 March 2009 - 02:26 AM

اضفت في جدول ال Operations عامود جديد اسميته NextDate وهذا يقوم بضرب تاريخ العملية الحالية ب 2 لكي يحدد للمتبرع التبرع للشهر القادم (بعد مرور شهران)
وكتبت هذا ال Trigger للجدول ونجح

begin select trunc(ADD_MONTHS(SYSDATE,2)) into :new.NEXTDATE from dual;
end;


ولكن عند التبطيق في جدول ال Operation تفصل قاعدة البيانات ويحدث Disconnect لا اعرف لماذا ولا يتحقق الشرط :(

تم التعديل بواسطة sonic, 14 March 2009 - 02:32 AM.

سبحان الله والحمد لله ولا اله الا الله والله أكبر
استغفر الله الذي لا إله إلا هو الحي القيوم وأتوب اليه
اللهم اغفر لي ولوالدي ولجميع المسلمين والمسلمات والمؤمنين والمؤمنات الاحياء منهم والاموات
اللهم صل وسلم على النبي محمد
اللهم أعطي الناس ضعف ما يتمنوه لي من خير

#21 TROYMAN

TROYMAN

    مشترك

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

تاريخ المشاركة 14 March 2009 - 02:56 PM

بالنسبة لحذف كميات الدم المنتهية الصلاحية باعتبار مدة الصلاحية 3 سنوات:

create or replace procedure pro_Exp
is
cursor cur is select * from operations where (sysdate-OperationDate)/360>3;
f boolean :=false;
begin for rec in cur loop
if f then
f:=true;
end if;
update BloodType set Balance=Balance-rec.QuantityPerLiter
where ID=rec.BloodTypeID;
delete from Operations where OperationID=rec.OperationID;
end loop;
commit;
end;
/


و لتنفيذ الكود كل يوم بشكل دوري نستخدم DBMS_SCHEDULE

begin dbms_scheduler.create_program(program_name => 'PRO_EXP_JOB',
program_type => 'STORED_PROCEDURE',
program_action => 'PRO_EXP',
enabled => true);
end;
/


begin dbms_scheduler.create_schedule('SCH_EXP_JOB',
start_date => sysdate + (1/1440),
repeat_interval => 'FREQ=DAILY');
end;
/


begin dbms_scheduler.create_job('JOB_Operations_EXP',
program_name => 'PRO_EXP_JOB',
schedule_name => 'SCH_EXP_JOB',
enabled => true);
end;
/


<<اللهم لا علـم لنا إلا ما علّمتنا إنك أنت العليــم الحكيــم>>
<<اللهم علّمنا ما ينفعنا و انفعنا بما علّمتنا و ازدنا علماً>>



Programmer (C#.Net,C++,ASP) & Oracle Developer


#22 sonic

sonic

    مشترك

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

تاريخ المشاركة 14 March 2009 - 03:12 PM

جزاك الله كل خير اخي TROYMAN وامدك بالصحة والعافية والعلم والدين وزادك من فضله اللهم امين :(

تم التعديل بواسطة sonic, 14 March 2009 - 03:13 PM.

سبحان الله والحمد لله ولا اله الا الله والله أكبر
استغفر الله الذي لا إله إلا هو الحي القيوم وأتوب اليه
اللهم اغفر لي ولوالدي ولجميع المسلمين والمسلمات والمؤمنين والمؤمنات الاحياء منهم والاموات
اللهم صل وسلم على النبي محمد
اللهم أعطي الناس ضعف ما يتمنوه لي من خير

#23 TROYMAN

TROYMAN

    مشترك

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

تاريخ المشاركة 14 March 2009 - 08:53 PM

بالنسبة للقيد الذي يحصر المتبرع من حيث عدد مرات التبرع (مرة واحدة كل شهرين)
لا داعي للحقل الذي قمت بإضافته , بل عدّل جسم التريجر ليصبح كالتالي:

create or replace trigger tri_BloodType
before insert on Operations
for each row
declare
Obalance number:=0;
Nbalance number:=0;
Mdate date;
Pcount number;
ID number;
begin select count(*) into Pcount from operations where Name=:new.Name;
/* if that person granted before*/
if Pcount>0 then
select BloodTypeID into ID from Operations where Name=:new.Name;
/* if that person's Blood type is matched*/
if ID!=:new.BloodTypeID then
raise_application_error(-20212,'You try to Grant more than type of Blood!');
end if;
select Max(OperationDate) into Mdate from Operations
where Name=:new.Name;
/* if that person's last granting date is greater than 2 months*/
if (sysdate-Mdate)/30<2 then
raise_application_error(-20211,'You can'||'t grant again before passing two months at least');
end if;
else
select Balance into Obalance from BloodType
where ID=:new.BloodTypeID;
if :new.OperationType='grant' then
Nbalance := Obalance +:new.QuantityPerLiter;
elsif :new.OperationType='revoke' then
Nbalance := Obalance - :new.QuantityPerLiter;
if Nbalance<0 then
raise_application_error(-20210,'You try to revoke quantity greater than available');
end if;
end if;
update BloodType set Balance = Nbalance where ID=:new.BloodTypeID;
end if;
end;
/

تم التعديل بواسطة TROYMAN, 14 March 2009 - 08:55 PM.


<<اللهم لا علـم لنا إلا ما علّمتنا إنك أنت العليــم الحكيــم>>
<<اللهم علّمنا ما ينفعنا و انفعنا بما علّمتنا و ازدنا علماً>>



Programmer (C#.Net,C++,ASP) & Oracle Developer


#24 sonic

sonic

    مشترك

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

تاريخ المشاركة 15 March 2009 - 03:29 AM

ما شاء الله تبارك الله العلي العظيم

أغرقتنا بكرمك اخي الكريم

اسال الله العظيم رب العرش العظيم ان يوفقك دنيا واخرة بما يحبه ويرضاه ويرزقك من فضله كل خير اللهم امين

تم التعديل بواسطة sonic, 15 March 2009 - 04:10 AM.

سبحان الله والحمد لله ولا اله الا الله والله أكبر
استغفر الله الذي لا إله إلا هو الحي القيوم وأتوب اليه
اللهم اغفر لي ولوالدي ولجميع المسلمين والمسلمات والمؤمنين والمؤمنات الاحياء منهم والاموات
اللهم صل وسلم على النبي محمد
اللهم أعطي الناس ضعف ما يتمنوه لي من خير

#25 TROYMAN

TROYMAN

    مشترك

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

تاريخ المشاركة 15 March 2009 - 12:30 PM

شكراً لك أخي الكريم ... الفضل لله وحده ...


<<اللهم لا علـم لنا إلا ما علّمتنا إنك أنت العليــم الحكيــم>>
<<اللهم علّمنا ما ينفعنا و انفعنا بما علّمتنا و ازدنا علماً>>



Programmer (C#.Net,C++,ASP) & Oracle Developer


#26 sonic

sonic

    مشترك

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

تاريخ المشاركة 20 March 2009 - 10:09 PM

اخي الكريم TROYMAN ممكن لوسمحت مساعدة لو تكرمت

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

ممكن لوسمحت عمل ذلك الصلاحية لمدة 45 يوماً ويقوم بحذفه؟ من فضلك

وفقك الله

تم التعديل بواسطة sonic, 20 March 2009 - 10:11 PM.

سبحان الله والحمد لله ولا اله الا الله والله أكبر
استغفر الله الذي لا إله إلا هو الحي القيوم وأتوب اليه
اللهم اغفر لي ولوالدي ولجميع المسلمين والمسلمات والمؤمنين والمؤمنات الاحياء منهم والاموات
اللهم صل وسلم على النبي محمد
اللهم أعطي الناس ضعف ما يتمنوه لي من خير

#27 TROYMAN

TROYMAN

    مشترك

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

تاريخ المشاركة 21 March 2009 - 02:03 PM

السلام عليكم...

عدّل بالكيرسر :
create or replace procedure pro_Exp
is
cursor cur is select * from operations where (sysdate-OperationDate)>45;
begin for rec in cur loop
update BloodType set Balance=Balance-rec.QuantityPerLiter
where ID=rec.BloodTypeID;
delete from Operations where OperationID=rec.OperationID;
end loop;
commit;
end;
/
;


أنا حذفت الـ if لأنو ما لها شغل .. نسيانها من المرة الماضية
بس نصيحة لا تستخدم أي كود بمشاريعك قبل ما تفهم كل سطر فيه...

تم التعديل بواسطة TROYMAN, 21 March 2009 - 02:07 PM.


<<اللهم لا علـم لنا إلا ما علّمتنا إنك أنت العليــم الحكيــم>>
<<اللهم علّمنا ما ينفعنا و انفعنا بما علّمتنا و ازدنا علماً>>



Programmer (C#.Net,C++,ASP) & Oracle Developer


#28 sonic

sonic

    مشترك

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

تاريخ المشاركة 21 March 2009 - 02:41 PM

جزاك الله كل خير اخي الكريم ولا تخف باذن الله اقوم بفهم طريقة عمل الكود ولكن الذي وقف معي هو عملية تحديد 45 يوم لهذا سالتك بهذا الموضوع :(

بارك الله فيك اخي الكريم ووفقك دنيا واخرة

تم التعديل بواسطة sonic, 21 March 2009 - 02:51 PM.

سبحان الله والحمد لله ولا اله الا الله والله أكبر
استغفر الله الذي لا إله إلا هو الحي القيوم وأتوب اليه
اللهم اغفر لي ولوالدي ولجميع المسلمين والمسلمات والمؤمنين والمؤمنات الاحياء منهم والاموات
اللهم صل وسلم على النبي محمد
اللهم أعطي الناس ضعف ما يتمنوه لي من خير

#29 sonic

sonic

    مشترك

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

تاريخ المشاركة 21 March 2009 - 03:25 PM

يوجد لدي error في ال Balance لا اعرف لماذا مع اني استخدم الكود القديم ولم يظهر لي مثل هذا ال error

انظر جزاك الله خير

ملف مرفق  proc.PNG   21.15كيلو   31 عدد مرات التحميل
سبحان الله والحمد لله ولا اله الا الله والله أكبر
استغفر الله الذي لا إله إلا هو الحي القيوم وأتوب اليه
اللهم اغفر لي ولوالدي ولجميع المسلمين والمسلمات والمؤمنين والمؤمنات الاحياء منهم والاموات
اللهم صل وسلم على النبي محمد
اللهم أعطي الناس ضعف ما يتمنوه لي من خير

#30 TROYMAN

TROYMAN

    مشترك

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

تاريخ المشاركة 21 March 2009 - 04:48 PM

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

بالكيرسر ضع
where (sysdate-OperationDate)>45;

بدلاً من
where (sysdate-OperationDate)/360>3;


مع العلم أن الفرق بين تاريخين هو دائماً بالأيام...

و قم بحذف:
f boolean :=false;
if f then
f:=true;
end if;

تم التعديل بواسطة TROYMAN, 21 March 2009 - 04:49 PM.


<<اللهم لا علـم لنا إلا ما علّمتنا إنك أنت العليــم الحكيــم>>
<<اللهم علّمنا ما ينفعنا و انفعنا بما علّمتنا و ازدنا علماً>>



Programmer (C#.Net,C++,ASP) & Oracle Developer