PDA

View Full Version : معرفی دیتابیس به کریستال ریپورت



riyahiyan
سه شنبه 09 خرداد 1385, 16:04 عصر
با سلام
چطور میتونیم یه دیتابیس رو به CrystalReport معرفی کرد بطوریکه با جابجایی مکان دیتابیس مشکلی در گزارش گیری ایجاد نشه آیا دستور مانند App.path وجود دارد؟

vahidhaghani
سه شنبه 16 خرداد 1385, 06:43 صبح
با سلام
چطور میتونیم یه دیتابیس رو به CrystalReport معرفی کرد بطوریکه با جابجایی مکان دیتابیس مشکلی در گزارش گیری ایجاد نشه آیا دستور مانند App.path وجود دارد؟

با سلام توسط این کد در VB6 میتوانید تمامی Property های یک Connection را ببینید
حال هر کدام از این 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
دیده خواهد شد

riyahiyan
چهارشنبه 17 خرداد 1385, 11:48 صبح
ممنون دوست عزیز.

pouriams
یک شنبه 21 خرداد 1385, 10:10 صبح
یک کار خیلی ساده‌تری هم هست. اونم اینه که زمانی که شما connection ات را برقرار کردی. دوباره یک new connection بزن و این سری به جای آدرس کامل فیزیکی فقط نام بانک اطلاعاتی را بده و save کن آنوقت هرجا که reoprt شما باشد باز هم کار می کند البته به شرطی که بانک شما هم بغلش باشد. احتیاجی به کدنویسی هم نیست.






-------------------
عشق‌هایی کز پی رنگی بود // عشق نبود عاقبت ننگی بود ـــ حضرت مولانا

kmotavali
سه شنبه 08 اسفند 1385, 00:16 صبح
با سلام توسط این کد در VB6 میتوانید تمامی Property های یک Connection را ببینید
حال هر کدام از این 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
دیده خواهد شد

من از Database اکسس استفاده کردم و وقتی کانکشن بالا رو نی نویسم error میده و منظور از database name چیه
متشکرم

Goeezor
سه شنبه 08 اسفند 1385, 21:17 عصر
عزیزم من هم مشکل تو را داشتم همین تازه حل کردم.
برای حل برو به منوی database در کریستال ریپورت و سپس set database location را بزن
propertise را زده و بروی data sourse راست کلیک کرده و گزینه same as report را انتخاب کن
تا مسیر پایگاه داده همان مسیر گزارش هایت باشد.

sh
سه شنبه 08 اسفند 1385, 21:47 عصر
به جای تمام این دنگ و فنگ ها فقط کافیه به جای معرفی دیتا بیس دیتا ست رو به کریستال ریپورت معرفی کنی و دیگه کریستال ریپورت کاری نداره شما اون رو چطوری و از کجا پر کردی

kmotavali
سه شنبه 08 اسفند 1385, 23:03 عصر
از راهنماییتون ممنونم

Goeezor
چهارشنبه 09 اسفند 1385, 14:00 عصر
به جای تمام این دنگ و فنگ ها فقط کافیه به جای معرفی دیتا بیس دیتا ست رو به کریستال ریپورت معرفی کنی و دیگه کریستال ریپورت کاری نداره شما اون رو چطوری و از کجا پر کردی

ممنون میشم اگه واضح تر توضیح بدین

kmotavali
پنج شنبه 10 اسفند 1385, 18:13 عصر
من راه حل اونو پیدا کردم این کدها در وبی 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

pouriams
شنبه 12 اسفند 1385, 11:23 صبح
من واقعا نمی دونم چرا ما همیشه دوست داریم لقمه را دور گردن بچرخانیم بعد در داخال دهانمان قرار دهیم.
خیلی راحت و بی دردسرتر از این حرفا مشکلات برطرف میشه. شما فکر می کنید کریستال ریپورت با این عظمتش فکری به حال این موضوع نکرده که می خواهید کدهای طولانی و خسته کننده بنویسید.
من سه تا عکس از کاری که باید انجام دهید برایتان گذاشتم که به راحتی می بینید وقتی دیتابیس خودتان را ایجاد کرده اید و آدرس فیزیکی به آن داده اید چگونه آدرس آن را نسبی بکنید و بسیار راحت هرجا که دلتان خواست آن را ببرید و از آن استفاده کنید. فقط کافی است کانکشن جدید را آدرس دهی نسبی بکنید.

