با سلام
چطور میتونیم یه دیتابیس رو به CrystalReport معرفی کرد بطوریکه با جابجایی مکان دیتابیس مشکلی در گزارش گیری ایجاد نشه آیا دستور مانند App.path وجود دارد؟
با سلام
چطور میتونیم یه دیتابیس رو به CrystalReport معرفی کرد بطوریکه با جابجایی مکان دیتابیس مشکلی در گزارش گیری ایجاد نشه آیا دستور مانند App.path وجود دارد؟
آخرین ویرایش به وسیله riyahiyan : سه شنبه 09 خرداد 1385 در 16:06 عصر
با سلام توسط این کد در VB6 میتوانید تمامی Property های یک Connection را ببینیدنوشته شده توسط riyahiyan
حال هر کدام از این Property ها را که بخواهید میتوانید Set کنید
On Error Resume Next
Dim props As CRAXDRT.ConnectionProperties
Dim prop As CRAXDRT.ConnectionProperty
Dim Report As New CrystalReport1
Set props = Report.Database.Tables(1).ConnectionProperties
List1.Clear
For Each prop In props
List1.AddItem prop.Name & " : " & prop.Value
Next
Set کردن یک Property :
Report.Database.Tables(1).ConnectionProperties("Da taBase Name")="c:\nwind.mdb"
یا
Report.Database.Tables(1).ConnectionProperties("Da taSource")="SQLSERVERDBNAME"
بسته به نوع روش اتصال به بانک اطلاعاتی مثل
ADO یا DataBaseFile
و غیره
مقادیر مختلفی در
ConnectionProperties
دیده خواهد شد
ممنون دوست عزیز.
یک کار خیلی سادهتری هم هست. اونم اینه که زمانی که شما connection ات را برقرار کردی. دوباره یک new connection بزن و این سری به جای آدرس کامل فیزیکی فقط نام بانک اطلاعاتی را بده و save کن آنوقت هرجا که reoprt شما باشد باز هم کار می کند البته به شرطی که بانک شما هم بغلش باشد. احتیاجی به کدنویسی هم نیست.
-------------------
عشقهایی کز پی رنگی بود // عشق نبود عاقبت ننگی بود ـــ حضرت مولانا
عزیزم من هم مشکل تو را داشتم همین تازه حل کردم.
برای حل برو به منوی database در کریستال ریپورت و سپس set database location را بزن
propertise را زده و بروی data sourse راست کلیک کرده و گزینه same as report را انتخاب کن
تا مسیر پایگاه داده همان مسیر گزارش هایت باشد.
به جای تمام این دنگ و فنگ ها فقط کافیه به جای معرفی دیتا بیس دیتا ست رو به کریستال ریپورت معرفی کنی و دیگه کریستال ریپورت کاری نداره شما اون رو چطوری و از کجا پر کردی
من راه حل اونو پیدا کردم این کدها در وبی 6 برای ا تصال به بانک اکسس خیلی راحت جواب میده
Dim strDatabaseLocation As String
Public strReportLocation As String
Private Sub Form_Load()
Dim oCRApp As CRAXDRT.Application
Dim oCRReport As CRAXDRT.Report
strReportLocation = "d:\1.rpt"
strDatabaseLocation = Form2.Text1.Text
'strDatabaseLocation = "C:\WINDOWS\Desktop\project\xpversion.mdb" the original Location
Set CrystalApplication = New CRAXDRT.Application
Set oCRReport = CrystalApplication.OpenReport(strReportLocation)
Call ResetReportDataSource(oCRReport)
oCRReport.Database.Verify
oCRReport.DiscardSavedData
Set oCREngine = oCRReport.PageEngine
oCRReport.ReadRecords
'open the report
oCRViewer.ReportSource = oCRReport
oCRViewer.ViewReport
While oCRViewer.IsBusy
DoEvents
Wend
Me.WindowState = vbMaximized
Me.Show
End Sub
Private Sub Form_Resize()
oCRViewer.Top = 0
oCRViewer.Left = 0
oCRViewer.Height = ScaleHeight
oCRViewer.Width = ScaleWidth
End Sub
'================================================= ========================
'Subroutine: ResetReportDataSource
'================================================= ========================
Sub ResetReportDataSource(ByRef oCRReport As CRAXDRT.Report)
Dim oCREngine As CRAXDRT.PageEngine
Dim oCRTables As CRAXDRT.DatabaseTables
Dim oCRTable As CRAXDRT.DatabaseTable
Dim oCRSections As CRAXDRT.Sections
Dim oCRSection As CRAXDRT.Section
Dim oCRReportObjects As CRAXDRT.ReportObjects
Dim oCRSubReportObject As CRAXDRT.SubreportObject
Dim oCRSubReport As CRAXDRT.Report
Dim I As Integer
'reset the source for each table in the report
I = 1
Set oCRTables = oCRReport.Database.Tables
While I <= oCRTables.Count
Set oCRTable = oCRTables.Item(I)
Call oCRTable.SetLogOnInfo(strDatabaseLocation, "", "", "")
I = I + 1
Wend
Dim strReportName As String
'reset the source for each sub-report table recursively
Set oCRSections = oCRReport.Sections
For Each oCRSection In oCRSections
'Debug.Print oCRSection.Name
Set oCRReportObjects = oCRSection.ReportObjects
For I = 1 To oCRReportObjects.Count
If oCRReportObjects.Item(I).Kind = crSubreportObject Then
Set oCRSubReport = oCRReport.OpenSubreport(oCRReportObjects.Item(I).S ubreportName)
'reset the tables forthe subreport
oCRSubReport.DiscardSavedData
oCRSubReport.Database.Verify
oCRSubReport.DiscardSavedData
'****recursively change data connections for all sub report tables As well
Call ResetReportDataSource(oCRSubReport)
End If
Next
Next
End Sub
من واقعا نمی دونم چرا ما همیشه دوست داریم لقمه را دور گردن بچرخانیم بعد در داخال دهانمان قرار دهیم.
خیلی راحت و بی دردسرتر از این حرفا مشکلات برطرف میشه. شما فکر می کنید کریستال ریپورت با این عظمتش فکری به حال این موضوع نکرده که می خواهید کدهای طولانی و خسته کننده بنویسید.
من سه تا عکس از کاری که باید انجام دهید برایتان گذاشتم که به راحتی می بینید وقتی دیتابیس خودتان را ایجاد کرده اید و آدرس فیزیکی به آن داده اید چگونه آدرس آن را نسبی بکنید و بسیار راحت هرجا که دلتان خواست آن را ببرید و از آن استفاده کنید. فقط کافی است کانکشن جدید را آدرس دهی نسبی بکنید.
با سلام
دیتابیس من اس کیو ال سرور 2000 و کدهایم با وی بی 6 است. ریپورت را ساخته ام و از طریق کد به دیتابیس وصل میشوم و مشکلی از باب اتصال وجود ندارد.
ولی مشکل اینجاست که اتصال و دیتابیس تعریف شده نمیتوانم در حین اجرا تغییر دهم.
این مشکل را با مثال توضیح میدهم:
1 - من دو دیتابیس 1 و 2 دارم که ساختار و طراحی هر دو دیتابیس کاملا شبیه هم است.
2 - محتویات دیتابیس 1 مربوط به شرکت الف و دیتابیس 2 مربوط به شرکت ب میباشد.
3 - برنامه به شکلی است که کاربر تعیین میکند این گزارش برای کدام شرکت باید تهیه شود آنگاه اتصال به همان دیتابیس برقرار و دادههای همان شرکت به ریپورت ارسال میشود.
4 - مشکل این است که در تمام حالات، اطلاعات شرکت الف نشان داده میشود.
این موضوع را توسط خود کریستال ریپورت هم تست کردم و از طریق set database location اقدام به تغییر آنها کردم ولی در آنجا هم فقط اطلاعات شرکت الف میآمد.
جالب این است که در properties اتصال اسم دیتابیس شرکت ب دیده میشود ولی موقع نمایش اطلاعات میبینم اطلاعات شرکت الف است.
اگر دوستان محبت کنند راهنمایی کنند ممنون میشوم.
با تشکر
"ولی مشکل اینجاست که اتصال و دیتابیس تعریف شده نمیتوانم در حین اجرا تغییر دهم"
متوجه نمی شوم. مگر نه اینکه شما از طریق کد وصل می شوید؟ پس زمانی که نام شرکت را انتخاب می کنید همون موقع هم connection می زنید به دیتابیس مربوطه و همان کانکشن را به ریپورت می فرستید. یا زمانی که انتخاب می کنید که از کدام دیتابیس گزارش بگیرید همان موقع باید connection string ای که به کریستال می فرستید با نام بانک انتخاب شده باشد.
راستی در کریستال ریپورت تست کنید که تیک save with data را حتما برداشته باشید.
من هم که نگفتم تیک آن باشد گفتم باید برداشته شود.
اگر با ado کار کنید به راحتی می توانید آدرسی که به کانکشن می فرستید عوض کنید.
oConn.CursorLocation = adUseClient
oConn.ConnectionString = "Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=" & dbnet
oConn.Mode = adModeReadWrite
oConn.Open
dbnet یک string است که من در فرم هایم نام دیتابیس ام را پاس می کنم.
من هم برنامه ای دارم که از دو دیتابیس که شبیه هم است و برای دو قسمت مختلف از یک شرکت است کار می کند که کاربر سیستم با توجه به انتخاب هر قسمتی که وارد آن می شود، دیتابیس آن قسمت نمایش داده می شود و در پرینت هم همین آدرس به کریستال ریپورت فرستاده می شود.
البته این کدی که در بالا است یک کانکشن ایجاد می کند که شما با ایجاد کردن یک recordset تمام برنامه های خود را می توانید پیاده سازی کنید و همچنین برای ریپورت خود آدرس دهی کنید.
Dim ors As New Recordset
ors.Open strsql, goConn, adOpenForwardOnly, adLockReadOnly
strsql دستور sql ای است که به دیتابیس می فرستید مانند دستورات select و ... که برای همه آشنا است.
goConn هم از نوع همان کانکشنی است که در بالا (oConn) تعریف شده.
به همین راحتی در برنامه می توانید هم ریپورتتان را صدا کنید و هم query به آن بزنید. (البته query زدن به کریستال ریپورت نوع نوشتن دستورات sql اش کمی فرق می کند.)
فکر میکنم مشکلم از نحوه اتصال با کد نباشد چرا که این موضوع را با خود کریستال ریپورت هم امتحان کردم و به نظر میرسد مشکل از جای دیگری باشد.
1) من گزارش ساخته شده را در کریستال ریپورت باز کردم و از طریق set database location دیتابیس شرکت ب را با Current data source گزارش جایگزین کردم
2) در درختواره بالایی همین پنجره set database location تمام properties مربوط به Current data source به خصوصیات دیتابیس شرکت ب تغییر کرد.
3) وقتی گزارش را به نمای پیشنمایش چاپ بردم، بازهم دیدم اطلاعات شرکت الف در گزارش آمده است.
4) از منوی Database فرمان Show SQL Query را اجرا کردم و دیده که در قسمت FROM این دستور اسن دیتابیس شرکت الف آمده است.
نمیدانم این نام را چگونه باید عوض کرد. البته من گزارش را با استفاده از دیتابیس شرکت الف طراحی کردهام.
جهت تکمیل سئوال، قطعه کدی که دیتابیس را به ریپورت معرفی میکند، در زیر آورده میشود:
Dim crApp As New CRAXDRT.Application
Dim crReport As New CRAXDRT.Report
Dim crDBTab As CRAXDRT.DatabaseTable
Set crReport = crApp.OpenReport(App.Path & "\Reports\RepJurnals.Rpt")
crReport.Database.LogOnServer "p2ssql.dll", DbInstance, DatabaseName, "sa", ""
For Each crDBTab In crReport.Database.Tables
crDBTab.SetLogOnInfo DbInstance, DatabaseName, "sa", ""
Next
دوست عزیز کانکشن رو در برنامت ایجاد کن و بعد با روش Oledb 4 در کریستال به بانک کانکت شو و از کد زیر در برنامه استفاده کن
Dim cn1 As New ADODB.Connection
Dim rs1 As New ADODB.Recordset
Dim sql As String
cn1.Open "provider=microsoft.jet.oledb.4.0;" _
& "data source=" & App.path & "\db1.mdb;" 'jet oledb:database password=9960984;"
Set rs1 = New ADODB.Recordset
rs1.CursorType = adOpenDynamic
rs1.LockType = adLockOptimistic
sql = "select * from personel order by famil"
rs1.Open sql, cn1
Report.Database.SetDataSource rs1
FrmCrView.CRViewer91.ReportSource = Report
FrmCrView.Show
آقا من اومدم ابرو رو درست کنم، زدم چشو کور کردم
درست است که گزارش من در هر حال اطلاعات شرکت الف را میآورد ولی با این حال اجرا میشد. خواستم کاری کنم تا یک جورائی رکوردست به گزارش ارسال شود ولی نمیدانم چه شده که در خط قرمزرنگ زیر اجرای گزارش به خطا منجر میشود.
Dim crApp As New CRAXDRT.Application
Dim crReport As New CRAXDRT.ReportSet crReport = crApp.OpenReport(App.Path & "\Reports\RepJurnals.Rpt")crReport.Database.LogOnServer "p2ssql.dll", DbInstance,DatabaseName, "sa", ""For Each crDBTab In crReport.Database.Tables
crDBTab.SetLogOnInfo DbInstance, DatabaseName, "sa", ""
Next
خطای زمان اجرای برنامه روی این خط هست:
invalid TLV record
واقعا تعجب میکنم!!!
مگه شماها همه توی Windows کدنویسی نمی کنین دوستان!؟
همین ویندوزی که باهاش کار می کنین یه ابزار بسیار عالی داره بنام ِODBC که تمام برنامه های دیگه هم اونو پشتیبانی می کنن از جمله کریستال
با استفاده از این ابزار تموم مشکلاتتون حل میشه
Control Panel--->Administrative Tools---> ODBC
موفق باشین
آقا من بانکم access هستش
آقا pouriams آدرس دهی نسبی برا من جواب نمی ده error می ده
مسیر از اول درایو تست می کنه نه از پوشه برنامه!!!!!
اون کدی هم که گذاشتی من از دستور sql استفاده نکردم برا من جواب نمی ده
آخرش من چی کار کنم ؟؟
برای آدرس دهی نسبی من گفتم بار اول که شما آدرس دهی مطلق می کنی و کریستال ات را می سازی برای این که نسبی اش بکنی نیازی نیست راه های سخت طی کنی و کدنویسی کنی، راحت ترین راه این است که همون جا دوباره new connection بزنی و همان کاری را که قبلا کردی انجام بدی یعنی دیتابیس ات را دوباره set کنی البته این بار فقط نام دیتابیس. اینطوری آدرس دهی دیتابیس ات نسبی میشه. هر جا که بانکت باشه، کریستال ات هم جواب میده.
در مورد کدی که گفتی جواب نداد هم اگر لطف کنی کامل تر توضیح بدی ممنون می شم
سلام من مشکلم فکر کنم حل شده فقط باید رو یه کامپیوتر دیگه امتحانش کنم
با استفاده از کدی که آقای vb341 داده بودند :
Dim cn1 As New ADODB.Connection
cn1.Open "provider=microsoft.jet.oledb.4.0;" _
& "data source=" & App.path & "\db1.mdb;"
Report.Database.SetDataSource cn1
با استفاده از oledb 4 . ازشون تشکر می کنم تنها مشکلی که الان دارم اینکه برای بار اول اطلاعات رو نشون می ده
ولی برای بار دوم باید حتما رفرش رو بزنی و گرنه نشون نمی ده
من از این کدها هم استفده کردم ولی جواب نداد!!!!
CRViewer91.Refresh
Report.DiscardSavedData
Report.ReadRecords
مشکل از کجاست؟؟؟؟
در منوی فایل تیک save data with report را بردارید. احتمالا مشکل از همین جاست.
فکر کنم یکبار دیگه باید کانکشنش رو Set کنید
شما باید یه متغیر از فایل گزارشتون توی برنامه ایجاد کنید و از اون به بعد با اون متغیر کار کنید و هربار که کاربر برای نمایش اقدام کرد اون متغیر رو دوباره مقداردهی کنید.
منظور شما از متغیر از گزارش در برنامه چیه؟؟؟؟؟؟؟
با اجازه اساتید فن، من کل مراحلی که خودم همیشه برای گزارشاتم استفاده می کنم رو بیان می کنم...
من همواره از ODBCاستفاده می کنم
1- توی کریستال ریپورت گزارشم رو میسازم و برای اینکه به بانک وصل بشوم، از کانکشن ODBC استفاده می کنم.
2- بعد از آنکه گزارشم رو ساختم اونو توی پروژه ام اضافه می کنم
حال یه Crystal Report Viewer روی فرم میزارم و بجای اینکه بگم Data Source اون یه فایل هست و مسیر قیزیکی رو بهش بدم اینجوری عمل می کنم :
Dim R as new ReportName
3- از این به بعد برای اینکه با گزارش کار کنم همواره با این متغیر سروکار دارم. حتی شما میتونین کانکشن رو هم با این متغیر Set کنید که من باهاش کار نکردم. می تونید بگید R.Database وبه همه پارامترهاش دسترسی داشته باشید
4- در مرحله بعد وقتی کاربر کلید نمایش گزارش رو فشار داد ابتدا باید متغیر R رو دوباره مقداردهی کنم :
r=new ReportBName
5- بعد هم اگر باید مقداری به پارامترهای گزارش رد کنم اینکار رو انجام میدم و درنهایت ReportSource مربوط به CrystalReport Viewer رو بدین ترتیب Set میکنم :
me.CrystalReportViewer.ReportSource=r
با این کار گزارش به بانک وصل میشود و مقادیر را به کاربر نمایش می دهد.
امیدوارم مفید واقع بشود
موفق باشید
کار شما خیلی خوبه منم همین کار را انجام می دهم ولی من بعد از این که گزارشم را در کریستال ریپورت ساختم اونو توی برنامه ام اضافه می کنم و در فرم ام هم CRViewer91 را ReportSource را نسبت دهی می کنم و به راحتی برنامه ام به ریپورتم وصل میشه. اما در مورد خود کریستال بود که بحث بود نه وصل شدن به آن.
با ODBC آیا دیگه مشکل آدرس دهی نسبی حل می شه؟؟؟
موقع setup سازی کی باید odbc رو برا کامپیوتر مقصد بسازیم
و در اون موقع آدرس دهی نسبی می کنه یا نه؟
بله تمام این مشکلات حل خواهد شد
ضمن اینکه شما براحتی میتونید هنگام ساختن Setup برنامه بگید که اون کانکشن ODBC رو هم به Setupتون اضافه کند... البته من همیشه Setupهای برنامه هام رو با Install shield می سازم که اون هم تمام این موارد رو پشتیبانی میکنه
موفق باشید
سلام
من تو یکی از ریپورتام از دو تا جدول استفاده کردم
ولی وقتی با دستور Sql اسم این دو جدولو ارجاع می دم و شرط می زارم
میره 2 3 صفحه ریپورت بمن تحویل می ده
در صورتی که 4 تا رکورد بیشتر نباید نشون بده
و مشکل از دستور sql هم نیست چون وقتی خروجی شو داخل DtataGrid می زارم درسته!!!
و در این مورد میره اطلاعات رو از بانکی که اولین بار با گزارش Set کردم می خونه
در صورتی که من می خوام از بانکی که داخل کد مسیرشو دادم بخونه!!!!
اینم کدش ببینید می تونید ایرادشو در بیارین؟؟؟؟؟؟؟؟
Private Sub Form_Load()
'********************************
Dim cn1 As New ADODB.Connection
Dim rs1 As New ADODB.Recordset
Dim strsql As String
Screen.MousePointer = vbHourglass
Set cn1 = New ADODB.Connection
Set rs1 = New ADODB.Recordset
Set Report = New Khadamat
cn1.Open "provider=microsoft.jet.oledb.4.0;" _
& "data source=" & App.path & "\files\paygahnew.mdb;" 'jet oledb:database password=9960984;"
rs1.CursorType = adOpenDynamic
rs1.LockType = adLockOptimistic
strsql = F_khb_report.DataCombo1.Text
sql = "select * from tsabtkh,tpch " 'WHERE [tsabtkh.نوع خدمات]='" & strsql & "' and [tsabtkh.شماره پرونده]=[tpch.شماره پرونده]"
rs1.Open sql, cn1
Report.Database.SetDataSource rs1
'********
CRViewer91.Refresh
Report.DiscardSavedData
Report.ReadRecords
Report.FormulaFields.GetItemByName("khadamat").Tex t = "'" & Trim(F_khb_report.DataCombo1.Text) & "'"
Report.FormulaFields.GetItemByName("date").Text = "'" & Trim(Shamsi()) & "'"
Report.RecordSelectionFormula = "{tsabtkh.نوع خدمات} like '*" & Trim(F_khb_report.DataCombo1.Text) & "*' "
CRViewer91.ReportSource = Report
CRViewer91.ViewReport
Screen.MousePointer = vbDefault
End Sub
من یه ریپورت دیگه دارم که اون شرط نداره و میره از همون بانکی که دفعه دوم آدرس دادم می خونه
تو این مورد درست عمل می کنه ولی تو مورد بالائی نه!!
اینم کدش:
Dim Report As New listafrad
Dim cn1 As New ADODB.Connection
Dim rs1 As New ADODB.Recordset
Dim sql As String
Private Sub Form_Load()
'********
Screen.MousePointer = vbHourglass
Set cn1 = New ADODB.Connection
Set rs1 = New ADODB.Recordset
Set Report = New listafrad
cn1.Open "provider=microsoft.jet.oledb.4.0;" _
& "data source=" & App.path & "\files\paygahnew.mdb;"
rs1.CursorType = adOpenDynamic
rs1.LockType = adLockOptimistic
sql = "select * from tpch"
rs1.Open sql, cn1
Report.Database.SetDataSource rs1
'********
Screen.MousePointer = vbHourglass
CRViewer91.Refresh
Report.DiscardSavedData
Report.ReadRecords
Report.FormulaFields.GetItemByName("date").Text = "'" & Trim(Shamsi()) & "'"
CRViewer91.ReportSource = Report
CRViewer91.ViewReport
Screen.MousePointer = vbDefault
End Sub
اشکال از کجاست؟
در مورد دوستمون که گفته بود ODBC استفاده کن
چجوری میشه با ODBC مسیر بانک گزارشو عوض کرد یا یه بانک دیگه مثل اون رو به عنوان بانک اصلی بهش داد؟؟
البته از طریق کدنویسی و در زمان اجرا !!؟
و مراحل بالا رو که شما گفته بود غیر از دو باره set کردن متغییر ریپورت
خود ویژوال بیسیک این کد ها رو می زاره !!! فکر کنم البته
شاید چون فارسی نوشتید مشکل پیدا کرده و نشان نمیدهد. در حالیکه کد sql هم درست به نظر می رسد.
در کانکشن هم از راه زیر بد نیست استفاده کنید:
Database-> set datasource location -> create new connection از اینجا oledb (ado) را انتخاب کنید. ولی چون قبلا دیتابیس تان را ست کرده اید و آدرس مطلق به آن داده اید دیگر لازم نیست که آدرس مطلق به آن بدهید کافی است دیتابیس را انتخاب کنید (فقط نام دیتابیس به عنوان مثال db1.mdb) و آدرس های قبل از آن را پاک کنید. بعد از این که finish را زدید (البته اگر passwordنیز دارد آن را نیز باید ست کنید) آدرس بانک شما آدرس نسبی می شود و هرجایی که بگذارید فقط کافی است بانکتان کنارش باشد یعنی در همان فولدر.
آخرین ویرایش به وسیله pouriams : یک شنبه 26 فروردین 1386 در 08:22 صبح دلیل: وضوح بیشتر مطلب