khaled بتاريخ: 1 فبراير 2004 تقديم بلاغ مشاركة بتاريخ: 1 فبراير 2004 (معدل) كل عام وانتم بخيرانا في الحقيقة دخلت قسم الدروس في ال pl/sql ووجد موضوع الدروس المبسطه التي بدءها الاخ عمر باعقيل جزاه الله خير . واود ان اشارك في بعض الدروس المتقدمه نوعا ما حتى افيد واستفيد فا اود ان استسمح المشرف في السماح لي بوضعها والدروس هي (Cursor , Error handling , Function , procedure , package , Supplied packages , database triggers )خالد العوبثاني تم تعديل 1 فبراير 2004 بواسطة Oracle 1 اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
Guest عادل الشهري بتاريخ: 1 فبراير 2004 تقديم بلاغ مشاركة بتاريخ: 1 فبراير 2004 (معدل) أكيد يا أخ khaled ,, تفضل بوضع كل ماتجود به نفسك من الدروسوجزاك الله عنها خير الجزاء ولكن تأكد من عدم التكرار ,,, الله يقويك ان شالله أخوك Oracle تم تعديل 1 فبراير 2004 بواسطة Oracle اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
moh بتاريخ: 2 فبراير 2004 تقديم بلاغ مشاركة بتاريخ: 2 فبراير 2004 يا حبذا يا أخ خالدتبدأ في شرح هذه الدروس لان معظم الإخوة في حاجة إلى مزيد من المعلومات عن هذه الدروس وجزاكم الله خيرا اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
khaled بتاريخ: 2 فبراير 2004 كاتب الموضوع تقديم بلاغ مشاركة بتاريخ: 2 فبراير 2004 (معدل) بسم الله الرحمن الرحيمالمواضيع التي سوف نقوم بتقديمها:----------------------------------1-Cursor ما هو , كيف يستفاد منه , لماذا نحتاج له , انواعه مع الامثله 2- pl/sql table datatype , record datatype , Object type كيفيه تعريفها والتعامل معها مع الامثله3- Error handling لماذا نحتاج الى معالجة الاخطى 4-Subprograms فائدت ال suprograms وانواعها وكيفية انشائها مع الامثله5- packages فائدتها وكيفية انشائها مع الامثله6-Database triggers فائدتها وكيفية انشائها مع الامثلههذه المواضيع التي سوف نقوم بتقديمها واذا كانت لديكم اي ملاحظات او مواضيع اخرى ترون ان من المفيد وضعها ضمن هذه المجموعه فنحن في اتم الاستعداد لتقديمها كما اني ارحب بكل من لديه اي تعقيبات او مواضيع يحب طرحها .الدرس الاول Cursor :ما هو الـ Cursor :-------------------الـ Cursor هو موقع في الذاكره {Memory buffer }يقوم بحفظ البيانات الناتجه من الاستعلام بصوره مؤقته ومن ثم يتم التعامل مع هذه البيانات من الذاكره , فانت حين تقوم بكتابه اي استعلام (Select empno, ename , sal from emp) فان اوراكل يقوم بحجز منطقه في الذاكره (Cursor) ويضع البيانات الناتجه من الاستعلام فيها ومن ثم يتم التعامل مع هذه البيانات من الذاكره .انواع الـ Cursor -----------------هناك نوعين من الـ Cursors 1- implicit Cursor وهذا النوع يعرف مباشرة دون ان نقوم نحن بتعريفه فهو يعرف مباشره عندما نقوم بتنفيذ اي استعلام حيث يتم حجز منقطه في الذاكره تحت تسميه معينه وتوضع فيها كل البيانات الناتجه من الاستعلام ثم يتم عرضها في الشاشه او التقرير .فعندما تقوم بفتح ال Sql * plus ثم تقوم بكتابه الاستعلام الاتي (select empno, ename , sal from emp ) فانه يتم تعريف Cursor ضمني توضع فيه كل السجلات الناتجه من الاستعلام ثم يتم بعد ذلك عرض السجلات سجل سجل باستخدام الـIndex .2- Explicit Cursor وهذا النوع يتم تعريفه من قبل المستخدم عندما يحتاج الى التعامل مع اكثر من سجل . وهذا النوع سوف نتطرق لشرحه بصوره مفصله عندما نحتاج للتعامل مع اكثر من سجل من البيانات من داخل برنامج PL/SQL .لماذا نحتاج للـ Cursor----------------------كما هو معروف للجميع ان استخدام الـ Select في الـ PL/SQL هو لغرض معالجة البيانات وليس لعرضها وحتى نستطيع ان نعالج البيانات يجب علينا حفظها في متغيرات ومن ثم معالجتها . ومن هنا فان استخدام الـ Select في الـ PL/SQL مقيده بشرطين . الاول : ان اي جمله Select يجب ان ترجع سجل واحد فقط لانها اذا رجعت اكثر من سجل او لم ترجع اي سجل فان البرنامج سوف ينتج عنه خطى .الثاني : ان اي عمود في جمله الـ Select يجب ان يخزن قيمته في متغير مشابه له في النوع والحجم .وخلاصه الكلام ان استخدام الـ select في الـ PL/SQL محدوده بارجاع سجل واحد فقط .وهنا تاتي الحاجه للـ Cursor لان من خلال الـ Cursor نستطيع التعامل مع اكثر من سجل من داخل برنامج الـ PL/SQL . مثال : افرض انك تريد تعديل رواتب الموظفين بنسب معينه حسب سنوات الخدمه سنه او اقل الزياده 5%سنه الى سنتين الزياده 10%اكثر من سنتين الزياده 15%في هذا المثال نحتاج الى معالجه اكثر من سجل وليس سجل واحد وحتى نستطيع انجاز هذا المثال نحتاج الى Explicit Cursor نوضع فيه كل بيانات الجدول Emp ومن ثم المرور عليها سجل سجل وزياده الراتب حسب سنوات الخبره .الخطوات اللازمة لانشاء الـ Cursor -------------------------------------1- تعرف الـ Cursor وتتم في الـ Decleration part من برنامج الـ PL/SQL Cursor c1 is Select empno, ename , sal from emp ;وفي هذا الخطوه يتم حجز منطقة في الذاكره للـ Cursor ومواصفات هذه المنطقه اي عدد المواقع وانواعها التي يتم حجزها في الذاكره يعتمد على نوع وعدد الاعمدة المعرففي الـ Query الموجود في تعريف الـ Cursor .في المثال السابق سوف يتم حجز منطقه في الذاكره باسم C1 تتكون من ثلاثه مواقع 2- فتح الـ Cursor وتتم في الـ Execution part من برنامج الPL/SQL Open C1; وفي هذه المنطقه يتم تنفيذ الـ Query الموجود بداخل الـ Cursor ثم يتم جلب السجلات من الـ Table ووضعها في الذاكره حتى يتسنى لنا التعامل معها سجل سجل3- جلب البيانات من الذاكره ووضعها في متغيرات Fetch C1 into v_empno,v_ename , v_sal وفي هذه الخطوه يتم جلب البيانات من الذاكره ووضعها في متغيرات و في كل مره يتم تنفيذ هذا الامر يتم جلب سجل واحد من مجموعة السجلات الموجوده في الـ Cursor ووضع بياناته في المتغيرات المناسبه الى ان تنتهي السجلات. ملاحظات :- قبل القيام بهذه الخطوه يجب ان تقوم بتعريف متغيرات في قسم الـ Decleration وهذه المتغيرات يجب ان تكون من نفس نوع وطول الاعمدة كالاتي :- Declare v_empno emp.empno%type v_ename emp.ename%type v_sal emp.sal%type - عند وضع المتغيرات في جملة الـ Fetch يجب ان تكون مرتبه حسب ترتيب الاعمدة في جملة Select الموجوده في الـ Cursor حتى توضع البيانات المناسبه في المتغير المناسبه .- عند تنفيذ جملة Fetch اول مره يتم جلب بيانات السجل الاول ووضعه في المتغيرات . وعند تنفيذها مرة ثانية يتم جلب بيانات السجل الثاني ووضعه في المتغيرات وهكذا تستمر العملية الى يتم الانتها من كل السجلات. وهذه العملية تتم باستخدام ما يسمى بالـ Pointer فهو مؤشر يكون عند السجل الاول وينتقل الى السجل التالي في كل مرة تتم فيها عملة Fetch الى ان تنتهي السجلات .- لكي نقوم بعملية جلب لكل البيانات يجب وضع جملة الـ Fetch في Loop ينتهي عند الوصول الى اخر سجل ويتم التأكد من اننا وصلنا الى اخر سجل باستخدام الـ Attribute %notfound4- غلق الـ Cursor وفي هذه العملية يتم غلق الـ Cursor ويتم ارجاع المؤشر الى السجل الاول .Close C1;مثال : Declare Cursor C1 is select empno, ename , sal from emp; v_empno emp.empno%type; v_ename emp.ename%type; v_sal emp.sal%type; Begin Open C1; Dbms_Output.put_line ('empno ' || ' ename ' || ' salary '); Loop Fetch C1 into v_empno, v_ename , v_sal; Exit when C1%notfound; Dbms_Output.put_line ( v_empno || ' ' || v_ename || ' ' || v_sal ); End loop; Close C1; End; / لو نظرنا الى المثال السابق سوف نلاحظ ان جملة الـ Fetch موجوده داخل Loop وشرط الخروج من الـ Loop هو Exit when C1%notfound وهذا الشرط سوف يؤدي الى الخروج من اللـ Loop عندما يتم الانتهاء من السجلات . Notfound هي boolean attribute يكون True عندما يصل المؤشر الى اخر سجل . لانه اذا وصل المؤشر الى اخر سجل وقمت بعملية Fetch اخر فان البرنامج سوف يعطيك error لان المؤشر سوف يخرج من اطار تعريف الـ Cursor في الذاكره . وهناك عدد من الـ Attributes للـ Cursor كالاتي -notfound : قيمه منطقية تكون False عندما كون المؤشرضمن سجلات الـ Cursor اي لم يصل الى السجل الاخير وتكون True عندما يصل المؤشر الى اخر سجل في الـ Cursor .-Found : عكس الـ Notfound .-rowcount : قيمة رقمية وتتغير قيمتها حسب موقع المؤشر في سجلات الـ Cursor , اذا كان المؤشر في السجل الأول سوف تكون قيمة الـ Rowcount=1واذا كان المؤشر في السجل الثاني سوف تكون قيمة الـ Rowcount =2 وهكذا , وهذا يفيد في التحكم في عدد السجلات المراد عرضها . فمثلاً في المثال السابق اذا اردنا عرض 5 سجلات فقط يغير شرط الخروج من الـ Loop الى الاتي Exit when C1%rowcount=5-isopen قيمة منطقية تكون False اذا كان الـ Cursor مغلق وتكون True اذا كان الـ Cursor مفتوح وهذه الخاصية يستفاد منها عندما يتم استخدام الـ Cursor اكثر من مره في البرنامج بحيث يتم التأكد من الـ Cursor قبل فتحه لانه اذا تم فتح الـ Cursor وهو لم يغلق بعد فسوف يعطينا error .هذه الطريق الاعتيادية او التقليدية للتعامل مع الـ Cursor وهناك طريقه اسهل للتعامل مع الـ Cursor وهي الـ For loop cursor .الـ Cursor For loop:مثال : declare begin Dbms_Output.put_line ('empno ' || ' ename ' || ' salary '); For i in (select empno, ename , sal from emp ) loop Dbms_Output.put_line ( i.empno || ' ' || i.ename || ' ' || i.sal ); end loop; end; / هذا المثال هو نفس المثال السابق ولكن هو Cursor for loop حيث تم الاستغنا عن كثير من الخطوات الموجوده في المثال السابق -لا نحتاج الى تعريف الـ Cursor -لا نحتاج الى فتح الـ Cursor -لا نحتاج لى جملة الـ Fetch- لا نحتاج لشرط الخروج من اللـ Loop .- لا نحتاج لتعريف متغيرات - لا نحتاج لغلق الـ Cursor وكما هو واضح في المثال السابق يتم وضع الـ Query في جملة الـ For ويتم بعد ذلك التعامل مع السجلاتParameter Cursor يستخدم هذا النوع من الـ Cursor عند الحاجة للحصول على بيانات مشروطه اي عندما تريد وضع شرط في جملة الـ Select الموجوده في تعريف الـ Cursor حيث يتم فتح الـ Cursor ومن ثم تمرير قيم للمتغيرات الموجوده في الـ Cursor Declare Cursor C1(v_dept in number) is select empno, ename , sal from emp where deptno=v_dept; v_empno emp.empno%type; v_ename emp.ename%type; v_sal emp.sal%type; Begin Open C1(10); Dbms_Output.put_line ('empno ' || ' ename ' || ' salary '); Loop Fetch C1 into v_empno, v_ename , v_sal; Exit when C1%notfound; Dbms_Output.put_line ( v_empno || ' ' || v_ename || ' ' || v_sal ); End loop; Close C1; End; / لو نظرنا للمثال سوف نلاحظ ان تعريف الـ Cursor اصبح يحتوي على Parameter اسمه v_dept وهذا الـ Parameter موجود في جملة الشرط where deptno=v_dept اي ان الـ Query سوف يعطينى سجلات قسم معين حسب قيمه المتغير V_dept فلو كانت قيمة الـ v_dept تساوي 10 فان الـ query سوف يعطينى سجلات القسم 10 وهكذا . وقيمة المتغير او الـ Parameter v_dept تعطى عند فتح الـ Cursor فلو نظرنا الى جملة Open c1(10) ; سوف نلاحظ ان قيمة المتغير v_dept هي 10 . ولو اردنا ان يعطينى الـ Cursor بيانات القسم 20 فكل ما علينها هو ان نغير قيمة المتغير V_dept الى 20 عند فتح الـ Cursor حيث تصبح جملة الفتح كالاتي Open c1(20) ; وهكذا .ملاحظه :يمكنك وضع اكثر من Parameter للـ Cursor من ثم استخدامهم كشروط لجملة الـ Select الموجوده في الـ Cursor مثال Declare Cursor C1(v_dept in number , s in number) is select empno, ename , sal from emp where deptno=v_dept AND sal >= s; v_empno emp.empno%type; v_ename emp.ename%type; v_sal emp.sal%type; Begin Open C1(10,3000); Dbms_Output.put_line ('empno ' || ' ename ' || ' salary '); Loop Fetch C1 into v_empno, v_ename , v_sal; Exit when C1%notfound; Dbms_Output.put_line ( v_empno || ' ' || v_ename || ' ' || v_sal ); End loop; Close C1; End; / هذا المثال يحوي tow parameters الاول v_dept لتمرير قيمة القسم و الثاني S لتمرير قيمة الراتب حيث نستطيع ان نرجع بيانات موظفي قسم معين الذين رواتبهم تتجاوز قيمة معينه كما هو موضح في المثال . Cursor for updateيستخدم هذا النوع من الـ Cursor لعمل Update في جدول الـ Cursor للسجل الموجود عليه المؤشر في متغير الـ Cursorبمعنى اخر اذا قمت بعمل Fetch لسجل معين من الـ Cursor واردت ان تعمل Update لهذا السجل في الجدول فانك تحتاج في هذه الحالة لاستخدام الـ Cursor for update مثال افرض انك تريد ان تعمل update للموظف الذي راتبه اقل من 100$ لاعطاءه زياده بنسبه 5% Declare Cursor C1 is select empno, ename , sal from emp for update of emp.sal; v_empno emp.empno%type; v_ename emp.ename%type; v_sal emp.sal%type; Begin Open C1; Dbms_Output.put_line ('empno ' || ' ename ' || ' salary '); Loop Fetch C1 into v_empno, v_ename , v_sal; if v_sal < 1000 then update emp set sal =v_sal + v_sal * 0.5 where current of c1; end if; Exit when C1%notfound; Dbms_Output.put_line ( v_empno || ' ' || v_ename || ' ' || v_sal ); End loop; Close C1; End; / لاحظ شرط للـ update الموجود في المثال where current of c1 اي عمل update في الجدول للسجل المقابل من حيث الرقم لسجل الـ cursor الذي عملنا له Fetch . lesson1.txt تم تعديل 23 فبراير 2004 بواسطة khaled اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
khaled بتاريخ: 2 فبراير 2004 كاتب الموضوع تقديم بلاغ مشاركة بتاريخ: 2 فبراير 2004 (معدل) اتمنى ان تعجبكم طريقه طرح الموضوعونرحب بكل المقترحاتخالد العوبثاني تم تعديل 2 فبراير 2004 بواسطة khaled اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
Guest عادل الشهري بتاريخ: 2 فبراير 2004 تقديم بلاغ مشاركة بتاريخ: 2 فبراير 2004 بارك الله فيك .... الله يقويك تحياتي Oracle اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
John بتاريخ: 3 فبراير 2004 تقديم بلاغ مشاركة بتاريخ: 3 فبراير 2004 شكراَ جدا اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
salama11433 بتاريخ: 3 فبراير 2004 تقديم بلاغ مشاركة بتاريخ: 3 فبراير 2004 شكرا يا اخى اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
osos.bg بتاريخ: 4 فبراير 2004 تقديم بلاغ مشاركة بتاريخ: 4 فبراير 2004 جزيت خيرا اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
khaled بتاريخ: 8 فبراير 2004 كاتب الموضوع تقديم بلاغ مشاركة بتاريخ: 8 فبراير 2004 الدرس الثاني في هذا الدرس سوف نتعرف على الانواع المختلفة للمتغيرات في الـ PL/SQL انواع المتغيرات :o Scalar data typeo Composite data typeScalar data type الـ Scalar data type هي المتغيرات التي تخزن قيمة مفرده مثل integer , varchar2 , Boolean وغيرها فهي تخزن قيمة مفردة ومن نوع معين وهذا النوع من المتغيرات يكون موجود تلقائياً ضمن اللغة ولا نحتاج الى إنشائه برمجياً . X integer (5); N Varchar2(20); المتغير X هو متغير من نوع Integer أي انه يخزن قيمة رقمية مثل 5 او 9 او 17 الى 99999 لان طوله 5 ارقام .المتغير N هو متغير من نوع Varchar2 أي انه يخزن قيمة حرفية تصل الى 20 حرف مثل Ali , Ahmed20 , وهكذا . Composite data typeالـ Composite data type هي المتغيرات التي تخزن اكثر من نوع من البيانات كان يكون لدينا متغير يخزن قيمة رقمية وفي نفس الوقت يخزن قيمة حرفية او تاريخية وهذا النوع من المتغيرات يحتاج الى ان نقوم بتعريفه للغة حتى نستطيع ان نعرف متغيرات على هذا النوع . فمثلاً لو اردت ان تعرف متغير يستطيع ان يخزن قيمة رقمية وقيمة حرفية يجب عليك اولاً ان تقوم بتعريف نوع متغير data type بهذه المواصفات ومن ثم تقوم بتعريف متغير من هذا النوع PL/SQL Record هذا النوع من المتغيرات يحوي اكثر من حقل ويكون على شكل سجل مثال :افرض انك تحتاج الى متغير يقوم بخزن عنوان الموظف مع العلم ان عنوان الموظف يتكون من عده اجزاء كالاتيالدوله Countryالمدينة Cityالشارع Streetرقم البيت home numberاولاً يجب ان نقوم بتعريف نوع متغير data type بهذه المواصفات كلاتي declare type address is record ( country varchar2(20) ,City varchar2(20) ,Street varchar2(20) ,Home_no number(5) ); الان وبعد ان قمنا بتعريف الـ Data type تحت اسم address نستطيع ان نعرف متغير من هذا النوع كالاتي add address;هذا النوع من الـ Data type يسمى pl/sql Record حيث انه يشبه الـRecord اذ انه يستطيع ان يخزن اكثر من وبانواع مختلفه من البيانات ففي المثال السابق المتغير add يستطيع ان يخزن 3 قيم حرفية وقيمه رقمية .فائدة هذا النوع من المتغيراتيستخدم هذا النوع من المتغيرات عند الحاجة لخزن سجل كامل من جدول معين ووضعه في متغير مشابه له مثال : declare type employees is record ( empno number(5) ,ename varchar2(20) ,mgr number(5) ,job varchar2(20) ,sal number (5) ,hiredate date ,deptno number(3) ); emp_rec employees; begin select empno, ename , mgr , job , sal , hiredate , deptno into emp_rec from emp where empno=7788; dbms_output.put_line(emp_rec.empno ||' ' || emp_rec.ename || ' ' ||emp_rec.mgr ||' ' ||emp_rec.sal || ' ' ||emp_rec.hiredate ||' ' ||emp_rec.deptno); end; / في المثال اعلاه عرفنا data type record باسم employees ثم عرفنا emp_rec من نوع هذا الـRecord ومن ثم استخدمنا هذا المتغير لحفظ البينات الناتجه من الاستعلام select .لاحظ ايضاً انك تستطيع ان تتعامل مع الحقول الموجوده بداخل هذا السجل يتم عن طريق وضع اسم المتغير ثم نقطه واسم الحقل كلاتي Emp_rec.ename:=’scott’; Dbms_output.put_line(emp_rec.ename); ملاحظةهناك طريقه اخرى لتعريف متغير من نوع سجل داخل table or view كالاتي Emp_rec emp%rowtype; في المثال اعلاه نلاحظ اننا قمنا بتعريف متغير emp_rec من نوع سجل الجدول emp أي ان المتغير emp_rec سوف يكون سجل يحوي كل الحقول الموجوده في الجدول Emp , ونستطيع التعامل معه مثله مثل المتغير emp_rec المعرف في المثال الاول . لماذا نستخدم الطريقه الاولى اذا كانت الطريقه الثانية تعطي نفس الشي الطريقه الثانية سوف تعرف سجل emp_rec يحوي كل حقول الجدول emp و في بعض الاحيان نحن نحتاج الى بعض الحقول وليس الكل لذلك نستخدم الطريقه الاولى . PL/SQL table هو يشبه الـ PL/SQL Record غير انه يحوي اكثر من سجل أي انه يشبه الـ Tow dimension Array فهو يشبه الجدول الذي يحوي اكثر من سجلمثال:افرض انك تحتاج الى خزن بيانات اكثر من موظف في متغير أي انك تقوم بخزن سجلات الموظفين في متغير ومن ثم معالجتها . declare type employees is record ( empno number(5) ,ename varchar2(20) ,mgr number(5) ,job varchar2(20) ,sal number (5) ,hiredate date ,deptno number(3) ); type emp_table is table of employees index by binary_integer; emp_array emp_table; c integer:=0; begin for i in ( select empno, ename , mgr , job , sal , hiredate , deptno from emp) loop c:=c+1; emp_array(c).empno:=i.empno; emp_array(c).ename:=i.ename; emp_array(c).mgr:=i.mgr; emp_array(c).job:=i.job; emp_array(c).sal:=i.sal; emp_array(c).hiredate:=i.hiredate; - end loop; for i in 1 .. 5 loop dbms_output.put_line(emp_array(i).empno ||' ' || emp_array(i).ename || ' ' ||emp_array(i).mgr ||' ' ||emp_array(i).sal || ' ' ||emp_array(i).hiredate ||' ' ||emp_array(i).deptno); end loop; end; / في المثال اعلاه قمنا1- تعريف pl/sql record2- تعريف pl/sql table من نوع الـpl/sql record المسمى employees3- تعريف متغير emp_array من نوع الtable المسمى emp_table ثم قمنا بتعبئة سجلات هذا المتغير باستخدام الـCursor ومن ثم طباعه خمسه سجلات من المتغير emp_array اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
arab20002000 بتاريخ: 8 فبراير 2004 تقديم بلاغ مشاركة بتاريخ: 8 فبراير 2004 مشكور على الدروس اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
zedan بتاريخ: 18 فبراير 2004 تقديم بلاغ مشاركة بتاريخ: 18 فبراير 2004 اسلام عليكماخ خالد لو سمحت ممكن تحط الدروس في ملف عشان اقدر انزله على جهازي و اقراه و اطبقهجزاك الله الف خير و كثر من امثالكشكرا اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
TAREK ALHAMAD بتاريخ: 18 فبراير 2004 تقديم بلاغ مشاركة بتاريخ: 18 فبراير 2004 يا أستاذ خالد أسلوبك فى الشرح غاية الروعة والجمال كما أنك تطرقت لاصعب مواضيع الاوراكلفارجو منك الاكمال بالله عليك أكمل اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
عمر باسلم بتاريخ: 21 فبراير 2004 تقديم بلاغ مشاركة بتاريخ: 21 فبراير 2004 جزاك الله خيرا متعه في طريقة دروسك ونرجو منك المحافظه على القمةوالسلام عليكم ورحمة الله وبركاته والله الموفق اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
TAREK ALHAMAD بتاريخ: 21 فبراير 2004 تقديم بلاغ مشاركة بتاريخ: 21 فبراير 2004 يا أستاذ خالد أتمنى ان تكمل الدروس لاحتياجى اليها جدا اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
khaled بتاريخ: 22 فبراير 2004 كاتب الموضوع تقديم بلاغ مشاركة بتاريخ: 22 فبراير 2004 تحياتي لكم جميعاً وكل عام وانت بخير اخواني الاعزاء اعتذر عن التأخر في تكملة دروس الـpl/sql وذلك لانشغالي , وكما تعلموا ان المشكله لدي هو عملية الكتابه لانها تأخذ الكثير من الوقت ولكني اعدكم بان اكمل انشاء الله بقية المواضيع في اقرب وقت , وشكراً لاهتمامكم اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
شبيــــه الريح بتاريخ: 25 فبراير 2004 تقديم بلاغ مشاركة بتاريخ: 25 فبراير 2004 شكرا لك اخي العزيز خالدوالله يعينك على اشغالكعندي اقتراح اتمنا النظر إليةالى وهو تقسيم الدروس على مواضيعيعني كل درس في موضوعلأسباب عديدة1- نستطيع مناقشه كل درس على حده2- سهولة الرجوع إلى درس معين3- لكي لا يصبح الموضوع متعدد الصفحات وهذى يجعله صعب القراءه...وسوف احاول ان اكمل ماقد بدائت بهوذلك حسب الوقت المتاحتحياتي لكشبيـــــــــه الريح اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
khaled بتاريخ: 25 فبراير 2004 كاتب الموضوع تقديم بلاغ مشاركة بتاريخ: 25 فبراير 2004 شكراً لك اخي شبيه الريح على الاقتراحات وجزاك الله الف خير وياريت تبداء في اكمال الباقي لان الاخوه منتظرين من فتره , وانا لم ستطيع ان اكمل نتيجه لضغط العمل .وانشاء الله سوف اساعدك بقدر ما امكن حسب الوقت . اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
eihab2000e بتاريخ: 16 مارس 2004 تقديم بلاغ مشاركة بتاريخ: 16 مارس 2004 شكرا لك سيدي اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
sammerjo بتاريخ: 25 مارس 2004 تقديم بلاغ مشاركة بتاريخ: 25 مارس 2004 تحياتي أخ خالد ...والله يعظيك الف عافية وانا بإنتظار الدرس الثالث بفارغ الصبر .... SammerJo اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
ibrahimdh بتاريخ: 30 مارس 2004 تقديم بلاغ مشاركة بتاريخ: 30 مارس 2004 جزاك الله خيرا اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
المعــــاري بتاريخ: 19 أبريل 2004 تقديم بلاغ مشاركة بتاريخ: 19 أبريل 2004 شكرا الاخ khaled على هده الدروس الثمينه وبارك الله فيك لو انها متأخره لاكني انا عضوا جديد ونريد المزيد من هده الدروس المفيده وجزاك الله عنا خيرا اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
المعــــاري بتاريخ: 19 أبريل 2004 تقديم بلاغ مشاركة بتاريخ: 19 أبريل 2004 جزاك الله خير اخي khlaled وبارك الله فيك ونحن بانتظار بقيه الدروس وجزاء الله خيرا جميع القائمين على تطوير هدا المنتدى وانشاء الله ادا نملك شيء لانبخل عليكم والله ولي التوفيق اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
abdalla بتاريخ: 24 أبريل 2004 تقديم بلاغ مشاركة بتاريخ: 24 أبريل 2004 جزاك الله خيراً ووفقك الى ماتحبه ويرضاه رب العالمين اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
saadaburezk بتاريخ: 22 مايو 2004 تقديم بلاغ مشاركة بتاريخ: 22 مايو 2004 ربنا يبارك فيك ياشيخ ويكثر من امثالك.... استمراخوك عبد المعبود ابورزق من مصر اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
Recommended Posts
انضم إلى المناقشة
يمكنك المشاركة الآن والتسجيل لاحقاً. إذا كان لديك حساب, سجل دخولك الآن لتقوم بالمشاركة من خلال حسابك.