none
請問reportViewer要如何做到動態的report RRS feed

  • 問題

  • 請敎各位前輩:

    在WinindowsXP,Visual Studio2005 C#,Windows Form已完成一個圖表的reportViewer

    SQL為
    SELECT MB001, MB002, MB003, MB004
    FROM `111.csv`--本機測試用
    WHERE (MB001 = 'z3-value')

    目前MB001 = 有z1-value~z5-value
    我的笨做法有2
    1.準備5塊Report1.rdlc供使用
    2.暴力法強迫以文字修改xml格式的DataSet1.xsd中CommandText,使它暴力動態變成我要的SQL

    請問有第3種方法可以在Visual Studio2005 C#設定畫面下,修改DataSet1.xsd中DataTable1中DataTable1TableAdapter中SQL Query屬性的CommandText

    感謝各位

    2007年2月9日 上午 12:44

解答

  • 感謝tihs提供第3種方法及LOLOTA第4種方法
    小弟我還是try不出來要如何使用

    myObjectDataSource.TypeName="DataSet2TableAdapters.DataTable1TableAdapter"
    加入後還是會發生錯誤"找不到ObjectDataSource的TypeName屬性所指定的型別"

    最後我換第5種方法
    DataSet1.xsd拉出的元件,無法動[SQL]Fill,GetData()中CommandText
    修改純文字檔DataSet1.xsd也太危險了
    所以我去動最後reportView要讀取的產物DataTable1做手腳
    this.DataSet1.DataTable1.Clear();
    this.DataSet1.DataTable1.Merge(myDataTable);
    也因此達到我要的動態report的效果

            private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
            {
                string connectionString = @"Driver={Driver do Microsoft Excel(*.xls)};dbq=D:\sample-chart.xls;defaultdir=D:\;driverid=790;fil=excel 8.0;filedsn=D:\EXCEL.dsn;maxbuffersize=2048;maxscanrows=8;pagetimeout=5;readonly=1;safetransactions=0;threads=3;uid=admin;usercommitsync=Yes";
                OdbcConnection myOdbcConnection = new OdbcConnection(connectionString);
                string queryString = "SELECT * FROM `'1rowdata$'`  WHERE (MB001  = '" + comboBox1.Text + "') ";//下拉選取查詢品號
                OdbcDataAdapter myOdbcDataAdapter = new OdbcDataAdapter(queryString, myOdbcConnection);

                DataSet myDataSet = new DataSet();
                DataTable myDataTable = new DataTable("chart");
                myOdbcDataAdapter.Fill(myDataTable);
                myDataSet.Tables.Add(myDataTable);

                // TODO: 這行程式碼會將資料載入 'DataSet1.DataTable1' 資料表。您可以視需要進行移動或移除。
                //this.DataTable1TableAdapter.Fill(this.DataSet1.DataTable1);

                //myDataTable.WriteXml("temp.xml",XmlWriteMode.IgnoreSchema);
                this.DataSet1.DataTable1.Clear();
                this.DataSet1.DataTable1.Merge(myDataTable);//原DataTable1由myDataTable覆蓋

                this.reportViewer1.RefreshReport();
                this.reportViewer1.LocalReport.Refresh();
            }

    2007年2月15日 上午 09:12

