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

شفرات بعض الازرار الرئيسية لكل فورم


cattoo

Recommended Posts

السلام عليكم ورحمة الله وبركاته
انا مبتدئة في تعلم الاوراكل والديفيلوبر وافضل طريقة للفهم وتثبيت المعلومات هي عن طريق تعليم الاخرين.
انا انشاء الله اليوم حبدأ هذا الدرس واي استفسار او سؤال او تصحيح ياريت تتكرموا وتعلموني به.
طبعا اولا نفتح الفورم بيلدر
ومن قائمة ملف نختار connect ثم ندخل على scott / tiger.
اما من معالج انشاء بلوك data block wizard او عن طريق الرسم اليدوي نرسم ثلاثة text item
نعطي لكل منهم اسم برمجي وهو اسم خاص بالمبرمج وغير مرئي من قبل المستخدم
ابتدئنا الاسم بالمقطع txt وذلك لسهوله المراجعة لاحقا.
الاول:
name:txt_deptno
column name:deptno
الثاني:
name:txt_dname
column name:dname
والثالث:
name:txt_loc
column name:loc

نرسم ايضا خمسة ازرار على الفورم.
الاول:
label:new اي لانشاء سجل جديد.
احداث triggers الازرار كلها when-button-pressed اي بعد رسم الزر على الفورم من لوحة الادوات ننقر عليه بالزر الايمن ونختار smart triggers ثم نختار الحدث المطلوب when-button-pressed اي عندما يتم الضغط على الزر

زر ادخال سجل جديد:


begin
insert into dept (deptno,dname,loc)values(:txt_deptno,:txt_dname,:txt_loc);
commit;
message('a new record has been added');
end;[/left]



شرح الشفرة:
دليل بداية الكود begin
insert into dept(deptno,dname,loc)values(:txt_deptno,:txt_dname,:txt_loc);
اي ادخل الى حقول الجدول dept وهي رقم القسم deptno ,اسم القسم dname, والموقع loc القيم التالية:
قيمة الكائنات المذكورة.فقيمة الكائن المسمىtxt_deptno تذهب للحقل deptno, ووضعت النقاط : امام الاسم لانه كائن في الفورم وليس متغير.وهكذا للبقية مع ضرورة الترتيب.
ومن اجل الحفظ للسجل الجديد يجب عمل commit;
message(' ');تستخدم لارسال رسالة للمستخدم تفيد ان السجل قد تم انشائة وحفظة بنجاح
واخيرا نهاية الكود end;
وانشاء الله اتمم بقية الازرار وهي تعديل،حذف,بحث,وخروج

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

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

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

  • cattoo

    10

  • omar-alreyati

    2

  • Amgad

    1

  • المهباش

    1

بالنسبة للزر الثاني "تعديل" وضيفته هي تعديل سجل موجود
وبما ان رقم القسم مفتاح اساسي primary key من الافضل عدم تعديله وذلك لامكانية وجود عدة سجلات في جدول الموظفين مرتبطه بهذا الرقم لذلك عند التعيل سنعمل على تغيير الاسم والموقع فقط.
طبعا تبع الحدث when-button-pressed
زر التعديل:
label:update
الشفرة:

begin
update dept set dname=:txt_dname,loc=:txt_loc where deptno=:txt_deptno;
commit;
message('a record has been updated');
end;




الشرح:
يمكن الاستغنا عن begin , end
وهما كم ذكرت للدلالة على بداية ونهاية الكود
update dept set dname=:txt_dname,loc=:txt_loc where deptno=:txt_deptno;
اي عدل الجدول dept وذلك بجعل dname=:txt_dname اي عدل الحقل اسم القسم ليصبح ما هو مكتوب في الكائن txt_dname ,وكذلك بالنسبة للموقع
where deptno=:txt_deptno
بشرط ان يكون رقم القسم مساااوي للكائن txt_deptno وذلك حتى لا يقوم بتعديل بيانات الجدول كامل.(عدل السجل الذي يتحقق فيه الشرط المذكور فقط).
ثم حفظ التعديل commit;
واخيرا نهاية الكود end;

وهذه شفرة الزر delete حذف سجل موجود

begin
delete from dept where deptno=:txt_deptno;
commit;
message('a record has been deleted');
end;



والزر خروج
begin
exit_form;
end;

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

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

declare 
n number(2);
f number(2);
s number(2);

fname varchar2(10);
sname varchar2(10);
lname varchar2(10);
begin
n:=0;
f:=0;
s:=0;
for i in 1..length(:txt1) loop
	if substr(:txt1,i,1)=' ' then
		n:=n+1;
		if n=1 then
	   fname:=substr(:txt1,1,i);
	 	 f:=i;
		elsif n=2 then 
		 sname:=substr(:txt1,f,i-f);
		 s:=i;
		end if;
	end if;
