PDA

View Full Version : یه جستجوی پارامتری با بانک اطلاعاتیAccess



محبوبه محزون زاده
دوشنبه 20 اردیبهشت 1389, 23:20 عصر
سلام
شاید من 5-6بار توی این تالار تقاضا کردم اما انگار اگه کسی هم بلد باشه دوست نداره مشکله دوستش رو حل کنه.من دارم یه برنامه می نویسم و VB.net رو خودم خوندم با کتاب،جزوه وسایت های مختلف اما الان توی یه قسمتی دچار مشکل شدم که هر چه خواهش میکنم کسی جواب نمیده.
میشه یه مثال از یه جستجوی پارامتری با Access در vb.net2005 قراربدید؟(یعنی یه بانک Access داشته باشید ازش یه Query (پارامتری)درست کنید ودر CrystalReport نمایش بدید.

با سپاس فراوان

Mohammad_chz
سه شنبه 21 اردیبهشت 1389, 11:31 صبح
سلام دوست عزیز
شما می تونید دستور Select را به صورت زیر با پارامتر تعریف کنید.

SELECT LDescribe.LComDate, LDescribe.LDescribe, LDescribe.DateToDo, Personel.PerFName, Personel.PerLName, LDescribe.Done, PerDes.PerID
FROM ((LDescribe INNER JOIN
PerDes ON LDescribe.LDesID = PerDes.LDesID) INNER JOIN
Personel ON PerDes.PerID = Personel.PerID)
WHERE (LDescribe.Done = ?) AND (Personel.PerID = ?)
دستور بالا را کپی کردم پس اسم فیلدارو جدی نگیرید.
بعد از تعریف این دستور برای انتقال پارامتر به دستور از روش زیر استفاده کنید


daAdapter.SelectCommand.Parameters.Add(Parameter's Name, OleDb.OleDbType.Boolean)
daAdapter.SelectCommand.Parameters(0).Value = False

حالا شما می تونید DataSet رو با مقادیر لازم پر کنید و به هر ریپورت دلخواه انتقال بدید.
فکر کنم واضح گفتم ولی اگه لازم داشتین بگین براتون یه برنامه نمونه بذارم.

محبوبه محزون زاده
سه شنبه 21 اردیبهشت 1389, 23:27 عصر
سلام
کدها رو منتقل کردم اما یه سری اشکال داره.
ضمنا توی vb هر چیزی بعد از ( ' ) نوشته شود بعنوان توضیح منظور میگردد که در خط
daAdapter.SelectCommand.Parameters.Add(Parameter' s Name, OleDb.OleDbType.Boolean)
شما نوشته بودید.حالا که زحمت کشیدید اگه یه سورس نمونه برام بگذارید بسیار ممنون می شوم.
با سپاس فراوان

Mohammad_chz
چهارشنبه 22 اردیبهشت 1389, 10:36 صبح
عذر میخوام یه خورده سرم شلوغه ولی حتما در اسرع وقت یه سورس براتون میذارم.
در ضمن جای که نوشتم Parameter's Name منظورم این بوده که اونجا باید اسم پارامتر مورد نظر رو بنویسید.

Mohammad_chz
چهارشنبه 22 اردیبهشت 1389, 12:54 عصر
سلام
ببخشید نمونه زیر رو با عجله سر کار تهیه کردم و الته جوادلش مربوط به یکی از برنامه هایی هست که قبلا نوشتم پس خیلی مختصر هستش ولی به راحتی می تونید نحوه ایجاد پارامتر و انتقال اون رو به DataBase ببینید درضمن جهت به دست آوردن شماره ها می تونید به بانک نگاه کنید.
اگه قصد دارید روی اطلاعات یک یا چند جدول به تناوب جستجوی پارامتری انجام بدید یا به عبارتی داده ها رو بر اساس یک پارامتر خاص فیلتر کنید به خاطر اینکه رفت و برگشت زیاد به بانک نداشته باشید بهتره یک بار داده ها رو توی DataSet بارگذاری کنید و بعد با استفاده از متد Filter از BindingSource به تناوب خروجی رو کنترل کنید.

محبوبه محزون زاده
چهارشنبه 22 اردیبهشت 1389, 15:14 عصر
ممنونم اما باز نشد.
من از VB.net2005 استفاده می کنم.فکر کنم برنامه شما ورژن2008 باشه

Mohammad_chz
پنج شنبه 23 اردیبهشت 1389, 07:57 صبح
سلام
ببخشید من 2005 نصب ندارم پس کد رو براتون میذارم اگه سئوالی بود بپرسید.



Dim da As OleDb.OleDbDataAdapter
Dim con AsNew OleDb.OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\windowsapplication1\windowsapplication1\ bin\Debug\main1.mdb")
Dim bs AsNew BindingSource
Dim ds AsNew Data.DataSet
Dim cmd As OleDb.OleDbCommand


من فرض کردم که شما بخوایید اطلاعات دریافتی رو بر اساس شماره پرسنلی(PerID) استخراج کنید.




PrivateSub Fill()
ds.Clear()
con.Open()
cmd = New OleDb.OleDbCommand("", con)
cmd.CommandType = CommandType.Text
cmd.CommandText = "SELECT Units.UnitID, Units.UnitName, Units.UnitDes, Units.IsMat, Personel.PerID, Personel.PerFName, Personel.PerLName, Personel.IsBoss,Personel.UnitID AS Expr1 FROM (Personel INNER JOIN Units ON Personel.UnitID = Units.UnitID) WHERE Personel.PerID = ?"

da = New OleDb.OleDbDataAdapter(cmd.CommandText, con)
da.SelectCommand.Parameters.Add("PerID", OleDb.OleDbType.Integer)
If TextBox1.Text <> ""Then

da.SelectCommand.Parameters(0).Value = TextBox1.Text
Else

da.SelectCommand.Parameters(0).Value = 750615
EndIf

da.Fill(ds, "TB")
bs.DataSource = ds
bs.DataMember = "TB"

bn.BindingSource = bs
dgv.DataSource = bs
con.Close()
EndSub



در فرمان Select جایی که علامت سئوال وجود داره باید مقدار پارامتر جایگزین بشه. فرض شده شما مقدار پارامتر رو از یک TextBox بگیرید و در یک دیتا گراید(dgv) نمایش بدید.

اما اگه شما سعی کنید چندین بار روال فوق رو فراخوانی کنیدمستلزم اینه که هر بار یک رفت و برگشت به بانک داشته باشید. اگه شما میخواید به این ترتیب یک جستجوی پارامتری برای کاربر مهیا کنید بهتره دستورات روال بالا رو بدون پارامتر اجرا کنید و تمام اطلاعات رو در DataSet بارگذاری کنید بعد با استفاده از متد Filter از BindingSource به صورت زیر اطلاعات رو خیلی راحتتر و سریعتر به صورت پارامتری فیلتر کنید.



PrivateSub TextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged
bs.filter=textbox1.text
EndSub



این روش رو هم امتحان کنید و خروجی رو به یک گراید ویو بدید، نتیجه جالبه!

محبوبه محزون زاده
جمعه 24 اردیبهشت 1389, 01:28 صبح
سلام

دوست عزیز
من با نمایش اطلاعات توی Grid View مشکل ندارمومشکل من نمایش توی کرستال ریپرورت هست.اگه ممکنه اون رو راهنمایی کنید.

محبوبه محزون زاده
جمعه 24 اردیبهشت 1389, 01:33 صبح
سلام
ببخشید من 2005 نصب ندارم پس کد رو براتون میذارم اگه سئوالی بود بپرسید.



Dim da As OleDb.OleDbDataAdapter
Dim con AsNew OleDb.OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\windowsapplication1\windowsapplication1\ bin\Debug\main1.mdb")
Dim bs AsNew BindingSource
Dim ds AsNew Data.DataSet
Dim cmd As OleDb.OleDbCommand


من فرض کردم که شما بخوایید اطلاعات دریافتی رو بر اساس شماره پرسنلی(PerID) استخراج کنید.




PrivateSub Fill()
ds.Clear()
con.Open()
cmd = New OleDb.OleDbCommand("", con)
cmd.CommandType = CommandType.Text
cmd.CommandText = "SELECT Units.UnitID, Units.UnitName, Units.UnitDes, Units.IsMat, Personel.PerID, Personel.PerFName, Personel.PerLName, Personel.IsBoss,Personel.UnitID AS Expr1 FROM (Personel INNER JOIN Units ON Personel.UnitID = Units.UnitID) WHERE Personel.PerID = ?"

da = New OleDb.OleDbDataAdapter(cmd.CommandText, con)
da.SelectCommand.Parameters.Add("PerID", OleDb.OleDbType.Integer)
If TextBox1.Text <> ""Then

da.SelectCommand.Parameters(0).Value = TextBox1.Text
Else

da.SelectCommand.Parameters(0).Value = 750615
EndIf

da.Fill(ds, "TB")
bs.DataSource = ds
bs.DataMember = "TB"

bn.BindingSource = bs
dgv.DataSource = bs
con.Close()
EndSub



در فرمان Select جایی که علامت سئوال وجود داره باید مقدار پارامتر جایگزین بشه. فرض شده شما مقدار پارامتر رو از یک TextBox بگیرید و در یک دیتا گراید(dgv) نمایش بدید.

اما اگه شما سعی کنید چندین بار روال فوق رو فراخوانی کنیدمستلزم اینه که هر بار یک رفت و برگشت به بانک داشته باشید. اگه شما میخواید به این ترتیب یک جستجوی پارامتری برای کاربر مهیا کنید بهتره دستورات روال بالا رو بدون پارامتر اجرا کنید و تمام اطلاعات رو در DataSet بارگذاری کنید بعد با استفاده از متد Filter از BindingSource به صورت زیر اطلاعات رو خیلی راحتتر و سریعتر به صورت پارامتری فیلتر کنید.



PrivateSub TextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged
bs.filter=textbox1.text
EndSub



این روش رو هم امتحان کنید و خروجی رو به یک گراید ویو بدید، نتیجه جالبه!

bn و TB چی هست؟( من حدس زدم TB باید Textbox باشه اما اگهname رو تغییر بدم دیگه اون رو نمیشناسه،یا bn یعنی button)

mohsen gh
جمعه 24 اردیبهشت 1389, 01:41 صبح
اين كد بهتري نوع جستجو فقط فيلد هاي بانكتو بنداز تو گريت ويو

PrivateSub TextBox1_TextChanged_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged
Dim dta AsNew OleDb.OleDbDataAdapter("select * from t1 ", "provider=microsoft.jet.oledb.4.0;data source=sabt.mdb")
Dim str_DPN AsString = ""
Me.str_DPN = "family"
TextBox1.Select()
If TextBox1.Text <> ""Then
bs.Filter = str_DPN + " like '%" + TextBox1.Text + "%'"
Else
bs.Filter = ""
EndIf

mohsen gh
جمعه 24 اردیبهشت 1389, 01:46 صبح
كدشو فردا حتما براتون ميزارم بايد يه كم روش فكر كنم دقيق هم نمدونم چي مخاي!!!!

محبوبه محزون زاده
جمعه 24 اردیبهشت 1389, 12:40 عصر
من برنامه رو نوشتم.این هم کد و Error که نشون میده.حالا میشه راهنمایی کنید؟

http://barnamenevis.org/forum/showthread.php?t=220496

mohsen gh
جمعه 24 اردیبهشت 1389, 13:36 عصر
توي يك فرم يه CrystalReportViewer1 درست كن يه CrystalReport1.rpt كه قبلا درست كردي بعد از اين استفاده كن

t1=نام جدول
form2= نام فرمي كهCrystalReportViewer1 داخلش هست
form1=نام فرميكه گريت ويو توشه
dg1=نام گريت ويو هستش
اين 4 خط راهنمايي بودن


Form2.CrystalReportViewer1.ReportSource = Application.StartupPath & "\CrystalReport1.rpt"
Form2.CrystalReportViewer1.SelectionFormula = "{t1.ID} =" &
form1.dg1.Rows(form1.dg1.CurrentRow.Index).Cells(0 ).Value
Form2.CrystalReportViewer1.RefreshReport()
Form2.ShowDialog(

Mohammad_chz
شنبه 25 اردیبهشت 1389, 08:31 صبح
سلام
ببخشید دیر جواب دادم!
جمعه ها اصلا کاری با کامپیوتر ندارم!!!!
1- ببخشید کدی که نوشتم واضح نبوده. خوب با عجله بود دیگه.:خجالت:
2- bn برای BindingNavigator استفاده شده و TB به عنوان نام یک دیتا تیبل در دیتا ست که با کد پر میشه!
3- در مورد کریستال ریپورت: شما بعد از این که DataSet رو با اطلاعات پر کردید فقط کافیه اون رو به فایل گزارشتون معرفی کنید. البته به روش زیر:



Dim myRpt AsNew rptFile
da.Fill(Ds,"tb"))
myRpt.SetDataSource(Ds)
Me.CrystalReportViewer1.ReportSource = myRpt



در کد بالا فرض شده شما یک گزارش تهیه کردین با نام rptFile و میخواین اونو تو CrystalReportViewr نشون بدین. این کدو توی روال لود فرم گزارشتون بذارین بد نیست.
امیدوارم این یکی رو دیگه واضح گفته باشم.
در هر صورت ببخشید اگه نا واضح میگم.

محبوبه محزون زاده
شنبه 25 اردیبهشت 1389, 23:12 عصر
بالاخره به جوابم رسیدم.

Dim rpt As New CrystalReport1
rpt.RecordSelectionFormula = "{table1.name} = '" & TextBox1.Text & "'"
CrystalReportViewer1.ReportSource = rpt
CrystalReportViewer1.Refresh()