实施过程中动态控制枚举项加载的方法(Python)
金蝶云社区-制造云产品部_黄
制造云产品部_黄
8人赞赏了该文章 9068次浏览 未经作者许可,禁止转载编辑于2013年09月06日 01:48:20

在线阅读该文档:
http://open.kingdee.com/K3cloud/WenKu/DocumentView.aspx?docId=108739
注:K/3 Cloud文档中心(wenku.ik3cloud.com)已正式上线,主要内容包括产品的培训文档(含视频)、安装包、竞争分析、售前方案、实施方案等。

最近在处理客户反馈问题的时候,我发现了有部分的枚举被删掉了。虽然按照客户的角度来看,有些枚举的业务线有可能业务现状用不上,删掉会减少用户操作时出现失误的概率。但我认为这样草率的处理方式十分的不好,理由有下:
1.枚举作为出厂数据,删掉某些选项可能会导致某些标准产品的功能出现异常的情况另外,后续版本新加入的功能也有可能因此导致不能使用。
2.多语言版本的枚举翻译资源会因为删除操作而丢失,而后续如果需要把删掉的选项加回来,需要手动操作,届时会非常的被动。
3.没法应对可伸缩的应用场景。因为枚举有可能是跨单据的。如果删掉了一个单据上的枚举,有可能会影响到别的单据使用这个枚举。但有人说:我建立一个新的枚举就行了。但是我觉得,既然同类型的枚举,我为什么需要去维护多个枚举?如果后续要加上新的选项的话,我还得去找这些枚举使用的地方,把新的选项加上去,这样操作会相当的被动。

事情有因必有果,上面扯了一大堆,无非是引出一个话题:我们能不能有一种可以干预枚举列表加载的办法?好,正题开始:

举个例子:我有一个枚举[图1],分别配置了两个下拉字段[图2][图3]:

图1

图2

图3

在没有代码干预的情况下,两个枚举加载的选项都是一致的(废话)。
那么如果我想将字段(删减版)移除一个选项呢?具体的处理方法应该如何?

那么我在这里提供这么一种思路:
1.在表单初始化的时候,我们可以通过获取表单的BusinessInfo,拿出对应字段的Field
2.Field可以有很多种派生类型,每一种派生类型都有各自独有的属性。比如基础资料的类型是BaseDataField的Filter是检索基础资料的过滤条件,DecimalField的FieldScale提供独有的精度控制,TextField的Editlen控制文本字段的可输入长度等等。
3.那么作为枚举字段的载体,下拉字段ComboField会附带着一个EnumObject属性。那么这个EnumObject到底是什么东西呢?我们不妨用我们的调试工具解开一看[图4]

图4
哟,这简直就是拨开云雾见青天啊。数据包内包含着这个下拉字段所配置的枚举的数据包,分别是枚举类型和所属的所有选项。这意味着我们不需要根据枚举类型去数据库寻找它所属的选项,表单加载引擎已经帮你做了80%的事情了。
好,那么剩下的事情,就是把不需要的枚举项从数据包里删除不就行了?那可没那么简单。因为我们的界面(Silverlight)跟插件(站点进程)之间的交互依赖于Http请求,光是把站点的数据包改掉了,并不会触发界面的更新的。那么这个事情应该怎么办呢?幸好,Cloud在Kingdee.Bos.Core.DynamicForm.PlugIn.ControlModel提供了一部分控件的编程模型来支撑插件与前端控件的一些特殊交互。这里介绍一下ComboFieldEditor,它提供了一个SetComboItems的方法,只需要一组特殊类型元素的列表,就可以对某一个下拉字段进行选项列表的重置。
那么一下的内容都是与代码实现相关的环节了,贴出代码以供参考[图5][图6]:

图5

图6

编译代码,重启服务器后,效果如下图[图7]:

图7
bingo!功能实现了!不过……不过啥?现场没装VS2010SP1?机器太破了跑不动VS2010?如果遇上这样的情况下,很遗憾,写插件的事情你基本没戏了!
但是幸好的是,Cloud拥有以IronPython为核心的脚本执行引擎,它允许在开发者在插件里注册一段Python脚本,执行效果与C#插件也是保持基本的一致。所以,本专题我们主要面向的是实施场景下的问题解决办法,C#插件因为需要编译而必须安装开发环境和编译器,差评!
那么,剩下的事情,就是将[图5][图6]的实现代码翻译成Python语言了[图8]。


那么事情到这里也差不多大功告成了。但是有一个遗留问题是,Python的语法要求是严格的缩进格式,如果没有经过python学习的朋友有可能会很不习惯这种代码形式。而且目前的BOS IDE对python脚本编写的便利性还是需要进一步提高的(我光是翻译这一小段python脚本居然用了1个小时,因为BOSIDE对脚本语法错误没有任何的感知能力,我不得不用this.View.ShowMessage("")来确定到底我写的脚本是不是写对了,如果是不熟悉python语法的朋友那就更是一种痛苦的领悟了。)

好,时到半夜,问题终于有了一个可靠的解决方案。最后附上两种语言的代码,供看官们参考。

结帖睡觉!:sleepy: