# مباحث متفرقه برنامه نویسی > گزارش سازی با Crystal Report >  معرفی دیتابیس به کریستال ریپورت

## riyahiyan

با سلام
چطور میتونیم یه دیتابیس رو به CrystalReport معرفی کرد بطوریکه با جابجایی مکان دیتابیس مشکلی در گزارش گیری ایجاد نشه آیا دستور مانند App.path وجود دارد؟

----------


## vahidhaghani

> با سلام
> چطور میتونیم یه دیتابیس رو به 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

ممنون دوست عزیز.

----------


## pouriams

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






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

----------


## kmotavali

> با سلام توسط این کد در 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
> ...


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

----------


## Goeezor

عزیزم من هم مشکل تو را داشتم همین تازه حل کردم.
برای حل برو به منوی database در کریستال ریپورت و سپس set database location را بزن
 propertise را زده و بروی data sourse راست کلیک کرده و گزینه same as report  را انتخاب کن 
تا مسیر پایگاه داده همان مسیر گزارش هایت باشد.

----------


## sh

به جای تمام این دنگ و فنگ ها فقط کافیه به جای معرفی دیتا بیس دیتا ست رو به کریستال ریپورت معرفی کنی و دیگه کریستال ریپورت کاری نداره شما اون رو چطوری و از کجا پر کردی

----------


## kmotavali

از راهنماییتون ممنونم

----------


## Goeezor

> به جای تمام این دنگ و فنگ ها فقط کافیه به جای معرفی دیتا بیس دیتا ست رو به کریستال ریپورت معرفی کنی و دیگه کریستال ریپورت کاری نداره شما اون رو چطوری و از کجا پر کردی


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

----------


## kmotavali

من راه حل اونو پیدا کردم این کدها در وبی 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

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

----------


## A.Farzin

با سلام

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

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

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

----------


## pouriams

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

----------


## Goeezor

> "راستی در کریستال ریپورت تست کنید که تیک save with data را حتما برداشته باشید.


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

----------


## pouriams

من هم که نگفتم تیک آن باشد گفتم باید برداشته شود.

----------


## kmotavali

> من واقعا نمی دونم چرا ما همیشه دوست داریم لقمه را دور گردن بچرخانیم بعد در داخال دهانمان قرار دهیم. 
> خیلی راحت و بی دردسرتر از این حرفا مشکلات برطرف میشه. شما فکر می کنید کریستال ریپورت با این عظمتش فکری به حال این موضوع نکرده که می خواهید کدهای طولانی و خسته کننده بنویسید.
> من سه تا عکس از کاری که باید انجام دهید برایتان گذاشتم که به راحتی می بینید وقتی دیتابیس خودتان را ایجاد کرده اید و آدرس فیزیکی به آن داده اید چگونه آدرس آن را نسبی بکنید و بسیار راحت هرجا که دلتان خواست آن را ببرید و از آن استفاده کنید. فقط کافی است کانکشن جدید را آدرس دهی نسبی بکنید.


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

----------


## pouriams

اگر با 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

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


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

> اگر با ado  کار کنید به راحتی می توانید آدرسی که به کانکشن می فرستید عوض کنید.
> 
> oConn.CursorLocation = adUseClient
> 
>     oConn.ConnectionString = "Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=" & *dbnet*
> 
>     oConn.Mode = adModeReadWrite
> 
>     oConn.Open
> ...



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

----------


## vb341

دوست عزیز کانکشن رو در برنامت ایجاد کن و بعد با روش 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

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


فرقی نمی کنه فقط کافیه 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

آقا من اومدم ابرو رو درست کنم، زدم چشو کور کردم

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

----------


## sm

واقعا تعجب میکنم!!!
مگه شماها همه توی Windows کدنویسی نمی کنین دوستان!؟
همین ویندوزی که باهاش کار می کنین یه ابزار بسیار عالی داره بنام ِODBC که تمام برنامه های دیگه هم اونو پشتیبانی می کنن از جمله کریستال
با استفاده از این ابزار تموم مشکلاتتون حل میشه

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

موفق باشین

----------


## pouriams

درود
وقتی oledb هست که odbc چیه.

----------


## mehdi_RM

آقا من بانکم access هستش
آقا pouriams  آدرس دهی نسبی برا من جواب نمی ده error  می ده
مسیر از اول درایو تست می کنه نه از پوشه برنامه!!!!!
اون کدی هم که گذاشتی من از دستور sql  استفاده نکردم برا من جواب نمی ده

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

----------


## pouriams