A.Farzin
شنبه 12 اسفند 1385, 19:45 عصر
با سلام

دیتابیس من اس کیو ال سرور 2000 و کدهایم با وی بی 6 است. ریپورت را ساخته ام و از طریق کد به دیتابیس وصل می‌شوم و مشکلی از باب اتصال وجود ندارد.
ولی مشکل اینجاست که اتصال و دیتابیس تعریف شده نمی‌توانم در حین اجرا تغییر دهم.
این مشکل را با مثال توضیح می‌دهم:
1 - من دو دیتابیس 1 و 2 دارم که ساختار و طراحی هر دو دیتابیس کاملا شبیه هم است.
2 - محتویات دیتابیس 1 مربوط به شرکت الف و دیتابیس 2 مربوط به شرکت ب می‌باشد.
3 - برنامه به شکلی است که کاربر تعیین می‌کند این گزارش برای کدام شرکت باید تهیه شود آنگاه اتصال به همان دیتابیس برقرار و داده‌های همان شرکت به ریپورت ارسال می‌شود.
4 - مشکل این است که در تمام حالات، اطلاعات شرکت الف نشان داده می‌شود.

این موضوع را توسط خود کریستال ریپورت هم تست کردم و از طریق set database location اقدام به تغییر آنها کردم ولی در آنجا هم فقط اطلاعات شرکت الف می‌آمد.
جالب این است که در ‌properties اتصال اسم دیتابیس شرکت ب دیده می‌شود ولی موقع نمایش اطلاعات می‌بینم اطلاعات شرکت الف است.

اگر دوستان محبت کنند راهنمایی کنند ممنون می‌شوم.
با تشکر

pouriams
یک شنبه 13 اسفند 1385, 08:07 صبح
"ولی مشکل اینجاست که اتصال و دیتابیس تعریف شده نمی‌توانم در حین اجرا تغییر دهم"
متوجه نمی شوم. مگر نه اینکه شما از طریق کد وصل می شوید؟ پس زمانی که نام شرکت را انتخاب می کنید همون موقع هم connection می زنید به دیتابیس مربوطه و همان کانکشن را به ریپورت می فرستید. یا زمانی که انتخاب می کنید که از کدام دیتابیس گزارش بگیرید همان موقع باید connection string ای که به کریستال می فرستید با نام بانک انتخاب شده باشد.
راستی در کریستال ریپورت تست کنید که تیک save with data را حتما برداشته باشید.

Goeezor
یک شنبه 13 اسفند 1385, 09:57 صبح
"راستی در کریستال ریپورت تست کنید که تیک save with data را حتما برداشته باشید.

اگه این کار رو کنیم برای هر گزارش باید دکمه refresh را بزنیم که تغییرات پایگاه داده در داخل برنامه اعمال شود.

pouriams
یک شنبه 13 اسفند 1385, 13:17 عصر
من هم که نگفتم تیک آن باشد گفتم باید برداشته شود.

kmotavali
سه شنبه 15 اسفند 1385, 22:55 عصر
من واقعا نمی دونم چرا ما همیشه دوست داریم لقمه را دور گردن بچرخانیم بعد در داخال دهانمان قرار دهیم.
خیلی راحت و بی دردسرتر از این حرفا مشکلات برطرف میشه. شما فکر می کنید کریستال ریپورت با این عظمتش فکری به حال این موضوع نکرده که می خواهید کدهای طولانی و خسته کننده بنویسید.
من سه تا عکس از کاری که باید انجام دهید برایتان گذاشتم که به راحتی می بینید وقتی دیتابیس خودتان را ایجاد کرده اید و آدرس فیزیکی به آن داده اید چگونه آدرس آن را نسبی بکنید و بسیار راحت هرجا که دلتان خواست آن را ببرید و از آن استفاده کنید. فقط کافی است کانکشن جدید را آدرس دهی نسبی بکنید.

دوست عزیز اگه ممکنه بفرمایید با چه دستوری در VB6میتوان آدرس و نام دیتابیس را عوض کرد ؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟

pouriams
چهارشنبه 16 اسفند 1385, 08:06 صبح
اگر با 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 اش کمی فرق می کند.)

A.Farzin
چهارشنبه 16 اسفند 1385, 18:32 عصر
با سلام

