关于使用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"];
}
为什么这样操作后的结果是根本就取不到值呢?
Hi,
问题验证中,有效的解决方案会立即回复。 Lenka.Guo 发表于 2016-5-10 15:46
Hi,
问题验证中,有效的解决方案会立即回复。
:(早上反应的下午才看。这效率。。 LocateDataSource 事件中的args.Data每次好像只能接收一个 DataTable 对象, 你查询的时候不返回 return myDataSet.Tables["MF_PSS"];,直接创建一个DataTable返回就可以了吧,反正创建DataSet好像也不用,你就需要一个 DataTable 而已。
纯属个人看法,如有不当,欢迎拍砖 :itwn:
大侠归来 发表于 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类型的报表中. 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 下载:
Lenka.Guo 发表于 2016-5-10 19:04
因为早上接到你的需求后,一直在验证,是想有效的解决方法之后,再回复,否则回复再及时也没有意义。
目 ...
经过对比我在设置取值的时候出现了问题!导致了取不到创建过的DataRelation子表数据!现在已经可以了!谢谢! SunDream° 发表于 2016-5-11 09:47
经过对比我在设置取值的时候出现了问题!导致了取不到创建过的DataRelation子表数据!现在已经可以了!谢 ...
:loap1::hjyzw: 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 进行拓展添加多一层的关系的时候,在进行预览的时候 会显示是空白捞不出来数据~ 是否是我这边有什么问题呢? SunDream° 发表于 2016-5-11 15:52
// 创建DataSet
DataSet myDataSet = new DataSet();
//string connStr = Pr ...
LocateDataSource 的args.Data每次只能接收一个 DataTable 对象,返回DataSet 是不合法的,所以只能返回myDataSet.Tables;才能获取到其他表的数据。