end loop;

if n=0 then
	fname:=substr(:txt1,1,length(:txt1));
elsif n=1 then
	sname:=substr(:txt1,f,length(:txt1));
elsif n=2 then
  lname:=substr(:txt1,s,length(:txt1));
end if;


:txtn:=n+1;
:txtf:=fname;
:txts:=sname;
:txtl:=lname;
end;




حيث txt1 هو الكائن الذي استخدمته لكتابة الاسم كاملا
txtf كائن الاسم الاول
txts كائن الاسم الاوسط او الثاني
txtl كائن الاسم الاخير
txtn كائن يظهر عدد الكلمات/الاسماء في txt1 (اي اذا الاسم ثنائي او ثلاثي )

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

الأخت / cattoo

شكرا لك على المجهود الكبير .. وحبك لتعليم الأخرين
ننتظر منك المزيد

سؤال بالنسبة لتجزئة الاسم
كيف يمكن التعامل مع اسم مثل
عبد الرحمن
وليس
عبدالرحمن
-- اى تم اضافة مسافة بين كلمة عبد وكلمة الرحمن

شكرا لك

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

شكرا لك اخي Amgad
بالنسبة لما سألته فبرنامجي يعتمد على الفراغات في تقسيم الاسماء وفي هذه الحالة سيعتبر "عبد" اسم ,و"الرحمن" اسم اخر. وهذا احتمال لم افكر فيه .
لكن شكرا على التنبيه وساحاول معالجة هذا الامر

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

اليوم ساحاول وضع شرح بسيط عن كيفية التعامل مع list item
list item لها ثلاثة انواع:
- poplist
- Tlist
- combo box
يمكننا اختيار اي من هذة الانواع من خواص هذا الكائن ,اي بعد رسم الكائن على الفورم اضغط f4 لتظهر لك نافذة property palette ثم من الخاصية list style اختار النوع المناسب لعملك او دعه كما هو افتراضيا poplist.
اذا اردنا اضافة عنصر الى list نستخدم الامر

add_list_element('ListName',index,label,value);


ListName هو اسم الكائن والذي تم تحديد في الخاصية name من نافذة property palette مثلا: lst_deptname
او اي اسم ويفضل ابتداء الاسم بالمقطع lst لسهولة قراءة البرنامج ومراجعته لاحقا. ويجب وضع الاسم بين علامتي اقتباس مفردة 'ListName' .
index (الفهرس) للدلاله على الموقع/رقم الفهرس الذي تريد اضافة العنصر به.
label العنوان الذي سيظهر للمستخدم .value هي القيمة الفعلية لهذا العنصر في قاعدة البيانات(غير ظاهرة للمستخدم).
مثال:
في حدث when-new-form-instance الذي يمكن الوصول اليه بالضغط على triggers (الذي يقع اسفل اسم moduleوالذي هو افتراضيا module1 ) بالزر الايمن ثم اختيار smart triggers ثم when-new-form-instance
والذي يعني عند بدء تنفيذ البرنامج(مثل form load في الفيجوال بيسك).
نكتب الكود التالي:

declare 
cursor cur_dept is select deptno,dname
from dept;
dno dept.deptno%type;
dnm dept.dname%type;
i number;
begin
 set_window_property(forms_mdi_window,window_state,maximize);
set_window_property('window1',window_state,maximize);
open cur_dept;
i:=0;
loop
	fetch cur_dept into dno,dnm;
	exit when cur_dept%notfound;
	add_list_element('lst_dept',i,dnm,dno);
	i:=i+1;
end loop;
close cur_dept;
end;





شرح الكود:
اولا cursor يعمل عملية الاستعلام عن اسماء الاقسام وارقامها في جدول الاقسام
ثم تعريف متغيرين dno وعينت له نفس صفات deptno في جدول الاقسام، والمتغير dnm واعطيت له نفس صفات المتغير dname في جدول الاقسام dept. ومتغير ثالث ستتضح مهمته لاحقا في فهرس list item.
بدء الكود begin . لابد انكم لاحظتم ان نافذة التنفيذ تتكون من نافذتين اصلا . احدهما لها الاسم forms_mdi_window وهس النافذة الاكبر. والاخرى window1 اذا لم تقم بتغييره من خصائص window (النافذة الداخلية).

set_window_property(forms_mdi_window,window_state,maximize);
set_window_property('window1',window_state,maximize);


