الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

درس في ADO.NET 2005

مثبّترائج
بدأه yaseralshikh في 31 يوليو 2006 · 202 رد · 80,577 مشاهدة · في ADO.NET
مشاركة: واتساب X فيسبوك تيليجرام
#51

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

وبه أبدا وأستعين ، وأختم بالصلاة والسلام على خاتم الأنبياء والمرسلين ، أما بعد ..

اعتذر على الانقطاع ..

اشكر الجميع على المتابعة ..

اقدم اليوم شرح مختصر للإستفسارات التي طلبها أخي محمد ...

1- هذا الكود :

ds2.Tables("TheBankAndData").Rows.Count

يعطينا عدد السطور ( السجلات ) في الجدول الذي أسميناه TheBankAndData .

2- هذا الكود :

ds2.Tables("TheBankAndData").Rows(0)("ask")

يعطينا القيمة المخزنة في الصف ( الأول ) رقم صفر الموجوده في الحقل Ask من الجدول TheBankAndData ، كما ذكرت تماماً .

3- هذا الكود :

Dim maxIdCommand As OleDbCommand = New OleDbCommand("SELECT MAX(id) AS MaxID FROM thebank ", cn)
Dim maxId As Object = maxIdCommand.ExecuteScalar() + 1

في السطر الأول قمنا بالتصريح عن متغير من نوع Command واسميناه maxIdCommand ، وجملة الاستعلام التي سوف يقوم بتنفيذها هذا الامر ما هي إلا استخراج أكبر قيمه في الحقل ( العمود ) ID والذي طلبنا من جملة الاستعلام تغيير اسمه مؤقتاً إلى MaxID وذلك بستخدام عبارة AS . والسبب في تغيير الاسم هنا هو نوع من الترف بمعنى انه غير مهم إلا انه للتوضيح ليس أكثر ..

وفي السطر الثاني قمنا بالتصريح عن متغيير من نوع Object وأسميناه maxId ، والهدف منه هو أن نخزن فيه القيمه التي سوف يعود بها الأمر maxIdCommand وهي هنا عباره عن رقم بالطبع وذلك بستخدام الخاصية ExecuteScalar التابعة للأمر maxIdCommand و التي تعيد لنا قيمة واحده ، ومن ثم نضيف عليه رقم 1 . والهدف من كل ذلك ، انه عندما نحفظ سجل جديد في الجدول الأب TheBank ينشئ بشكل أوتوماتيكي رقم جديد في الحقل ID ( لاننا عندما صممنا قاعدة البيانات بواسطة برنامج الأكسس طلبنا ذلك للحقل ID ) وهذا الرقم يزيد عن الرقم الذي يسبقه بواحد ، ولكي نربط السجل الجديد في الجدول الأب بالسجل الجديد في الجدول الإبن Data ، لا بد أن يحمل السجل الجديد في الجدول الإبن نفس الرقم المذكور أنفاً ( الرقم ألأُتوماتيكي ) ، ولكي نفعل ذلك جعلنا البرنامج يقرأ لنا أكبر رقم في الحقل ID الموجود في الجدول الاب ويضيف عليه 1 ومن ثم عند حفظ سجل جديد في الجدول الابن يقوم بتخزين الرقم المخزن في maxId في الحقل ID التابع للجدول الابن .

ومن المهم التنبيه إلى أن هذه الطريقه غير مجديه في حالة الرقم الذي ينشأ بشكل أوتوماتيكي ، فلقد سببت لي الكثير من الصداع بسبب الاخطاء التي قد تنتج عنها ، فلو حفظنا خمس سجلات جديده وحذفنا واحد منها سوف يصبح أكبر رقم في الحقل ID هو الرقم أربعة ، وفي حالة الرغبه في إظافة سجل جديد و طبقنا هذه الطريقة أنظر ما ذا سوف يحدث : الامر maxIdCommand سوف يرجع لنا بالعدد 4 والمتغير maxId سوف يعود لنا بالرقم 4+1 يعني 5 ، وعند إضافة سجل جديد للجدول الأب سوف يوجد رقم بشكل أوتوماتيكي للحقل ID وهو الرقم 6 ، وعند إضافة سجل جديد للجدول الإبن سوف يخزن القيمة المخزنه في maxId وهي الرقم 5 ، وبذلك لن يرتبط هاذين السجلين في الجدولين ببعظهما . لذلك قمت بالتغلب على هذه المشكلة في المشاركة رقم 30 أو يمكنكم تحميل الملف المرفق في المشاركة رقم 48 والإطلاع على الكود ودراسته .

4- هذا الكود :

InsertCommand.Parameters.AddWithValue("?", txtask.Text)

قبل التحدث عن هذا الكود يجب أن نتطرق لما قبله كي نكون صوره واضحة ، لقدصرحنا عن متغير من نوع Command وأسميناه InsertCommand وهو لإظافة سجل جديد وفي جملة الإستعلام حددنا الحقول التي سوف تضاف لها معلومات جديده وكان من ظمنها الحقل Ask ، وحددنا أيضا البيانات المضافة لهذه الحقول ورمزنا لها بالرمز ? على الترتيب والتوالي ( بحيث الاستفهام الأول للحقل الأول والثاني للثاني وهكذا .. ) . وبعد ذلك استدعينا الخاصية Parameters للأمر InsertCommand وطلبنا الخاصية AddWithValue للخاصية Parameters وحددنا انه مكان الرمز ? نخزن القيمة الموجوده في مربع النص txtask .

5- هذا الكود :

InsertCommand.ExecuteNonQuery()

تجعل هذه الخاصية ( ExecuteNonQuery ) الأمر InsertCommand ينفذ جملة الإستعلام المطلوبه منه ، والتي هي ليست استفساراً .

6- هذا الكود :

maxIdCommand.Dispose()

هذا الأمر( Dispose ) يتخلص من المتغير maxIdCommand لأننا لم نعد نحتاجه . يعني اننا نستخدمه في حالة رغبتنا في عدم استخدام شيئ كي لا يحتل جزء من الذاكره بدون طائل .

أرجو أن أكون وضحت الأمور ولم أزدها غموضاً ..

ان أخطأت فمن نفسي والشيطان وإن أصبت فبتوفيق الله ، والحمد لله ...

تم تعديل هذه المشاركة بواسطة yaseralshikh في 12 سبتمبر 2006 في 22:53

1 - سقوط الإنسان ليس فشلاً ، ولكن الفشل أن يبقى حيث سقط .

