以文本方式查看主题

-  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与另外两个表的关联关系。
此问题纠结了很久,一直没找到很好的处理办法。
这是例子,请高手帮忙看下:
 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:管理项目1.rar



--  作者:有点蓝
--  发布时间: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
--  
参考这个例子:
 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:管理项目1.table


关联只能存在于已经加载的数据中,所谓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对关联子表进行统计,假如子表数据量太大,也要先加载进来,服务器肯定完蛋