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

اظهار رساله عند عدم تحقق check


MMA

Recommended Posts

بسم الله الرحمن الرحيم

فية عندي سؤال لم يتم إدراجه في هذا المنتدي من قبل وهو


تعاملت مع قاعدة بيانات ACCESS كثيراً ، فعند إنشاء حقل جديد لراتب الموظف
تحت إسم Sal كنت أقوم بوضع قد له تحت إسم ( قاعدة التحقق من الصحة ) وهي
نفس طريقة ( Check ) الموجودة بأوراكل ، ولكن حتي الآن لم أجد داخل أوراكل
القيد الثاني ( نص التحقق من الصحة ) ، وهو النص الذي سيظهر عند عدم إتباع
المستخدم القيد المنشأ في ( Check )


مثال :
-------
نفترض أن لدينا جدول ( EMP ) والذي يمثل الموظف ، وبه حقل ( Sal ) والذي
يمثل اراتب ، طلبت مني الشركة أن لا يزيد الراتب عن 5000 جنية مصر ، و لا
يقل عن 500 ج مصري ، ففي داخل أوراكل أستخدمت أمر Check ، وعند إدخال قمة
أبر من 5000 أو أقل من 500 تظهر رسالة ( تم إنتهاك قيد Check ) ، ولكن
كيف يتم عرض رسالة ( رجاء إدخال راتب بين 500 و 5000 جنية مصري ) مثل نظام
أكسيس

ملحوظة :
---------
رجاء عدم إستخدام طرق Procedue أو Function لمعالجة هذا الجزء ، فإذا كان
هناك قيد مثل القيد المذكور أعلاة في نظام أكسيس رجاء إخباري به وطريقة إنشاءة
، أما إذا كان هذا القيد غير مدعوم بأوراكل فرجاء إخباري بذلك للإستفادة منها
أنا وكافة الأعضاء.

أنظر الصورة المرفقة معرفة المطلوب بالضبط


آسف علي طول الرسالة





مع الشكر

رابط هذا التعليق
شارك

اخي الكريم

عندما تظهر رسالة الخطأ ( تم إنتهاك قيد Check )
هناك رقم لهذه الرسالة يمكن استخدام هذا الرقم في التريجر ON-ERROR لعرض الرسالة التي تريدها عن طريق الامر message

رابط هذا التعليق
شارك

أخي Develobar الكريم ، متشكر جداً علي الرد السريع !

في الحقيقة هذه الطريقة هي المتبعة معي في برمجة قواعد بيانات أوراكل مع لغة برمجة الفيجوال بيزيك
وذلك كما تعلمتة من هذا المنتدي العريق ومنتدي الفريق العربي للبرمجيات ، ولكنني أسأل عن خاصية معينة ،
وهي ( نص التحقق من الصحة ) هل هي مدعومة داخل أوراكل أم لا؟


وأشكرك علي الرد مرة أخري

رابط هذا التعليق
شارك

السلام عليكم
اخى MMA

يوجد خاصيتين بtext item تسمى:
lowest allwed value
highest allowed value

ويمكن من خلالهما تحديد قيمة دنيا وقيمة عليا للبيانات التى سوف يتم ادخالها فى هذا الحقل وفى حالة ادخالة قيمة غير المطلوبة يظهر الخطأ ورقمة frm-40207 ومع رسالة تفيد ان البيانات يجب ان تكون فى نطاق القيم التى قمت بتحديدها

ارجو ان يكون هذا هو المطلوب

تم تعديل بواسطة m_ahmed
رابط هذا التعليق
شارك

متشكر جداً أخ M_Ahmed :

ولكن كيف يتم ذلك من خلال الكود:

Create Table Emp
(
Enumber VarChar2(10),
Ename VarChar2(50),
Sex VarChar2(1),
Sal Number(10,3),
Constraint PK_EMP Primary Key(Enumber),
Constraint CHK_EMP_SAL Check(Sal >= 500 And Sal <=6000)
);

كيف يتم تصميم ما قلتة علي هذا الكود

رابط هذا التعليق
شارك

يمكن تحقيق ما تريد عن طريق داتا بيز تريجر مع استخدام raise_application_error ووضع نص الرساله هذا علي مستوي الداتا بيز
اما علي مستوي الفورم فيمكنك كتابه ماتريد عن طريق تريجر when vaildate item واكتب الي عاوزه

مع تمنياتي بالتوفيق

رابط هذا التعليق
شارك

بسم الله الرحمن الرحيم