2 - الفاشلون قسمان : قسم فكر ولم يفعل ، وقسم فعل ولم يفكر .

-------------------------------------------------------

درس في ADO.NET 2005, التعامل مع الجداول المترابطة في ado.net 2005

درس في الإجراءات الفرعية ( العامة )

درس في ADO.NET من الصفر إلى الإحتراف .

#52

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

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

ولكن لدي بعض الملاحضات التي قد تفيدكم كثيراً جداً .

أولاً .

عرف متغير الـ Dataset ومتغير الـ DataAdapter وكائن الإتصال على مستوى الفورم .

ثانياً .

بالنسبة لكود الإضافة أفضل أن تستخدم الكود التالي :

me.BindingContects.Tables("EMP").addnew()

ولا يحتاج لعمل Clear لكل النصوص .

فقط هو سيقوم بإنشاء سجل جديد .

طبعاً في البداية وقبل الإكمال انا الآن بأعمل من مقهى إنترنت ولا يوجد VB.NET منصب هنا بالجهاز لذلك أخاف أنك ستجد بعض الأخطاء الإملائية في الأكواد لذا أعذرونا .

وبالنسبة لكود الحفظ فمافي أسهل منه وهو كالتالي وشوف كديش صغير ! ;)

dim dCom as new OledbCommandBuilder(daEmp) 

daEmp.InsertCommand = dCom.GetInsertCommand() 
daEmp.UpdateCommand = dCom.GetUpdateCommand()
daEmp.DeleteCommand = dCom.GetDeleteCommand() 

me.BindingContects.Table("EMP").EndCurrentEdit()

daEmp.Update(DsEmp,"EMP")
dsEmp.Tables("EMP").Clear()
daEmp.Fill(DsEmp,"EMP")

لاحظ كيف الكود صغير :o

طبعاً إن شاء الله حأحاول أن أنشيء مثال بسيط جداً وأرفق شرحه لكم قريباً .

على فكرة .

مهارة إستخدام Dataset و DataAdapter تعود إلى مدى فهمك لها .

فحاول أن تفهمها جيداً .

وبالنسبة لكود التراجع عن عملية الإضافة أو التعديل فهي بسيطة جداً .

