مشروع دليل تلفيونات

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

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

ونبدأ على بركة الله ولكن أهم شيئ تفاعلكم ..

أولا تكوين الجدول:
وهو عبارة عن جدول واحد فقط يوجد به البيانات التالية:
الإسمName ، العنوان Address ، التلفون Tel ، الإيميل Email ، ملاحظات Note
إفتح برنامج SQL * PLUS وإدخل بالمستخدم system/manager
وإنشئ الجدول phone كما يلي:
CREATE TABLE phone(name varchar(30) primary key,
address varchar(20),
tel varchar(20),
email varchar(30),
note varchar(50));


لاحظ أن الإسم هو المفتاح الأساسي للجدول أي لايسمح أن يترك الأسم فارغا ولا يسمح أيضاً بإدخال الإسم أكثر من مرة (عدم تشابه الأسماء).
الأن ندخل مجموعة من القيود من أجل أن نطبق عليه بعض الأمثلة في البرنامج:


insert into phone(name,address,tel,email,note) values
('Ahmed','Yemen','123321','ahm@yahoo.com','');
insert into phone
(name,address,tel,email,note) values
('Mohammed','Iraq','2258647','moh@yahoo.com','');
insert into phone
(name,address,tel,email,note) values
('amer','Sudia','58694725','ameer@yahoo.com','');
insert into phone
(name,address,tel,email,note) values
('moner','Egypt','55886644','moner@hotmail.com','');
insert into phone
(name,address,tel,email,note) values
('Mohsen','Yemen','123355','moh@yahoo.com','');
insert into phone
(name,address,tel,email,note) values
('moneraa','Iraq','5541857','moneraa@hotmail.com','');
عد هذا سوف نبدأ بالدفلوبر ونبدأ بتصميم الإطارات
1- افتح برنامج Oracle Form Builder
2- من نافذة Welcome to the form Builder إختار Use the Data Block Wizard(لماذا؟)
وذلك من أجل تكوين بلوك بيانات (داتا بلوك) جديد مربوط بالجدول phone الذي أنشأناه في الدرس الماضي.
ولن تستطيع تطبيق هذا الدرس إلا إذا طبقت الدرس الماضي.
3- إختار Display this page next time ثم التالي ثم إختار Table or View ثم التالي،
وذلك من أجل أن نستدعي الجدول من قاعدة البيانات.
4- لإستدعاء الجدول نختار Browse ثم إكتب إسم المستخدم وكلمة المرور system/manager 
ثم نختار إسم الجدول وهو كما سميناه سابقاً بإسم phone 


سوف يظهر لنا في العمود Available Columns أسماء جميع الحقول التي كوناها في الجدول.
إختار الجميع ليتم نقلهن جميعاً إلى العمود Database Item ثم التالي.


5- إختار Create the data block, then call the Layout Wizard ثم نهاية
وذلك من أجل إستدعاء Wizard أخر من أجل عمل تصميم لمحتويات بلك البيانات.
6- من الـ Wizard الجديد إختار التالي ثم إختار New Canvas أي ساحة عمل جديدة وإختار النوع Content


