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

درس البحث المتقدم بـ Forms


محمد علي الحيلان

Recommended Posts

اخوتي في هذا المنتدى الرائع
السلام عليكم ورحمة الله وبركاتة:-
احبتي هذه الطريقة في البحث تعلمتها من صديق من ( مصر الشقيقة ) وقد استأذنته
في وضعها كمشاركة في هذا المنتدى الرائع مساهمه منا بنشر العلم
كلنا يعرف طرق البحث المختلفه ب SQL وب CURSOR وب default_where
والبحث باكثر من جدول ا 00 الخ

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

لنفرض ان لديك جدول معين ؟؟ والمثال على جدول EMP
ويحتوي على كم هائل من بيانات المواطنين ومن ضمن هذه البيانات الأعمدة التالية:-
رقم الموظف EMPNO
الاسم ENAME
المهنة JOB
المدير MGR
التاريخ HIREDATE
الراتب SAL
رقم القسم DEPTNO
--
واردت البحث بجميع الحقول اعلاه مجتمعة او كل واحد على حده او بحقلين او بثلاثة او باربعة 0 او بالاول والاخير او بالاخير والثاني او او 000 الخ
بـ FORM واحد وبامر واحد لاتقول بـ WHERE --- IN
--
ابداء مشروع جديدا بـ Data block Wizard واكمل خطوات انشاء جدول EMP
وليكن من نوع Tabular وعدد السجلات 15
--
انشي BLOCK يدوي وليكن اسمه CONTROL في هذا البلوك اضف عدد سبعة
ITEM وليكن اسمائهم على الترتيب T7,T6,T5,T4,T3.T2,T1 واجعلها فوق البلوك
EMP واكتب لهم عنواين رقم الموظف اسم الموظف 000 الخ
اضف Bush Button في نفس البلوك CONTROL في Triggers
WHEN-BUTTON-PRESSED
اكتب الكود التالي

DECLARE
  v_query VARCHAR2(200) := '(select EMPNO,ENAME,job,mgr,HIREDATE,sal,DEPTNO from EMP where ';
  v1 VARCHAR2(50);
		v2 VARCHAR2(50);
	 v3 VARCHAR2(50); 
	v4 VARCHAR2(50);
	v5 VARCHAR2(50);
	v6 VARCHAR2(50);
	v7 VARCHAR2(50);
