Foxtable(狐表)用户栏目专家坐堂 → 模拟关联表的问题,一直没有找到很好的解决办法


  共有5696人关注过本帖树形打印复制链接

主题:模拟关联表的问题,一直没有找到很好的解决办法

帅哥哟,离线,有人找我吗?
reachtone
  1楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信 一级勋章
等级:版主 帖子:1993 积分:19409 威望:0 精华:20 注册:2008/9/2 10:09:00
模拟关联表的问题,一直没有找到很好的解决办法  发帖心情 Post By:2022/3/24 17:07:00 [只看该作者]

订单、产品、客户3个datatable已经建立关联,在订单中获取产品或客户数据轻而易举。
问题在于,这个订单数据的获取是要异步执行的,所以要改用sqlcommand,这样一来,就要模拟临时datatable与另外两个表的关联关系。
此问题纠结了很久,一直没找到很好的处理办法。
这是例子,请高手帮忙看下:
 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:管理项目1.rar



 回到顶部
帅哥哟,离线,有人找我吗?
有点蓝
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:109728 积分:558356 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2022/3/24 17:14:00 [只看该作者]

方法1、动态关联:http://www.foxtable.com/webhelp/topics/1942.htm
2、通过SQLcommand,或者find,select等功能获取其它表的数据
3、通过视图/查询表,合并获取3个表的数据使用

 回到顶部
帅哥哟,离线,有人找我吗?
reachtone
  3楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信 一级勋章
等级:版主 帖子:1993 积分:19409 威望:0 精华:20 注册:2008/9/2 10:09:00
  发帖心情 Post By:2022/3/24 17:23:00 [只看该作者]

因为是特定场景,方法3不适用。
方法1考虑过,但代码量巨大,且未必可行。因为表达式也是动态的,可能用到多个关联,这就要根据用到的关联创建N个table才能模拟出关联关系,太复杂。
方法2也考虑过,但在find的时候,仍然存在方法1中的问题,需要模拟出好多table才能find出来。

 回到顶部
帅哥哟,离线,有人找我吗?
reachtone
  4楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信 一级勋章
等级:版主 帖子:1993 积分:19409 威望:0 精华:20 注册:2008/9/2 10:09:00
  发帖心情 Post By:2022/3/24 17:30:00 [只看该作者]

如果能给数据源connection也加上类似于Excel报表的AddRelation方法,也就是直接用后台数据表指定关联关系,所有问题都迎刃而解。
目前的关联只能基于table,局限太大了。
[此贴子已经被作者于2022/3/24 17:35:52编辑过]

 回到顶部
帅哥哟,离线,有人找我吗?
reachtone
  5楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信 一级勋章
等级:版主 帖子:1993 积分:19409 威望:0 精华:20 注册:2008/9/2 10:09:00
  发帖心情 Post By: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
  6楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:婴狐 帖子:28 积分:308 威望:0 精华:0 注册:2020/1/22 17:51:00
  发帖心情 Post By:2022/3/25 8:11:00 [只看该作者]

虽然我不懂,但感觉说的太棒了

 回到顶部
帅哥哟,离线,有人找我吗?
狐狸爸爸
  7楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:管理员 帖子:47480 积分:251289 威望:0 精华:91 注册:2008/6/17 17:14:00
  发帖心情 Post By:2022/3/25 8:34:00 [只看该作者]

参考这个例子:
 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:管理项目1.table


关联只能存在于已经加载的数据中,所谓excel报表可以针对后台数据建立关联,也是和这个例子一样,加载几个临时表,然后建立关联,打印完毕后,再删除关联和临时表。
[此贴子已经被作者于2022/3/25 8:39:35编辑过]

 回到顶部
帅哥哟,离线,有人找我吗?
reachtone
  8楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信 一级勋章
等级:版主 帖子:1993 积分:19409 威望:0 精华:20 注册:2008/9/2 10:09:00
  发帖心情 Post By:2022/3/25 9:02:00 [只看该作者]

谢谢@狐狸爸爸回复。
这种处理方式对于固定的关联关系还好,代码量不是太大,处理起来也不复杂。本实例的问题主要在于两点:
(1)列表达式并不是固定的,或者说它只是一个模板类型的表达式,真正生成数据时需要对这个表达式进行解析并模拟重新建立关联。如果表达式中用到了N个parent或child,就意味着要加载N个临时表再建关联。
(2)代码写多一点无所谓,可以自定义函数来处理。我最大的担心是,服务器端在多人访问且同时有多个复杂表达式列的情况下,意味着要加载很多个临时表。假如参与关联的临时表数据量很大,服务器能否顶的住?

 回到顶部
帅哥哟,离线,有人找我吗?
狐狸爸爸
  9楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:管理员 帖子:47480 积分:251289 威望:0 精华:91 注册:2008/6/17 17:14:00
  发帖心情 Post By:2022/3/25 9:10:00 [只看该作者]

这个没有办法的,在数据管理和交互上,bs先天就不如cs的。

 回到顶部
帅哥哟,离线,有人找我吗?
reachtone
  10楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信 一级勋章
等级:版主 帖子:1993 积分:19409 威望:0 精华:20 注册:2008/9/2 10:09:00
  发帖心情 Post By:2022/3/25 9:10:00 [只看该作者]

比如,在父表中使用sum对关联子表进行统计,假如子表数据量太大,也要先加载进来,服务器肯定完蛋

 回到顶部
总数 15 1 2 下一页