أعزائي مبرمجين هذا الموقع العريق ،
تحية طيبة وبعد ،


في الحقيقة أنا مبرمج مبتديء ، وأفهم كثيراً للغة برمجة Visual Basic خاص الربط مع قاعدة البيانات ( أكسيس- أوراكل- اس كيو ال سيرفار ) ، كما أنني أفهم بعض الشيء عن برمجة صفحات الويب ( HTML-ASP-VBScript ).

أما بالنسبة لقواعد البيانات فقد أهتميت للغتي ( DDL ) لتصميم قاعدة البيانات و ( DML ) لمعالجة قواعد البيانات ، وكان هذا محور إهتماماتي لتصميم تطبيقات VB مع قواعد البيانات ، وحينما قررت أن أتعلم برمجة ( PL/SQL ) وجدت نفســي فــي متاهــة لمـــدة 3 شهور حتي تمكنت من القدرة علــي تصميــم كلاً مــن ( Function- Procedure- Package ) داخل Oracle ، وذلك بحدود متطلباتي مع الفيجوال بيزيك.

أما بالنسبة لمشكلتي داخل Oracle هي تصميم التريجر ، الحقيقة أنا قرأت كتب كثيرة عن ال ( Trigger ) وفهمت منها بعض الشيء ، ولكن عند التصميم داخل SQL/Plus يعطي الناتج غير صحيح.

أما بالنسبة لي مع قواعد بيانات أوراكل لن أتعامل معها الا في الحدود الموضحة أعلاة وهي تصميم قاعدة البيانات بالكود والربط مع VB.

فنعود مرة أخري الي المشكلة التي توجهت إليها بالمثال التالي :

نفرض أن هناك شركة تعطي مرتبات للموظفين ما بين ( 500ج ) للموظف المبتديء و ( 5500 ) للوظف النهائي ، فأنا أرغب في جعل حقل المرتب تحت إسم ( Sal ) يتم تخزين قيم الراتب ما بين هذين الرقمين ( 500-5500) ، ولكي يتم ذلك من الطبيعي إستخدام أمر Check ، ولكن سؤالي هنا كيف يتم وضع القيد ( نص التحقق من الصحة ) مثل الموجود داخل ( Access ) ولكن بإستخدام الكود مثل ما يلي :

Create Table Emp
(
Enumber VarChar2(10),
Ename VarChar2(40),
Sex VarChar2(1),
Sal Number(10,3),
Constraint PK_EMP Primary Key(Enumber),
Constraint CHK_SAL Check(Sal >= 500 And Sal <=5500)
);
/
كيف يتم وضع قيد بدون التريجر علي الحقل Sal بحيث أن يعرض رسالة مثلا ( يجب إدخال راتب ما بين 500 و 5500 جنية مصري )

لأن في الحقيقة هذا القيد يفيدني كثيراً داخل VB من خلال Access ، أما Oracle فحتي الآن أستخدم طريقة إقتباس رقم الخطأ المنتج من Oracle ومعالجتها داخل Function ، وإذا كان ليس هناك حل سوي التريجر فياريت تساعدوني في كيفية تصميم ال Triger .

أما بالنسبة للأخ m_ahmed فمتشكر جداً علي الرد ، ولكن أنا ليس معقداً ولكني أتحقق فقط لا غير ، فإن كان الموضوع بالنسبة لك أو لأي عضو غير مفهوم فأعتبرو أن الموضوع كأنة لم يكن وصدقوني لم أزعل نهائياً ، لأن كل نظام يختلف تماماً عن غيرة من حيث الإمكانيات مثل أمر ( On Update Cascade ) الغير مدعومة داخل Oracle .

أرجو أن لا أكون مذعج بالنسبة لكم ، فالحقيقة أنا مسجل في هذا المنتدي منذ فترة ولكن يعتبر هذه أول مشاركة لي كعضو لأنني كنت أتعلم في البداية وحان الوقت لمشاركتي مع سيادتكم ، وأتمي أن تتقبلو مني هذه الرسالة لفتح مناقشة في المستقبل.

وآسف مرة أخري علي الإزعاج

رابط هذا التعليق
شارك

اخى
MMA

اعتذر لك ان كنت قد اسأت لك من غير قصد

واعتقد انه يمكن ان تكتب هذا الكود تحت التريجير when vaildate item

if :salary not between 500 and 5500 then

