【套打】通过表单插件过滤数据(python创建数组对象)原创
金蝶云社区-_Tmp
_Tmp
8人赞赏了该文章 1,211次浏览 未经作者许可,禁止转载编辑于2021年11月03日 15:53:23

<0>很早的时候就支持通过平台python插件处理套打数据,但是当想过滤数据时返回数据对象给平台时都不知道怎么写,这里提供一个创建数据对象返回平台的方法。

Array.CreateInstance(type, len(tempList));


分析过程:

<1>直接创建,无法使用new语法

<2>List<T>.ToArray()? 理解面向接口编程

C# 语言默认提供的IList<T>列表接口实现默认就7种,像python这种第三方库本质上也是应该面向接口编程,如果了解星空是使用IronPython实现python语法的话(本质上也是一个C#的库,将python的语法用C#实现而已),查下github源码就知道了(源码面前了无秘密),最终的源码是IronPython.Runtime.List没有ToArray的公有接口

image.png

image.png


<3>IronPython.Runtime.List分析源码,本质上也是通过数组实现列表

本质上也是object[]实现列表,但是奈何没有实现这个列表的动态访问,无法访问内部属性

image.png

image.png


<4>再仔细分析,内部实现的拷贝都借助了一个静态类ArrayOps,分析静态类中提供的语法,最终找到一个Array.CreateInstance的方法,Array在python中属于一个动态类型,因此支持访问器内部方法

image.png

image.png

image.png


可能有些小伙伴不了解动态类型和静态类型,动态类型的意思是继承System.Dynamic.DynamicObject,通过实现TryGetMember和TrySetMember进行获取和设置内部成员(还包括其他接口),比如平台提供的实体服务规则和套打动态字段等。

image.png


<4>实现案例:过滤套打单据体的数据

image.png

image.png

from System import *
from Kingdee.BOS import *
from Kingdee.BOS.DataEntity import *
def OnPrepareNotePrintData(e):
 if e.NotePrintTplId.Equals("648ff10a-0a6b-4327-93c6-cea80ddbf8b8"):
  if e.DataSourceId.Equals("FBottomEntity",StringComparison.OrdinalIgnoreCase):
   tempList = filter(lambda x:x["FBomLevel"] == 1, e.DataObjects);
   tempArray = Array.CreateInstance(e.DataObjects[0].GetType(), len(tempList));
   for index in range(len(tempArray)):
    tempArray[index] = tempList[index];
   e.DataObjects = tempArray;


若上代码异常,请使用附件的代码

KdPython.rar(0.41KB)

图标赞 8
8人点赞
还没有人点赞,快来当第一个点赞的人吧!
图标打赏
0人打赏
还没有人打赏,快来当第一个打赏的人吧!