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

مشاكل البرى اب ديت

مغلق
بدأه حد السيف في 14 يوليو 2003 · 17 رد · 1,566 مشاهدة · في قواعد بيانات Oracle
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

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

انا عندى برنامج للمستودعات مستشفى ويحتوى على ثلاث جدوال الاول

لتسجل المواد الداخله للمتسودع والثانى جدول للطلبيات وجدول للااسترجاع المود للمستودع

لدىفي الجدول الاول حقل لكمية الموجوده وحقل للكمية المصروفه

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

PROCEDURE PINSER IS

BEGIN

UPDATE STORS SET FOUND_QUANTITY= FOUND_QUANTITY-:STORS.DISBURSED_QUANTITY

WHERE :ORDERS.CATEGORY_NO = STORS.CATEGORY_NO;

end;

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

PROCEDURE PINSER IS

BEGIN

UPDATE STORS SETDISBURSED_QUANTITY =DISBURSED_QUANTITY+:ORDERS.DISBURSED_QUANTITY

WHERE :ORDERS.CATEGORY_NO = STORS.CATEGORY_NO;

end;

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

فهل من طريقه لحل المشكله

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

DECLARE

 DIS_QUANTITY NUMBER (9);

 BEGIN 

SELECT DISBURSED_QUANTITY INTO DIS_QUANTITY FROM ORDERS

WHERE ORDERS.CATEGORY_NO  = :ORDERS.CATEGORY_NO; 

UPDATE STORS SET FOUND_QUANTITY = FOUND_QUANTITY - DIS_QUANTITY

  WHERE :ORDERS.CATEGORY_NO = STORS.CATEGORY_NO;

  END;

	DECLARE

 D_QUANTITY NUMBER (9);

	BEGIN

 	 SELECT DISBURSED_QUANTITY INTO D_QUANTITY FROM ORDERS

  WHERE ORDERS.CATEGORY_NO  = :ORDERS.CATEGORY_NO;

	UPDATE STORS SET DISBURSED_QUANTITY = DISBURSED_QUANTITY + D_QUANTITY

  WHERE :ORDERS.CATEGORY_NO = STORS.CATEGORY_NO;

  END;

تسميات الحقول والجدوال وشرحها

TABLE STORS هذا اسم الجدول الذى تسجل في كل المواد الداخله لمستودعات المستشفي

TABLE ORDERS هذا اسم جدول الطلبيات لااقسام المستشفي

FOUND_QUANTITYNUMBER(10)NOT NULL هذا الكمية الموجوده ويوجد في جدولSTORS

DISBURSED_QUANTITY NUMBER(10),الكمية المصروفه الموجود في جدول STORS

DISBURSED_QUANTITY NUMBER(10)NOT NULL,الكمية المصروفة في جدول الطلبيات ORDERS

ارجو ان يكون الشرح وافي ولااكون اثقلت عليكم ولدى سؤال اخير ارجو ان تتحملوني

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

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

if :ORDERS.STORE_NAME<>:STORS.STORE_NAME then AND :ORDERS.CATEGORY_NO =:STORS.CATEGORY_NO

MESSAGE('اختر المستودع الصحيح');

MESSAGE(' ');

 end if;

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

#2

شباب وينكم مافيه احد يعرف لها؟؟؟؟؟؟؟؟؟؟؟

معقوله وينكم ياشباب الاوركل

#3

بالنسبة للسؤال الأول :

أقترح إنك تضع الكمية المصروفة في برميتر في POST-QUERY

وفي POST-UPDATE تقوم بالتحقق إذا كان المبلغ الموجود في الحقل = المبلغ الموجود في البرميتر

إذا كان غير متساوي تقوم بالتعديل على جدول STORS

PROCEDURE UPDATE_1 IS

BEGIN

UPDATE STORS SET FOUND_QUANTITY= FOUND_QUANTITY-:STORS.DISBURSED_QUANTITY + :PARAMETER.old_quantity

WHERE :ORDERS.CATEGORY_NO = STORS.CATEGORY_NO;

end;

PROCEDURE UPDATE_2 IS

BEGIN

UPDATE STORS SETDISBURSED_QUANTITY =DISBURSED_QUANTITY+:ORDERS.DISBURSED_QUANTITY- :PARAMETER.old_quantity

WHERE :ORDERS.CATEGORY_NO = STORS.CATEGORY_NO;

end;

السؤال الثاني :

" أنت تقول أن رقم الصنف لا يمكن أن يتكرر في مستودع ثاني "

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

وبكذ لا يمكن أن يسجل بيانات صنف من مستودع آخر

وعند POST-CHANGE لحقل المستودع تقوم بتفريغ البيانات من حقل الصنف

بالنسبة للكود يمكن وضعه في PRE-INSERT أو WHEN-VALIDATE-RECORD

if :ORDERS.STORE_NAME<>:STORS.STORE_NAME AND :ORDERS.CATEGORY_NO =:STORS.CATEGORY_NO then 

MESSAGE('اختر المستودع الصحيح');