message('يجب ان لا يقل الراتب عن 500 ولا يزيد عن 5500');
message('يجب ان لا يقل الراتب عن 500 ولا يزيد عن 5500');
rasie form_trigger_faliuer
end if 


ارجو ان يكون هذا المطلوب

واعتذر مرة ثانية

رابط هذا التعليق
شارك

لا تعتزر أخي m_ahmed ، فأنا قد تعلمت منك ومن أعضاء هذا المنتدي الكثير والكثير عن Oracle ،
فأنا لن أزعل أبداً من أحبائي وأساتزتي ومعلميني :


ولكن أخي العزيز معزرتاً ، أعتقد أنك لم تقرأ الرسالة جيداً !!!

فقد قلت أنني لن أعرف كيف يتم إنشاء ال Trigger أما عن ال ( Function-Procedure-Package)
فأنا أتعامل معها جداً ، فهل بإمكانك مساعدتي..

إذا كان ذلك ، فأنا أطلب منك طلب آخر داخل Oracle دون إحراج وهو :
1- هل يمكن إنشاء جداول أو عارض أو فهرس أو غرض أو ......... الي آخرة من خلال Procedure
مثل القدرة علي التعامل مع DML.
2- هل يمكن إنشاء Parameter لإحدي الإجراءات من نوع Object مثل الكود التالي داخل VB.

Dim obj As Object
Set obj = From1
Label1.Caption = obj.Name
Set obj = Nothing

مع العلم أنني أستخدم قاعدة If للإنتقال ما بن الكائنات ، ولكن كيف يتم التعامل مع 100
كائن ، فالحل هو إستخدام متغير من نوع Object.



وشكراً

رابط هذا التعليق
شارك

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

CREATE TABLE SAL_VAL
(
 SAL  NUMBER,
 CONSTRAINT CHK_SAL
CHECK (sal>=500 and sal <=500)
);



يمكن أن تنشيء الجدول من داخل PL/SQL بإتسخدام

Forms_ddl

وهذا مثال على ذلك

Forms_DDL('create table temp(n NUMBER)');



والمثال كاملا من الهيلب حق الديفلوبر 200 وستجد الكثير من الأمثله هناك

BEGIN 
Forms_DDL('create table temp(n NUMBER)');
IF NOT Form_Success THEN
Message ('Table Creation Failed'); 
ELSE Message ('Table Created'); 
END IF; 
END; 




أتمنى أن يكون هذا هو ماتبحث عنه

شكرا

رابط هذا التعليق
شارك

خلاص يا جماعة أنسو الأمر كأنة لم يكن ، وسأعود أنا الي الطريقة المتبعة معي ، وأنا خجلان جداً لأني معرفتش أوصلكم المعلومة صحيحة.

علي العموم أنا سأعتبر أن هذه المشاركة تكون مشاركة تعارف ، هل ترغبونني كعضو في هذا المنتدي

فأنا مهما كنت أسمي مبتديء

===========

أما بالنسبة للأخ (ابن الجزيره ) جربت الكود بتاعك ولكن لية لما أستخدم الكود الي بعتهولي لن يعمل ويعطي خطأ ، كأن أوراكل لا يعلم الأمرين Message و Forms_DDL.

مع العلم أستخدم Oracle9

رابط هذا التعليق
شارك

انا مصمم بقي انك تفهم الموضوع :)
بص مفيش طريقة مباشره انك تطلع رساله من اوراكل غير لو كانت رسال exception وتعمل هاند للاكسبشن ده
وعلشان تطلع رساله مفهومه في الاكسبشن مش ينفع تعمل تشيك كونسترينت
لازم تعمله عن طريق داتا بيز تريجر
واسهل كود للموضوع اهه

CREATE OR REPLACE TRIGGER XXYY
BEFORE 
INSERT
ON EMP
REFERENCING OLD AS OLD NEW AS NEW
FOR EACH ROW 
BEGIN
IF :NEW.SAl = 10 THEN
RAISE_APPLICATION_ERROR(-2550,'XX');
END IF;
END;
/


XXYY اسم التريجر و
وxx هي المسج التي تريد ارجاعها
والكود ده معناه لو المرتب ب 10 مش تعمل انسرت و رجع ايرور رقمه 2550 و اسمه الي مكتوب جنبه
ومرحب بيك في المنتدي دائما
مع تمنياتي بالتوفيق

رابط هذا التعليق
شارك

يمكن تكون نسخت الكود نسخ وهذا أحيانا حتى من الهيلب حق الديفلوبر 200 يسبب مشكله لأنه يحط بعض الspace لكن حاول تكتبه كتابه وأبد بالسطر الأول بس علشان يظبط معاك يعني


