View Full Version : ارسال خروجی گرایدویو به گزارش
shafi21
شنبه 10 مرداد 1388, 11:44 صبح
سلام دوستان
من یه فرم سرچ دارم که براساس چند فیلد جدول داخل دیتاست رو فیل تر میکنم ورشته ی فیل ترم رو در دیتاویو قرار دادم:
Dim dv As DataView = New DataView(ds.Tables(0))
dv.RowFilter = filter
dtg.DataSource = dv
حالا میخوام بازدن دکمه چاپ همین اطلاعات داخل دیتاگرایدم داخل فرم ریپورت نمایش داده شه ولی کلاس setdatasource پارامتر dv روقبول نمیکنه
Dim frmreport As new report
strReportPath &= "\CrystalReport1.rpt"
Dim rpttb As New CrystalDecisions.CrystalReports.Engine.ReportDocum ent
rpttb.Load(strReportPath)
rpttb.SetDataSource(dv)
frmreport.CrystalReportViewer1.ReportSource = rpttb
frmreport.ShowDialog()
چه راهی پیشنهاد میکنید؟
bad_boy_2007
شنبه 10 مرداد 1388, 13:53 عصر
سلام دوست من ،
در DataView شما از گزينه RowFilter جهت فيلتر كردن داده هاتون استفاده كرديد كه اين مقدار رو ميتونيد در بخش Where يك كوئري SQL قرار بديد و يك ديتاست رو باهاش پر كنيد و به گزارشتون پاس بديد ، كدي مشابه كد زير :
وقت ندارم كدهاي رو تست كنم ، تو نوت پد تايپ كردم اگه مشكلي داشت بگو برسي ميكنم ، ولي من از مشابه اين كد به كرات استفاده كردم
dim ds as new YourDataset
dim cn as new sqlclient.sqlconnection("ConnectionString")
dim cmd as new sqlclient.sqlcommand("Select * from YourTable Where " dv.rowfilter,cn)
dim da as new sqlclient.sqldataadapter
da.selectcommand=cmd
if dv.rowfilter="" then cmd.commandText="Select * from YourTable "
cn.open
da.fill(ds.YourTable)
cn.close()
rpttb.SetDataSource(ds)
shafi21
شنبه 10 مرداد 1388, 18:14 عصر
ممنون از توجهتون ،این کد رو برای دکمه سرچ نوشتم:
con.Open()
s2 = "(select code,numbere,person_code,letter.code_sub,abstract, kind_code,item,code_baigani,shomare_atf,shomare_pe irov,received,tarikhe_name,tarikhe_sabt
,tarikh,descript from letter,subject where received and letter.code_sub=subject.code_sub)"
Dim da As New OleDbDataAdapter(s2, con)
da.Fill(ds, "letter")
Dim dv As DataView = New DataView(ds.Tables(0))
dv.RowFilter = filter
dtg.DataSource = dv
dtg.Columns(3).Visible = False
con.Close()
وباتوجه به کد شما برای دکمه چاپ:
Dim frmreport As new report
strReportPath &= "\CrystalReport1.rpt"
Dim rpttb As New CrystalDecisions.CrystalReports.Engine.ReportDocum ent
rpttb.Load(strReportPath)
con.Open()
Dim cmd As New OleDb.OleDbCommand("select * from letter where " & dv.RowFilter, con) '"select code,numbere,person_code,letter.code_sub,abstract, kind_code,item,code_baigani,shomare_atf,shomare_pe irov,received,tarikhe_name,tarikhe_sabt,tarikh,des cript from letter,subject where " & dv.RowFilter, con)
da.SelectCommand = cmd
da.Fill(ds, "letter")
con.Close()
rpttb.SetDataSource(ds)
frmreport.CrystalReportViewer1.ReportSource = rpttb
frmreport.ShowDialog()
ولی موقع زدن دکمه چاپ این ارور رو میده:Syntax error in WHERE clause
bad_boy_2007
شنبه 10 مرداد 1388, 19:33 عصر
با اين تيكه كد برسي كنيد :
if dv.rowfilter="" then cmd.commandText="Select * from YourTable "
در صورت مشكل ، برسي كنيد مقدار DV.rowFilter چيه ؟
shafi21
یک شنبه 11 مرداد 1388, 14:30 عصر
همونطور که داخل کد بالا نوشتم من از چند تا جدول سلکت کردم وبرای پرکردن دیتاست گزارش هیچ مدلی جواب نداد:ناراحت:
nooshin964
یک شنبه 11 مرداد 1388, 15:42 عصر
سلام . میتوانید از کامپوننت های C1 برای این کار استفاده نمایید.
shafi21
یک شنبه 11 مرداد 1388, 20:03 عصر
کارشون چیه؟از کجا تهیه کنم؟
ولی مطمئنم که میشه با کد هم از چند جدول گزارش تهیه کرد.دوستان میشه راهنماییم کنید؟
bad_boy_2007
یک شنبه 11 مرداد 1388, 22:33 عصر
یک جای کارتون مشکل داره که باید کدتون رو بزارید
احتمال اول :
شما از چندین جدول (بیش از یک جدول) در گزارشتون استفاده کرده اید و این جداول با یکدیگر InnerJoin شده اند ولی در زمانی که گزارشتان را از طریق برنامه فراخوانی میکنید فقط تعدادی از این جداول را مقدار میدهید ولی تعداد دیگری را بدون مقدار به گزارشتان پاس میدهید و چون امکان Inner Join وجود ندارد هیچ داده ای مشاهده نمیکنید
احتمال دوم :
شما گزارشتان را برای خواندن اطلاعات از دیتابیس طراحی ککرده اید نه خواندن اطلاعات از دیتاست
توصیه میکنم یک گزارش خیلی ساده حاوی تنها چند فیلد و یک جدول را از طریق پاس دادن اطلاعات با دیتاست تهیه کنید و سپس به گزارش خودتان باز گردید
شاید برسی برنامه لینک زیر هم مفید باشد :
http://barnamenevis.org/forum/showpost.php?p=764584&postcount=2
bad_boy_2007
یک شنبه 11 مرداد 1388, 22:34 عصر
سلام . میتوانید از کامپوننت های C1 برای این کار استفاده نمایید.
این کار را برای این برنامه توصیه نمیکنم ، عملیات فوق العاده ساده ای است که میتوان با خود دات نت انجام داد ولزومی به استفاده از کامپوننت خارجی ندارد
shafi21
یک شنبه 11 مرداد 1388, 23:16 عصر
ممنون ازتوجهت دوست عزیز
من با گزارشگیری از یک جدول هیچ مشکلی ندارم،فقط هم جداول مورد استفادم در کوئری باهم رابطه دارند که اونم در دیتاستی که باویزارد برای ریپورتم انتخاب کردم وجود داره
میشه یک نمونه کوئری که از چند جدول سلکت کنه ودر قسمت where اون از دیتاویو استفاده شده بهم بدید یا میل کنید؟
درضمن آیا شما تمام فیلدهای دو جدول رو در صفحه ی ریپورت قرار میدید؟
bad_boy_2007
دوشنبه 12 مرداد 1388, 21:44 عصر
توضيحات كامل را در يك PDF برايتان تهيه كردم برسي كيند
shafi21
سه شنبه 13 مرداد 1388, 15:56 عصر
ممنون از راهنماییهاتون،من کد دو دکمه ی سرچ وچاپ رو میذارم شاید کمک بیشتری به مشکلم کنه:
Private Sub Btn_search_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn_search.Click
ds.Clear()
Dim filter As String = ""
If txt_num.Text.Length > 0 Then
filter = "( numbere like " + "'%" + txt_num.Text + "%')"
End If
If txt_person.Text.Length > 0 And filter = "" Then
filter = "(person_code = '" & txt_person.Text & "')"
ElseIf txt_person.Text.Length > 0 Then
filter = filter + "and" + "( person_code = '" & txt_person.Text & "')"
End If
Dim cmd As New OleDb.OleDbCommand("select code,numbere,letter.person_code,nam from letter,person where letter.person_code=person.person_code", con)
con.Open()
Dim da As New OleDbDataAdapter(cmd)
da.Fill(ds, "letter")
Dim dv As DataView = New DataView(ds.Tables(0))
dv.RowFilter = filter
dtg.DataSource = dv
con.Close()
End Sub
Private Sub Btn_print_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn_print.Click
Dim cmd As New OleDb.OleDbCommand("select code,numbere,letter.person_code,nam from letter,person where letter.person_code=person.person_code", con)
cmd.CommandText += " Where " + dv.RowFilter
Dim daprint As New OleDb.OleDbDataAdapter(cmd)
con.Open()
daprint.Fill(dsprint, "letter")
con.Close()
Dim strReportPath As String = GetCurrentDirectory()
If strReportPath.Substring(strReportPath.Length - 9) = "bin\Debug" Then
strReportPath = strReportPath.Substring(0, strReportPath.Length - 10)
End If
strReportPath &= "\CrystalReport1.rpt"
Dim rpttb As New CrystalDecisions.CrystalReports.Engine.ReportDocum ent
rpttb.Load(strReportPath)
rpttb.SetDataSource(dsprint)
report.CrystalReportViewer1.ReportSource = rpttb
report.Show()
End Sub
وقتی دکمه سرچ رو میزنم مشکلی نداره ولی چاپ رو که میزنم این ارورو میده:
daprint.Fill(dsprint, "letter")
Syntax error (missing operator) in query expression 'letter.person_code=person.person_code Where'.
bad_boy_2007
سه شنبه 13 مرداد 1388, 20:37 عصر
مشكل شما در اين بخش هست :
cmd.CommandText += " Where " + dv.RowFilter
در يك ساختار If قرار دهيد
shafi21
شنبه 17 مرداد 1388, 09:49 صبح
وقتی از dsprint خروجی xml میگیرم همه ی رکوردهارو میده یعنی وقتی دیتاویو داخل یک دکمه ی دیگه فیلتر شده اینجا دوباره خالی در نظر گرفته میشه!!پس چطور باید ازش استفاده کنم؟
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.