扩展表功能存在BUG,详见SQLGeneratorImpl#getExtColClause方法

栏目:eas cloud知识作者:金蝶来源:金蝶云社区发布:2024-09-16浏览:1

扩展表功能存在BUG,详见SQLGeneratorImpl#getExtColClause方法

EAS BOS默认提供了扩展表功能,如果一个单据的字段特别多,需要分表存储,那么可以使用此功能。使用此功能时,字段还是直接加在主实体上,只是对应的数据表字段选扩展表中的即可。但该功能存在问题,目前已知的问题如下:

问题1:扩展表功能存在BUG,详见SQLGeneratorImpl#getExtColClause方法

分析发现是解析扩展表SQL时,会根据字段来生成扩展表的别名,如下标记红色的地方,该方法中还有多次类似问题。(如果碰巧只加一个扩展表,表中只有一个字段,如下代码刚好是正确的)

问题2:扩展表字段引入到Query后,也不能正常解析SQL




问题3:在主实体记录已保存,扩展表记录不存在的情况下,执行保存操作不会再次生成扩展表记录。


解决方案:
问题1:
反编译修改代码,但这种方式存在后续版本升级的问题。将图中getTableAlias的参数修改为extTableName

问题2:先将问题1解决,问题1的解决方案只能解决单据查看报错的问题,但不能解决Query的解析错误。
此处可以不用去反编译Query 解析类,换一种方式。
首先要了解,扩展表中的字段是在当前实体上(比如是Entity)的,我们可以再单独建个实体VExt,和数据表T_VExt(关键在这里,元数据是Table,但sql要写成视图,视图的数据从Entity查询)。
然后需要使用扩展表字段的Query,需要通过反向关联的方式关联实体VExt。这样就可以解决上述问题2

问题3:
需要重写原单据的ControllerBean#_update方法,在该方法super._update前增加相应的判断,具体的逻辑为:根据当前单据的ID从扩展表查询记录,如果查不到就新增一条空记录(但是ID一定不能为空,其它业务字段可以为空),这条空数据会在super._update方法中被再次更新,所以你可以不用考虑新增记录的更新问题,交由框架来处理即可。

为了解决这个扩展表的问题,要做这么多,值得吗?首先,肯定值得。希望研发能将扩展表的功能完善。

1.如果不用扩展表,单据字段太多的情况下,需要单独建实体,然后自己通过代码实现数据的保存、修改、删除,同时还要处理这个数据与当前单据的级联关系。我们通常把这种方式叫做反向关联。

2.使用了反向关联以后,会增加单据转换取数的难度,如果要获取反向关联实体上的字段,通过自定义botp函数可以解决,但还是需要二次开发支持。当然,不仅仅是单据转换变麻烦了,所有需要直接从当前实体上获取字段的功能都不灵了。

3.通过反向关联实现,元数据这一层其实不能实现“所见即所得”,所带来的麻烦会接二连三,不一一列举了。

扩展表功能存在BUG,详见SQLGeneratorImpl#getExtColClause方法

EAS BOS默认提供了扩展表功能,如果一个单据的字段特别多,需要分表存储,那么可以使用此功能。使用此功能时,字段还是直接加在主实体上,...
点击下载文档
确认删除?
回到顶部
客服QQ
  • 客服QQ点击这里给我发消息