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

فورم بحث دقيق


alsaedi

Recommended Posts



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

السلام عليكم

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


Number التسلسل

Name الاسم

Degree اللقب العلمي

Department القسم

College الكلية

University الجامعة

General special التخصص العام

Specific special التخصص الدقيق


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

العلوم وبجميع الاختصاصات كيمياء فيزياء ............الخ و في جامعة عين شمس فقط

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

الجامعة وهكذا .....


وبانتظار الردود ايها الاعزاء

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

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

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

  • alsaedi

    15

  • weloooo

    9

  • BadeeAlmamry

    2

  • roro2005

    1

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

أخي الكريم.
قم بعمل (control block) ثم قم بإنشاء حقول البحث التي تريدها (إسم الجامعه، التخصص، الدرجه، الإسم .....وهكذا ). بعد ذلك إنشيء زرار أكتب فيه التالي:


:global.uni_name:=:university_name;
:global.sp:=:specialization;
:global.pro_name:=:professor_name;


go_block('professors_data');
execute_query;



تم إستخدام الجلوبال هنا لأن هذه القيم سوف يتم إستخدامها في بلوك آخر أو نموذج آخر كما تريد.
ضيف ما تريده من حقول للبحث على هذه الطريقه.
بعد ذلك إذهب إلى البلوك أو الفورمه التي تريد أن تبحث بداخلها. في هذا المثال يتم الذهاب إلى بلوك آخر (professors_data) وليس فورمه. ، ثم إختار تريجر (pre_query) وأكتب فيه التالي:

:university_name:=:global.uni_name;
:specialization:=:global.sp;
:professor_name:=:global.pro_name;



أي سؤال أنا تحت أمرك.

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



شكرا لك اخي على الرد




في البداية انا مازلت مبتدا في اوراكل ... وانا اريد ان اعمل زر البحث يمتاز ببحث دقيق لا اكثر وليست مجموعة ازرار ..........


وثانيا اخي العزيز كيــــــــف اعمل كونترول بلوك ؟؟؟؟

ارجو ان لا اكون ثقيل عليك في السؤال وياريت قليل من التفصيل .

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

السلام عليكم،

هناك نوعان من البلوك (Database block) و (Control block).
الأول يتم إنشاءه للتعامل المباشر مع بيانات قاعدة البيانات لديك وعند إنشاءه تجد أنه الفورم ينشيء الحقول أوتوماتيك وتعتمد هذه الحقول على أعمدة القاعده لديك، أما
الكنترول بلوك هو بلوك لا يعتمد (إفتراضياً) في البيانات التي سوف تظهر في أعمدته على بيانات أعمدة قاعدة البيانات لديك، ويتم إستخدامه لمثل هذه الحاله حتى لا أطول عليك. أدخل على فورم جديده ثم إقف بالماوس على (Data Blocks) ثم إضغط على زرار (+) لإنشاء بلوك جديد سوف تظهر لك رسالة إختيار الأول أن يكون إنشاء هذا البلوك من خلال ال (wizard) , والثاني أن يكون إنشاءه يدوي (Build a new data block manually) إختار الثاني وبهذا تكون قد أنشأت كنترول بلوك، سميه (control) .سوف تلاحظ أنه ليس به أي حقول (items) لذلك عليك إنشائها بنفسك على عكس ال (Database block). إنشيء الحقول التي تريدها لعملية البحث (إسم الجامعه، التخصص، إسم الدكتور ... وهكذا) ، سوف تجد في خصائصهم أنها لا تعتمد على قاعدة البيانات (Database item= No).وبعد تسميتهم إنشيء واحد آخر وإجعله زرار ثم ضيف عليه تريجر (when_button_pressed) وأكتب فيه:

:global.uni_name:=:control.university_name;
:global.sp:=:control.specialization;
:global.pro_name:=:control.professor_name;
---------------------------------------------------------------------------
/*  Add any number of  global variables according to the search items that satisfy your search criteria.*/
---------------------------------------------------------------------------

go_block('professors_data');
execute_query;



