SunDream° 发表于 2016-5-10 09:32:41

关于使用DataRelation建立关系然后在pagereport中显示多表联合的数据问题!

本帖最后由 Lenka.Guo 于 2016-5-10 13:32 编辑

////在设计器中我添加了这么一个数据集下的字段   字段的名字是PRD_NO 取值是从TF_PSS_MF关系中取到PRD_NO字段,

Field field = new Field("PRD_NO", "TF_PSS_MF.PRD_NO", null);
dataSet.Fields.Add(field);

////下面是我在view预览的时候在pageReport.Document.LocateDataSource的数据集数据源的取值事件
public DataTable LoadDataSet()
{
            string _connsql = "“;
            string _OLEDB = "";
            DataSet myDataSet = new DataSet();
            //string connStr = Properties.Resources.ConnectionString;
            OleDbConnection conn = new OleDbConnection(_OLEDB);
            for (int i = 0; i < 2; i++)
            {
                DataTable[] myDataTables = new DataTable;
                myDataTables = new DataTable(Constants.tableNames);
                myDataSet.Tables.Add(myDataTables);
                OleDbCommand cmd = new OleDbCommand(Constants.cmdText, conn);
                OleDbDataAdapter oleAdapter = new OleDbDataAdapter(cmd);
                oleAdapter.Fill(myDataSet.Tables);
            }
            DataRelation RelPSS =
               new DataRelation("TF_PSS_MF", new DataColumn[] { myDataSet.Tables["MF_PSS"].Columns["MF_PS_NO"] },
                              new DataColumn[] { myDataSet.Tables["TF_PSS"].Columns["TF_PS_NO"] });
            myDataSet.Relations.Add(RelPSS);

            return myDataSet.Tables["MF_PSS"];
}

为什么这样操作后的结果是根本就取不到值呢?

Lenka.Guo 发表于 2016-5-10 15:46:23

Hi,
问题验证中,有效的解决方案会立即回复。

SunDream° 发表于 2016-5-10 16:15:12

Lenka.Guo 发表于 2016-5-10 15:46
Hi,
问题验证中,有效的解决方案会立即回复。