دیتابیس من اس کیو ال سرور 2000 و کدهایم با وی بی 6 است. ریپورت را ساخته ام و از طریق کد به دیتابیس وصل می‌شوم و مشکلی از باب اتصال وجود ندارد.
ولی مشکل اینجاست که اتصال و دیتابیس تعریف شده را نمی‌توانم در حین اجرا تغییر دهم.
این مشکل را با مثال توضیح می‌دهم:
1 - من دو دیتابیس 1 و 2 دارم که ساختار و طراحی هر دو دیتابیس کاملا شبیه هم است.
2 - محتویات دیتابیس 1 مربوط به شرکت الف و دیتابیس 2 مربوط به شرکت ب می‌باشد.
3 - برنامه به شکلی است که کاربر تعیین می‌کند این گزارش برای کدام شرکت باید تهیه شود آنگاه اتصال به همان دیتابیس برقرار و داده‌های همان شرکت به ریپورت ارسال می‌شود.
4 - مشکل این است که در تمام حالات، اطلاعات شرکت الف نشان داده می‌شود.

این موضوع را توسط خود کریستال ریپورت هم تست کردم و از طریق set database location اقدام به تغییر آنها کردم ولی در آنجا هم فقط اطلاعات شرکت الف می‌آمد.
جالب این است که در ‌properties اتصال اسم دیتابیس شرکت ب دیده می‌شود ولی موقع نمایش اطلاعات می‌بینم اطلاعات شرکت الف است.

اگر دوستان محبت کنند راهنمایی کنند ممنون می‌شوم.
با تشکر

فکر می‌کنم مشکلم از نحوه اتصال با کد نباشد چرا که این موضوع را با خود کریستال ریپورت هم امتحان کردم و به نظر می‌رسد مشکل از جای دیگری باشد.
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

kmotavali
پنج شنبه 17 اسفند 1385, 00:14 صبح
اگر با 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 اش کمی فرق می کند.)


بانک اطلاعاتی من اکسسه

vb341
جمعه 18 اسفند 1385, 02:48 صبح
دوست عزیز کانکشن رو در برنامت ایجاد کن و بعد با روش 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

pouriams
یک شنبه 20 اسفند 1385, 14:39 عصر
بانک اطلاعاتی من اکسسه
فرقی نمی کنه فقط کافیه provider اش را بانک اکسس بگذاری:

Provider=Microsoft.Jet.OLEDB.4.0;Data Source=DATABASE.mdb;Mode=ReadWrite;Persist Security Info=False;Jet OLEDB:Database Password=YOURPASSWORDHERE
داخل کوتیشن به جای provider‌ قبلی، بالایی را جایگزین کن.

A.Farzin
یک شنبه 20 اسفند 1385, 18:50 عصر
آقا من اومدم ابرو رو درست کنم، زدم چشو کور کردم

درست است که گزارش من در هر حال اطلاعات شرکت الف را می‌آورد ولی با این حال اجرا می‌شد. خواستم کاری کنم تا یک جورائی رکوردست به گزارش ارسال شود ولی نمی‌دانم چه شده که در خط قرمزرنگ زیر اجرای گزارش به خطا منجر می‌شود.

Dim crApp As New CRAXDRT.Application
Dim crReport As New CRAXDRT.Report

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

خطای زمان اجرای برنامه روی این خط هست:
invalid TLV record

sm
یک شنبه 12 فروردین 1386, 12:48 عصر
واقعا تعجب میکنم!!!
مگه شماها همه توی Windows کدنویسی نمی کنین دوستان!؟
همین ویندوزی که باهاش کار می کنین یه ابزار بسیار عالی داره بنام ِODBC که تمام برنامه های دیگه هم اونو پشتیبانی می کنن از جمله کریستال
با استفاده از این ابزار تموم مشکلاتتون حل میشه

Control Panel--->Administrative Tools---> ODBC

موفق باشین

pouriams
سه شنبه 14 فروردین 1386, 08:38 صبح
درود
وقتی oledb هست که odbc چیه.

mehdi_RM
پنج شنبه 16 فروردین 1386, 20:20 عصر
آقا من بانکم access هستش
آقا pouriams آدرس دهی نسبی برا من جواب نمی ده error می ده
مسیر از اول درایو تست می کنه نه از پوشه برنامه!!!!!
اون کدی هم که گذاشتی من از دستور sql استفاده نکردم برا من جواب نمی ده

آخرش من چی کار کنم ؟؟