بعد ذلك إذهب إلى البلوك أو الفورمه التي تريد أن تبحث بداخلها. في هذا المثال يتم الذهاب إلى بلوك آخر (professors_data) وليس فورمه. ، ثم إختار تريجر (pre_query) وأكتب فيه التالي:

:professors_data.university_name:=:global.uni_name;
:professors_data.specialization:=:global.sp;
:professors_data.professor_name:=:global.pro_name;



ملحوظه: الحقول داخل الكنترول بلوك لا يتم إنشاء (canvas) لها لذلك إما أن تنشيء كانفس ثم تحدد داخل الحقول هذا الكانفس حتى يظهروا عليه، او تنشيء (database block) وذلك حسب الضروره وبهذا يتم إنشاء كانفس أوتوماتيك لهذا البلوك بعد ذلك عند إنشاء (control block) وبداخله الحقول أدخل على خصائصها وحدد لها نفس الكانفس للبلوك الأول إذا أردت ذلك...

وهذا هو رابط لفورمه تقوم بذلك تعمل هذه الفورمه على إسكيمة(hr). أرجو أن أكون وفيت

من هنا

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



شكرا لك اخي العزيز weloooo


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


سؤال اخير اخي العزيز هل ممكن ان اطبع نتيجة الاستعلام على شكل تقرير اي اضيف زر يعمل طباعة لنتيجة التقرير على شكل ورقة بالعرض وفي كل ورقة عدد معين من القيودد ... وياريت توضيح عمل رسالة عند عدم وجود نتيجة للاستعلام ...

ارجو ان لا اثقل علــــــــيك ياخي

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

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

أخي الكريم أنا آسف لتأخري في الرد عليك لظروف النت . أنت لا تثقل علي في شييء لأن هذا من واجب المسلمين جميعاً.

أولاً: بالنسبه لسؤالك أنك تريد عمل رساله عند عدم وجود نتيجه. أولاً عند عمل إستعلام ليس له نتيجه سوف تظهر لك رساله أسفل يمين الشاشه بها رقم وليكن (frm-40350) ثم بعد ذلك نص الرساله (this query has no record to be retrieved) . هذه الأرقام هي لتوضيح نوع الرساله حيث أن أي رساله إما أن تكون (informative) أو ( error) ومعرفة نوعها يكون من خلال رقمها دورك هو أن تفتح ال (help) تكتب هذا الرقم (frm-40350) في البحث من خلال ال (index) راعي أنك سوف تكتب أيضاً الحروف الثلاثه. بعد ذلك أدخل عليها وسوف تجد أن نوعها (informative). الآن وعلى مستوي النموذج إعمل تريجر من نوع(on_message) وأكتب فيه:

if error_cod=40350
then
message(هذا الإستعلام ليس له نتيجه);
message(هذا الإستعلام ليس له نتيجه);
end if;



أما إذا كان نوع الرساله (error) وليس (informative) فإنك تعمل تريجر من نوع (on_error) ثم تقوم بنفس الخطوات السابقه.
___________________________________________________________

ثانياً: بالنسبه للتقرير إذا أردت عمله علي شكل ورقه بالعرض. إذهب إلى ال (main section) للتقرير ثم أدخل على ال (property inspector) زود ال (width)
وقلل ال (height) ثم إجعل ال (orientation) إلى (landscape). أما بالنسبه لعدد السجلات. إذهب ال (repeating frame) ومن خلال ال (property inspector) عدل ال (maximum record per page) عدلها إلى العدد الذي تريده. أما بالنسبه للتقرير نفسه فأظن أن عمله صعب (مع أني قمت بمحاوله وكان من المفترض أن تنجح ) ذلك لأن التقرير يعتمد على جملة (sql query) وحيث أن الأعمده نفسها في جملة ال (where) في هذا التقرير وليس فقط قيمة الأعمده تتغير فإن ذلك لا تستطيع فعله من خلال التقرير
ولكن أنا الآن أقوم بمحاوله وأيضاً سوف أبحث عن هذا الموضوع لأنه فعلاً مهم. الله يسهلها ولا تتردد إن أردت السؤال عن أي شييء آخر وأتمنى أن يكون في إستطاعتي.

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

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


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

Form_Report.zip

Form_Report.zip

Form_Report.zip

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



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