برای آدرس دهی نسبی من گفتم بار اول که شما آدرس دهی مطلق می کنی و کریستال ات را می سازی برای این که نسبی اش بکنی نیازی نیست راه های سخت طی کنی و کدنویسی کنی، راحت ترین راه این است که همون جا دوباره new connection بزنی و همان کاری را که قبلا کردی انجام بدی یعنی دیتابیس ات را دوباره set کنی البته این بار فقط نام دیتابیس. اینطوری آدرس دهی دیتابیس ات نسبی میشه. هر جا که بانکت باشه، کریستال ات هم جواب میده.
در مورد کدی که گفتی جواب نداد هم اگر لطف کنی کامل تر توضیح بدی ممنون می شم

----------


## mehdi_RM

سلام من مشکلم فکر کنم حل شده فقط باید رو یه کامپیوتر دیگه امتحانش کنم
با استفاده از کدی که آقای 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

در منوی فایل تیک save data with report را بردارید. احتمالا مشکل از همین جاست.

----------


## mehdi_RM

این کارو کردم ولی مشکل از اونجا هم نبود؟؟؟!!!!!!!

----------


## sm

فکر کنم یکبار دیگه باید کانکشنش رو Set کنید

----------


## mehdi_RM

چجوری می تونم این کارو انجام بدم؟

----------


## sm

شما باید یه متغیر از فایل گزارشتون توی برنامه ایجاد کنید و از اون به بعد با اون متغیر کار کنید و هربار که کاربر برای نمایش اقدام کرد اون متغیر رو دوباره مقداردهی کنید.

----------


## pouriams

منظور شما از متغیر از گزارش در برنامه چیه؟؟؟؟؟؟؟

----------


## sm

با اجازه اساتید فن، من کل مراحلی که خودم همیشه برای گزارشاتم استفاده می کنم رو بیان می کنم...
من همواره از 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

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

----------


## mehdi_RM

با ODBC آیا دیگه مشکل آدرس دهی نسبی حل می شه؟؟؟

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

----------


## sm

بله تمام این مشکلات حل خواهد شد
ضمن اینکه شما براحتی میتونید هنگام ساختن Setup برنامه بگید که اون کانکشن ODBC رو هم به Setupتون اضافه کند... البته من همیشه Setupهای برنامه هام رو با Install shield می سازم که اون هم تمام این موارد رو پشتیبانی میکنه

موفق باشید

----------


## mehdi_RM

یعنی برای هر پروژه باید یه ODBC  تعریف کنیم ؟

----------


## mehdi_RM

سلام

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

----------


## pouriams

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

----------


## mehdi_RM

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


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


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

----------


## sm

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

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

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

موفق باشید

----------


## mehdi_RM

من میگم چجوری به ODBC آدرس دهی نسبی بدم و یا توی کد برنامه حین اجرا مسیر بانک اطلاعاتی رو عوض کنم!!!!!!!!!!!!!!

----------


## A.Farzin

> ولی وقتی با دستور Sql اسم این دو جدولو ارجاع می دم و شرط می زارم 
> میره 2 3 صفحه ریپورت بمن تحویل می ده
> در صورتی که 4  تا رکورد بیشتر نباید نشون بده 
> و مشکل از دستور sql  هم نیست چون وقتی خروجی شو داخل DtataGrid  می زارم درسته!!!
> و در این مورد میره اطلاعات رو از بانکی که اولین بار با گزارش Set  کردم می خونه



من هم همچین مشکلی داشتم که اطلاعات از جدولی خوانده می‌شد که گزارش را روی آن طراحی کرده بودم.
به شکلی که من مساله را حل کردم، شما باید این کد را 
Report.SQLQueryString = sql
قبل از خطوط زیر در برنامه‌تون اضافه کنید.

    CRViewer91.Refresh
    Report.DiscardSavedData
    Report.ReadRecords

----------


## sm

> من میگم چجوری به ODBC آدرس دهی نسبی بدم و یا توی کد برنامه حین اجرا مسیر بانک اطلاعاتی رو عوض کنم!!!!!!!!!!!!!!


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

----------


## mehdi_RM

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

----------


## sm

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

موفق باشید

----------


## mehdi_RM

> با اجازه ی اساتید، من دارم یه آموزش کوچولو از نحوه چگونگی استفاده از ODBC Connection آماده می کنم... فکر کنم مشکلات دوستان تا حد زیادی حل بشه


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

----------


## sm

حتما... ببخشین... فراموشم شده بود
تا چند روز آینده میزارم

موفق باشید

----------


## sm

این هم آموزشی رو که قول داده بودم
اولا که بخشین دیر شد... بعد هم امیدوارم اساتید ببخشن
از دوستان عزیز ممنون میشم نظراتشونو دراین باره بگن... 

موفق باشید

----------


## elmira_63

ممنون آقای sm بابت آموزش جالبتون 
من تموم گزارش هام رو با کریستال ریپورت به وسیله odbc connection ارتباط دادم ولی ممکنه بگید چه جوری توی ساخت برنامه نصب این ارتباط رو اضافه کنم که روی سیستم مقصد هم ریپورت هام جواب بده؟؟

----------