所有回覆

  • HI,

    要執行查詢的話, 可以透過DataSet.Table名稱,Select(查詢條件);做到, 例如:

    northwindDataSet.Products.Select(查詢條件);

    tihs

    2007年2月9日 上午 01:11
  •  tihs 寫信:

    HI,
    要執行查詢的話, 可以透過DataSet.Table名稱,Select(查詢條件);做到, 例如:
    northwindDataSet.Products.Select(查詢條件);
    tihs


    謝謝您的回覆指導,又要再度麻煩您了

    我參考以下文件
    DataTable.Select 方法
    http://msdn2.microsoft.com/zh-tw/library/system.data.datatable.select(VS.80).aspx

                // Get the DataTable of a DataSet.
                DataTable table = DataSet2.Tables[0];
                DataRow[] rows = table.Select();

                // Print the value one column of each DataRow.
                for (int i = 0; i < rows.Length; i++)
                {
                    comboBox1.Items.Add(rowsIdea[0]);
                }
    並沒有撈出我已預存的SQL
    SELECT MB001, MB002, MB003, MB004 FROM `111.csv` WHERE (MB001 = 'z3-value')
    comboBox1結果是空的

    我如何做到以下的要求?
                string temp_string = "SELECT * FROM `111.csv` WHERE (MB001 = '" +  comboBox1.Text + "')";
                DataSet2.Tables[0].Select(temp_string);

    我需要一併在client PC安裝Northwind 範例資料庫嗎??
    謝謝您

    2007年2月9日 上午 03:21
  • SQL語法應該可以這麼下

    SQL為
    SELECT MB001, MB002, MB003, MB004
    FROM `111.csv

    WHERE (MB001 = @Para1)

     

    然後程式內設定參數值(您應該是以ObjectDataSource為資料來源吧?)

     ObjectDataSource1.SelectParameters.Clear()
     ObjectDataSource1.SelectParameters.Add("Para1", "Z1")
     ObjectDataSource1.Select()

     

    以上供您參考。

     

    2007年2月9日 上午 09:04
    版主
  •  LOLOTA 寫信:

    SQL語法應該可以這麼下

    SQL為
    SELECT MB001, MB002, MB003, MB004
    FROM `111.csv

    WHERE (MB001 = @Para1)

     

    然後程式內設定參數值(您應該是以ObjectDataSource為資料來源吧?)

     ObjectDataSource1.SelectParameters.Clear()
     ObjectDataSource1.SelectParameters.Add("Para1", "Z1")
     ObjectDataSource1.Select()

     

    以上供您參考。

     

    您好:

    我只有用C# .net,未使用ASP.NET

    SQL為
    SELECT MB001, MB002, MB003, MB004
    FROM `111.csv'
    WHERE (MB001 = @MB001_value)

                ObjectDataSource myObjectDataSource = new ObjectDataSource();
                myObjectDataSource.SelectParameters.Clear();
                myObjectDataSource.SelectParameters.Add("MB001_value", "z4-value");
                myObjectDataSource.Select();

                this.dataTable1TableAdapter.Fill(this.DataSet2.DataTable1);
               
                this.reportViewer1.RefreshReport();
                this.reportViewer1.LocalReport.Refresh();

    發生錯誤訊"除非指定SelectMethod,否則ObjectDataSource無法支援選取作業"
    請問我可以這樣設定嗎??

    2007年2月12日 上午 02:06
  • 這樣的步驟是沒錯,根據您的錯誤訊息,您的ObjectDataSource並沒有指定selectMethod

    (因為我是從畫面拉元件來用,所以是在畫面上設定,這裡您必須用程式設定)。

    設定方式可以參考:

    myObjectDataSource.SelectMethod="DataSet中的SelectMethind  Name"

    2007年2月12日 上午 02:26
    版主
  •  LOLOTA 寫信:

    這樣的步驟是沒錯,根據您的錯誤訊息,您的ObjectDataSource並沒有指定selectMethod

    (因為我是從畫面拉元件來用,所以是在畫面上設定,這裡您必須用程式設定)。

    設定方式可以參考:

    myObjectDataSource.SelectMethod="DataSet中的SelectMethind  Name"

    您好:

    我依據
    namespace reportView
    {
        public partial class Form2 : Form
        {
            public Form2()
            {
                InitializeComponent();
            }
    .......etc....
    以及DataSet2.xsd中DataTable1TableAdapter中SQL欄位為Fill,GetData()

               設定為
                myObjectDataSource.SelectMethod = "Fill";
                myObjectDataSource.TypeName = "reportView.Form2";

    myObjectDataSource.Select();
    會發生錯誤"找不到ObjectDataSource的TypeName屬性所指定的型別"

    請問我是那裡漏設定??

    2007年2月12日 上午 10:07
  • 設定的方法:

    前面為DataSet的Name,後面為Adapter的名稱。

    myObjectDataSource.TypeName="DataSet2TableAdapters.DataTable1TableAdapter"

    2007年2月13日 上午 01:27
    版主
  • 感謝tihs提供第3種方法及LOLOTA第4種方法
    小弟我還是try不出來要如何使用

    myObjectDataSource.TypeName="DataSet2TableAdapters.DataTable1TableAdapter"
    加入後還是會發生錯誤"找不到ObjectDataSource的TypeName屬性所指定的型別"

    最後我換第5種方法
    DataSet1.xsd拉出的元件,無法動[SQL]Fill,GetData()中CommandText
    修改純文字檔DataSet1.xsd也太危險了
    所以我去動最後reportView要讀取的產物DataTable1做手腳
    this.DataSet1.DataTable1.Clear();
    this.DataSet1.DataTable1.Merge(myDataTable);
    也因此達到我要的動態report的效果

            private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
            {
                string connectionString = @"Driver={Driver do Microsoft Excel(*.xls)};dbq=D:\sample-chart.xls;defaultdir=D:\;driverid=790;fil=excel 8.0;filedsn=D:\EXCEL.dsn;maxbuffersize=2048;maxscanrows=8;pagetimeout=5;readonly=1;safetransactions=0;threads=3;uid=admin;usercommitsync=Yes";
                OdbcConnection myOdbcConnection = new OdbcConnection(connectionString);
                string queryString = "SELECT * FROM `'1rowdata$'`  WHERE (MB001  = '" + comboBox1.Text + "') ";//下拉選取查詢品號
                OdbcDataAdapter myOdbcDataAdapter = new OdbcDataAdapter(queryString, myOdbcConnection);

                DataSet myDataSet = new DataSet();
                DataTable myDataTable = new DataTable("chart");
                myOdbcDataAdapter.Fill(myDataTable);
                myDataSet.Tables.Add(myDataTable);

                // TODO: 這行程式碼會將資料載入 'DataSet1.DataTable1' 資料表。您可以視需要進行移動或移除。
                //this.DataTable1TableAdapter.Fill(this.DataSet1.DataTable1);

                //myDataTable.WriteXml("temp.xml",XmlWriteMode.IgnoreSchema);
                this.DataSet1.DataTable1.Clear();
                this.DataSet1.DataTable1.Merge(myDataTable);//原DataTable1由myDataTable覆蓋

                this.reportViewer1.RefreshReport();
                this.reportViewer1.LocalReport.Refresh();
            }

    2007年2月15日 上午 09:12
  • hi 達人好
    請問關於作report,可以用動態的dataset?
    因我目前是用外面新增一個Dataset及.rdlc的方式,配合reportviewer、objectdatasource來展現報表,
    但請問可以不要由外面拉dataset的方式,而由程式new一個dataset作source?? 而.rdlc裡的欄位又要如何以程式加進去??
    環境是 vs2005+c#+sql2005
    感謝您!!!
    2008年1月14日 上午 08:00
  • 如果你用XML Editor來開啟rdlc檔案,你會發現報表樣板檔是由XML所描述

    然後你去比較新增一些項目後的rdlc檔案以及全新的rdlc檔案間的不同,透過對xml檔案修改的方式來存取

     

    上面說的方法會很麻煩,所以實做起來實在很不便利,如果要做到動態的「感覺」。

    可以參考下列這個方法:

    http://blog.lolota.net/2007/12/blog-post.html

     

    2008年1月14日 上午 08:55
    版主
  •  

    hi  LOLOTA

    謝謝您的回應與指導,但我有以下疑問:

    1. 關於第一作法,是拉一個空的報表(.rdlc),再用讀寫檔方式加入欄位的話,的確是一個方法,也的確有點複雜,這可以避開預先拉dataset的情形,不過,希望還有其他方法。

    2. 關於第二項,是好像以gridview作source?? 可是報表檔的欄位設定在哪裡?? 是先設好還是程式跑的時候才設定??

     

    希望您抽空再指導!!  感謝您!!

    2008年1月15日 上午 01:09
  • 1. 如果您去看rdlc的xml檔案,您會發現裡面包含欄位以及相對應的DataSet(or DataTable)的屬性設定。

        所以如果要動態加欄位,除了去寫XML到欄位中,「我想」應該是沒其他方法了

        (也許有達人有,要等待別人出來分享了)

     

    2. 報表黨還是要預先定義好,只是可以透過參數設定的方式決定哪些欄位的顯示與否。

     

     

     

    Best Regards

     

    2008年1月15日 上午 01:23
    版主