pouriams
شنبه 18 فروردین 1386, 07:57 صبح
برای آدرس دهی نسبی من گفتم بار اول که شما آدرس دهی مطلق می کنی و کریستال ات را می سازی برای این که نسبی اش بکنی نیازی نیست راه های سخت طی کنی و کدنویسی کنی، راحت ترین راه این است که همون جا دوباره new connection بزنی و همان کاری را که قبلا کردی انجام بدی یعنی دیتابیس ات را دوباره set کنی البته این بار فقط نام دیتابیس. اینطوری آدرس دهی دیتابیس ات نسبی میشه. هر جا که بانکت باشه، کریستال ات هم جواب میده.
در مورد کدی که گفتی جواب نداد هم اگر لطف کنی کامل تر توضیح بدی ممنون می شم

mehdi_RM
شنبه 18 فروردین 1386, 22:50 عصر
سلام من مشکلم فکر کنم حل شده فقط باید رو یه کامپیوتر دیگه امتحانش کنم
با استفاده از کدی که آقای 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
مشکل از کجاست؟؟؟؟

pouriams
یک شنبه 19 فروردین 1386, 07:41 صبح
در منوی فایل تیک save data with report را بردارید. احتمالا مشکل از همین جاست.

mehdi_RM
یک شنبه 19 فروردین 1386, 21:52 عصر
این کارو کردم ولی مشکل از اونجا هم نبود؟؟؟!!!!!!!

sm
دوشنبه 20 فروردین 1386, 07:16 صبح
فکر کنم یکبار دیگه باید کانکشنش رو Set کنید

mehdi_RM
دوشنبه 20 فروردین 1386, 14:21 عصر
چجوری می تونم این کارو انجام بدم؟

sm
سه شنبه 21 فروردین 1386, 07:40 صبح
شما باید یه متغیر از فایل گزارشتون توی برنامه ایجاد کنید و از اون به بعد با اون متغیر کار کنید و هربار که کاربر برای نمایش اقدام کرد اون متغیر رو دوباره مقداردهی کنید.

pouriams
چهارشنبه 22 فروردین 1386, 12:07 عصر
منظور شما از متغیر از گزارش در برنامه چیه؟؟؟؟؟؟؟

sm
چهارشنبه 22 فروردین 1386, 17:51 عصر
با اجازه اساتید فن، من کل مراحلی که خودم همیشه برای گزارشاتم استفاده می کنم رو بیان می کنم...
من همواره از 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

با این کار گزارش به بانک وصل میشود و مقادیر را به کاربر نمایش می دهد.

امیدوارم مفید واقع بشود

موفق باشید

pouriams
پنج شنبه 23 فروردین 1386, 11:47 صبح
کار شما خیلی خوبه منم همین کار را انجام می دهم ولی من بعد از این که گزارشم را در کریستال ریپورت ساختم اونو توی برنامه ام اضافه می کنم و در فرم ام هم CRViewer91 را ReportSource را نسبت دهی می کنم و به راحتی برنامه ام به ریپورتم وصل میشه. اما در مورد خود کریستال بود که بحث بود نه وصل شدن به آن.

mehdi_RM
جمعه 24 فروردین 1386, 21:20 عصر
با ODBC آیا دیگه مشکل آدرس دهی نسبی حل می شه؟؟؟

موقع setup سازی کی باید odbc رو برا کامپیوتر مقصد بسازیم
و در اون موقع آدرس دهی نسبی می کنه یا نه؟

sm
جمعه 24 فروردین 1386, 22:14 عصر
بله تمام این مشکلات حل خواهد شد
ضمن اینکه شما براحتی میتونید هنگام ساختن Setup برنامه بگید که اون کانکشن ODBC رو هم به Setupتون اضافه کند... البته من همیشه Setupهای برنامه هام رو با Install shield می سازم که اون هم تمام این موارد رو پشتیبانی میکنه

موفق باشید

mehdi_RM
شنبه 25 فروردین 1386, 14:59 عصر
یعنی برای هر پروژه باید یه ODBC تعریف کنیم ؟

mehdi_RM
شنبه 25 فروردین 1386, 15:50 عصر
سلام

من تو یکی از ریپورتام از دو تا جدول استفاده کردم
ولی وقتی با دستور 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").Text = "'" & 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 کردن متغییر ریپورت
خود ویژوال بیسیک این کد ها رو می زاره !!! فکر کنم البته