MESSAGE(' ');

RAISE FORM_TRIGGER_FAILURE;

 end if;
#4

شكر اخى ابرهيم على جهدك معى انا راح اجرب هالطريقه اشوف لكن ابىاعرف كيف اعمل برميتر؟؟

#5

Parameter يشبه Global

بس الفرق أن البراميتر يستخدم داخل الفوم الواحد ولا ينتقل إلى فورم آخر كـال Global

ممكن تنشئ برميتر عن طريق

object navigator

تلقى تحت Parameters

أضف واحد غير اسمه أدخل على الخصائص غيرها حسب أحتياجك

أستدعيها في الكود

:PARAMETER.اسم البرميتر
#6

السلام عليكم

الأخ السائل

أنا لاحظت من الكود اللي انت ضفته في رسالتك انك لم تكتب الأمر Commit

وانا اعتقد انك عندما تريد ان تتأكد من صحة البيانات فانك تدخل ب session جديدة وفي هذه الحالة شيء اكيد انك لم ترى التغيرات ولن تراها الا عندما تكتب الامر COMMIT

Abo Qosai

#7

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

اخىالفاضل ابو قصى شكراً جزيلاً على ردك لكن انا على حد علمي لا نحتاج الى امر الحفظ هنا لان الاومر التى نريدها يتم تنفذيها قبل الحفظ عن طريق triger preinsert اى ينفذ الاومر قبل الاضافه وكذلك الحذف والتعديل

لكن بما ان الشى بالشى يذكر فانا تذكرت امر احتاجه وهو امر ايقاف الحفظ عندى بحيث لو وضعت شرط لتاكد من شى معين وعند الضفط على زر الحفظ يقوم بالتاكد من صحة الشرط اذا هو صحيح حفظ واذا لم يكن صحيح يعطيك مسج ينبهك للخطا انا علمتها ومشى تمام معى واضهر لى المسج في حالة الخطا لكن بعد ماضغط موفق لااخفا المسج يضهر لى مربع الحفظ واذا اخترت نعم حفظ انا اريده يوقف الحفظ حتى اعدل الخطا هل يوجد لديك امر ايقاف الحفظ وسؤلى موجه للجميع شاكراً لكم جميعاً

#8

اهلين شباب حياكم الله كيفك اخوى ابرهيم وابو قصى إن شاء الله بخير

اعتذر لكم انا وعدتكم اجيب لكم الحل اليوم السبت لكن نسيت اخذ الكود من جهاز العمل فاعذروني:o

ظهرت عندى مشكله جديده وهى بنفس موضوعنا الا ب ديت وهى عندى جدول الاسترجاع واسمه RECOVERYS وفيه حقل اسمه QUANTITY وهو الكمية المسترجعه وعندى كما تعلمون الجدول الرئسيى وهو STORS الذى سبق الحديث عنه في المشكله الاولى وهو جدول لتسجيل جميع الاصناف في المستودع وفيه حقلين وهما الكمية الموجوده FOUND_QUANTITY وكذلك الكمية المصروفه DISBURSED_QUANTITY وهذه الحقول المذكوره اعلاه هى محور حديثنا

انا عملت برى انسيرت في حالة اضافة سجل في جدول الاسترجاع يقوم باخذ قيمة الكمية QUANTITY ويضيفها للكمية الموجوده FOUND_QUANTITY في جدولSTORS بناء على رقم الصنف الذي موجود في الجدول ومعمول لهم ربط وهذا الكود الخاص فيه

PROCEDURE PINSERT3 IS

BEGIN

UPDATE STORS SET FOUND_QUANTITY = FOUND_QUANTITY + :RECOVERYS.QUANTITY

WHERE :RECOVERYS.CATEGORY_NO = STORS.CATEGORY_NO;

end;

كذلك عملت برى انسيرت اخرى للكمية المصروفهDISBURSED_QUANTITY في جدول STORS وهو يقوم باخذ قيمة حقل الكيمةQUANTITY الموجود في الاسترجاعRECOVERYS ويخصمها من الكمية المصروفه DISBURSED_QUANTITY الموجوده كذلك في جدول STORS وهذ الكود الخاص به

PROCEDURE PINSERT4 IS

BEGIN

UPDATE STORS SET DISBURSED_QUANTITY = DISBURSED_QUANTITY - :RECOVERYS.QUANTITY

WHERE :RECOVERYS.CATEGORY_NO = STORS.CATEGORY_NO;

end;

الى هنا لايوجد مشاكل يقوم بعمله بشكل صحيح لكن المشاكل تبدا عند التعديل