في هذا الكود قمنا بتكبير النافذتين maximize ومن الممكن جعلهما او احدهما عادية او مصغرة يتغير maximize الى minimize او normal .
open cur_dept فتح cur_dept والذي يحمل اسماء وارقام الاقسام, ثم اسندنا القيمة 0 الى المتغير i وذلك حتى تبدء الاضافة الى list item من البداية (من اول فهرس).
loop بداية دوران (الدوران من اجل المرور على كافة السجلات في cur_dept.)
fetch cur_dept into dno,dnm; اي قم بجلب محتويات السجل الحالي في cur_dept وضعه في dno,dnm.
exit when cur_dept%notfound; وضع شرط للخروج من الدوران عند نهاية السجلات في cur_dept وبدون هذا السطر يحدث دوران لانهائي. ثم اضافة اسم ورقم القسم والذان تم خزنهما في المتغيرين dno,dnm للسجل الحالي الى list_dept في الفهرس i والذي هو في اول سجل =0 ,ثم نقوم باظافة 1 الى i ليصبح i=1 (حتى يتم اظافة اسم ورقم السجل التالي في الفهرس 1 والا سيتم وضعه فوق الاول )، end loop نهاية بلوك الدوران
،ثم close cur_dept اذا لم تقم بوضع هذا السطر لن يتأثر عمل البرنامج وانما سيتم استهلاك الذاكرة(بقاء السجلات في الذاكرة حتى عند عدم الحتجة اليها).
نهاية الكود end;

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

تابع


لحذف عنصر من القائمة يجب تحديد رقم الفهرس index لهذا العنصر المراد حذفة

delete_list_element('ListName',index);

مثال:
لحذف العنصر الاول في القائمة ,يكون الكود كالتالي:

delete_list_element('ListName',1);



ولحذف جميع عناصر القائمة نحدد اسم القائمة فقط .

clear_list('ListName');



طبعا في البداية وقبل إنشاء List Item يجب معرفة هل نريد أن تكون القيم الظاهرة فيها :
• ثابتة (إستاتيكية) Static : وبالتالي فهي تمتلك قيم ثابتة لا يمكن تعديلها ؛
• متغيرة (ديناميكية) Dynamic : وبالتالي فهي تمتلك قيم متغيرة تعكس صورة السجلات في قاعدة البيانات وجلب البيانات فيها سيكون بواسطة الإستعلام Query .
يمكن تحديد نوع القائمة من خصائصها .حدد القائمة ثم اضغط f4 لتظهر لك نافذة الخصائص، من خاصية element in list
انقر على more .فاذا كنت تريد ان تكون القائمة ثابتة اكتب ماتريد من العناصر الثابتة في المربع الذي سيظهر عند النقر على
more.
12236384.gif
والا ان كنت تريدها قائمة ديناميكية اعمل على مسح وتفريغ كل ما هو موجود في المربع المتكون من الضغط على more.
96250118.gif

اي ان القائمة lst_dept في مثالنا السابق هي قائمة ديناميكية اذ اننا اسعنا بالاستعلام لملئ القائمة باسماء الاقسام وهي متغيرة بتغير جدول الاقسام في قاعدة البيانات scott/tiger.ولم نقم بتعبئتها بقيم ثابتة.

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

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

alert يشابة message فهو يقوم بعرض رسالة للمستخدم للتنبيه
فمثلا في زر الحذف يفضل دائما عمل تنبيه للمستخدم فيما اذا اراد حقا الحذف ام لا وذلك للحول ضد ضياع المعلومات.فاذا ضغط المستخدم موافق تم الحذف والا لا يحث شي.
لانشاء alert نفتح شاشة navigator من خلال الضغط على مفتاح f3 , حدد alert ثم اضغط موافق ، فتلاحظ ظهور وتكون alert باسم افتراضي ،
انقر عليه ثم f4 وعدل في خصائصة :
name: alert
title :تنبيه
alert style:stop
button 1 label:موافق
button 2 label :الغاء الامر
default alert button: button 2
غيرنا خاصية name الى alert او اي اسم تتذكره , وخاصية title وهي عنوان الرسالة ففجعلناه "تنبيه"،في خاصية alert style :حدد شكله اجعله stop لتظهر علامة الضرب الحمراء اوغيره كما تحب. حدد الازرار التي تريد ظهورها (موافق و الغاء الامر) ، وحدد الزر الافتراضي ( الزر الذي سيتم اختياره من الضغط على enter ) وهو في مثالنا (الزر الثاني "الغاءالامر") وذلك لحماية البيانات من الضغط بالغلط على enter فلا يحدث مسح للبيانات.

والان في trigger زر المسح عدل الشفرة لتصبح كالتالي:

declare
al_id alert;
n number;
begin
set_alert_property('alert',alert_message_text,'هل تريد بالتاكيد حذف سجل ');
al_id:=find_alert('alert');
n:=show_alert(al_id);
if n=alert_button 1 then
delete from dept where deptno=:txt_deptno;
commit;
else
null;
end if;
end;


