الانتقال إلى المحتوى
View in the app

A better way to browse. Learn more.

مجموعة مستخدمي أوراكل العربية

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

تعديل في مبيعات يتبعه تعديل في ارصده وكلاء

Featured Replies

بتاريخ:

عندي فورم مبيعات سيراميك لوكلاء حصريون ، حين ان كل وكيل له سجل خاص به ، يقوم الفورم بخصم قيمه المشتروات من رصيد الوكيل من خلال PROCEDURE اسمه Agacount_decrبه الكود التالي



PROCEDURE Agacount_decr (decr_credit IN NUMBER,
AG_ID IN NUMBER) IS credit NUMBER;
BEGIN
SELECT AGCREDIT INTO credit FROM AGMSTR
WHERE AGID = AG_ID;
UPDATE AGMSTR
SET AGCREDIT = credit - decr_credit WHERE AGID = AG_ID;
--Raise Form_Trigger_Failure;
END;




ويتم مناداه هذا الـ PROCEDURE من خلال Post-forms-commit Trigger به الكود التالي :



DECLARE
RcrdFetch NUMBER;
BEGIN
RcrdFetch := 0;
SELECT COUNT(*) INTO RcrdFetch FROM AGMSTR WHERE AGMSTR.AGID = :BLKDPMSTR.C_ID;
if RcrdFetch <> 0 then
Agacount_decr (:BLKDPDTLS.T_PRICE,:BLKDPMSTR.C_ID);

 END IF;
END;




، اريد عند التعديل في كميه معينه (مثلا سحبنا 10 قطع ، ثم عدلنا الكميه المسحوبه بعد الحفظ الي 8 قطع) ان يرجع الفرق في حساب الوكيل
مرفق لكم فورم المبيعات وفورم الوكلاء والجداول

بتاريخ:
  • كاتب الموضوع

لم اتمكن من ارفاق الملف في هذه الصفحه ، بتظهر رساله (غير مصرح لك بارفاق هذا النوع من الملفات) على العموم الملفات مضغوطه في ملف winrar على الرابط التالي :
http://www.megaupload.com/?d=PYJHS203

بتاريخ:

السلام عليكم
يمكن عمل التعديلات المطلوبة كلها عن طريق database triggers
فيمكنك انشاء تريجر after insert or update علي جدول المشتروات نفسه
بحيث تقومي بالتشييك
if inserting then
قومي بخصم القيمة المشتراة من الرصيد
elsif updating
قومي بالتشييك اذا كانت القيمة المشتراة قد تم تخفيضها او تزويدها اذا تم تخفيضها
قومي بحساب الفرق
مثلا من 10 الي 8 و هو 2
و اضيفيه علي الرصيد مرة اخري
ولو تم تزويدها احسبي الفرق ايضا و اخصميه من الرصيد

CREATE OR  REPLACE  TRIGGER ADJUST_BAL AFTER INSERT OR  UPDATE  ON  (UR  TABLE NAME)  FOR  EACH  ROW
DECLARE  
V_DIFF  NUMBER;
BEGIN  
IF  INSERTING  THEN  
UR  PROCEDURE  HERE;
ELSIF  UPDATING  THEN  
V_DIFF:=(:NEW.TOTAL-:OLD.TOTAL)*-1;
---UR  PROCEDURE  HERE  BUT PASS  V_DIFF 
END  IF;
END;


بالتوفيق

تم تعديل بواسطة hanon_OCP

بتاريخ:
  • كاتب الموضوع

اشكرك جدا سيد hanon_OCP علي الرد ، لكن ارجو التوضيح اكثر في العبارتين التاليتين
V_DIFF:=(:OLD.TOTAL-:NEW.TOTAL)*-1;
---UR PROCEDURE HERE BUT PASS V_DIFF
واعذرنا على ثقل الراس

بتاريخ:

السلام عليكم
لا شكر علي واجب :P
بالنسبة للعبارة الاولي