في حالة التعديل يقوم بتحديث قيمة الكمية الموجوده في جدول المستودع ولايوجد مشكله لكن المشكله تبدا عندما يقوم باخذ قيمة الكمية السترجعه الجديده ويخصمها من الكمية المصروفه وهذا يلخبط الحسابات بحيث لو كان عندى صنف موجود في جدول المستودعات الكمية الموجود منه 90 والكمية المصروفه 10 وعندما استرجع منه 5 مثلاً يقوم بوضع قيمة الكمية الموجوده95 والكمية المصروفه5 هنا تمام لكن عندما اعدل على السجل واضع الكمية المسترجعه 4 بدل 5 يقوم بوضع الكمية الموجوده 96 وهنا لاتوجد مشكله لكن يقوم باخذ القيمة الجديده للحقل وهى 4 ويخصمها بحيث يكون فيه خطا في الحساب وتكون الكمية المصروفه1بينما الصحيح يكون 6 وهذى المشكله

وهذه الكودات التى عملتها

PROCEDURE UPDATE_3 IS

BEGIN

  DECLARE

 old_quantity NUMBER (9);

  BEGIN 

	SELECT QUANTITY INTO old_quantity FROM RECOVERYS

	WHERE RECOVERYS.STORE_NAME= :RECOVERYS.STORE_NAME; 



UPDATE STORS SET FOUND_QUANTITY= FOUND_QUANTITY + old_quantity -:RECOVERYS.QUANTITY

WHERE :RECOVERYS.CATEGORY_NO = STORS.CATEGORY_NO;

end;

end;

هذ كود الاب ديت للكمية الموجوده

PROCEDURE UPDATE_4 IS

BEGIN

  DECLARE

 old_quantity NUMBER (9);

  BEGIN 

	SELECT QUANTITY INTO old_quantity FROM RECOVERYS

	WHERE RECOVERYS.STORE_NAME= :RECOVERYS.STORE_NAME;



UPDATE STORS SET DISBURSED_QUANTITY = DISBURSED_QUANTITY  +old_quantity -:RECOVERYS.QUANTITY

WHERE :RECOVERYS.CATEGORY_NO = STORS.CATEGORY_NO;

end;

end;

انا خطرت في بالى فكره لكن لم اجربها وهى انى اضع حقل جديد في جدول الاستراجاع واجعل هذا الجدول يساوى قيمة حقل الكمية الموجود في الاسترجاع ويكون هذا الحقل غير ضاهر للمستخدم لانه لايحتاجه فقط في الدات بيز ويقوم عند عمل الاب ديت ياخذ قيمته ويخصمها من الكمية المصروفه في جدول المستودع stors لكن لم اعرف الطريقه التى تجعل هذا الحقل ياخذ قيمة حقل الكيمه بحيث اذا سجل المستخدمه قيمة في الكيمه ياخذها مباشره ويضعها هناك في الحقل الجديد هذا ماينقصنى لعمل التجربه علها تنجح فمن لديه طريقه لجعل حقل ياخذ قيمة الحقل الاخر اتوماتيكاً اوا طريقه اخرى لحلها يفيدنا جزاءه الله عنا خير الجزاء وتقبلو فائق تقدير واحترام حد السيف

#9

شباب للحين ماحلها احد انا متوقف شغلى عليها

#10

المشكلة هذي مشابهة للمشكلة الأولى :

1- استخدم البرميتر أو استخدم حقل غير مرئي مثل ما قلت بس يكون لازم تغير خاصية الداتابيس آيتم إلى NO

2- في Post-query تجعل "البرميتر أو الحقل الغير مرئي" مساوي للكمية المسترجعة

3- في Post-update تقوم بالتحقق من التساوي بين "البرميتر أو الحقل الغير مرئي " مع الحقل المرئي إذا كان غير ميساوي تنفذ عملية update على الجدول stores

إن شاء الله تضبط معك.....

ابراهيم

#11

اهلين اخ ابرهيم كيف حالك مشكور على الحل وبجربه بكرا إن شاء الله واعطيك خبر عن النتيجه

#12

اخوى ابرهيم ارجو ان ترد علي سؤال بسرعه كيف اعمل النقطه الثانيه؟؟؟

اقتباس
2- في Post-query تجعل "البرميتر أو الحقل الغير مرئي" مساوي للكمية المسترجعة
#13

انا نسيت ان اسالك والحين رجعت اسال

#14

شوف اخوي انت قصدك زي المثال هذا والا انا غلطان في الملف موجود الفورم والكود في الحاله هذه عمليه الجمع

create table dd(
dd number(5),
ss number(5),
mm number(5));

ss.zip

#15
:PARAMETER.old_quantity :=  :RECOVERYS.QUANTITY;

تضع هذا الكود في Post-query

المعذرة على التأخير ما أدخل على النت إلى الصباح في العمل

#16

يعطيكم العافيه اخونى على جهدك الكبير الذى بذلتوه معى انا خجلان منك صراحه وابشركم انحلت المشاكل كلها في البرنامج وهذا بفضل الله وجهدكم معى وراح انزل الكوادت في اليل إن شاء الله

#17

اهلين شباب هذى الكودات الى كتبتها بمساعدتكم وانا انزلها هنا لفائده ولكم منى جزيل الشكر

راح انزل لكم الملف وانتم حملوه

çلكوïçê.txt

#18

I CAN NOT SAVE THE FILE PLS SOLV THE PROB

هذا الموضوع مغلق.

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