set_alert_property تعمل على تحديد خاصية message في الرسالة (الرسالة التي ستظهر للمستخدم ).
find_alert تبحث عن alert وتضعه في al_id ( لاحظ ان اسم alert بين علامتي اقتباس مفردة)
show_alert تعمل على اظهاره (لاحظ ان تم الاشارة اليه بالمتغير الذي وجده ولذلك فهو بدون علامتي الاقتباس) ،حتى يقوم المستخدم باختيار احد الزرين ، ويخزن اختياره في n ,فاذا اختار المستخدم "موافق" وهو alert_button1 تم المسح ، والا alert_button2 لايحث شي null.

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

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

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

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

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

يعطيكي العافية اخت cattoo
مجهود كبير... وشرح رائع
أرجو أن تستمري ... فأنا مبتدئ في موضوع الفورم بعد قرائتي للكتب فإني أحتاج فعلا التطبيق

وها انت تضعينا على معظم المواضيع المهمة التي يحتاجها كل نظام

استمري ... وسنتواصل معك
بارك الله فيك

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

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

ممتااااااااااااااااااااااااااازة ياريت تكملى وتعملى زى ما الاستاذ الجليل خالد ميجا ما قلك وما تخليش الملل يتسلل اليك ؛ واحنا كلنا فى انتظار دروسك
وشكرا

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

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

numeric_systems.zipالسلام عليكم ورحمة الله وبركاته...
شكرا لكم .. عن جد رفعتوا معنوياتي والحمدلله انه في احد استفاد ..

اليوم اقدم لكم برنامج تحويل بين الانظمة الرقمية يعني من الثنائي الى اي نظام وبين العشري والثماني والسداس عشر .
المهم انكم تفهموا طريقة الدوران الشرطي loop وكذلك if,ifelse ،عمل الدالة trunc ،العمليات الحسابية داخل برنامج.
البرنامج به اكثر من Canvas كل منها مرتبط ببلوك بيانات خاص به Data Block ,والكل في نافذة Window واحدة وموضح في البرنامج طريقة الانتقال بين الاسطح Canvases .

طبعا عند التنفيذ اكتب اي اسم مستخدم/كلمة مرور لان النظام غير مرتبط باي قاعدة بيانات.

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

list.zip

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

درس اليوم بحث باستخدام List عن طريق رقم واسم الموظف ، يعني اذا كتبت رقم في خانة البحث سيكون نتائج البحث الارقام التي تبتدئ بنفس المقطع واذا كتبت اسم ستكون النتائج اسماء التي تبتدئ بنفس المقطع.

مثال اذا ادخلت الحرف S في خانة البحث ستحصل على ناتجين scott , smith اما اذا ادخلت sc ستحصل على ناتج واحد مطابق scott ونفس الشي بالنسبة للارقام .اي يختبر فيما اذا ادخلت رقم يبحث عن الارقام المماثلة او اسم ليبحث عن الاسماء المماثلة .

:rolleyes: :rolleyes:

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

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

أختي الكريمة أشكرك على هذا المجهود المميز ولكن أتمنى أن تشرحي زر التعديل بصورة مفصلة أكثر مثل مافعلتي في زر الحذف
----------------------
بالنسبة للزر الثاني "تعديل" وضيفته هي تعديل سجل موجود
وبما ان رقم القسم مفتاح اساسي primary key من الافضل عدم تعديله وذلك لامكانية وجود عدة سجلات في جدول الموظفين مرتبطه بهذا الرقم لذلك عند التعيل سنعمل على تغيير الاسم والموقع فقط.
طبعا تبع الحدث when-button-pressed
زر التعديل:
label:update
الشفرة:

begin
update dept set dname=:txt_dname,loc=:txt_loc where deptno=:txt_deptno;
commit;
message('a record has been updated');
end;




الشرح:
يمكن الاستغنا عن begin , end
وهما كم ذكرت للدلالة على بداية ونهاية الكود
update dept set dname=:txt_dname,loc=:txt_loc where deptno=:txt_deptno;
اي عدل الجدول dept وذلك بجعل dname=:txt_dname اي عدل الحقل اسم القسم ليصبح ما هو مكتوب في الكائن txt_dname ,وكذلك بالنسبة للموقع
where deptno=:txt_deptno
بشرط ان يكون رقم القسم مساااوي للكائن txt_deptno وذلك حتى لا يقوم بتعديل بيانات الجدول كامل.(عدل السجل الذي يتحقق فيه الشرط المذكور فقط).
ثم حفظ التعديل commit;
واخيرا نهاية الكود end;

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

  • بعد 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.

جاري التحميل

×
×
  • أضف...

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

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