dsemp.Tables("EMP).CancelCurrentEdit()
dsemp.Tables("EMP).Clear()
daEmp.Fill(dsemp,"EMP")

وبالنسبة لكود الحذف فهو الكود المحبوب بالنسبة لي . :D

dsemp.Tables("EMP").RemoveAt(me.BindingContects.Table("EMP").Position) 
dsemp.Tables("EMP).Clear()
daEmp.Fill(dsemp,"EMP")

نفع الله بكم أمة الإسلام والمسلمين . آميـــــــــــــــــــــــــن .

#53

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

اخي الحبيب إبراهيم بخش ..

فعلااً أختصار الكود مهم جداً وبالذات في البرامج الكبيره ، وانا أنادي بذلك منذ بداية الدرس ..

اشكرك على الملاحضات التي ذكرتها ، فهي ما نبحث عنه ونريد التحدث والمناقشة فيه ..

واتمنى من الأخوان أن يشاركو معنا ، في تطوير الكود والوصول إلى أفضل طريقة للتعامل مع قواعد البيانات ..

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

1 - سقوط الإنسان ليس فشلاً ، ولكن الفشل أن يبقى حيث سقط .

2 - الفاشلون قسمان : قسم فكر ولم يفعل ، وقسم فعل ولم يفكر .

-------------------------------------------------------

درس في ADO.NET 2005, التعامل مع الجداول المترابطة في ado.net 2005

درس في الإجراءات الفرعية ( العامة )

درس في ADO.NET من الصفر إلى الإحتراف .

#54

جزاك الله خير جزاء أخانا الأستاذ ياسر

وهذا إن دل على شيء فعنإنما يدل على حرصك على نشر العلم ونفع أمتك والرقي بها أسأل الله أن يحقق لك آمالك .

وأشكرك كثيراً على حسن الشرح .

لقد واجهتي مشكلة في الإصدار الأخير من برنامجك والإصاد الأول أضياً ، وهي عندما أضغط على زر طبعاً بعد تشغيل البرنامج Show Crystal Report يظهر لي خطأ في لكود ؟ إليك صور الأخطاء على الروابط التالية :

http://www.uparab.com/files/WhNcMS2NWT9MZkXM.jpg

http://www.uparab.com/files/x6WhwLPzS5i1wVgJ.jpg

وإزا أوقفت التشغيل وذهب إلى الـ Solution Explorer ، ثم ضغطت على Form2.vb تظهر لي الشاشة التالي:

http://www.uparab.com/files/H1wA08LwQVz28bqM.jpg

وأشكرك مرة أخرى والسلام عليكم

والسلام عليكم

#55

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

أخي محمد ..

من المؤسف أن الشروع لم يعمل لديك ، وفي الحقيقة أنا لا أعلم سبب هذه الأخطاء ، ربما لم يتم فك ضغط الملف المرفق لديك بشكل جيد ، أو أنه لديك مشكله في نسخة vb.net2005 لا أدري ، لكن من الصور التي أرفقتها جمع الشكوك تشير إلى الفورم 2 واداة عرض التقرير وملف التقرير نفسه ، حاول فك ضغط البرنامج مرة أخرى ، أو حاول فتح مشروج جديد واعداد الادوات فيه ونقل الكود من المشروع المرفق إلى مشروعك الجديد . لاني قمت بفط ضغط المشروع عندي وعمل بشكل جيد ، بل أني قمت بتحميله من الرابط وفكيت ضغطه وعمل معي بشكل جيد . لذلك أنا استبعد وجود مشكله في المشروع المرفق ..

حاول وانا لن ارتاح حتى تجد حل لمشكلتك ..

أو ارسل لي مجلد المشروع الذي لم يعمل عندك كي أجربه عندي مرة أخرى ..

كما اريد من الأخوان افادتنا فيما إذا كان المشروع قام بالعمل عندهم بدون مشاكل ..

1 - سقوط الإنسان ليس فشلاً ، ولكن الفشل أن يبقى حيث سقط .

2 - الفاشلون قسمان : قسم فكر ولم يفعل ، وقسم فعل ولم يفكر .

-------------------------------------------------------

درس في ADO.NET 2005, التعامل مع الجداول المترابطة في ado.net 2005

درس في الإجراءات الفرعية ( العامة )

درس في ADO.NET من الصفر إلى الإحتراف .

#56

بالنسبة للـ DataRelation فإنها بسيطة جداً .

والموظوع شيق نوعاً ما .

وهو كالتالي : -

أولاً بالنسبة لكائن الـ DataSet يجب إنشاءه يدوياً ويحوي على البنية الأساسية للكائنات في قاعدة البيانات وهو ما أقوم بعمله دائماً .

تقوم بإنشاء DataRelation وتحدد الجدول والحقل الأب والجدول والحقل الإبن في المتغيرات التي تمررها عند إنشهائه طبعاً حيقول أحد الأعضاء الكرام فين تقوم بإنشائه :blink: !

اقوله هنا .

dsEmp.Relations.Add("RelDeptEmps","DEPT.DEPTNO","EMP.DEPTNO")

' ومثلاً يكون عندنا داتا جريد نعبيها من البيانات التي تنتج عن هذه العلاقة من جدول الموظفين . 

DgEmployees.DataSource = dsEmp.Relations("RelDeptEmps")
'طبعاً إذا كان في   TableStyle لازم تخلي MappingName  الخاصة بها إلى EMP

أما بالنسبة للترقيم التلقائي فهناك يا أخي الكريم أكثر من طريقة وهي كالتالي :

أولاُ بالنسبة للأوراكل والـ SQLServer فتقوم بإنشاء Trigger على مستوى الجدول يقوم عند إضافة سجل جديد بوضع القيمة التلقائية في الحقل .

وطبعاً يفيدك في الأوراكل أن تنشيء Sequnces .

وطبعاً بالنسبة للآكسيس فتقوم بإستخدام الكود التالي عند الضغط على زر الإضافة :

con.open 
dim dc as new oledbCommand("Select Count(*) From Emp",con)
dim RecCount as Integer = dc.ExecuteScaler
if RecCount = 0 then 
  RecCount = 1 
Else
 dc.Dispose 
 dc = new oledbCommand("Select Max(Empno) From Emp",con)
 RecCount = dc.ExecuteScaler
 RecCount =+ 1
End IF
con.close
Empnotxt.Text = RecCount

طبعاً يا أخوان انا كتبت هذا الكود من مقهى إنترنت لذلك أرجو أن لا يكون في أي أخطاء إملائية .. :wacko:

ولكن أرجوا أن تكون الفكرة وصلت .

تم تعديل هذه المشاركة بواسطة إبراهيم بخش في 14 سبتمبر 2006 في 21:12

#57

حضرة المهندس ياسر :

أشكرك كتير كتير على هالموضوع وعلى هاي الردود ياللي تفتح النفس ، الله يجزيك عني وعن الشباب خيراً .

004.gif

2_asmilies-com.gif

وبصراحة استفدت منها كتير كتير ، وماني عارف شلون رد لإلك ها الجميل ولكن حسبي بالدعاء لك في ظهر الغيب بأن الله يوفقك ويحقق لك آمالك .

بالنسبي لإظهار التقرير ، ( الخطأ اللذي كلمت عليه ) ، الظاهر إنو زي ما قلت حضرتك الإصدار ياللي عندي في فيجوال بيسك هوي Express وهو أخس إصدار مانو بروفيشينال ، وبصراحة أنا دورت بكل المحلات عنا وما لقيت ، والمشكلي إنو ما لقيت رابطو في الإنترنيت 029.gif على كل حال ، ما تشغل بالك بهالموضوع ، أنا رح طالعو من تحت الأرض036.gif .

حضرة الأستاذ ياسر الشيخ :

أنا مستحي كتير منك مشان كترت عليك الأسئلي... بس يداك أوكتا وفوك نفخ 027.gif إنتي ياللي شجعتني على هيك 014.gif

1- ممكن تشرح الكود التالي وشو فائدتو ؟؟؟ وليش ما حطيت قبلو Me زي ما حطيت في الأكواد ياللي بعدو ومن نفس النوع ؟

BindingContext(MyDataView).Current("id")

2- وهاد كمان شو عملو ؟؟ وشو معنات IdValue ؟؟؟

MyDeleteRecord("thebank", "id", IdValue)

3- وهادا معاهم :

ErrorProvider1.Clear()

008.gif

حضرة المهندس ياسر :

شلون نقدر إنو نضيف الأداة DataGdidView إلى المشروع وندير البيانات من خلالها .

لقد حاولت وقرأت كثيراً لكي أضيفه في هذا الموضوع ، ولكن لم أجد حلاً إلا عن طريق Data Gonfigration Winzard يعني بدون استخدام أي كود برمجة . أرجو أن تتفضل علينا وتفيدنا وجزاك الله خير ا.

005.gif

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

#58

الأستاذ القدير ياسر الشيخ

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

بارككم الله جميعاً

وأريد أن أشارك بطرح الأسئلة لأنني لست خبيراً في البرمجة بالفيجوال نت فهل يمكن أن أجد إجابة عن مدى إمكانية البرمجة الجاهزة بوحدات التحكم الخاصة بـ ADO.NET بحيث تتشابه وما هو لدى ADODC في الفيجوال بيسك 6 حيث يتم ربط كل TEXTBOX على FORM بحقل من حقول ملف البيانات وعند ضغط زر الأمر الخاص بالحفظ يتم إصدار أمر واحد فقط وهو ADODC1.RECORDSET.UPDATE فيتم حفظ البيانات الموجودة في صناديق النص ووحدات التاريخ وغيرها المرتبطة بملف قاعدة البيانات في الجدول المرتبط بها .

لا أدري هل سؤالي واضح أم أنه يشوبه الغموض فأزيده تفصيلا .

رجائي أن أجد الإجابة وجزاكم الله عنا كل الخير :D

#59

أخي الفاضل عمران هي في الحقيقة كذلك !

بالإضافة لتطوير لعمل ADODC .

مثلاً عندنا لعمل حفظ فقط نقوم بالتالي :

da.Update(ds,"EMP")

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

#60

أستاذ إبراهيم بخش

لك شكري وتقدير على الرد ولكن هل من مزيد من الايضاح فقد كنا في ADODC نحدد جدول البيانات وقاعدة البيانات في خصائص الأداة أما الآن وحسب ما هو مذكور أعلاه فإن تعريف قاعدة البيانات والجدول يتم عن طريق الكود فقط !!! كما أنه لدي سؤال آخر هو كيف يمكنني تغيير بما كان يسمى RecordSource في ADO.NET عن طريق الكود بحيث يعرض فقط السجل أو السجلات التي ينطبق عليها الشرط المذكور في جملة Select فقط ويتم عرض البيانات الناتجة في أدوات TextBox المحددة سلفاً أرجو أن تغفر لي( Not خفة الدم ) ودمت لنا أستاذاً ودام لنا المنتدى منبراً للتعلم والتعليم وجزاك الله خيراً .

#61

آسف للتأخير على الرد أخي العزيز ،، في الحقيقة لقد تغيبت عن المنتدى لمدة طويلة وأخشى أنني سأظل كذلك خلال الأيام القادمة لقدوم ضيف عزيز على قلوبنا جميعاً رمضان كريم من طيبة الطيبة إلى أرجاء المعمورة وكل عام وأنتم بأحسن الأحوال .

والآن بالنسبة لسؤالك عن الــ RecordSource ، أريدك الآن أن تنسى كل ماتعرفه عن الــ ADO وتبدأ معي بفهم الأسطر البسيطة التالية :

أولاً لدينا في الــ ADO.NET عملية الإتصال بقاعدة البيانات نوعان وضع منفصل ووضع متصل ، ولن أتطرق إلى شرحها ولكن أعطيك أفضل طريقة مما فهمته أنك تريد إستخدام الوضع المنفصل . أي أنك تستخدم كائن ويسمى Dataset وتقوم بتعبئته من البيانات من قاعدة البيانات ومن ثم تربط الكائنات التي لديك على الشاشة من قوائم وعناصر TextBox وغيرها من كائن الــ DataSet و تقوم بالتعديل على البيانات الموجودة في الــ DataSet وكل ذلك وأنت غير متصل مع قاعدة البيانات وعند رغبتك في حفظ التعديلات تقوم فقط بالضغط على زر الحفظ الذي يقوم بإعادة الإتصال تلقائياً بقاعدة البيانات وحفظ التغييرات .

طيب يتبقى لدينا هنا أهم شيء وهو كيف نقوم بتعبئة كائن الــ DataSet أساساً بالبيانات من مصدر البيانات مثلاً أوراكل أو SqlServer أو Access ؟

:P

سؤال بديهي والإجابة هي :

نستخدم هنا كائن نسميه Connection وهذا الكائن يقوم بتمثيل مصدر البيانات وبما أن لديك الخبرة أستطيع أن أقول لك ببساطة تحدد في هذا الكائن الــ (Connection String ) الذي تريده للإتصال وهو يقوم بالإتصال :o طبعاً إذا توفر خادم الإتصال أساساً :o وتستطيع إستخدام هذا الكائن لمعرفة حالة الإتصال وخصائص أخرى بالإضافة إلى بعض الطرق التي تمكنك مثلاً من التخلص من هذا الإتصال في حالة عدم رغبتك لبقاء هذا الإتصال في جزء معين من برنامجك لأنك طبعاً تريد التخفيف من الحمل على الذاكرة .

ونستخدم كائن يسمى DataAdapter ويمثل هذا الكائن حلقة الوصل بين مصدر البيانات والكائن المسمى بالــ DataSet .

أي أنه في جزء واحد فقط من البرنامج نقوم بفتح الإتصال وإستخدام هذا الكائن لتعبئة الــ DataSet ومن ثم نقوم بإغلاق الإتصال .

والآن في أي جزء آخر من البرنامج كل ماعلينا فعله مثلاً للتعامل مع مصدر البيانات من مثلاً عمليات حفظ أ و إعادة تعبئة هو إستخدام هذا الكائن ولا حاجة لإعادة فتح وإغلاق مصدر البيانات " كائن الـ Connection " حيث أنه يقوم بذلك ضمنياً لأنه تعرف على كائن الإتصال الذي سيستخدمه للإتصال بمصدر البيانات ولا ضير في إعادة الإتصال يدوياً .

أما كائن الــ DataSet فهي بكل هدوء تمثل جزء من الذاكرة تستخدم لحفظ البيانات على مستوى العميل وذلك للقيام بعمليات المعالجة عليها وتستحق الذكر حيث أنه من أهم عمليات المعالجة التي يدعمها هذا الكائن أو بالأحرى ADO.NET هي الــ XML حيث تدعم لك إستخدام مايسمى بربط ونشر البيانات على الإنترنت مع مصادر بيانات آخرى .

طبعاً أرجو أن تكون قد إتضحت الصورة :blink: .

فلنأخذ مثال على ماذكرناه بالأعلى .

نقوم بإنشاء Module وكتابة السطر التالي في أول الصفحة :

Imports system.data.oledb

نعرف هذه الكائنات على مستوى البرنامج .

Public Con as OledbConnection 
Public ConnectionString as String
Public Sql as String 
Public daEmployees as OledbDataAdapter 
Public ds as DataSet

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

Sub GetConnection ()
ConnectionString = "تكتب هنا نص الإتصال بمصدر البيانات"
 Try
   Con = New OleDbConnection (ConnectionString)
   Con.Open()
   Sql = "Select * From Employees"
   daEmployees = new OledbDataAdapter(sql,Con)
   ds = new DataSet 
   daEmployees.Fill(ds,"EMPLOYEES")
 Catch Ex as exception 
   messagebox.show(ex.message,"Error in GetConnect:")
 Finally 
  Con.Close()
 End Try
End Sub

طبعاً لازم تحدد نص الإتصال كما تريد .

هكذا قمنا بفتح الإتصال وتعبئة الكائن المسمى بالــ DataSet

مثلاً الآن نجي على الفورم المسمى مثلاً EmployeesFrm

إذهب إلى الكود الخاص بإنشاء نسخة جديده من الفورم في الذاكرة وأكتب التالي :

GetConnection()
EmpIdtxt.DataBindings.add("Text",ds,"EMPLOYEES.EMP_ID")
EmpNametxt.DataBindings.add("Text",ds,"EMPLOYEES.NAME")
EmpAddress.DataBindings.add("Text",ds,"EMPLOYEES.ADDRESS")

وشغل البرنامج وشوف النتيجة .....

طبعاً للأفس الشديد أنه الآن ماهو نازل عندي Visual Basic . NET وله كان سويت مثال وأرفقته لكم .

ولكن أطلب من بقية الأعظاء أو ممن لديه القدرة على عمل مثال ، على عمل مثال وإرفاقه للفائدة للجميع .. ... ;)

وفي النهاية إن أصبت فهذا من توفيق الله لي وإن أخطأت فمني ومن الشيطان .

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

(h)

#62

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

أخي محمد انا متأسف جداً على التأخير .. لي مده اشاهد الجهاز ولا اجد له وقت مناسب ..

اقدم لك اليوم الاجابه على اسئلتك ..

UpdateCommand.Parameters.AddWithValue("?", _ Me.BindingContext(MyDataView).Current("id"))

هذا الكود .. يستخرج لنا القيمة الحالية الموجودة في الحقل ( العمود )ID ، والهدف رفعها بواسطة Parameters ( التابع للأمر UpdateCommand) إلى جملة الاستعلام التي سوف تقوم بحفظ التعديلات التي قام بها المستخدم . وذلك بعد تنفيذ الإجراء UpdateCommand.ExecuteNonQuery() .

أما سؤالك عن عدم استخدامي للعبارة Me هنا وعدم استخدامي لها في مواضع أخرى ، الجواب لا يوجد هنا سبب وجيه ، وبماأننا نعمل في نفس الفورم يمكننا كتابتها أو الإستغناء عنها ، فهي مثل تعاملنا مع مربع النص ، في العادة نكتب :

Text1.text="Ok"

ويمكننا كتابته كما يلي :

Me.Text1.text="Ok"

MyDeleteRecord("thebank", "id", IdValue)

هذا الكود عباره عن إجراء فرعي له ثلاث متغيرات ، اسم الجدول ، واسم العمود والقيمه الحالية للصف الحالي في هذا العمود . وقمت بكتابته حتى أختصر الكود وهو يقوم بحذف سجل من الجدول"thebank" ولكي نحدد هذا السجل حددنا العمود "id" والذي يحمل القيمة IdValue ، ونحصل على هذه القيمه من خلال الكود التالي :

Dim IdValue As String = BindingContext(MyDataView).Current("id")

بعد ذلك يتنفذ الاجراء التالي :

	Private Sub MyDeleteRecord(ByVal TABLE As String, ByVal FIELD As String, ByVal MyValue As String)
		On Error Resume Next
		Dim SQL As String = ""
		SQL = "DELETE FROM " & TABLE & " WHERE " & FIELD & "=?;"
		Dim CMD As OleDbCommand = New OleDbCommand
		CMD.CommandType = CommandType.Text
		CMD.Connection = cn
		If cn.State = ConnectionState.Open Then cn.Close()
		cn.Open()
		CMD.CommandText = SQL
		CMD.Parameters.AddWithValue("?", MyValue)
		CMD.ExecuteNonQuery()
		cn.Close()
		'Dispose Declare local variables and objects
		CMD.Dispose()
	End Sub

أما ErrorProvider1.Clear() أنا أضفت ErrorProvider للمشروع وذلك للتنبيه عن الأخطاء التي تصدر من المستخدم مثل ترك مربع نص فارغ وطلب الحفظ وفي حالة الرغبة في إبعاد التنبيه عن ErrorProvider نقوم بكتابة هذا الكود المذكور .

أما DataGdidView فلقد كتبت عنه في المشاركة رقم 1 ، وفي الحقيقة لم أتعمق في التعامل معه وتعاملي معه إلى الآن سطحي مع العلم أن التعامل معه سهل إلى حد ما ، وعلى العموم في حالة اكتمال ألصوره لدي سوف اطرح ما توصلت عليه ، مع العلم أن المنتدى يحمل الكثير من المشاركات التي تتحدث عنه ويمكننا البحث ، والموضوع للنقاش فمن يستطيع شرحه بشكل احترافي ومكثف فليتفضل مشكوراً .

اخي omran555 أنا متأسف جداً لأني لم أفهم قصدك جيداً ..

ولكني أرجو أن يكون في مشاركتي التالية ما يرضيك ، ويوصلك لما تريد ..

1 - سقوط الإنسان ليس فشلاً ، ولكن الفشل أن يبقى حيث سقط .

2 - الفاشلون قسمان : قسم فكر ولم يفعل ، وقسم فعل ولم يفكر .

-------------------------------------------------------

درس في ADO.NET 2005, التعامل مع الجداول المترابطة في ado.net 2005

درس في الإجراءات الفرعية ( العامة )

درس في ADO.NET من الصفر إلى الإحتراف .

#63

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

وبه أبدا وأستعين ، وأختم بالصلاة والسلام على خاتم الأنبياء والمرسلين ، أما بعد ..

اعتذر على الانقطاع ..

اشكر الجميع على المتابعة ..

واستغل هذه المناسبة كي أهني كل الأصدقاء والأخوان في هذا المنتدى الحبيب بقدوم شهر رمضان المبارك ، فكل عام وأنتم بخير ، وتقبل الله منا ومنكم شهر شعبان ، وبلغنا وبلغكم شهر رمضان .. أمين ...

*******************************************

أخي الحبيب إبراهيم بخش ..

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

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

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

البداية :

لنفرض أن لدينا قاعدة بيانات اسمها Employee.MDB بها جدولين الأول اسمه Emp1 ويوجد به الحقلين "ID,Name" حيث أن ID من نوع الترقيم التلقائي و Name من نوع النص ، والجدول الثاني اسمه Emp2 ويوجد به الحقول "ID,City,Phone,Mobile,Email " حيث أن ID من نوع رقم و City من نوع النص و Phone من نوع النص و Mobile من نوع النص و Email من نوع النص .

بعد ذلك ننشئ مشروع جديد ولنسميه LearnWithMeDatarelation ، ثم نغير اسم الفورم الموجود فيه إلى frmMain ، ثم نضيف للمشروع 6 TextBox وبعد ذلك نسمي كل واحد منها بما يناسب الحقل الذي سوف يرتبط به من قاعدة البيانات وذلك على النحو التالي (txtName,txtCity,txtPhone,txtMobile,txtEmail,txtFind ) . ثم نضيف 5 Labels ليشير إلى مربع النص الذي أمامه وذلك على النحو التالي (lblName,lblCity,lblPhone,lblMobile,lblEmail ) ، ثم نضيف 10 أزرار Button على النحو التالي ( btnMoveFirst للانتقال للسجل الأول + btnMoveNext للانتقال للسجل التالي + btnMovePrevious للانتقال للسجل السابق + btnMoveLast للانتقال للسجل الأخير + btnFind للبحث عن السجلات + btnAdd لإضافة سجل جديد + btnSave لحفظ سجل جديد أو تحديث بيانات مخزنة + btnDelete لحذف سجل + btnExit للخروج من البرنامج + btnCancel لإلغاء عملية الإضافة أو التعديل على البيانات ) ..

وبعد ذلك ننطلق إلى وضع الكود اللازم ..

في البداية نحتاج إلى استدعاء فضاء الأسماء الخاص بقواعد بيانات Microsoft Office Access وذلك بكتابة العبارة التالية في بداية شاشة الكود :

Imports System.Data
Imports System.Data.OleDb

وبعد ذلك نصرح عن بعض المتغيرات الضرورية وذلك تحت العبارة Public Class frmMain :

	' متغير لحفظ نص الاتصال بقاعدة البيانات
	Dim ConnString As String
	' متغير لحفظ نص الاستعلام عن الجداول وهو على شكل مصفوفه وينتج عنه
	'SQL(0) , Sql(1)
	Dim SQL(1) As String
	' متغير من نوع CurrencyManager
	' و الغرض منه هو الابحار و التجول في قيم الاعمدة المرتبطة في خصائص العناصر في النموذج 
	'و يمكن كذلك عن طريقه كل من الاضافة و الحذف و التعديل وكذلك الالغاء.. و التحقق و,,, وكل ما يتعلق بالابحار
	'كالذهاب للصف الاول أو الاخير والسابق أو التالي
	' تم اقتباس الشرح من كلام الأخ الحبيب الغملاسي
	Dim MyCurrencyManager As CurrencyManager
	'متغير كائن الاتصال بقاعدة البيانات
	Dim MyConn As New OleDbConnection
	'متغيرين من نوع موفق البيانات إلى داتاسيت 
	Dim MyDA1 As New OleDbDataAdapter ' خاص بالجدول الاب
	Dim MyDA2 As New OleDbDataAdapter ' خاص بالجدول الابن
	'متغير الربط بين الجدولين من خلال العمودين دوي العلاقه اب وابن
	Dim datarelation As DataRelation
	' متغيرين من نوع عمود لحفظ الاعمدة
	Dim dc1 As New DataColumn ' خاص بالعمود الاب
	Dim dc2 As New DataColumn ' خاص بالعمود الابن
	'متغير من نوع داتاسيت لتخزين الجداول والربط فيما بينها
	Dim MyDS As New DataSet
	'متغير باني الأوامر الاضافة و الحذف و التعديل 
	Dim MYCB As OleDbCommandBuilder
	' متغير للتحكم في مجموعة من عمليات قاعدة البيانات التي يجب أن تعمل كوحدة ، فإما أن تحدث جميع هذه العمليات أو لا يحدث أي منها
	' وذلك حفاظاً على أمن المعلومات
	Dim taTransaction As OleDb.OleDbTransaction

ثم نقوم بعد ذلك بكتابة الكود التالي في حدث frmMain_Load :

		' الاتصال بقاعدة البيانات
		ConnString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Application.StartupPath & "\" & "Employee.MDB" & ";Jet OLEDB:Database Password="
		MyConn.ConnectionString = ConnString
		Try
			'إجراء فرعي يقوم بتعبئة الداتاسيت بالجدولين وإنشاء علاقه بين الجدولين
			FillDataSetAndMakeRelation()
		Catch ex As OleDbException
			MessageBox.Show("OleDB Exception: " & ex.Message, "درس في قواعد البيانات ", MessageBoxButtons.OK, _
			MessageBoxIcon.Information, MessageBoxDefaultButton.Button1, _
			MessageBoxOptions.RtlReading)
		Catch ex As Exception
			MessageBox.Show("General Exception : " & ex.Message, "درس في قواعد البيانات ", MessageBoxButtons.OK, _
			MessageBoxIcon.Information, MessageBoxDefaultButton.Button1, _
			MessageBoxOptions.RtlReading)
		Finally
			MyConn.Close()
		End Try
		'اجراء فرعي لعرض البيانات في التكست بوكس
		ShowData()
		'تجهيز متغير الابحار في قاعدة البيانات وربطه بالجدول الأب
		MyCurrencyManager = Me.BindingContext(MyDS, "Emp1")
		'  اجراء فرعي يقوم بالإخبار عن رقم السجل الحالي من عدد السجلات الكلي وله معاملان هدفهما الامساك بأداة التحكم التي
		' طلبت تنفيذ الإجراء و تحديد الحدث الخاص بها على سبيل المثال النقر على زر الأمر التالي
		DisplayNav(sender, e)

ثم نقوم بإعداد وتجهيز الإجراءات الفرعية التي قمنا بذكرها في الحدث frmMain _Load وهم :-

1- FillDataSetAndMakeRelation :

	Private Sub FillDataSetAndMakeRelation()
		'كتابة نصي الاستعلام عن الجدولين وتخزينهما
		SQL(0) = "Select ID,name from Emp1"
		SQL(1) = "Select ID,City,phone,mobile,Email from Emp2"
		' فتح الاتصال
		MyConn.Open()
		' إفراغ الداتاسيت من الجداول
		MyDS.Clear()
		'الآن تعبئة الجدول الأو وهو الأب وتخزينه في الداتاسيت
		MyDA1 = New OleDbDataAdapter(SQL(0), MyConn)
		MyDA1.MissingSchemaAction = MissingSchemaAction.AddWithKey
		MyDA1.MissingMappingAction = MissingMappingAction.Passthrough
		MyDA1.Fill(MyDS, "Emp1")
		'الآن تعبئة الجدول الثاني وهو الإبن وتخزينه في الداتاسيت
		MyDA2 = New OleDbDataAdapter(SQL(1), MyConn)
		MyDA2.MissingSchemaAction = MissingSchemaAction.AddWithKey
		MyDA2.MissingMappingAction = MissingMappingAction.Passthrough
		MyDA2.Fill(MyDS, "Emp2")
		'  بعد تعبئة الداتاسيت بالجدولين نستطيع معالجتهما في وضع منفصل لذلك سوف نقوم بقفل الاتصال بقاعدة البيانت
		MyConn.Close()
		'تخزين بيانات العمودين الأب والإبن ذوي العلاقة
		dc1 = MyDS.Tables("Emp1").Columns("ID")
		dc2 = MyDS.Tables("Emp2").Columns("ID")
		'تكوين العلاقه بين الجدول الأب والإبن
		Try
			datarelation = New DataRelation("Emp12", dc1, dc2, True)
			MyDS.Relations.Clear()
			MyDS.Relations.Add(datarelation)
		Catch ex As Exception
			MsgBox(ex.Message)
		End Try
	End Sub

2- ShowData :

		' إلغاء ربط مربعات النص بالبيانات
		TxtName.DataBindings.Clear()
		TxtCity.DataBindings.Clear()
		TxtPhone.DataBindings.Clear()
		txtMobile.DataBindings.Clear()
		txtEmail.DataBindings.Clear()
		' ربط مربعات النص بالبيانات
		TxtName.DataBindings.Add(New Binding("Text", MyDS, "Emp1.name")) ' أب
		TxtCity.DataBindings.Add(New Binding("Text", MyDS, "Emp1.Emp12.city")) ' إبن
		TxtPhone.DataBindings.Add(New Binding("Text", MyDS, "Emp1.Emp12.phone")) ' إبن
		txtMobile.DataBindings.Add(New Binding("Text", MyDS, "Emp1.Emp12.mobile")) ' إبن
		txtEmail.DataBindings.Add(New Binding("Text", MyDS, "Emp1.Emp12.email")) ' إبن

3- DisplayNav :

	Private Sub DisplayNav(ByVal sender As Object, ByVal e As EventArgs) Handles BtnDelete.Click, btnFind.Click, ButCancel.Click, ButSave.Click
		' يجب ملاحظة أني قمت بربط أدوات التحكم التي أريد تنفيد هذا الإجراء عند النقر عليها وذلك في السطر السابق 
		lblN.Text = MyCurrencyManager.Position + 1 & " من " & MyCurrencyManager.Count()
	End Sub

بعد ذلك نجهز أزرار الأوامر الخاصة بالإبحار داخل قاعدة البيانات والتنقل بين السجلات ، ويتم ذلك من خلال الكود التالي :-

1- btnMoveLast :

	Private Sub btnMoveLast_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnMoveLast.Click
		MyCurrencyManager.Position = MyCurrencyManager.Count - 1
		DisplayNav(sender, e)
	End Sub

2- btnMoveNext :

	Private Sub btnMoveNext_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnMoveNext.Click
		MyCurrencyManager.Position += 1
		DisplayNav(sender, e)
	End Sub

3- btnMovePrevious :

	Private Sub btnMovePrevious_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnMovePrevious.Click
		MyCurrencyManager.Position -= 1
		DisplayNav(sender, e)
	End Sub

4- btnMoveFirst :

	Private Sub btnMoveFirst_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnMoveFirst.Click
		MyCurrencyManager.Position = 0
		DisplayNav(sender, e)
	End Sub

ولكي نلغي البيانات التي قام المستخدم بتغيرها وقرر التراجع عن ذلك :

	Private Sub ButCancel_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButCancel.Click
		'  الغاء التغيرات التي ادخلها المستخدم
		MyCurrencyManager.CancelCurrentEdit()
		MyCurrencyManager.Position = 0
	End Sub

ثم كما هو معروف للخروج من البرنامج :

	Private Sub BtnExit_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnExit.Click
		End
	End Sub

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

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

http://download.35mb.com/yaser95/LearnWithMeDataRelation.zip

إن أخطأت فمن نفسي والشيطان وإن أصبت فبتوفيق الله ، والحمد لله ...

1 - سقوط الإنسان ليس فشلاً ، ولكن الفشل أن يبقى حيث سقط .

2 - الفاشلون قسمان : قسم فكر ولم يفعل ، وقسم فعل ولم يفكر .

-------------------------------------------------------

درس في ADO.NET 2005, التعامل مع الجداول المترابطة في ado.net 2005

درس في الإجراءات الفرعية ( العامة )

درس في ADO.NET من الصفر إلى الإحتراف .

#64

بارك الله فيكم ... جدهد رائع وفقكم الله

رمضان كريم وكل عام وأنتم بخير

#65

Mail.rarأولا كل العام وجميع مرتادي وزوار والعاملين بالمنتدى بألف خير بمناسة شهر رمضان المبارك أعاده على الأمة الإسلامية باليمن والبركة

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

ثالثاً أرجو المعذرة فإن لدي الكثير من الأسئلة فأرجو ألا تملوا وتتركوا الموضوع

أساتذتي : لقد عملت مثال بسيط لملف بيانات واحد به عدة حقول واستعملت ولم أستخدم أي كود لكتابة الاتصال بل أستخدمت الأدوات الموجود بالفيجوال نت من خلال لوحة التحكم وبالتحديد تم رسم ثلاثة وحدة تحكم على النموذج Form تلقائياً دون تدخل مني وهي ( BindingSource - dataSet - tableAdapter ) وبهذه تم عرض أو سجل في ملف قاعدة البيانات ثم أضفت زر أمر لإضافة سجل جديد وكتبت به الكود التالي :

Me.In_mailBindingSource.AddNew()

حيث أن In_mail هو اسم الجدول الذي أخترته وقد تم إضافة سجل جديد في الداتا سيت ثم استخدمت الكود التالي في حدث الضغط على زر أمر الحفظ كالتالي :

Me.In_mailBindingSource.EndEdit()

Me.In_mailTableAdapter.Update(Me.MailDS.in_mail)

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

المشكلة أنني وقفت هنا ولم أعد أستطيع التقدم وذلك لإتمام عملية البحث التي أتمنى أن تكون وفق التسلسل التالي :

1 - انشاء نموذج جديد به صندوق نص واحد يسمح بإدخال رقم والبحث عن هذا الرقم في ملف قاعدة البيانات فإذا وجده يتم عرض بياناته في صناديق النص الموجودة في النموذج رقم 1 وإذا لم يجده يعرض النموذج رقم 1 في حالة إضافة سجل جديد

فهل يمكن مساعدتي في ذلك ( مرفق مثال على ملف بريد صادر ووارد )

#66

أخوتي الأعزاء السلام عليكم ورحمة الله وبركاته

سوف أشرح الطريقة التي عملت بها ما ذكر في المشاركة السابقة

في نافذة Solution Explorer نختار التبويب Data Sources ثم نضغط على الوصلة Add New Data Source ثم نختار Database من صندوق حوار Data Source Configuration Wizard الخاص باختيار نوع قاعدة البيانات Choose a Data Source Type ونضغط على زر الأمر Next في صندوق المحادثة التالي نضغط على زر الأمر New Connection لتحديد Data Source و Database File Name بحيث نحدد في الأولى Microsoft Access Database File (OLEDB) وفي الثانية نختار ملف قاعدة البيانات من خلال الضغط على زر Browse ثم نضغط على زر OK ، وفي صندوق المحادثة الأول نضغط على زر الأمر Next ثم نحدد اسم ConnectionString الذي نريده ثم نضغط على زر الأمر Next ثم نختار Database Object إما Tables أو Views أو كلاهما ونحدد في الأسفل اسم DataSet ثم نضغط على زر الانتهاء Finish

بعد ذلك نفتح إشارة + أمام اسم الجدول المراد العمل عليه ونقوم بالسحب والافلات للحقول المراد إدراجها على النموذج Form ليتم إنشاء صناديق النص التي ستظهر فيها البيانات أو ندخل فيها البيانات الجديدة .

وسيظهر تلقائياً في أسفل النموذج الوحدات التالية :

DataSet - Binding Source - TableAdapter وبهذا نكون قد قطعنا شوط كبير من البرمجة دون أن نكتب سطر واحد من الكود

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

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

#67
035.gif

رمضان كريم وشهر مبارك للجميع

أسأل الله أن يعيننا على صيامه وقيامه

وأن يجعله شهر خير وبركة ونصرة للإسلام والمسلمين

035.gif

أخي الأستاز ياسر :

كل عام وأنت ومحبيك بصحا وعافي .

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

كرمال عين رمضان ما رح تئل عليك بالأسئلي :P :

بس سؤال واحد :) :

شلون بقدر إطبع السؤال لحالو بصفحة واحدي ، يعني نظيف زر مكتوب عليه طباعة السؤال ، يطبع في الصفحة :

السؤال : .......

الجواب : .....

رقم السؤال : ......

وهكذا ، يعني يطبع السؤال المحدد فقط .

وجزاك الله عنا خير أخانا الأستاز ياسر .

#68

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

أخي محمد أشكرك على مشاعرك النبيله ، وكل عام أنت والشعب السوري بألف خير وعافية .. كما أني أدعو الله أن يوفقك في دراستك ..

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

ولكني أوفر عليك ، وأكتبلك خلاصة تجاربي :

1 - يمكنك عمل ذلك من خلال الشرط في جملة استعلام SQL فبل تعبئة DataSet ومن ثم ربط التقرير بـ DataSet .

2- يمكن عمل ذلك من خلال الفورملا وهو المحبب إلي :

rpt.RecordSelectionFormula = (" {TheBank.AskNumber} = " & txtnumber.Text.Trim & "")

3 - يمكن عمل ذلك من خلال استعمال البارامتر لتحديد مجموعة معينه من البيانات كي تظهر في التقرير ، ويوجد شرح مفصل للموضوع في هذا الرابط :

/index.php?showtopic=102894

أرجو أن أكون قد بلغتك مرادك ..

1 - سقوط الإنسان ليس فشلاً ، ولكن الفشل أن يبقى حيث سقط .

2 - الفاشلون قسمان : قسم فكر ولم يفعل ، وقسم فعل ولم يفكر .

-------------------------------------------------------

درس في ADO.NET 2005, التعامل مع الجداول المترابطة في ado.net 2005

درس في الإجراءات الفرعية ( العامة )

درس في ADO.NET من الصفر إلى الإحتراف .

#69

أنا زعلان وتعيس فلم أجد من يروي عطشي سامحكم الله

#70
omran555 كتب:
أنا زعلان وتعيس فلم أجد من يروي عطشي سامحكم الله

والله ما يرضيني زعلك ، فقط ارفق لنا مشروعك ، والله يقدرنا نساعدك . ونلبي طلبك بالشرح ...

1 - سقوط الإنسان ليس فشلاً ، ولكن الفشل أن يبقى حيث سقط .

2 - الفاشلون قسمان : قسم فكر ولم يفعل ، وقسم فعل ولم يفكر .

-------------------------------------------------------

درس في ADO.NET 2005, التعامل مع الجداول المترابطة في ado.net 2005

درس في الإجراءات الفرعية ( العامة )

درس في ADO.NET من الصفر إلى الإحتراف .

#71

أخي واستاذي ياسر

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

الله يسلمك ويبارك فيك وكان هذي عشمي في أهل النشاما

عزيزي إن المثال مرفق في بداية المشاركة رقم 66 تحت اسم mail.rar

والشرح وافي في المشاركة رقم 67 وأنا في انتظار الرد على أحر من الجمر

#72

اخوتى فى الله

اعلم بوصولى متأخر و لكن هذا حال التلميذ الضعيف

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

اخى yaseralshikh

شكراً على مشاركاتك و نتمنى المزيد

فعلاً تستحق الشكر

وانا كما ارشتنى متابع للموضوع و لكن اسف لعم الرد والمشاركة الجادة فى الموضوع

وعذراً اخوتى

وليد

لا اله الا الله محمد رسول الله

#73

لماذا توقفت الكتابة في هذا الموضوع هل يعتبر الأساتذة بأنهم أعطوا ما فيه الكفاية أم أن الموضوع لم يعد يستهويهم

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

أتمنى أن يكون ما قلته دافعاً للعودة للدرس والتابة في الموضوع وليس العكس

#74
اقتباس
لماذا توقفت الكتابة في هذا الموضوع هل يعتبر الأساتذة بأنهم أعطوا ما فيه الكفاية أم أن الموضوع لم يعد يستهويهم

أخي الغالي بالنسبة لي توقفت على شان رمضان ، وعلى شان الأستاذ ساسر وأستاذ إبراهيم بخش ما يقولو إيش هذا القلق فير رمضان كمان

بس أنا أوريك فيهم بعد رمضان ..

#75

اخي omran555 لقد وصلك المشروع بعد التعديل وانا سوف ارفعه هنا ولكن يمنعني المشكلة الموجوده في زر أمر الاضافة رغم صحة الكود ، حقاً مشكله تحير ..

لكن هذا يدعونا للمحاوله والتفكير في حل ، ولكي نفكر بشكل جماعي أنا سوف ارفعه ، والشاطر يكتشف المشكلة أولاً ويخبرنا عن حلها .

رابط المشروع :

http://www.webfile.ws/d/12345

1 - سقوط الإنسان ليس فشلاً ، ولكن الفشل أن يبقى حيث سقط .

2 - الفاشلون قسمان : قسم فكر ولم يفعل ، وقسم فعل ولم يفكر .

-------------------------------------------------------

درس في ADO.NET 2005, التعامل مع الجداول المترابطة في ado.net 2005

درس في الإجراءات الفرعية ( العامة )

درس في ADO.NET من الصفر إلى الإحتراف .

مواضيع مشابهة