pouriams
یک شنبه 26 فروردین 1386, 08:18 صبح
شاید چون فارسی نوشتید مشکل پیدا کرده و نشان نمیدهد. در حالیکه کد sql هم درست به نظر می رسد.
در کانکشن هم از راه زیر بد نیست استفاده کنید:
Database-> set datasource location -> create new connection از اینجا oledb (ado) را انتخاب کنید. ولی چون قبلا دیتابیس تان را ست کرده اید و آدرس مطلق به آن داده اید دیگر لازم نیست که آدرس مطلق به آن بدهید کافی است دیتابیس را انتخاب کنید (فقط نام دیتابیس به عنوان مثال db1.mdb) و آدرس های قبل از آن را پاک کنید. بعد از این که finish‌ را زدید (البته اگر password‌نیز دارد آن را نیز باید ست کنید) آدرس بانک شما آدرس نسبی می شود و هرجایی که بگذارید فقط کافی است بانکتان کنارش باشد یعنی در همان فولدر.

mehdi_RM
یک شنبه 26 فروردین 1386, 09:06 صبح
در کانکشن هم از راه زیر بد نیست استفاده کنید:
Database-> set datasource location -> create new connection از اینجا oledb (ado) را انتخاب کنید. ولی چون قبلا دیتابیس تان را ست کرده اید و آدرس مطلق به آن داده اید دیگر لازم نیست که آدرس مطلق به آن بدهید کافی است دیتابیس را انتخاب کنید (فقط نام دیتابیس به عنوان مثال db1.mdb) و آدرس های قبل از آن را پاک کنید. بعد از این که finish‌ را زدید (البته اگر password‌نیز دارد آن را نیز باید ست کنید) آدرس بانک شما آدرس نسبی می شود و هرجایی که بگذارید فقط کافی است بانکتان کنارش باشد یعنی در همان فولدر.


سلام
من این کارو کردم ولی جواب نمیده
سوالم اینه که از داخل کد برنامه چجوری میشه یه مسیر دیگه به دیتابیس داد
و اصلا کاری ندارم که قبلا آدرس دهی نسبی شده یا نه و آیا اصلا میشه یا نه؟؟؟؟؟؟


اگه نمیشه بگید آدرس دهی نصبی روش دیکه ای هم داره؟؟؟؟؟

sm
یک شنبه 26 فروردین 1386, 09:18 صبح
با اجازه ی اساتید، من دارم یه آموزش کوچولو از نحوه چگونگی استفاده از ODBC Connection آماده می کنم... فکر کنم مشکلات دوستان تا حد زیادی حل بشه
شما فعلا برای اینکه مشکلتون حل بشه از مسیر زیر ، مسیر ‍Connection خود به بانک رو اصلاح کنید

اگر توی کریستال کار می کنید :
Database--->Set Datasource Location

اگر توی دات نت استفاده می کنید:
گزارش رو باز کنید و بروید به حالت Design بعد روی گزارش راست کلیک کنید و بقیه :
Database--->Set Location

موفق باشید

mehdi_RM
دوشنبه 27 فروردین 1386, 15:41 عصر
من میگم چجوری به ODBC آدرس دهی نسبی بدم و یا توی کد برنامه حین اجرا مسیر بانک اطلاعاتی رو عوض کنم!!!!!!!!!!!!!!

A.Farzin
دوشنبه 27 فروردین 1386, 19:07 عصر
ولی وقتی با دستور Sql اسم این دو جدولو ارجاع می دم و شرط می زارم
میره 2 3 صفحه ریپورت بمن تحویل می ده
در صورتی که 4 تا رکورد بیشتر نباید نشون بده
و مشکل از دستور sql هم نیست چون وقتی خروجی شو داخل DtataGrid می زارم درسته!!!
و در این مورد میره اطلاعات رو از بانکی که اولین بار با گزارش Set کردم می خونه



من هم همچین مشکلی داشتم که اطلاعات از جدولی خوانده می‌شد که گزارش را روی آن طراحی کرده بودم.
به شکلی که من مساله را حل کردم، شما باید این کد را

Report.SQLQueryString = sql
قبل از خطوط زیر در برنامه‌تون اضافه کنید.


CRViewer91.Refresh
Report.DiscardSavedData
Report.ReadRecords

