数据包取值简介原创
金蝶云社区-eris
eris
34人赞赏了该文章 5551次浏览 未经作者许可,禁止转载编辑于2021年08月24日 11:01:32

说明:

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



赞 34