لا اعرف كيف اشكرك لدي سؤال اخير حتى لااصبح ثقيل عليك يا اخي


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

قم بعمل server للتقارير ثم سميه rep90 من خلال كتابة هذا الأمر في ال run rwserver server=rep90[/size


انا اعمل على قاعدة بيانات اوراكل 9i وديفلوبر 6i

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

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

شوف أخي أنا أعمل على قاعدة بيانات 10g وكذلك الدفيلوبر ولكن أعتقد أن هذه الخطوه ثابته لأي دفيلوبر.
حتى تستطيع تشغيل أي تقرير لابد من وجود server مخصص للتقارير. وحتى تقوم بعمل هذا ال server إتبع الآتي:
1- إذهب الى قائمة ال start ثم شغل ال run
2- أكتب في ال run هذا الأمر.
rwserver server=rep90

بعد ذلك سوف تجد نافذه أن ال server تم إنشاءه وسوف يظهر لك نافذه صغيره لهذا الserver إنتظر دقيقه حتى تتأكد أن الserver أصبح جاهزاً . وأنظر إلى هذه النافذه ستجد جملة report server is ready وبذلك تستطيع فتح التقرير.

أتمنى أن تكون الفكره قد وضحت وراسلني إن لم تستطع ذلك.

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




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

ما الذي تقصده ب rwserver هل هو اسم السيرفر الخاص باوراكل عملت ذلك بادخال اسم اليرفر تبعي من خلال كتابة الامر oracle server=rep90

ولكن تظهر لي شاشة الدوس فيها مكتوب hit any key to exit server تبقى هذه الشاشة على نفس الحالة لفترة طويلة ما فائدة هذه الطريقة لاني اواجة نماذج وتقارير بنفس الطريقة في مواضيع اخرى في المنتدى

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

ارجو ان لا ازعجك في النهاية وعلى راحتـــــــــــك في الاجابة

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

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

أنا لا اعلم إين كتبت هذه الجمله oracle server=rep90 على أي حال ياريت تحذفها وترجع إلى ال default .
إن rwserver هو الملف التشغيلي لعمل ال report server وهو السيرفر الخاص بتشغيل التقارير وبدونه لا تستطيع أن تقوم بالتشغيل. ولعمل مثل هذا السيرفر إتبع الآتي:
1- أسفل يسار الشاشه ستجد زرار start أكيد أنت عارفه. إضغط عليه.
2- من خلال أمر ال run أكتب السطر الذي قلتلك عليه.

أنا ارفقت ملف فيه شرح بالصور لهذه الخطوه أرجو أن يفيدك

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

pics.zip

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



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


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

التعاون الكبير

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

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

سيدي الفاضل. كود زرار التقرير منقسم إلى جزئين:

الأول: هو لبناء جملة ال where وذلك لإستخدامها في جملة الإستعلام للتقرير.
الثاني: كود إستدعاء التقرير والمبني على جملة ال where التي نتجت من الكود الأول.

الجزء الأول:

بالنسبه للتقرير فإن من الملاحظ أن جملة ال where تتغير على حسب قيمة أعمدة البحث التي تريدها. الفورم يقوم بها تلقائياً لعمل الإستعلام ولكنك تريدها أيضا للتقرير فكان من اللازم عملها يدوياً في الفورم ثم تمررها كا (parameter) لتشغيل التقرير في الجزء الثاني من الكود.

begin
if :control.l_name is null
then
if :control.dept_id is null
	then
	 :global.p_l_name:='salary= '||:control.sal;
else
	:global.p_l_name:='department_id= '||:control.dept_id;
end if;
else
	:global.p_l_name:='last_name= '||:control.l_name;
end if;
:control.d_l_name:=:global.p_l_name;
	end;
	----------------
begin
if :control.dept_id is null
	then
	if :control.sal is null
		then
		:global.p_dept_id:='last_name= '||:control.l_name;
	else
		
		:global.p_dept_id:='salary= '||:control.sal;
	end if;
	else
		
		:global.p_dept_id:='department_id= '||:control.dept_id;
	end if;
	:control.d_dept_id:=:global.p_dept_id;
end;
------------------
begin
if :control.sal is null
	then
	if :control.l_name is null
		then
		:global.p_sal:='department_id= '||:control.dept_id;
	else
		
		:global.p_sal:='last_name= '||:control.l_name;
	end if;
	else
		
		:global.p_sal:='salary= '||:control.sal;
	end if;
	:control.d_sal:=:global.p_sal;
end;
:global.all:='where '||:global.p_l_name||' and '||:global.p_dept_id||' and '||:global.p_sal;



أنظر للسطر الأخير في الكود ستجد أن به global variable لتضع به القيمه الناتجه من جمل الشرط وهي في النهايه جملة ال where التي ستمررها إلي التقرير كا باراميتر.

الجزء الثاني:

وهو الجزء المسؤل عن إستدعاء التقرير. أنظر إلى الكود:

declare
	v_state varchar2(1000);
vc_rep_status varchar2(100);
VC_URL varchar2(1000);
pl_id paramlist;	
begin
---------------------------------------- PARAMETER -----------------------------------------------------
pl_id := get_parameter_list('temp');
if id_null(pl_id) then
	pl_id := create_parameter_list('temp');
else
	destroy_parameter_list(pl_id);
	pl_id := create_parameter_list('temp');
end if;

add_parameter (pl_id,'p_where',text_parameter,:global.all);

------------------------------------RUN REPORT------------------------------------------------
v_state := run_report_object('REP',pl_id);

vc_rep_status := report_object_status(v_state);	

WHILE vc_rep_status in ('RUNNING', 'OPENING_REPORT','ENQUEUED') LOOP 
	vc_rep_status := report_object_status(v_state);
 END LOOP;
			-- VC_URL :='/reports/rwservlet/getjobid'||substr(v_state,LENGTH('rep90')+2)||'?server=rep90';
		  WEB.SHOW_DOCUMENT('http://localhost:8889/reports/rwservlet/getjobid'|| substr(v_state,instr(v_state,'_',-1)+1)||'?'||'server=rep90','_blank');  
			
end;



حتى لا أطيل في الشرح. الجزء الأول من كود الإستدعاء ثابت. بالنسبه للسطر:

	add_parameter (pl_id,'p_where',text_parameter,:global.all);



هو لإضافة parameter وهو الذي سيعتمد عليه التقرير. وطبعاً هايكون قيمه هذا الباراميتر هي جملة ال where الناتجه من الجزء الأول من الزرار.
خلال هذا ال parameter ستجد على الترتيب :إسم ال parameter list ، إسم الparameter الموجةد في التقرير نفسه والذي سيحمل قمية جملة ال where من الفورم، نوع ال parameter، القيمه الفعليه global.all: التي سيأخذها باراميتر التقرير ('p_where')
طبعاً عند إنشاء التقرير لابد أن تضع به user parameter وهما نوعان إما bind أو lexical . في مثالنا هذا يكون نوعه lexical لأنه سيحمل قيمه نصيه(جملة ال where) ويكون إسمه هو نفس الإسم الموجود بزرار إستدعاء التقرير (p_where) . ثم تكتب جملة الإستعلام للتقرير كالآتي
select * from employees
&p_where

ثم تخزن التقرير في المسار e:\ تحت إسم query_all.rdf

بعد ذلك ترجع إلى الفورم ستجد كلمة report إضغط إنشاء جديد. ثم أدخل عليه وحدد مكانه وهو المكان الذي خزنت فيه التقرير نفسه(query_all). وحدد ال query data source block إلي البلوك الذي سيتم عليه الإستعلام(employees) . ومن الخارج سمه الأسم الذي تريد (مثلا emp)
ترجع إلي زرار التقرير مره أخري ومع سطر:

v_state := run_report_object('REP',pl_id);



تلاحظ أن إسم report الذي قمت بتسميته (rep) مكتوب . وهذا هو المكان الذي تكتب فيه إسم التقرير المنشأ على الفورم. لاحظ هذا الإسم ليس إسم التقرير الأساسي ولكن إسمه المتعارف عليه في الفورم والذي قمت بإنشاءه في الخطوه السابقه.
أترك باقي الكود كما هو.

_________________
كود الزرار بالكامل:

begin
if :control.l_name is null
then
if :control.dept_id is null
	then
	 :global.p_l_name:='salary= '||:control.sal;
else
	:global.p_l_name:='department_id= '||:control.dept_id;
end if;
else
	:global.p_l_name:='last_name= '||:control.l_name;
end if;
:control.d_l_name:=:global.p_l_name;
	end;
	----------------
begin
if :control.dept_id is null
	then
	if :control.sal is null
		then
		:global.p_dept_id:='last_name= '||:control.l_name;
	else
		
		:global.p_dept_id:='salary= '||:control.sal;
	end if;
	else
		
		:global.p_dept_id:='department_id= '||:control.dept_id;
	end if;
	:control.d_dept_id:=:global.p_dept_id;
end;
------------------
begin
if :control.sal is null
	then
	if :control.l_name is null
		then
		:global.p_sal:='department_id= '||:control.dept_id;
	else
		
		:global.p_sal:='last_name= '||:control.l_name;
	end if;
	else
		
		:global.p_sal:='salary= '||:control.sal;
	end if;
	:control.d_sal:=:global.p_sal;
end;
:global.all:='where '||:global.p_l_name||' and '||:global.p_dept_id||' and '||:global.p_sal;
---------------------------------------------
declare
	v_state varchar2(1000);
vc_rep_status varchar2(100);
VC_URL varchar2(1000);
pl_id paramlist;	
begin
---------------------------------------- PARAMETER -----------------------------------------------------
pl_id := get_parameter_list('temp');
if id_null(pl_id) then
	pl_id := create_parameter_list('temp');
else
	destroy_parameter_list(pl_id);
	pl_id := create_parameter_list('temp');
end if;

add_parameter (pl_id,'p_where',text_parameter,:global.all);

	------------------------------------RUN REPORT------------------------------------------------
v_state := run_report_object('REP',pl_id);

vc_rep_status := report_object_status(v_state);

	WHILE vc_rep_status in ('RUNNING', 'OPENING_REPORT','ENQUEUED') LOOP 
	vc_rep_status := report_object_status(v_state);
 END LOOP;
		   
		  WEB.SHOW_DOCUMENT('http://localhost:8889/reports/rwservlet/getjobid'|| substr(v_state,instr(v_state,'_',-1)+1)||'?'||'server=rep90','_blank');  
					
end;



حاول إستيعاب الكود وستجده سهلاً إن شاء الله.

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



شــــــــــــــــــــــكرا لك يااخي على الجواب ............

اسال الله ان يحفظك من كل مكروه وان يسدد خطـــــــــاك

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

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

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

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

  • بعد 3 شهور...



الاخوة والاخوات

كيف يمكن ان اضيف text item الى الفورم يرجع لي مجموع عدد نتيجة الاستعلام .... اي لو كان عدد الطلبة الذين استعلمت عليهم 50 ترجع في المربع عدد 50 وهكذا ..

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

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



الموضوع مش صعب ولا حاجه يا أخي .. أولا إنتا عايز تعمل شاشه فيها 2 Tab page الأولى تحتوي على البحث .. والثانية تحتوي على نتيجة البحث

التاب الأولى تكون مبنية على جميع المعايير التي تود البحث بها ... مثل .. Number التسلسل

Name الاسم

Degree اللقب العلمي

Department القسم

College الكلية

University الجامعة

General special التخصص العام

Specific special التخصص الدقيق

وكما تشاء أضف فيها ..

أما التاب الثانيه فتحتوي على Database Block يجيب البيانات من الجدول المراد البحث فيه ..

وفي ال Where Condition إكتب التالي ..

(Degree = :Degree OR :Degree IS null )
and
(College = :College or :College is null)

وهكدا حتى تضيف جميع المعايير اللتي ترغب في إضافتها ..

وعلى التريجر When Tab Change تكتب

If new_tab_page = search_result then excecute_query

طبعا مع مراعات الكود الصحيح لإني مش حافظ كود طبعا ..

وأتمنى أن أكون أجبت سؤالك وبالتوفيق

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

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

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

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

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

جاري التحميل



×
×
  • أضف...

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

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