sm
سه شنبه 28 فروردین 1386, 07:06 صبح
من میگم چجوری به ODBC آدرس دهی نسبی بدم و یا توی کد برنامه حین اجرا مسیر بانک اطلاعاتی رو عوض کنم!!!!!!!!!!!!!!

شما چه نیازی دارید که مسیر بانک اطلاعاتی رو حین اجرا عوض کنید؟
شما مراحل ساخت ODBC رو انجام دادید؟

mehdi_RM
سه شنبه 28 فروردین 1386, 13:43 عصر
آخه وقتی ODBC می سازیم از ما آدرس دهی نسبی نمی گیره
باید نام درایو هم بدیم
و شاید این درایو در کامپیوتر مقصد نباشه
من ODBC ساختم جوابم داد
ولی نمی دونم چجوری آدرس دهی نسبیش کنم و آیا اصلاً نیاز هست
اگه نیست چرا ؟
اگه نیاز هست روش چجوریه؟

sm
چهارشنبه 29 فروردین 1386, 08:22 صبح
شما وقتی ODBC رو روی سیستم خودتون ایجاد کردید که میتونین وصل بشین و باهاش کار کنید
حالا وقتی میخواین روی سیستم دیگه ای برنامه رو نصب کنید، اگر Setup برنامه رو ساخته باشید میتونین بگین ODBC رو هم به اون اضافه کنه و روی سیستم نصب بشه یا اینکه اگر Setup رو نساختین، بصورت دستی اونو روی کامپیوتر مقصد بسازین
در هر صورت وقتی ODBC روی سیستم مقصد ایجاد شد، 2 حالت بوجود میاد:
1-برنامه بصورت کلاینت هست
2- برنامه توی شبکه کار می کند البته از نقطه نظر بانک اطلاعاتی
اگر برنامه فقط روی یه سیستم نصب میشه و شبکه ای نیست که کار خیلی راحت هست... شما وقتی دارین ODBC رو هنگام برنامه نویسی میسازین توی قسمت مربوط به Server (برای کانکشن از نوع SQL)باید عبارت (local) یا فقط یه نقطه رو درج کنید. با این عمل وقتی ODBC روی کامپیوتر مقصد هم ایجاد شد، شما نیاز به هیچ تغییری ندارید
اما اگر برنامه شما توی شبکه قرار است کار کند فرق می کند.
اگر شما از قبل نام یا IP سرور بانک اطلاعاتی خودتون رو بدونید بازهم کار مثل بالاست اما درصورتیکه ندونید باید شما برنامه تان رو حالت عادی بنویسید اما وقتی روی کامپیوتر مقصد نصب شد، ODBC اونو تغییر بدید. توی این حالت فقط باید اونو ویرایش کنید و نام یا IP سرور بانک اطلاعاتی رو بهش بدین
به همین راحتی... تازه نکته خوبی که داره اینه که میشه تاحدودی از ODBC بجای قفل نرم افزاری استفاده کرد... چراکه وقتی بخواد به بانک وصل بشه، می توان برای آن یوزر و پسورد هم تعریف کرد...
امیدوارم مشکلاتتون حل بشه

موفق باشید

mehdi_RM
یک شنبه 20 خرداد 1386, 22:10 عصر
با اجازه ی اساتید، من دارم یه آموزش کوچولو از نحوه چگونگی استفاده از ODBC Connection آماده می کنم... فکر کنم مشکلات دوستان تا حد زیادی حل بشه

سلام دوست عزیز این آموزش آماده نشد
خیلی مشتاقم آموزشو اینجا بزارید
ممنون

sm
دوشنبه 21 خرداد 1386, 11:52 صبح
حتما... ببخشین... فراموشم شده بود
تا چند روز آینده میزارم

موفق باشید

sm
شنبه 26 خرداد 1386, 07:15 صبح
این هم آموزشی رو که قول داده بودم
اولا که بخشین دیر شد... بعد هم امیدوارم اساتید ببخشن
از دوستان عزیز ممنون میشم نظراتشونو دراین باره بگن...

موفق باشید

elmira_63
پنج شنبه 16 خرداد 1387, 11:24 صبح
ممنون آقای sm بابت آموزش جالبتون
من تموم گزارش هام رو با کریستال ریپورت به وسیله odbc connection ارتباط دادم ولی ممکنه بگید چه جوری توی ساخت برنامه نصب این ارتباط رو اضافه کنم که روی سیستم مقصد هم ریپورت هام جواب بده؟؟