Forms_DDL('create table temp(n NUMBER)');


وشوف الجدول تم إنشاؤه أو لا

شكر

رابط هذا التعليق
شارك

السلام عليكم ورحمة الله وبركاته


create  or  replace  trigger  t_emp  before  insert  on   emp  for  each  row
begin
if   inserting  then
if :new.sal  not  between  500  and  6000   then
raise_application_error(-20001,' يجب أن يكون الراتب أكبر من أو يساوي 500 جنيه أو أصغر من أو يساوي 6000 جنيه ' );
end if;
end if;
end;

رابط هذا التعليق
شارك

بسم الله الرحمن الرحيم


تحية طيبة وبعد،

أخي العزيز ، عبدالله ندا /
الحقيقة أنا فرحان جداً علي إصرارك كي أفهم تركيبة الـ ( Trigger ) ، والحقيقة التركيبة المعطاة لي قد فهمتها جيداً ، وعند البدء في التطبيق علي الحاسب أعطي لي ناتج صحيح ، فبصراحة متشكر جداً جداً علي تعاونك معي ، لأن بهذا الكود قد فتح لي أبواب برمجة الأزندة ، ومنه قد فهمت العديد من الأكواد الموجودة معي علي الحاسب الخاص بي ، منها تركيبة الترقيم التلقائي ، والمكتوبة بزناد ذات الصف الواحد ، وهذا ما جعلني تأخرت في الرد هذا اليوم.

أخي العزيز ، بعد الإنتهاء من كتابة الكود ظهر لي رسالة ( تم إنشاء زناد ) ، وعند إدراج سجل جديد قمت بوضع الرقم ( 10 ) بحقل ( Sal ) ، فلم يدرج السجل ، وهذا هو المطلوب مثل أمر ( Check ) ، ولكن للأسف الرسالة التي كتبتها – XX- لم تظهر نهائياً ، وعند تغيير رقم الخطأ من ( -2550 ) الي ( -20504 ) كما قرأتة من قبل علي الويب ، وجدت الرسالة يتم عرضها طبيعي ، كما يلي :
ORA-20504: XX
ORA-06512: عند "Man.XXYYY",Line 3
ORA-04088: ظهر خطأ أثناء تنفيذ الزناد MAN.XXYYY

ولكن بعد هذه المساعدة العظيمة بالنسبة لي كان لي سؤالين أرغب في الإجابة عنهم ، فرجاء مساعدتي حتي تكمل مسح الغمامة الموجودة في بصري :
1- ما هذا الرقم - هل يمكن تغييره - وما هي باقية الأرقام وكيف يتم الحصول عليها ؟
2- هل يمكن عرض الرسالة ( XX ) فقط لا غير بدون باقية الرسالة ؟ كيف يتم ذلك ؟
3- هل لديك كتاب مختصر يمكن من خلالة مساعدتي علي إنشاء أي ( Trigger ) ؟

أخي العزيز ، أنت لست مٌجبر للإجابة علي هذه الأسئلة ، ولكنها بالنسبة لي تعتبر ثروة ، من خلالها توفر لي العديد من الأكواد التي كنت أكتبها داخل لغة ( الفيجوال بيزيك ) .

ومتشكر جدا علي وقوفك معي لمسح تلك الغمامة


أخوك ( مصطفي محمود عبدالسلام )

=============================================================

أما الأخ الغالي jamal_rrkk :
شكراً جزيراً علي الرد ، فإن الأخ عبدالله ندا ساعدني بنفس مساعدتك تقريباً ، فهذا هو ما فعلتة بعد إرشادات الأخ عبداالله.

فشكراً جزيرا

=============================================================


أخي العزيز ( إبن الجزيرة ) ، شكراً جزيراً علي الرد .

أما بالنسبة لي فقد كتبت الكود بنفسي دون إجراء عملة النسخ من الكود المرفق في هذه الصفحة أو حتي من أي منطقة أخري ، بل كتبتة داخل محرر النص ( Notepad ) ، ورغم ذلك كأن أوراكل لن يعرف أي شيء عن الأوامر التالي :
Forms_DLL
Message




وشكراً جزيراً أخي ( إبن الجزيرة )

رابط هذا التعليق
شارك

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

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

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

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   تمت استعادة المحتوى السابق الخاص بك.   مسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

جاري التحميل
×
×
  • أضف...

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

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