N NUMBER;
r_id RECORDGROUP;
BEGIN
go_block('CONTROL');
  if NVL(LENGTH( (:CONTROL.t1) ),0)<>0 then
 v1:=' EMPNO = '''|| rtrim(ltrim(:CONTROL.t1))||'''';
  else
  	v1:='  1=1 ';
  	end if;
if NVL(LENGTH( (:CONTROL.t2) ),0)<>0 then
v2:='  AND ENAME like '''|| '%'||rtrim(ltrim(:CONTROL.t2))||'%'||'''';
  else
  	v2:=' AND 1=1 ';
  	end if;
if NVL(LENGTH( (:CONTROL.t3) ),0)<>0 then
 v3:=' AND job = '''||rtrim(ltrim(:CONTROL.t3))||'''';
  else
  	v3:=' AND 1=1 ';
  	end if;
if NVL(LENGTH( (:CONTROL.t4) ),0)<>0 then
 v4:=' AND mgr = '''||rtrim(ltrim(:CONTROL.t4))||'''';
  else
  	v4:=' and 1=1 ';
  	end if;
 if NVL(LENGTH( (:CONTROL.T5) ),0)<>0 then
 v5:=' AND HIREDATE = '''||rtrim(ltrim(:CONTROL.t5))||'''';
  else
  	v5:='AND 1=1 ';
  	end if;
  if NVL(LENGTH( (:CONTROL.t6) ),0)<>0 then
 v6:=' AND sal = '''||rtrim(ltrim(:CONTROL.t6))||'''';
  else
  	v6:='AND 1=1 ';
  end if;
  	if NVL(LENGTH( (:CONTROL.t7) ),0)<>0 then
 v7:=' AND DEPTNO = '''||rtrim(ltrim(:CONTROL.t7))||'''';
  else
  	v7:='  AND 1=1 ';
  	end if;
  v_query := v_query ||v1 ||v2 ||v3 ||v4 ||v5 ||v6||v7 ||')';
 r_id:=FIND_GROUP('QQ1');
IF not ID_NULL(FIND_GROUP('QQ1')) THEN
	DELETE_GROUP(r_id);
	else
	message(  v_query);
 r_id:=create_group_from_query('QQ1', v_query);
n:=populate_group('QQ1');
	DELETE_GROUP(r_id);
end if;
  go_block('EMP');
  clear_block;
set_block_property('EMP', QUERY_DATA_SOURCE_NAME, v_query);
  execute_query(no_validate);
  -- :CONTROL.d1 :=get_group_row_count(r_id);

	raise form_trigger_failure;

END;


لاتنسونا من صالح الدعاء

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

  • الردود 30
  • البداية
  • اخر رد

أكثر المشاركين في هذا الموضوع

  • محمد علي الحيلان

    4

  • hobaa

    3

  • Mala_Moh

    2

  • comander

    2

أكثر المشاركين في هذا الموضوع

اخى فى البدايه مشكور على الفكره الرائعه

انا محتاج اعرف ما هى فائدة الداله rtrim

على فكره انا جربت الكود بس مطلعش نتيجه !!!! انا الصراحه مكنتش فاضى بس هاجربه تانى و ارد عليك

ايهاب وجدى

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

اخوتي في المنتدى
السلام عليكم ورحمة الله وبركاتة:-
شكرا للجميع على الردود و الاجابات والتفاعل
اخي / hobaa
بالنسبة لسوائلك فان الدالتين
rtrim لازالة الفراغات من اليمين
ltrim لازالة الفراغ من اليسار
--
هذا على حد علمي
اسال الله التوفيق لنا جميعا،،،

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

السلام عليكم ورحمة الله وبركاتة :-
شكرا لكافة الزملاء
بالنسبة لسوالك اخي / Comander
بالنسبة لهذا البحث فهو يتفق مع البحث العادي من جهة ويختلف من جهة اخرى
فهو شبية بالمعامل OR بالنسبة لحقلين فقط واذا زات الحقول فلن تحقق نتيجة في المعامل OR
فأنه سوف يعطيك بيانات كثيرة وغير دقيقة على سبيل المثال:-
لو اردت البحث بحرف (م) والادارة 30 والعمر مثلا 30 ولديك اكثر من شخص مائة شخص مثلا
من ضمن هولاء الاشخاص شخص يبداء اسمه (م) ولكن انه في الادارة 20 وعمره 40
وانفذت البحث ب Or فأنه سوف يعرض لك الاشخاص الذين في الادارة 30 ومن ضمنهم حبيبنا هذا الذي عمره 40 ويعمل في الادارة 20 ناهيك اذا كانت قاعدة البيانات بها ملايين السجلات فتخيل السجلات المعروضه
--
لكن بهذا البحث فانه يقتصر على من تتوفر به الشروط المدونه في الحقول فقط
بصراحة كأنك تبحث بـ AND ولكن بطريقة مختلفه تماما وانت لاحظ وجود AND داخل الكود و طبعا بـ AND العادية لن يتحقق شيء على الاطلاق0 وانت جرب البحث بـ OR وشوف النتيجة

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

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

أخى الفاضل محمد
شكرا على التوضيح لكن أنا تقريبا ممكن اكون تهت منك
دلوقتى أنا لو عملت form بدائيه على جدول emp مثلا وبعدين دخلت وعملت إستعلام
على أكتر من حقل ساعتها كأنه بيعمل AND بين الأختيارات فى سطر الWHERE وليس OR ولو مادخلتش قيمه أثناء الأستعلام مش حيحطها فى ال WHERE يعنى تقريبا زى الكود المكتوب فوق
معرفش أنا كده فهمتك ولا لأ

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

السلام عليكم ورحمة الله وبركاتة
اخي /Comander
كلامك صحيح 100% بالنسبة لـ WHere
لكن انا قصدي في الشرح لو طرحت هذا الكود جانبا واستعملت الكودات المعروفه فهنا يتضح الفرق
select * from emp where ename= t1 or jop = t2 or .... or وهكذا
ونفذت الاستعلام وانت عارف النتيجة طبعا00000
ولعلمك ياخي انا ناقل من صديقي مثلك ولم اتي به من عندي وقد استأذنته قبل وضعه في المنتدى كما هو موضح في البداية
وانني بصراحة اكون مبسوط اذا علق احد الاخوة مثلك لتعم الفائدة الجميع
وجزاك الله خير
والسلام

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

  • بعد 3 أسابيع...
  • بعد 4 أسابيع...
  • بعد 2 أسابيع...
  • بعد 2 أسابيع...

السلام عليكم,
اود المشاركة في موضوع ltrim & rtrim
و تصحيحا لرأي اخي
HOBAA
انه هاتان الدالتان تقومان بحذف الفراغات من اليمين و اليسار ليس فقط حذف الفراغات بل يمكنك ان تحذف ما تريد
من يمين النص او يساره مثال على
(ltrim):



ltrim(' tech'); would return 'tech'
ltrim(' tech', ' '); would return 'tech'
ltrim('000123', '0'); would return '123'
ltrim('123123Tech', '123'); would return 'Tech'
ltrim('123123Tech123', '123'); would return 'Tech123'
ltrim('xyxzyyyTech', 'xyz'); would return 'Tech'
ltrim('6372Tech', '0123456789'); would return 'Tech'


The ltrim function may appear to remove patterns, but this is not the case as demonstrated in the following example.

ltrim('xyxzyyyTech', 'xyz'); would return 'Tech'

It actually removes the individual occurrences of 'x', 'y', and 'z', as opposed to the pattern of 'xyz'.

The ltrim function can also be used to remove all leading numbers as demonstrated in the next example.

ltrim( '6372Tech', '0123456789'); would return 'Tech'

In this example, every number combination from 0 to 9 has been listed in the trim_string parameter. By doing this, it does not matter the order that the numbers appear in string1, all leading numbers will be removed by the ltrim function.

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

  • بعد 1 شهر...
  • بعد 4 أسابيع...
  • بعد 1 شهر...
  • بعد 3 أسابيع...

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

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

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

×   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.

جاري التحميل



×
×
  • أضف...

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

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