文本描述了数据包的结构与类型(简单、复杂、集合节点),并解释了它们在基础数据、单据体、子单据体及关联实体中的具体应用。还阐述了在Web层和App层如何通过这些数据包和元数据进行数据的取值与赋值操作,包括使用节点key、节点索引、动态属性等方法。详细展示了如何从不同层级的数据包中获取数据(如单据头、单据体、子单据头、子单据体、关联实体等),以及基础资料字段和多选基础资料的取值和赋值示例。文本还提供了如何通过属性名或动态属性从数据包中读取字段值,并对不同类型的字段值进行必要的转换和处理。
说明:
1.数据包:树形结构,每个节点为键值对(Key:Value);节点分三种类型:简单,复杂,集合;
简单节点的值不能再分解,复杂节点的值又是一个数据包,集合节点的值为数据包集合;
2.简单节点:文本,整数,数量,复选框,内码,编号,基础资料内码等字段对应的数据
3.复杂节点:各种类型的基础资料等对应的数据
4.集合节点:单据体,子单据体,关联实体,多选基础资料等对应的数据
5.取值原则:一定是在其相应数据包下取值;比如单据体,单据头字段,子单据头字段的相应数据包为整个单据数据包;单据体字段,子单据体的相应数据包则为单据体数据包。
6.数据包表示类:数据包类:DynamicObject, 数据包集合类:DynamicObjectCollection
实现:
首先需要已知整个单据数据包和元数据,取值方式有三种:1.节点key 也就是字段的属性名, 2. 节点索引 3. 动态属性(字段或实体的动态属性,一般使用这种)。下面以在web层中插件取数为例:
取实体数据包:
1. 整个单据数据包
var billObj = this.Model.DataObject; //web层数据包
var billObj = this.DataObject ; //app层数据包,假设为此
var billBusinessInfo = this.BusinessInfo;// 元数据
2. 取单据体数据包
var entryKey = "FEntryKey"; // 假设单据体的Key为FEntryKey
var entryEntity = billBusinessInfo .GetEntity(entryKey);//单据体实体
//web层取数
var entryObjs = tthis.Model.GetEntityDataObject(entryEntity1) as DynamicObjectCollection;
//app层,web层通用取数
var entryObjs = entryEntity.DynamicProperty.GetValue((billObj) as DynamicObjectCollection;
3. 取子单据头数据包
//子单据头数据包是个集合,但只有一条数据
var subHeadKey = "FSubHeadKey"; // 假设子单据头的Key为FSubHeadKey
//子单据头单据体实体
var subHeadEntity = billBusinessInfo .GetEntity(subHeadKey );
//web层取数
var subHeadObjs = this.Model.GetEntityDataObject(subHeadEntity ) as DynamicObjectCollection;
//app层,web层通用取数
var subHeadObjs = subHeadEntity.DynamicProperty.GetValue((billObj) as DynamicObjectCollection;
4. 取子单据体数据包
// 假设子单据体key为fSubEntryKey
var subEntryKey = "fSubEntryKey";
//子单据体实体
var subEntryEntity = billBusinessInfo.GetEntity(subEntryKey);
//web层取数
//得到焦点行下的子单据体数包集合
var subEntryObjs = this.Model.GetEntityDataObject(subEntryEntity ) as DynamicObjectCollection;
//得到焦点行下的子单据体数包集合中的第rowIndex行数据包
var subEntryObj = this.Model.GetEntityDataObject(subEntryEntity,rowIndex ) as DynamicObject;
//app层,web层通用取数,假设子单据体所在的单据体数据包集合为entryObjs
foreach (var entryObj in entryObjs)
{
var subEntryObjs = subEntryEntity.DynamicProperty.GetValue(entryObj ) as DynamicObjectCollection;
}
5. 取关联实体数据包
//关联实体数据包跟子单据体类似,需要在其父实体数据包中取,假设它的父实体为单据体。 var linkEntity = billBusinessInfo.GetForm().LinkSet.LinkEntitys[0];//关联实体 var parentKey = linkEntity.ParentEntityKey; //关联主实体key(也叫父实体key) var parentEntity = billBusinessInfo.GetEntity(parentKey);//关联主实体 DynamicObjectCollection dynObjs ; if(parentEntity is HeadEntity) //如果关联主实体是单据头 { dynObjs = new DynamicObjectCollection(billObj.DynamicObjectType); dynObjs.Add(billObj); } else { dynObjs = parentEntity.DynamicProperty.GetValue(billObj) as DynamicObjectCollection; } //循环父实体数据包 foreach (var entityObj in dynObjs ) { var linkObjs = entityObj[linkEntity.Key] as DynamicObjectCollection; //关联数据包 foreach(var linkObj in linkObjs ) { var ruleId = linkObj["RuleId"];//转换规则内码 var sBillId= linkObj["SBillId"];//上游单据内码 var sId= linkObj["SId"];//上游单据跟此单据关联的实体内码,一般为分录内码 var sId= linkObj["STableName"]; //上游单据表名 } }
取赋字段值:
总体原则:
1. web层已经封装好了,直接使用this.Model.GetValue("fieldKey")取值,this.Model.SerValue("fieldKey","value)赋值
2. web层取单据体中字段的值,不传行号,默认取第一行数据包中的字段值
3. web层和app层都可以使用动态属性,或字段属性名在相应数据包中取值
4. 取到的所有值都是object类型,按需要进行转换
5. 简单字段的值直接转换为相应类型即可
6. 基础资料类型字段(包括基础资料和继承基础资料的字段比如,用户,组织等)取值都是DynamicObject
7. 多选基础资料和多选辅助属性取到的是DynamicObjectCollection
示例:
var fKey = "FKey"; //假设字段key为FKey
var EntityObj= //字段所在实体数据包
web层取值
1. 单据头字段
var fValue = this.Model.GetValue(fkey);
2. 单据体字段
var fValue = this.Model.GetValue(fkey); //默认第一行数据包中的值
var fValue = this.Model.GetValue(fkey, 10); //第10行数据包中的值
web层赋值
1. this.Model.SetValue(fkey,"value"); //有好几个重载,也可以指定数据包 基础资料字段赋值,"value"一定是内码
2.this.Model.SetItemValueByNumber(fkey,"fnumber"); //基础资料字段赋值,通过编码
web层和app层通用取值
var field = billBusinessInfo.GetField(fKey);//字段
var fValue = field.DynamicProperty.GetValue(EntityObj);//动态属性取值
var fValue = EntityObj[field.PropertyName]; //属性名取值
web层和app层通用赋值
field.DynamicProperty.SetValue(EntityObj,fValue );//动态属性赋值
EntityObj[field.PropertyName] = fValue;//属性名赋值
特殊字段的值
//取基础资料的内码
1. 通过数据包取,fValue 上面的到的基础资料值
var fObj = fValue as DynamicObject ;//值转换为数据包
var fbasePk = fObj["Id"] 或 fObj[0];//取内码
2. 通过基础资料内码属性取,
var baseField = field as BaseDataFiled ;//字段转换基础资料字段
var basePKId = baseField.RefIDDynamicProperty.GetValue(fObj )
//fValue是多选基础资料的值
var fObjs = fValue as DynamicObjectCollection
推荐阅读