فبدلا من كتابة IF STATMENT لعمل تشيك علي القيمة القديمة اكبر من الجديدة او اصغر منها يمكن اختزال ذلك في جملة واحدة عن طريق حساب الفرق
بطرح القيمة القديمة من الجديدة و اذا كان الفرق بالموجب بمعني انه تم زيادة القيمة الجديدة
فبضربه في -1 سيكون لدينا الفرق بالماينس مثال
القيمة الجديدة 12و القديمة 10
12-10=2
2*-1= -2
و عند جمع -2 مع الرصيد الموجود اذا كان مثلا 40
40+-2
سيكون الناتج 38
اي تم تخفيض الرصيد بقيمة التزويد
اما اذا كانت القيمة القديمة اكبر من الجديدة فسيكون الفرق
بالموجب
مثال
8-10=-2
و عند ضربه في -1 كالتالي
-1* -2=2
ستكون النتيجة 2
لان ضرب السالب في سالب بموجب
و النتيجة ستكون 2
التي عند جمعها مع الرصيد السابق سيصبح
40+2=42
اي تم تزويد الرصيد بالقيمة التي تم تقليلها

و بالنسبة للعبارة الاخري
اقصد
انكي في البروسيدر التي تقومي فيها بتخفيض الرصيد يوجد بارمتر اسمه
decr_credit
في حالة الادخال استعدي البروسيدر و ضعي قيمة هذه البارمتر
:NEW.TOTAL
ام ا في حالة التعديل
فقومي اولا بحساب البروسيدر ثم بدلا من ان تضعي قيمة البارمتر :NEW.TOTAL
ضعي بدلا منه المتغير V_DIFF

ليقوم بخصم او زيادة الرصيد حسب الفرق
ملحوظة : قمت بتعديل المعادلة الي :NEW.TOTAL -:OLD.TOTAL
و ايضا ارجوا ان يكون مفهوما ان البروسيدر حق تعديل الرصيد يجب ان تكون علي الداتا بيز و ليس علي الفورم

ارجو ان تكون وضحت
بالتوفيق

تم تعديل بواسطة hanon_OCP

بتاريخ:
  • كاتب الموضوع

اخ hanon_OCP ، اشكرك جدا على الرد ، لكن اخي ما استعصي على فهمي المتواضع عباره ( :NEW.TOTAL و العباره :OLD.TOTAL) حيث لم افهم بالضبط مكانهما في الكود وماذا تمثلان ، هل هي من الجدول او من الفورم ( مع العلم ان الترقر اللي نتكلم عنه في الجداول ) واضعهما في اي مكان - لو امكن توضيح القيم المقابله من الاكواد المرفقه ان وجدت - ؟
واكرر شكري وتقديري

بتاريخ:

السلام عليكم
:new.total and :old.total
هما اسم العمود
الموجود بحقل :BLKDPDTLS.T_PRICE
يعني ممكن تعديل التريجر ليكون :new.t_price and :old.t_price
و :new and :old
هما قيمة الحقل قبل التعديل و بعد التعديل
بالتوفيق

بتاريخ:
  • كاتب الموضوع

قمت بإضافه الكود من خلال الفورم ك تريقر اسمه ADJUST_BAL لاني عدلت في الكود ونسخته في SQL PLUS ولم يحدث شي ، مع ذلك تظهر الكثير من الاخطاء ، فهناك كلمات مثل PROCEDURE اذ انه كيف يمكنني تظمين بروسيدر ضمن الكود من دون مشاكل

بتاريخ:

السلام عليكم
يا اختي العزيزة
ما بعثته ليس كود كامل هو فقط مجرد guide حتي تستطيعي كتابة التريجر بشكل صحيح
ما اقصده بكلمه بروسيدر ليس ان تضعي كلمة بروسيدر بنفسها في التريجر
و لكن ان تقويم اولا بانشاء البروسيدر التي تعدل في الرصيد علي الداتا بيز
ثم تقومي بانشاء التريجر عيل الداات بيز ايضا
ثم تكتبي اسمها في التريجر هكذا
Agacount_decr (:new.T_PRICE,:new.C_ID);
و كلمة ur procedure
المقصود بها اسم البروسيدر التي ستقومي بانشائها
و ممكن الاتشغناء عنها و كتابة جملة الابديت مباشرة
في التريجر

بالتوفيق

تم تعديل بواسطة hanon_OCP

بتاريخ:
  • كاتب الموضوع

الاخ hanoon_ocp
اليك ما حدث :
قمت بانشاء بروسيدر (INSERT) على الداتا بيز من خلال الفورم بلدر يحتوي على هذا الكود :

PROCEDURE Agacount_insert (new.t_price IN NUMBER,AG_ID IN NUMBER) IS credit NUMBER;
BEGIN
SELECT AGCREDIT INTO credit FROM AGMSTR
WHERE AGID = AG_ID;
UPDATE AGMSTR
SET AGCREDIT = credit - new.t_price WHERE AGID = AG_ID;
Raise Form_Trigger_Failure;
END;



ولكن تظهر رساله اعتراض (عند حفظ البروسيدر ، لم اجد مكان عمل الـ COMPILE) على العباره التاليه new.t_price
هذا ما اردت قوله ، كما اود ان اعرف ما اذا كان هناك طريقه اخري لانشاء DATABASE TRIGGER وكيفيه مناداه الـ PROCEDURE من خلال هذا الـ تريقر
وجزاكم الله خيرا

بتاريخ:

 PROCEDURE Agacount_insert (t_price IN NUMBER,AG_ID IN NUMBER) IS 
credit NUMBER;
BEGIN
SELECT AGCREDIT INTO credit FROM AGMSTR
WHERE AGID = AG_ID;
UPDATE AGMSTR
SET AGCREDIT = credit - t_price WHERE AGID = AG_ID;

END;



وعملية الاستدعاء تتم من خلال التريجر حيث ترسلين المتغيرات باسم البروسيجر

Agacount_insert (:ur_t_price ,:ur_AG_ID );

بتاريخ:
  • كاتب الموضوع

شكرا للسيد المشرف على الرد ، لكن تحملو جهلي ، اين اضع هذا البروسيدر ، فقد قمت بكتابته على SQLPLUS على بيئتي الـ DOS والـ TEXT EDITORT ، كما قمت بارفاقه ايضا من خلال الـ Form Builder ومن خلال Enterprise Manager Console ، كيف اعمل هذا البروسيدر ، والاهم ، اين يمكن ان اعمل compile حتي اتأكد من صحه الكود

بتاريخ:

اختي الكريمة
هناك فرق بين بروسيجر الخاص بقاعدة البيانات والبروسيجر الخاص بالديفلوبر فالذي في قاعدة البيانات يمكن استدعائه من الفورم او من plsql او من اي مكان اما الذي خاص بالفورم والذي انتي قمتي بانشائه فتضعينه فيما يسمى ب Program Units في القورم حيث تقومين بانشاء بروةسيجر وتنسخين هذا الكود
اما بالنسبة لاستدعائه فيتم من خلال تريجر او عند حدوث حدث معين مثلا عن الضغط على زر او عند التخزين على العموم بما انه يختص في الاضافة فيفضل انشاء تريجر من اسمه post-insert ووضع الاستداعاء بداخله


انصحك يا اختي ان تركزي في السؤال فاجابات الاخ
hanon_OCP وافيه وكافيه ومشكوووور وماقصر

بتاريخ:

السلام عليكم
يبدو انه حدث بعض اللخبطة عند الاخت LINDA
عموما
أخت ليندا
المفروض ان عندك جدولين
1-جدول مبيعات
2- جدول ارصدة عملاء
و ان كود العميل موجود في جدول المبيعات
و انك تريدي ان تقومي بتعديل الرصيد علي حسب عمليات البيع او التعديل فيها بالزيادة او النقصان

هذه هي المشكلة
الحل::

لا تقومي بانشاء اي بروسيدر لا علي الداات بيز ولا علي الفورم
افتحي السكول بلس
و قومي باشناء داتا بيز تريجر علي جدول المبيعات كالتالي

CREATE OR  REPLACE  TRIGGER ADJUST_BAL AFTER INSERT OR  UPDATE  ON  (/*UR  TABLE NAME)*/  FOR  EACH  ROW
DECLARE  
V_DIFF  NUMBER;
BEGIN  
IF  INSERTING  THEN  
UPDATE AGMSTR
SET AGCREDIT = AGCREDIT - :NEW.T_PRICE WHERE AGID = :NEW.AG_ID;
ELSIF  UPDATING  THEN  
V_DIFF:=(:OLD.T_PRICE-:NEW.T_PRICE)*-1;
UPDATE AGMSTR
SET AGCREDIT = AGCREDIT -V_DIFF WHERE AGID = :NEW.AG_ID; 
END  IF;
END;


ضعي بدلا من تعليق /*UR TABLE NAME*/
إسم جدول المبيعات
و قد قمت باضافة جملية الابديت و تعديل التريجر حتي يعمل بصورة صحيحة ان شاء الله
مرة اخري اذكرك هذا داتا بيز تريجر
و ليس علي الفورم و لا يوجد داعي الان لانشاء اي بروسيدر تقوم بعمل الابديت
لاننا وضعناها في التريجر نفسه
و شرح التريجر كالتالي

CREATE OR  REPLACE  TRIGGER ADJUST_BAL AFTER INSERT OR  UPDATE  ON  (/*UR  TABLE NAME)*/  FOR  EACH  ROW


هذه الجملة تقوم بانشاء تريجر باسم ADJUST_BAL علي جدول المبيعات بعد الاضافة او التعديل في مبيعات موجودة
و يعالج حالتين
الاولي و ه ي الاضافة
و فيها سنقوم بتعديل جدول الارصدة بالخصم دوما
و الحالة الثانية و هي التعديل في مبيعات موجودةو فيها سنقوم بتعديل الرصيد بالزيادة او النقصان حسب نوع التعديل

IF  INSERTING  THEN  
UPDATE AGMSTR
SET AGCREDIT = AGCREDIT - :NEW.T_PRICE WHERE AGID = :NEW.AG_ID;


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

V_DIFF:=(:OLD.T_PRICE-:NEW.T_PRICE)*-1;
UPDATE AGMSTR
SET AGCREDIT = AGCREDIT -(V_DIFF) WHERE AGID = :NEW.AG_ID; 
END  IF;
END;


و في هذا الجزء اذا كانت العملية عملية تعديل في مبيعات موجودة
نحسب الفرق اولا
ثم نقوم بتعديل الرصيد للعميل بالزيادة او النقصان حسب الفرق
اذا كان بموجب اي تم تخفيض المبيعات
سيقوم بزيادة الرصيد
لو سالب اي تم زيادة المبيعات سيقوم بتخفيض الرصيد

و بالنسبة لآخطاء اي بروسيدر او تريجر علي الداتا بيز
بعد انشاءه من السكول بلس
اذا كان هناك اي اخطاء لعرضها استخدمي الامر

show errors
/


سيعرض لكي الاخطاء الموجودة

اتمني ان يكون كل شئ وضح الان
بالتوفيق

تم تعديل بواسطة hanon_OCP

بتاريخ:
  • كاتب الموضوع

اخي hanon_OCP ، اشكرك بشده على نصائحك الثمينه وتوجيهاتك القيمه ومتابعه دعمكم للبوست ، واتمني من الله ان يثيبك كما تحب ، جاري العمل حسب توجيهاتكم ، وسأوافيكم بالنتائج والكود في قسم الدروس حتي تعم الفائده للأعضاء بعد ان افرغ من العمل وجزاكم الله خيرا

انضم إلى المناقشة

يمكنك المشاركة الآن والتسجيل لاحقاً. إذا كان لديك حساب, سجل دخولك الآن لتقوم بالمشاركة من خلال حسابك.

زائر
أضف رد على هذا الموضوع...

برجاء الإنتباه

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

Account

Navigation

البحث

إعداد إشعارات المتصفح الفورية

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.