:(早上反应的下午才看。这效率。。

大侠归来 发表于 2016-5-10 16:16:04

LocateDataSource 事件中的args.Data每次好像只能接收一个 DataTable 对象, 你查询的时候不返回 return myDataSet.Tables["MF_PSS"];,直接创建一个DataTable返回就可以了吧,反正创建DataSet好像也不用,你就需要一个 DataTable 而已。
纯属个人看法,如有不当,欢迎拍砖 :itwn:

SunDream° 发表于 2016-5-10 17:41:09

大侠归来 发表于 2016-5-10 16:16
LocateDataSource 事件中的args.Data每次好像只能接收一个 DataTable 对象, 你查询的时候不返回 return my ...

哈哈~ 没事儿呢~ 这些问题就是要讨论来的呢,

DataRelation RelPSS =
               new DataRelation("TF_PSS_MF", new DataColumn[] { myDataSet.Tables["MF_PSS"].Columns["MF_PS_NO"] },
                              new DataColumn[] { myDataSet.Tables["TF_PSS"].Columns["TF_PS_NO"] });
            myDataSet.Relations.Add(RelPSS);

你看一下我这里面有一个创建两表关联关系的语句,在创建关系我想要的就是可以传入一个DataTable 然后用这个dataTable访问存在关系的另外一个DataTable达到多表关联的效果呈现在PageReport类型的报表中.

Lenka.Guo 发表于 2016-5-10 19:04:10

SunDream° 发表于 2016-5-10 17:41
哈哈~ 没事儿呢~ 这些问题就是要讨论来的呢,

DataRelation RelPSS =


因为早上接到你的需求后,一直在验证,是想有效的解决方法之后,再回复,否则回复再及时也没有意义。
目前该问题的进展是,通过DataRelation,可以成功访问实现多表关联的效果。需要注意的是,当返回的是主表内容,则在生成报表时,可获取到子表字段,反之亦然。所以要注意的是字段所属的DataTable和传进的Table的关系。

核心代码:

LocateDataSource:
private void LoadDataSet(object sender, LocateDataSourceEventArgs args)
      {
........
.......
                //为Table 添加数据
                myDataSet.Tables.Add(myDataTables);
                OleDbCommand cmd2 = new OleDbCommand(Constants.cmdText2, conn);
                OleDbDataAdapter oleAdapter2 = new OleDbDataAdapter(cmd2);
                oleAdapter2.Fill(myDataSet.Tables);

                //创建 “DataRelation”

            DataRelation RelPSS = new DataRelation("TF_PSS_MF", myDataSet.Tables.Columns["订单ID"] ,
                              myDataSet.Tables.Columns["订单ID"] );
            myDataSet.Relations.Add(RelPSS);
         
            //返回从表数据
            args.Data = myDataSet.Tables;

            
      }


创建报表:
public static PageReport addDataSet(PageReport report)
      {
.......
......
            //获取主表字段
            Field field = new Field("客户ID", "TF_PSS_MF.客户ID", null);
                dataSet.Fields.Add(field);

Demo 下载:




SunDream° 发表于 2016-5-11 09:47:15

Lenka.Guo 发表于 2016-5-10 19:04
因为早上接到你的需求后,一直在验证,是想有效的解决方法之后,再回复,否则回复再及时也没有意义。
目 ...

经过对比我在设置取值的时候出现了问题!导致了取不到创建过的DataRelation子表数据!现在已经可以了!谢谢!

Lenka.Guo 发表于 2016-5-11 10:11:23

SunDream° 发表于 2016-5-11 09:47
经过对比我在设置取值的时候出现了问题!导致了取不到创建过的DataRelation子表数据!现在已经可以了!谢 ...

:loap1::hjyzw:

SunDream° 发表于 2016-5-11 15:52:57

Lenka.Guo 发表于 2016-5-11 10:11


// 创建DataSet
            DataSet myDataSet = new DataSet();
            //string connStr = Properties.Resources.ConnectionString;
            OleDbConnection conn = new OleDbConnection(_OLEDB);
            DataTable[] myDataTables = new DataTable;
            myDataTables = new DataTable("MF_PSS");
            myDataTables = new DataTable("TF_PSS");
            myDataTables = new DataTable("TF_PSS_RCV");


            //创建DataTable   
            myDataSet.Tables.Add(myDataTables);
            OleDbCommand cmd1 = new OleDbCommand(Constants.TxtSql, conn);
            OleDbDataAdapter oleAdapter1 = new OleDbDataAdapter(cmd1);
            oleAdapter1.Fill(myDataSet.Tables);

            //为Table 添加数据
            myDataSet.Tables.Add(myDataTables);
            OleDbCommand cmd2 = new OleDbCommand(Constants.TxtSql1, conn);
            OleDbDataAdapter oleAdapter2 = new OleDbDataAdapter(cmd2);
            oleAdapter2.Fill(myDataSet.Tables);

            myDataSet.Tables.Add(myDataTables);
            OleDbCommand cmd3 = new OleDbCommand(Constants.TxtSql2, conn);
            OleDbDataAdapter oleAdapter3 = new OleDbDataAdapter(cmd3);
            oleAdapter3.Fill(myDataSet.Tables);

            //创建 “DataRelation”

            DataRelation RelPSS = new DataRelation("TF_PSS_MF", myDataSet.Tables.Columns["PS_NO"],
                              myDataSet.Tables.Columns["PS_NO"]);

            DataRelation RelRCV = new DataRelation("TF_PSS_RCV", myDataSet.Tables.Columns["PS_NO"],
                              myDataSet.Tables.Columns["PS_NO"]);

            myDataSet.Relations.Add(RelPSS);
            myDataSet.Relations.Add(RelRCV);

            //返回从表数据
            return myDataSet;



如上面这一段代码所示,   在我对你们提供的DEMO 进行拓展添加多一层的关系的时候,在进行预览的时候 会显示是空白捞不出来数据~   是否是我这边有什么问题呢?

Lenka.Guo 发表于 2016-5-11 16:06:49

SunDream° 发表于 2016-5-11 15:52
// 创建DataSet
            DataSet myDataSet = new DataSet();
            //string connStr = Pr ...
LocateDataSource 的args.Data每次只能接收一个 DataTable 对象,返回DataSet 是不合法的,所以只能返回myDataSet.Tables;才能获取到其他表的数据。
页: [1] 2 3
查看完整版本: 关于使用DataRelation建立关系然后在pagereport中显示多表联合的数据问题!