[Last Call] Learn about multicloud storage options and how to improve your company's cloud strategy. Register Now

x
?
Solved

I need a generic TableAdapter to dynamically access multiple reports

Posted on 2008-10-08
8
Medium Priority
?
1,021 Views
Last Modified: 2013-11-07
I have several reports I want to choose from and display on a web page.  I have one working using the following code to the needed variables for a ReportViewer:
        Dim taDS As dsCampaignTableAdapters.CampaignTableAdapter
        taDS = New dsCampaignTableAdapters.CampaignTableAdapter
        Dim uData As dsCampaign = New dsCampaign()
        Dim rds As ReportDataSource = New ReportDataSource("dsCampaign_Campaign", uData.Campaign)
        taDS.Fill(uData.Campaign)
        Dim rptPath As String = "Reports\Campaign List.rdlc"
        Dim rptPar(3) As ReportParameter

What I want to do is make it generic so I can pass appropriate names and parameters retrieved from a database.  I have the following working except for the taDS.Fill function...can anyone tell me how to fill in the commands needed to get this to work?
        Dim taDS As SqlDataAdapter
        taDS = New SqlDataAdapter()
        Dim uData As DataSet = New DataSet("dsCampaign")
        Dim rds As ReportDataSource = New ReportDataSource("dsCampaign_Campaign", uData.Tables("Campaign"))
        taDS.Fill(uData.Tables("Campaign"))
        Dim rptPath As String = "Reports\Campaign List.rdlc"
        Dim rptPar(3) As ReportParameter
0
Comment
Question by:Dalexan
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 3
  • 3
8 Comments
 
LVL 96

Expert Comment

by:Bob Learned
ID: 22730036
Strong-typed and generic don't really play well together.  TableAdapters a strong-typed, so if you need a generic implementation, then I would think that you need something different than a TableAdapter.
0
 

Author Comment

by:Dalexan
ID: 22732503
Given the lack of solutions in my searches on the web, and the slow responses to queries, I am assuming this to be much harder than I originally thought...if no one else has figured this out yet, it should be worth more.  So, I have increased the points to the max here...they will be well-deserved for the one who solves this.

Well, yes, mixing generic and strong-typed is difficult, but doable.  I have come up with a solution that works but is not as concise as I would like.  It will involve a Select Case statement for each report (there are over 50 so far and may be up to 100).  I created a strong-typed DataSet for each and use the Case statements to set up a ReportViewer.

What I would like to do is find a way to put something in a data base which could be used to find/identify/create the necessary pieces...taDS, uData and rds in the attached code snippet...even, perhaps, by storing the name of each in the DB and using that string value to create the assignment; or, if SQLServer allows it, somehow store the DataSets and TableAdapters themselves in the DB (not the preferred way to go).

Anyway, what I am still hoping for is a way to use a DB lookup rather than a long SELECT statement...any thoughts or suggestions would be greatly appreciated.
    Private Sub ShowReport(ByVal idx As Integer, ByVal sdate As Date, ByVal edate As Date, ByVal param As String)
        Dim taDS As Object
        Dim uData As DataSet
        Dim rds As ReportDataSource = New ReportDataSource()
        Dim rptPath As String = "Reports\"
        Dim rptPar() As ReportParameter
        Dim bPar As Boolean = False
 
        ReDim Preserve rptPar(1)
        rptPar(0) = New ReportParameter("dtmFrom", sdate.ToShortDateString())
        rptPar(1) = New ReportParameter("dtmTo", edate.ToShortDateString())
 
        Select Case idx
            Case 0
                taDS = New dsCampaignTableAdapters.CampaignTableAdapter()
                uData = New dsCampaign()
                rds = New ReportDataSource("dsCampaign_Campaign", uData.Tables(0))
                taDS.Fill(uData.Tables(0))
                rptPath += "Campaign_List.rdlc"
            Case 1
                taDS = New dsAgentQ_ProductTableAdapters.AgentQ_ProductTableAdapter()
                uData = New dsAgentQ_Product()
                rds = New ReportDataSource("dsAgentQ_Product_AgentQ_Product", uData.Tables(0))
                taDS.Fill(uData.Tables(0), sdate, edate, Val(param))
                rptPath += "AgentQ_Product.rdlc"
                ReDim Preserve rptPar(2)
                rptPar(2) = New ReportParameter("OrdRepNumber", param)
                bPar = True
        End Select
 
        Try
            rv1.Reset()
            rv1.LocalReport.DataSources.Clear()
            rv1.LocalReport.DataSources.Add(rds)
            rv1.LocalReport.ReportPath = rptPath
            If bPar Then rv1.LocalReport.SetParameters(rptPar)
            rv1.LocalReport.Refresh()
            rv1.Visible = True
        Catch ex As Exception
            '("There was an error generating the report:\r\n{0}", ex.ToString())
        End Try
    End Sub

Open in new window

0
 
LVL 96

Expert Comment

by:Bob Learned
ID: 22732677
If you think that you need to stick to this concept, you could use Activator.CreateType with a type name, and use the Invoke method on the instance created to fill the DataSet table.
0
Veeam Task Manager for Hyper-V

Task Manager for Hyper-V provides critical information that allows you to monitor Hyper-V performance by displaying real-time views of CPU and memory at the individual VM-level, so you can quickly identify which VMs are using host resources.

 

Author Comment

by:Dalexan
ID: 22732758
You say "If you think that you need to stick to this concept..." as if you have a better one in mind.  Perhaps you would share your thoughts on a different approach?
0
 
LVL 96

Accepted Solution

by:
Bob Learned earned 2000 total points
ID: 22732904
I would use single SqlConnection, SqlCommand, and SqlDataReader instances, with different stored procedure names and parameters that you can use to build a DataTable instance that you can bind to the report.  You could use an XML configuration file that defines the stored procedure name, parameters, and reporting binding information.  Then, you wouldn't need a huge Select Case statement.
0
 

Author Closing Comment

by:Dalexan
ID: 31504546
While this question is really unanswered "TheLearnedOne" probably has the best approach.
0

Featured Post

Get your Disaster Recovery as a Service basics

Disaster Recovery as a Service is one go-to solution that revolutionizes DR planning. Implementing DRaaS could be an efficient process, easily accessible to non-DR experts. Learn about monitoring, testing, executing failovers and failbacks to ensure a "healthy" DR environment.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Microsoft Access is a place to store data within tables and represent this stored data using multiple database objects such as in form of macros, forms, reports, etc. After a MS Access database is created there is need to improve the performance and…
Lotus Notes has been used since a very long time as an e-mail client and is very popular because of it's unmatched security. In this article we are going to learn about  RRV Bucket corruption and understand various methods to Fix "RRV Bucket Corrupt…
Polish reports in Access so they look terrific. Take yourself to another level. Equations, Back Color, Alternate Back Color. Write easy VBA Code. Tighten space to use less pages. Launch report from a menu, considering criteria only when it is filled…
This is a high-level webinar that covers the history of enterprise open source database use. It addresses both the advantages companies see in using open source database technologies, as well as the fears and reservations they might have. In this…

650 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question