7- ثم إختار الكل لنقل حقول الجدول إلى العمود Displayed Items 
من أجل عرض هذه الحقول في ساحة العمل Canvas الجديدة ثم إختار التالي.
8- إختار التالي مرة أخرى أو يمكنك قبل إختار التالي ان تغير من عناوين الأعمدة
وهذا لايؤثر على التسميات الموجودة في الجدول ولكن أفضل تركها كما هي.
[imghttp://www.arabteam2000.com/picload/pics_10_05/04_06_06_12_21_48_1149405708datablock47bs.jpg[/img]

9- بعد إختيار التالي سوف تظهر شاشة لإختار شكل التصميم 
إختار Form من اجل عرض صف واحد من البيانات
أما Tabular من أجل عرض عدد من الصفوف.
إختار Form ثم التالي.
10- سوف تظهر الآن شاشة من أجل وضع إسم للإطار الذي سوف يحوي بلك البيانات إجعله فارغا ثم التالي ثم نهاية.

لقد كونا الآن بلك بيانات مرتبط بقاعدة البيانات وبالجدول phone. يجب أن تكون شاشتك كما في الشكل التالي:


سوف يكون هذا Canvas هو الشاشة الأساسية الأولى ومنه سوف يتم الإنتقال إلى بقية الشاشات الأخرى التي سوف نكونها في الدروس التالية..
أي أن هذا الـ Canvas سوف يكون فقط لعرض النتائج وليس للإضافة والتعديل.
الان نغير من بعض الخصائص:
بلك البيانات المسمى حاليا phone سوف نغيير خصائصة كما يلي:
إنقر على بلك البيانات phone ثم إضغط المفتاح F4 من أجل عرض نافذة الخصائص
غير الخصائص كما يلي:
Name: View
Database Data Block: No
وإحذف كلمة phone من أمام الخاصية Query Data Source Name وذلك من أجل ان نجعل بلوك البيانات هذا غير مرتبط بالجدول( قد تتسأل لماذا أجعله غير مربوط بالجدول ومن أين سوف أستدعي البيانات) الجواب البيانات سوف نبحث عنها بإستخدام مربع نص وسيكون بلوك البيانات View فقط لعرض ما حصلنا عليه من البحث (لاتشغل بالك سوف تتوضح الفكرة مع التقدم في الدرس)


أما خصائص ساحة العمل Canvas فسوف نغيير خصائصها كما يلي:
Name: CNVView

الان حدد العناصر Name,Address,Tel,Email,Memo وذلك بالضغط على كل عنصر مع الإستمرار بالضغط على المفتاح Ctrl ثم إضغط المفتاح F4 لعرض الخصائص وغير كما يلي:
Item Type: Display Item وذلك من أجل العرض فقط
Database item: No
Canvas: CNVVIEW
Reading Order: Left to Right


أما خصائص FRAME فغيرها كما يلي:
Update layout: Locked وذلك من أجل إذا أردت التغيير في حجم الإطار فلا يؤثر على العناصر.

الآن إحفظ عملك بالضغط على حفظ وإحفظه بإسم telephone

اليوم سيكون عن عرض البيانات وعرض نتائج البحث (الأسماء فقط) في قائمة وبمجرد الضغط على إسم شخص من القائمة تظهر التفاصيل في بلك البيانات.(هل وضحت الصور؟؟)
ونبدأ على بركة الله..
كيف ستكون عملية البحث؟؟؟
لعملية البحث نحتاج الى عنصر نص Text Item يتم كتابة حرف أو أكثر من حروف الاسم في عنصر النص هذا فيتم عرض جميع الأسماء (الأسماء فقط) التي تبدأ بهذا الحرف أو الحروف في قائمة. إذا سوف نحتاج أيضاً إلى عنصر القائمة List Item لعرض نتائج البحث..
إذا نحتاج الأن لتكوين عنصرين (عنصر نص لكتابة حروف البحث وعنصر القائمة لعرض قائمة بنتائج البحث).
1- كون مربع نص Text Item وعنصر قائمة List Item في بلوك البيانات View كما في الصورة التالية:


2- غير خصائص Text Item كما يلي:
Name:SEARCH
Database Item: No
Canvas:CNVVIEW


3- غير خصائص عنصر القائمة List Item كما يلي:
Name:LISTVIEW وتذكر هذا الإسم جيداً LISTVIEW سوف نستخدمه كثيراً في هذا الدرس.
إضغط على More بجوار الخاصية Elements in List وإحذف أي نص موجود أسفل List Elements ثم موافق
وذلك لمنع من إدخال أي بيانات الى القائمة يدوياً. فسوف يتم إدخال البيانات إلى القائمة بالإعتماد على محتوى مربع نص البحث.
List Style: Tlist
Database Item: NO
Canvas:CNVVIEW
Direction: Left To Right
صورة

الأن إحفظ البرنامج ثم نفذه المفروض أن تظهر نافذة التنفيذ كما يلي:
صورة

هذه النافذة كشكل عام تحتاج إلى التعديل عليها بالنقط التالية:
1- شريطي الأدوات والقوائم نريد إخفائهم (لن نحتاجهم في هذه الشاشة شاشة العرض والبحث)
2- إسم نافذة البرنامج Window1 نريد تغييرها إلى Telephone Guide
3- نافذة البرنامج نريدها مكبرة maximize
لتعديل هذه النقاط نقوم بالتالي:
1- من خصائص الفورم الرئيسي Telephone نحذف كلمتي DEFAULT&SMARTBAR من أمام الخاصية Menu Module 
فهاتين الكلمتين تدلان على شريطي القوائم والأدوات.
2- من خصائص النافذة Window نغير التالي:
Name:Window1
Title: Telephone Guide
3- أما عملية تكبير النافذة فسوف نحتاج إلى Trigger (ماهو الترايجر؟؟) 
الترايجر هو عبارة عن أكواد برمجية يتم تنفيذها في أوقات محددة في البرنامج .
إذا نكون ترايجر على مستوى الفورم Telephone أي أسفل الفورم TELEPHONE أنقر بالأيمن على Trigger ثم إختار
SmartTriggers ثم إختار WHEN-NEW-FORM-INSTANCE أي أن وقت تنفيذ هذا الترايجر هو عند تشغيل الفورم.

set_window_property('window1',window_state,maximize);



سوف تفتح نافذة جديدة سوف نكتب بها بعض الأكواد بلغة PL/SQL البسيطة.
وسوف نكتب في هذا الترايجر ما يلي:

معنى هذا الكود انه غير في خصائص النافذة التي اسمها 'Window1' بحيث تصبح Maximize
الأن إحفظ البرنامج ونفذه.
تلاحظ أن النقاط السابقة قد تم تلافيها.

الان ماذا تلاحظ في نافذة التفيذ أين البيانات التي أدخلناها في الجدول في أول درس
حاول أن تكتب أي حرف في عنصر نص البحث ثم إضغط إنتر !!!!؟
لا يوجد شيئ... لم يبحث عن شيئ.. طبعاً لا يوجد شيئ
لإن حاليا كل الذي سويناه فقط الجزء المرئي يبقى الأن دور البرمجة.
أول شيئ نريده وقبل البدء بالبحث نريد عرض جميع الأسماء في عنصر القائمة Listview.
ولعمل ذلك سوف نحتاج إلى ترايجر على الفورم الرئيسي (نفس التريجر السابق سوف نفتحة ونعدلة إلى الشكل التاليصورة




declare
        cursor curs is select name from phone;
        a varchar(30);
        n number:=0;
begin
        set_window_property('window1',window_state,maximize);
        clear_list('listview');
        open curs;
        loop
  fetch curs into a;
  exit when curs%notfound;
  n:=n+1;
  add_list_element('listview',n,a,a);
        end loop;
end;



الأن دعنا نشرح هذا الكود خطوة خطوة:
declare عنوان لتعريف المتغيرات ويحتوي على المتغيرات التالية:
cursor curs is select name from phone أي أن الـ curs هو متغير من نوع مؤشر أي مصفوفة من البيانات
تحتوي على عدد من البيانات ترجعها جملة الإستعلام select 
وجملة select السابقة تعود بجميع الأسماء الموجودة في الجدولphone (واضح إن شاء الله)
a varchar(30 متغير حرفي طولة 30 حرف وسوف نستخدم هذا المتغير من أجل خزن الإسم فيه.
n number:=0 متغير رقمي قيمته الإبتدائية تساوي صفر وسوف نستخدمه كرقم السطر في القائمة

begin إيعاز لبداية البرنامج أو الكود

set_window_property('window1',window_state,maximize); تم شرحها سابقا والخاصة بتكبير النافذة
clear_list ('listview'); لتصفير وحذف أي عنصر من القائمة listview وهذه القائمة تعرفوها جيدا ألم أقل لكم تذكروا إسمها جيدا
open curs; لفتح المتغير curs
loop بداية دوارة
fetch curs into a; جلب أول سطر من المتغير curs ووضعة في المتغير a 
وعند الرجوع مرة أخرى لهذ الكود فسوف يتم إستدعاء السطر الثاني من المتغير curs وهكذا الى حين الخروج من الدوارة.
exit when curs%notfound; شرط الخروج من الدوارة وهو عندما يكون المتغير curs قد أستدعى جميع أسطره
n:=n+1; زيادة قيمة المتغير n بواحد أي يصبح واحد في الدورة الأولى و أثنين في الدورة الثانية وهكذا.
add_list_element('listview',n,a,a); إضافة عنصر للقائمة listview في الموقع n 
واسم العنصرالذي سوف نضيفه في القائمة هو قيمة المتغير a وإسمه في قاعدة البيانات ايضاً قيمة المتغير a
end loop; نهاية الدوارة.
end; نهاية البرنامج أو الكود.


إن شاء الله يكون هذا الكود واضح على العموم يجب أن يكون لديك فكرة ولو بسيطة عن لغة PL/SQL 
الان إحفظ البرنامج ثم نفذ ماذا تلاحظ؟؟؟
جميع الأسماء التي أضفناها في الدرس الأول قد ظهرت في القائمة listview نتجية جميلة أليس كذلك؟؟
صورة

ولكن أين بقية البيانات اي العنوان ورقم التلفون وغيرها؟؟؟
لكي تظهر هذه البيانات نحتاج ألى ترايجر أخر. (أين نحط هذا الترايجر ومتى يجب أن يتنفذ؟؟؟)




ماذا نريد الآن؟؟
خطوة أخيرة قبل البدء بعملة البحث..
نريد عندما نضغط على إسم شخص من القائمة، تظهر جميع بياناته في بلك البيانات ، وهذا الشيئ يحتاج إلى ماذا؟؟؟
نعم برمجة بإستخدام PL/SQL والترايجر.
لكن هذه المرة أين سيكون موقع الترايجر؟؟؟
التريجر سيكون عند ضغط الماوس على عنصر القائمة
إذا سوف ننشئ ترايجر تحت listview وبالحدث WHEN-MOUSE-CLICK
أنقر بالز الأيمن على Trigger أسفل listview ثم أختار Smart Triggers ثم إختار Other


سوف تظهر نافذة إختار منها When-Mouse-Click ثم موافق ثم أكتب الكود التالي:

declare
        cursor curs is select * from phone where name=:view.listview;
        n varchar(30);
        a varchar(20);
        t varchar(20);
        e varchar(30);
        m varchar(50);
begin
        open curs;
        loop
  fetch curs into n,a,t,e,m;
  exit when curs%notfound;
  :view.name:=n;
  :view.address:=a;
  :view.tel:=t;
  :view.email:=e;
  :view.memo:=m;
        end loop;
end;

ولنشرح بعض أجزاء الكود:

Cursor curs is select * from phone where name=:view.listview;

أعتقد واضحة. وهي تكوين متغير يحتوي على جميع بيانات (*) الجدول phone تحت شرط معين
وهو عندما محتوى name في الجدول يساوي محتوي القائمة listview تعرفوها طبعا وموقعها فن بلك البيانات View
(View.listview) الناتج سوف يكون سطر واحد فقط من الجدول (منو يعرف ليش؟؟)

المتغيرات n,a,t,e,m هي متغيرات حرفية (لماذا بعضها ذات طول 20 وبعضها 30 وواحدة 50؟؟؟)
fetch curs into n,a,t,e,m;


لاحظ أن في جملة select أستدعينا جميع البيانات وليس الأسم ولذلك يجب في جملة fetch أن نضع قيمة المتغير curs في أكثر من متغيير وهي n للإسم وa للعنوان و t للتلفون و e للإيميل و m للملاحظات.
exit when curs%notfound;

شرط الخروج من اللوب
:view.name:=n;


وتعني إجعل قيمة العنصر name الموجود في بلك البيانات view يساوي المتغير n
وهكذا لبقية الأسطر الأربعة الأخرى.

الأن إحفظ البرنامج ثم نفذه.
اختار بالماوس على أحد الأسماء(ماذا ينتج؟)
أليست نتيجة رائعة تظهر جميع محتويات هذا الاسم في بلوك البيانات.


الآن وبعد أن انتهينا من عملية العرض بالشكل المناسب ننتقل إلى عملية البحث عن إسم معين.
هل تذكروا في بداية الدرس الثالث عندما أنشئنا عنصر نص Text Item واعطيناه الإسم Search
الأن سوف ننشئ ترايجر أسفل هذا العنصر تحت الحدث POST-CHANGE أي عند حدوث تغيير في هذا العنصر
ونكتب فيه الكود المبين في الصورة التالية:


الكود هذا لقد مر علينا سابقاً غير ان هناك فارق بيسط فيه وهي جملة select
select name from phone where substr(name,1,length(:view.search))=:view.search;

أي اعرض جميع الأسماء من الجدول phone تحت الشرط التالي:

substr(name,1,length(:view.search))


substr هي دالة إستقطاع جزء من النص النص المستقطع هو name أي الاسم من الجدول phone وبداية الأستقطاع هو من الحرف الأول (1) وبطول length(:view.search) أي بطول عدد الحروف الموجودة في العنصر search الموجود في بلك البيانات view
فإذا هذا الجزء المستقطع من الاسم يساوي محتوي العنصر search (=:view.search)
فإن الجملة select سوف ترجع بإسم هذا الحقل (إن شاء الله مفهوم..)
بقية الكود تم شرح مثله في درس سابق.

الأن إحفظ البرنامج ثم نفذه.
في عنصر النص search أكتب أي اسم او حرف لبداية إسم تريد البحث عنه
وليكن مثلا حرف m ثم إضغط إنتر (ماهي النتيجة؟؟)
القائمة عرضة فقط الأسماء التي تبدأ بحرف m إنقر على أي إسم لعرض بياناته.


لاحظ أن حالة ألاحرف حساسة أي البحث عن m يختلف عن البحث عن M (كيف يمكن تفادي هذه المشكلة..؟؟؟؟؟)
لتفادي هذه المشكلة غير الكود
select name from phone where substr(name,1,length(:view.search))=:view.search;

إلى الكود
cursor curs is select name from tel where lower(substr(name,1,length(:view.tis)))lower(:view.tis);


يمكن أن تستخدم الدالة Upper بدلاً من lower
الأمر بسيط للغاية lower تحول جميع الأحرف إلى أحرف صغيرة
و upper تحول جميع الأحرف إلى أحرف كبيرة
إحفظ البرنامج ونفذ مرة أخرى
أكتب الان m أو M ثم إضغط إنتر (نتيجة رائعة)
الان أكتب أكثر من حرف وليكن مثلاً moh ثم إنتر
تم عرض فقط الأسماء التي تبدأ بالحروف moh

وبذلك نكون قد أنتهينا من عملية البحث (أي إقتراح أخر يمكنكم طرحة لنحله معاً)

سوف نقوم بالتمهيد للعميات الأخرى كالحذف والإضافة والتعديل
وبما أن الشاشة التي كوناها سابقاً هي الشاشة الرئيسية
فلذلك سوف نضطر إلى إضافة مجموعة من الأزرار للقيام بالعمليات الإضافة والحذف والتعديل وأيضاً الخروج من البرنامج
فأول خطوة سوف نخطوها اليوم هي إضافة مجموعة من الأزرار (Buttons)
وسوف نحصر هذه الأزرار في إطار مناسب إذا قم بالتالي:
1- على الـ Canver المسمى CNVVIEW إنشئ إطار ثم أربعة Buttons
2- غير في خصائص الإطار بحيث تكون قيمة الخاصية Frame Titel تساوي لاشيئ (أي فارغ)
3- غير في خصائص أول Button بحيث:
Name= B_Exit
Label= Exit
Canvas= CNVVIEW
وسيكون هذا هو زر الخروج من البرنامج.
4- غير في خصائص ثاني Button بحيث:
Name= B_Delete
Label= Delete
Canvas= CNVVIEW
وسيكون هذا هو زر حذف قيد.
5- غير في خصائص ثالث Button بحيث:
Name= B_Edit
Label= Edit
Canvas= CNVVIEW
وسيكون هذا هو زر تعديل قيد.
6- غير في خصائص رابع Button بحيث:
Name= B_Add
Label= Add
Canvas= CNVVIEW
وسيكون هذا هو زر إضافة قيد.


الأن يجب أن نبرمج كل زر بحيث يقوم بوظيفته:
أمر الخروج من البرنامج (Exit) نضيف ترايجر أسفل الزر Exit وبالحدث WHEN-BUTTON-PRESSED ونكتب فيه الكود التالي:
plain text

Exit_form;
وهذا الكود لايحتاج إلى شرح (وظيفته الخروج من البرنامج).


إحفظ البرنامج ثم نفذه
إضغط على أي Button غير Exit تلاحظ لايؤثر في شيئ لإنها تخلو من البرمجة، لكن إضغط على زر exit تلاحظ خروجك من البرنامج بسبب أن الترايجر يوجهها الى هذا الأمر.

الأن الـ Button الثاني والخاص بحذف عنصر.
من البديهيات المعروفة انه قبل حذف أي عنصر فإنه يجب التنبيه بذلك أي يجب عرض رسالة تحذيرية تخبرنا بالتأكيد على الحذف أم لا.
ولعرض هذه الرسالة سوف نحتاج إلى إضافة Alert .
أضف Alert جديد وغير في خصائصه كما يلي:
Name= MSG
Alert Style= Caution أي رسالة تحذيرية
Button 1 Label= Yes أي ان الزر الأول في الرسالة يكتب فيه كلمة Yes
Button 2 Label= No أي الزر الثاني في الرسالة يكتب فيه كلمة No
Button 3 Label إجعله فارغا لإننا لا نحتاج إلى زر ثالث
Default Alert Button= Button 2 أي إجعل الزر الثاني هو الزر الإفتراضي (النشط)


الأن نرجع إلى برمجة الزر Delete
ننشئ ترايجر جديد أسفل الزر delete عند الحدث WHEN-BUTTON-PRESSED ونكتب فيه الكود التالي:
plain text

if :view.name is not null then
set_alert_property('msg',title,'Delete');
set_alert_property('msg',alert_message_text,'Are You Sure to Delete ' || :view.name);
if show_alert('msg')=alert_button1 then
delete from phone where name=(:view.name);
commit_form;
end if;
end if;

شرح الكود:
السطر الأول يوجد به شرط IF والشرط (هل قيمة العنصر name في البلوك View يكون فارغ أي لا يحتوي على أي حرف) فإذا تحقق هذا الشرط فسوف يتم تنفيذ السطور التالية حتى نهاية جملة IF والتي تنتهي بالجملة End if في آخر سطر في الكود.
أما إذا لم يتحقق هذا الشرط فلن يتم تنفيذ شيئ.

السطر الثاني يتم فيه تغيير في خصائص الـ Alert التي سميناها MSG أي خصائص رسالةالتنبيه
حيث يتم تغيير عنوان (Titel) الرسالة (MSG) إلى الكلمة Delete.

السطر الثالث يتم فيه أيضا تغيير في خصائص الـ Alert التي سميناها MSG أي خصائص رسالةالتنبيه
حيث يتم وضع نص (alert_message_text) الرسالة (MSG) إلى الجملة:
Are You Sure to Delete يلي هذه الرسالة يضيف ( || علامة الإضافة) يضيف محتوي العنصر name من البلك VIEW.
فإذا كان محتوى العنصر name هو الإسم Mohammed فسوف يكون نص الرسلة هو:
Are You Sure to Delete Mohammed

السطر الرابع: فيه شرط If يقول show_alert أي إعرض الرسالة MSG
فإذا كان الإختيار على الزر الأول(alert_button1 والذي حددنها سابقا في خصائص الـ Alert بالقيمة Yes)
فإذا كان الإختيار على هذا الزر (أي تم ضغط هذا الزر) فإن البرنامج سوف يقوم بتنفيذ الأسطر التي تلي هذا الشرط
والتي تنتهي بالجملة End If في السطر القبل الأخير
أما إذا كان الضغط على الزر No فإن البرنامج لن يفعل شيئ.

السطر الخامس: وهي أهم خطوة أمر الحذف وهو أحذف(Delete) من الجدول Phone عندما يكون الأسم يساوي محتوي العنصر name في البلوك View.

السطر السادس: أمر التثبيت. وذلك من أجل تثبيت الحذف.

الأن إحفظ البرنامج.
طبعاً عملية الحذف الأن تقريباً أكتملت ولكن ينقصها بعض التعديلات من أجل الشكل فقط سوف نناقشها بعد تنفيذ البرنامج.
الأن نفذ البرنامج:

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


لإلغاء عملية الحذف إختارعلى الزر No أو إو إضغط على إنتر Enter من لوحة المفاتيح لإن الزر No هو الزر الفعال حالياً
أما إذا أخترت Yes فسوف يتم حذف القيد amer

الأن بعد أن حذفت القيد amer تلاحظ أن القيد مازال موجوداً في القائمة، ولكنه قد حذف من الجدول وللتأكد من عملية الحف
إخرج من البرنامج بالضغط على الزر Exit ثم نفذه من جديد ستلاحظ بأن القيد amer غير موجود ضمن القائمة.

ولكن كيف يمكن أن أجعل العنصر ينحذف حتى من القائمة بعد الحذف مباشرتاً وبدون خروج من البرنامج؟؟؟
لحل هذا المشكلة إنتظروا الدرس القادم

ملاحظة:
يمكنك إضافة القيود التي حذفتها يدوياً بأن تقص الكود التالي وتلصقه في SQL *Plus وذلك من أجل أن تتمرن أكثر على عملية الحف.
delete from phone;
insert into phone
values
('Ahmed','Yemen','123321','ahm@yahoo.com','');
insert into phone
values
('Mohammed','Iraq','2258647','moh@yahoo.com','');
insert into phone
values
('amer','Sudia','58694725','ameer@yahoo.com','');
insert into phone
values
('moner','Egypt','55886644','moner@hotmail.com','');
insert into phone
values
('Mohsen','Yemen','123355','moh@yahoo.com','');
insert into phone
values
('moneraa','Iraq','5541857','moneraa@hotmail.com','');
commit;


عندما أحذف العنصر يجب أن ينحذف من القائمة وليس فقط من الجدول. حتى يبين للجميع بأن الإسم قد تم حذفه.
أتذكرون الترايجر التي كوناه أسفل الفورم الرئيسي والذي يتنفذ عند تنفيذ البرنامج (ماهي وظيفة هذا الترايجر؟)
declare
cursor curs is select name from phone;
a varchar(30);
n number:=0;
begin
set_window_property('window1',window_state,maximize);
clear_list('listview');
open curs;
loop
 fetch curs into a;
 exit when curs%notfound;
 n:=n+1;
 add_list_element('listview',n,a,a);
end loop;
end;



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

ويبقى السؤال الأن كيف أقوم بإستدعاء هذا الترايجر بعد كل عملية حذف.
سوف نحتاج هنا إلى إجراء عام يمكن إإستدعاه من أي ترايجر بمجرد فقط ذكر إسمه. (كيف ذلك؟؟).
1- إختار Program Units
2- إختار إضافة
3- إختار Procedure
4- إكتب إسم الإجراء بجوار الحقل name وليكن Refresh
5- إختار Ok


سوف تظهر نافذة جديدة يوجد بها بعض الأسطر
أضف الكود التالي إلى هذه النافذه بحيث تصبح بالشكل التالي:


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

الأن ماهي التعديلات التي سوف نجريها على الترايجر الأول الذي أسفل الفورم الرئيسي؟؟؟
وماهي التغيرات التي سوف نجريها على ترايجر الحذف؟؟؟
التعديلات ستكون كما في الشكل التالي:


أعتقد بأن التغيرات التي أجريناها لاتحتاج إلى شرح أكثر من هذا؟

الان إحفظ البرنامج ثم نفذه.
ثم حاول أن تحذف أحد القيود؟؟
فعلاً لقد تم حذف الإسم حتى من القائمة.
ولكن بقت مشكلة بسيطة جدأ وهي أن بيانات الشخص المحذوف تبقى في بلك البيانات. (كيف يمكن معالجة هذه المشكلة البسيطة؟؟)ز
الحل بسيط جداً..
في ترايجر الحذف أضف الأسطر التالية:
 :view.name:='';
  :view.Address:='';
  :view.Tel:='';
  :view.Email:='';
  :view.Memo:='';



وظيفة هذه الأسطر هو جعل قيم بلك البيانات فارغة.


الأن إحفظ البرنامج ثم نفذه.
ثم حاول حذف أحد الأسماء.. (لاتوجد مشاكل الأن..  .)

أنتهى درس الحذف وبنهايتهة ينتهي درس اليوم ولم يبقى لنا سوي التعديل والإضافة
    سوف نقوم في هذا الدرس بإنشاء بلك بيانات جديد وCanvas جديد
    بلك البيانات سوف نربطه بالجدول PHONE
    إذا أول خطوة هي أنشئ بلك بيانات جديد (لكيفية إنشاء بلك البيانات راجع الدرس الثاني..)
    وخطوات إنشاء بلك البيانات هي كالتالي ( للتذكير):
    1- إختار Data Blocks.
    2- إختار إضافة.
    3- User The Data Block Wizard ثم O.K
    4- Display the Page Next time ثم التالي.
    5- Table Or View ثم التالي.
    6- Browse..
    7- أدخل اليوزر نيم والباسورد (system/manager) ثم connect
    8- إختار الجدول PHONE ثم O.K
    9- إختار الكل ثم التالي.
    10- التالي.
    11- Create the data block, then call the Layout Wizard. ثم نهاية.
    12- Display the Page Next time ثم التالي.
    13- Canvas = New Canves
    Type = Content ثم التالي.
    14- إختار الكل ثم التالي.
    15- التالي.
    16- Form ثم التالي.
    17- التالي.
    18- نهاية.

    الأن قم بتغيير الخصائص كما يلي:
    1- الداتا بلوك Phone
    name= EDIT
    2- CANVAS
    name= CNVEDIT
    3- FRAME الموجود في CNVEDIT
    Update Layout= LOCKED
    4- حدد العناصر NAME,ADDRESS,TEL,EMAIL,MEMO وغير في خصائصهم كالتالي:
    Reading Order= Left To Right

    الأن أضيف زرين (BUTTONs) إلى الداتا بلك EDIT
    وغير خصائصهما كما يلي:
    1- الزر الأول:
    name= P_CANCEL
    label= CANCEL
    2- الزر الثاني:
    name= P_OK
    label= OK

    الأن أضيف مربع نص في CNVEDIT وأكتب فيه الكلمة EDIT
    إجعل شاشتك تظهر بالشكل التالي:
    صورة

    الأن أنتهينا من التصميم المرئي لبلك البيانات الخاص بشاشة التعديل EDIT
    وبقى فقط الجزئ البرمجي...
    إحفظ برنامج ثم نفذ..
    تلاحظ بأن شاشة التعديل هي التي ظهرت وليست الشاشة الرئيسية التي أنشئناها في الدروس السابقة.
    كيف أجعل شاشة العرض هي التي تظهر بالبداية؟؟؟
    إذهب الى الترايجر الذي أسفل الفورم الرئيسيى والذي عدلنا به في الدرس الماضي والمسمى بـ
    WHEN-NEW-FORM-INSTANCE
    وأضف الكود التالي في نهايته:
    GO_BLOCK('VIEW');

    هذا الكود يعني إذهب وأعرض بلك البيانات الذي أسمه VIEW
    الأن إحفظ البرنامج ونفذ.
    فعلاً ظهرت الأن شاشة العرض الأساسية.
    إضغط على الزر Edit (لا يحصل شيئ!!!)
    إختار على أحد الأسماء من القائمة ثم إضغط على الزر Edit مرة أخرى (أيضاً لا يحصل شيئ!!!!!)

    طبعاً لايحصل شيئ لإن ترايجر زر التعديل لم نوجهه حتى الأن
    إذا أخرج من شاشة التفيذ وأضيف ترايجر جديد أسفل زر التعديل Edit في بلك البيانات VIEW
    ويكون تحت الحدث WHEN-BUTTON-PRESSED وأكتب فيه الكود التالي:
    if :view.name is not null then
      go_block('edit');
      set_block_property('edit',default_where,'name=:view.name');
      execute_query;
    end if;

    شرح الكود:
    يوجد بالكود شرط وهو يجب أن لا يكون العنصر name في بلك البيانات VIEW فارغاً
    لأجل تنفيذ الأسطر التالية حتى نهاية جملة end if (تذكر هذا الشرط جيداً..)
    السطر الثاني واضح وهو أمر الذهاب وعرض بلك البيانات EDIT
    السطر الثالث وهو تغيير في خصائص بلك البيانات EDIT بحيث يصبح يحتوي على الإستعلام التالي
    الاسم name يساوي العنصر name في بلك البيانات VIEW
    السطر الرابع وهو أمر تنفيذ الإستعلام
    هذين السطرين الثالث والرابع وظيفتهما هو عرض جميع بيانات القيد الذي أسمة يساوي الإسم الموجود في بلك البيانات VIEW

    الأن نضيف ترايجر أخر في بلك البيانات EDIT تحت الزر CANCEL
    وبالحدث WHEN-BUTTON-PRESSED ونكتب فيه الكود التالي:
    go_block('view');

    واضح معناه أي الرجوع وعرض بلك البيانات VIEW وبدون حفظ أي تغيير.

    وأخيراً سوف نظيف ترايجر ثالث في بلك البيانات EDIT تحت الزر OK
    وبالحدث WHEN-BUTTON-PRESSED ونكتب فيه الكود التالي:
    commit_form;
    go_block('view');
    refresh;

    السطر الأول واضح جداً وهو من أجل تثبيت البيانات التي غيرنا فيها وحفظها في الجدول.
    السطر الثاني أوضح من الأول، وهو من أجل الرجوع إلى بلك البيانات الرئيسي VIEW
    أما السطر الثالث فهو موجه لكم أنتم لماذا أستخدمناه وماهي وظيفته؟؟؟؟؟ (راجع الدروس السابقة).

    الآن إحفظ البرنامج ثم نفذه.
    1- قبل أن تختار أي إسم من القائمة إضغط على الزر Edit (ماذا يحصل؟)
    لا يحصل شيئ وذلك بسبب ان العنصر NAME في بلك البيانات VIEW فارغاً
    بينما الشرط في الترايجر يقول يجب أن يكون الاسم في بلك البيانات VIEW غير فارغ. (ألم أقل لكم تذكروا هذا الشرط جيداً)
    (كيف أجعله يظهر رسالة تخبرني بأنه لايوجد إسم في العنصر name ؟؟)
    2- الأن إختار أحد الأسماء الذي تريد أن تعدل في بياناته من القائمة ثم إضغط على Edit
    سوف تظهر شاشة التعديل وبه جميع بيانات ذلك الشخص. غير بياناته.
    3- إذا ضغطت على Cancel فلن يتم حفظ التغيرات.
    4- أما إذا ضغط على OK فسوف يتم حفظ التعديلات.




      تعليقات