DynamicObject结构说明

简介

DynamicObject是K3Cloud的基础数据格式。金蝶的表单数据、执行SQL后的数据集都用DynamicObject来表示。

我们可以简单的把DynamicObject理解为Dictionary<string,object>。
DynamicObject的集合用DynamicObjectCollection来表示,可以简单的理解为List<Dictionary<string,object>>

读取/设置值的方法也跟字典一致。假设dyo是一个DynamicObject,则

object a=dyo["Id"];//获取值  
dyo["Id"]=123;//设置值

键说明

DynamicObject的键名称来源于表单对应控件的实体名,非标识名。
如果DynamicObject是SQL的结果集,则键名称为SQL语句select的字段名。

值类型说明

DynamicObject的值可以是基本类型(int、DateTime、string等),也可以是复杂类型(DynamicObject、DynamicObjectCollection)。

值的具体数据类型取决于表单控件类型

如果DynamicObject是SQL语句的执行结果,那么只会有基本类型,所以本文只考虑表单的DynamicObject,不考虑SQL的结果集

基本类型

int/long

控件为整数类型,对应的DynamicObject值的数据类型为long

string

控件为文本类型,对应的DynamicObject值的数据类型为string

bool

控件为复选框,对应的DynamicObject值的数据类型为bool
KSQL没有bit类型,实际在数据库存储是char(1)类型

DateTime?

控件为时间类型,对应的DynamicObject值的数据类型为DateTime?

decimal

控件为小数、数量、单价、金额等类型,对应的DynamicObject值的数据类型为decimal

基本类型总结

基本类型常见的就上面所列,可能有缺漏。有的时候再补充吧。
实际获取,我们一般用Convert.ToXXX方法进行转换,或者显示声明。

long id=Convert.ToInt64(dyo["Id"]);
long id2=(long)dyo["Id"];

复杂类型

  • 表单控件为基础资料类,值为:DynamicObject。
    里面的字段为该基础资料的基本字段(内码/代码/名称)+本表单引用该基础资料的字段。

  • 分录数据包,值为:DynamicObjectCollection

隐藏键说明

为了便于开发,DynamicObject存在一些默认键,用于方便开发引用,包括但不限于:
Id

表单数据主键名。示例:object id=dyo["Id"];//获取主键

XXX_Id

XXX为基础资料实体,它是一个DynamicObject类型,但表单同时存在一个键为XXX_Id,它的值为基础资料ID。示例:如物料实体名为MaterialId,则var midt=dyo["MaterialId_Id"];//获取物料内码

XXX_Text

只存在于批号字段,值为批号文本。示例:如批号实体名为Lot,则string lot=dyo["Lot_Text"];//获取批号文本

Seq

分录序号实体名,固定为此名称,仅存在于分录。示例:object id=dyo["Seq"];//获取行序号

案例分析 - 准备工作

我们新建个单据,添加以下控件:

类型 标识 实体名 备注
整数 FLong Long
小数 FNum Num123
日期 FDate Date
文本 FText Text
基础资料 FItemID ItemID 类型:物料、引用属性:启用批号管理
复选框 FOk FOk
单据体 FEntity Entity
文本 FValue Value 位于单据体

添加1个按钮用于读取当前表单数据包

案例分析 - 代码

public class Test1BillPlugin: AbstractBillPlugIn {
        void button1() {//读取界面表单数据
            DynamicObject dyo = this.Model.DataObject;
            getField(dyo);
        } 
        void getField(DynamicObject dyo) {
            var keys = dyo.DynamicObjectType.Properties;//枚举键
            Debug.WriteLine("当前DynamicObject键为:"+keys);

            object vLong = dyo["Long"];//整数
            object vNum = dyo["Num123"];//小数
            object vDate = dyo["Date"];//日期
            object vText = dyo["Text"];//文本
            object vItemID = dyo["ItemID"];//基础资料(物料)
            object vItemID_Id= dyo["ItemID_Id"];//基础资料隐藏键(物料内码)
            object vOK = dyo["FOK"];//复选框
            DynamicObjectCollection vEntity = dyo["Entity"] as DynamicObjectCollection;//单据体

            //循环单据体
            foreach (DynamicObject row in vEntity) {
                var v = row["Value"];//单据体-文本字段值
                Debug.WriteLine(v);
            }
        }
        
        public override void ButtonClick(ButtonClickEventArgs e) {
            base.ButtonClick(e);
            if (e.Key.EqualsIgnoreCase("FButton1")) {
                button1();
            }
        }
    }

案例分析 - 调试结果


调试上面的插件。我们在界面上输入值,然后点击按钮1,查看数据包结构。

各字段值及数据类型截图

分录数据包类型为DynamicObjectCollection
物料(基础资料)数据包类型为DynamicObject

PS:dyo.DynamicObjectType.Properties可枚举当前DynamicObject键,结果如图:

posted @ 2021-10-31 14:45  苏暖暖  阅读(1772)  评论(4编辑  收藏  举报