以文本方式查看主题 - Foxtable(狐表) (http://foxtable.net/bbs/index.asp) -- 专家坐堂 (http://foxtable.net/bbs/list.asp?boardid=2) ---- 模拟关联表的问题,一直没有找到很好的解决办法 (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=175942) |
||||
-- 作者:reachtone -- 发布时间:2022/3/24 17:07:00 -- 模拟关联表的问题,一直没有找到很好的解决办法 订单、产品、客户3个datatable已经建立关联,在订单中获取产品或客户数据轻而易举。 问题在于,这个订单数据的获取是要异步执行的,所以要改用sqlcommand,这样一来,就要模拟临时datatable与另外两个表的关联关系。 此问题纠结了很久,一直没找到很好的处理办法。 这是例子,请高手帮忙看下:
|
||||
-- 作者:有点蓝 -- 发布时间:2022/3/24 17:14:00 -- 方法1、动态关联:http://www.foxtable.com/webhelp/topics/1942.htm 2、通过SQLcommand,或者find,select等功能获取其它表的数据 3、通过视图/查询表,合并获取3个表的数据使用
|
||||
-- 作者:reachtone -- 发布时间:2022/3/24 17:23:00 -- 因为是特定场景,方法3不适用。 方法1考虑过,但代码量巨大,且未必可行。因为表达式也是动态的,可能用到多个关联,这就要根据用到的关联创建N个table才能模拟出关联关系,太复杂。 方法2也考虑过,但在find的时候,仍然存在方法1中的问题,需要模拟出好多table才能find出来。
|
||||
-- 作者:reachtone -- 发布时间:2022/3/24 17:30:00 -- 如果能给数据源connection也加上类似于Excel报表的AddRelation方法,也就是直接用后台数据表指定关联关系,所有问题都迎刃而解。 目前的关联只能基于table,局限太大了。
[此贴子已经被作者于2022/3/24 17:35:52编辑过]
|
||||
-- 作者:reachtone -- 发布时间:2022/3/24 18:22:00 -- 一楼例子用到的数据库就是狐表自带的“多表统计”access文件。简单的说,现在就想在不修改自定义函数的前提下,让“窗口1”中的table可以正常显示“产品名称”和“客户名称”数据,请高手支招! 现补充说明此实例用到的场景(确实是实际开发中碰到的问题,并非自己找麻烦): 1、这是我做的一个通用web项目的服务器端设置。由于是通用的,所以其中的很多参数都是动态的,而非设置死的。 在这个设置里,允许用户指定网页中显示的表格及其列,包括表达式列(可以表内计算,也可以跨表取值,使用的就是foxtable表达式列语法规则)。 2、为方便用户定义跨表取值的列表达式,系统会先将数据表所在数据源的全部表或视图,以外部表方式添加进来,并允许用户对它们建立关联。 例如,用户想在网页上显示“订单”表数据,同时想在表格中加上3个表达式列:金额、产品名称、客户名称,系统必须把“订单”、“产品”、“客户”3个表先添加到table中,否则用户就没办法为它们创建关联。因为,即使foxtable使用代码创建关联,也是要使用table才行的。 为说明问题方便,一楼例子中,已经添加了3个table表,并建立了2个关联(分别是po和co)。 3、有了这些关联设置之后,用户才能在表达式中使用parent或child跨表取值。 如一楼实例,这里就给“订单”表添加了3个表达式列,并用jobject表示如下(在实际项目中,表达式内容是由用户手工输入的): Dim exps As new jobject exps("金额") = "单价*数量*(1-折扣)" exps("产品名称") = "parent(po).产品名称" exps("客户名称") = "parent(co).客户名称" 那么,在浏览器中实际访问时,就要异步执行一楼实例中的getdata函数,以获取包含表达式列在内的全部数据。为说明问题方便,一楼实例将异步执行函数的代码放到了按钮中,并在函数中加上了return以方便观察效果。 4、由于getdata函数是要异步执行的,所以在这个函数里就改用sqlcommand来获取订单数据。问题症结就在这里: (a)之前的关联都是根据"订单"表创建的,现在改用sqlcommand获取订单表数据之后,这个临时表与其他2个表并无关联关系,因而,通过exps传来的表达式参数动态添加表达式列就无效了。 (b)如果要让它有效,就必须加上可能很长的一段代码对表达式进行解析:首先看表达式里用了几个关联,每个关联的父表、子表及关联列是什么,然后再根据这些信息分别生成table,最后再使用代码给这些table分别模拟创建关联。新创建的关联名称还不能与原有的重名,这意味着,在模拟关联表的工作完成之后,还要修改表达式中对应的关联名称才行。相当繁琐! 由此可见,一楼实例中的“订单”、“产品”和“客户”3个外部表实际上是供用户编写表达式使用的(要在列表达式中跨表取值就要先有关联,而关联的前提又必须有table),真正生成的数据则靠的是sqlcommand。要在这个sqlcommand中加入指定的表达式列,则必须参照表达式中用到的parent或child再新建多个关联。 5、现有Relations的Add方法在创建关联时,只能依据table,确实局限太大了。在单向生成或双向生成关联表模式下,必须依赖table可以理解,但在开发WEB服务端程序时呢?这个时候不需要ui、不需要显示关联表,它仅需跨表取值!如果还单纯依赖table,就非常的不合时宜。因此,完全可以参考Excel报表的AddRelation方法,将Relations的Add方法扩展一下,加个参数以决定是否可以直接用后台数据表指定关联关系!大概看了下狐表中的常用方法,无论是表数据操作还是表数据统计,都能跳过datatable直接处理后台,唯独Relations不可以。强烈建议把这一块也补上!真能如此的话,本实例中的3个datatable根本就无需添加,所有问题都会迎刃而解。
[此贴子已经被作者于2022/3/24 21:52:42编辑过]
|
||||
-- 作者:pk399 -- 发布时间:2022/3/25 8:11:00 -- 虽然我不懂,但感觉说的太棒了 |
||||
-- 作者:狐狸爸爸 -- 发布时间:2022/3/25 8:34:00 -- 参考这个例子:
关联只能存在于已经加载的数据中,所谓excel报表可以针对后台数据建立关联,也是和这个例子一样,加载几个临时表,然后建立关联,打印完毕后,再删除关联和临时表。
[此贴子已经被作者于2022/3/25 8:39:35编辑过]
|
||||
-- 作者:reachtone -- 发布时间:2022/3/25 9:02:00 -- 谢谢@狐狸爸爸回复。 这种处理方式对于固定的关联关系还好,代码量不是太大,处理起来也不复杂。本实例的问题主要在于两点: (1)列表达式并不是固定的,或者说它只是一个模板类型的表达式,真正生成数据时需要对这个表达式进行解析并模拟重新建立关联。如果表达式中用到了N个parent或child,就意味着要加载N个临时表再建关联。 (2)代码写多一点无所谓,可以自定义函数来处理。我最大的担心是,服务器端在多人访问且同时有多个复杂表达式列的情况下,意味着要加载很多个临时表。假如参与关联的临时表数据量很大,服务器能否顶的住?
|
||||
-- 作者:狐狸爸爸 -- 发布时间:2022/3/25 9:10:00 -- 这个没有办法的,在数据管理和交互上,bs先天就不如cs的。 |
||||
-- 作者:reachtone -- 发布时间:2022/3/25 9:10:00 -- 比如,在父表中使用sum对关联子表进行统计,假如子表数据量太大,也要先加载进来,服务器肯定完蛋 |