找回密码
 立即注册

QQ登录

只需一步,快速开始

SunDream°
社区贡献组   /  发表于:2016-5-10 09:32  /   查看:10979  /  回复:24
本帖最后由 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[2];
                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"];
}

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

24 个回复

倒序浏览
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 而已。
纯属个人看法,如有不当,欢迎拍砖
回复 使用道具 举报
SunDream°
社区贡献组   /  发表于:2016-5-10 17:41:09
5#
大侠归来 发表于 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
6#
SunDream° 发表于 2016-5-10 17:41
哈哈~ 没事儿呢~ 这些问题就是要讨论来的呢,

DataRelation RelPSS =

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

核心代码:

LocateDataSource:
  1. private void LoadDataSet(object sender, LocateDataSourceEventArgs args)
  2.         {
  3. ........
  4. .......
  5.                 //为Table 添加数据
  6.                 myDataSet.Tables.Add(myDataTables[1]);
  7.                 OleDbCommand cmd2 = new OleDbCommand(Constants.cmdText2, conn);
  8.                 OleDbDataAdapter oleAdapter2 = new OleDbDataAdapter(cmd2);
  9.                 oleAdapter2.Fill(myDataSet.Tables[1]);

  10.                 //创建 “DataRelation”

  11.             DataRelation RelPSS = new DataRelation("TF_PSS_MF", myDataSet.Tables[0].Columns["订单ID"] ,
  12.                                 myDataSet.Tables[1].Columns["订单ID"] );
  13.             myDataSet.Relations.Add(RelPSS);
  14.          
  15.             //返回从表数据
  16.             args.Data = myDataSet.Tables[1];

  17.             
  18.         }
复制代码



创建报表:
  1. public static PageReport addDataSet(PageReport report)
  2.         {
  3. .......
  4. ......
  5.             //获取主表字段
  6.             Field field = new Field("客户ID", "TF_PSS_MF.客户ID", null);
  7.                 dataSet.Fields.Add(field);
复制代码


Demo 下载:




本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

评分

参与人数 1满意度 +5 收起 理由
SunDream° + 5 很给力!

查看全部评分

回复 使用道具 举报
SunDream°
社区贡献组   /  发表于:2016-5-11 09:47:15
7#
Lenka.Guo 发表于 2016-5-10 19:04
因为早上接到你的需求后,一直在验证,是想有效的解决方法之后,再回复,否则回复再及时也没有意义。
目 ...

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

评分

参与人数 1金币 +500 收起 理由
Lenka.Guo + 500 淡定

查看全部评分

回复 使用道具 举报
Lenka.Guo讲师达人认证 悬赏达人认证
超级版主   /  发表于:2016-5-11 10:11:23
8#
SunDream° 发表于 2016-5-11 09:47
经过对比我在设置取值的时候出现了问题!导致了取不到创建过的DataRelation子表数据!现在已经可以了!谢 ...

回复 使用道具 举报
SunDream°
社区贡献组   /  发表于:2016-5-11 15:52:57
9#

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


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

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

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

            //创建 “DataRelation”

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

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

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

            //返回从表数据
            return myDataSet;



如上面这一段代码所示,   在我对你们提供的DEMO 进行拓展添加多一层的关系的时候,  在进行预览的时候 会显示是空白捞不出来数据~   是否是我这边有什么问题呢?
回复 使用道具 举报
Lenka.Guo讲师达人认证 悬赏达人认证
超级版主   /  发表于:2016-5-11 16:06:49
10#
SunDream° 发表于 2016-5-11 15:52
// 创建DataSet
            DataSet myDataSet = new DataSet();
            //string connStr = Pr ...

LocateDataSource 的args.Data每次只能接收一个 DataTable 对象,返回DataSet 是不合法的,  所以只能返回myDataSet.Tables[0];才能获取到其他表的数据。
回复 使用道具 举报
123下一页
您需要登录后才可以回帖 登录 | 立即注册
返回顶部