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键,结果如图: