一楼例子用到的数据库就是狐表自带的“多表统计”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编辑过]