插件案例 —— 服务端基础资料赋值技巧原创
金蝶云社区-MiLai
MiLai
29人赞赏了该文章 3188次浏览 未经作者许可,禁止转载编辑于2020年08月05日 12:28:39


案例背景


下推的时候,有的时候我们可以在单据转换里面进行下游基础资料携带。但是有的基础资料没有办法经过携带,比如想下推过后默认携带当前用户的采购员、销售员,这些需要先取数,再赋值。



错误思路


直接给数据包赋值,比如 :

billObj["PurchaserId_Id"] =12138;

但是这样虽然能给给数据包赋值,界面上不显示呀,对应的数据模型没有填充。



代码思路一

如果基础资料仅后台生成过后,暂存,其实也确实是不需要赋值基础资料包,只要把对应的ID填写进数据库了,下次加载的时候,就会自动重新构建包。


代码思路二

BaseDataField purchaserIdField = e.TargetBusinessInfo.GetField("FPURCHASEID");
headDyn["PurchaserId_Id"]  = Convert.ToInt64(取数的Id);
FieldUtils.SetBaseDataFieldValue(this.Context, purchaserIdField, headDyn, headDyn["PurchaserId_Id"]);


FieldUtils.SetBaseDataFieldValue 其实利用的就是基础资料包Load后,再SetValue了。


public static void SetBaseDataFieldValue(Context ctx,BaseDataField field, DynamicObject data, object value)
{
    long lPKValue = 0;
    Int64.TryParse(value.ToString(), out lPKValue);
    if (value.ToString().Length > 1 || lPKValue > 0)
    {
        DynamicObject valueObj = LoadReferenceData(ctx, field.RefFormDynamicObjectType, (object)value);
        field.DynamicProperty.SetValue(data, valueObj);
        filed.RefIDDynamicProperty.SetValue(data, value);
    }
    else
    {
        field.DynamicProperty.SetValue(data, null);
        field.RefIDDynamicProperty.SetValue(data, 0);
    }
}
public static DynamicObject LoadReferenceData(Context ctx, DynamicObjectType dt, object pkValue)
{
    if (pkValue.IsEmptyPrimaryKey())
    {
        return null;
    }
    OperateOption option = OperateOption.Create();
    option.SetThrowExceptionWhenNotFind(false);
    IViewService service = ServiceHelper.GetService<IViewServivce>();
    return service.LoadSingle(ctx, pkValue, dt, option);
}


赋值上面的代码,在服务端赋值让基础资料显示的时候,可以正常在单据上显示。


* 代码思路三

如果在资料需要保存、提交、审核的时候,这里会涉及到很多代码,关于基础资料的引用的问题,如果数据包没有被加载到Model.DataObject的时候,就会报错。


我们可以调用DbService里面的方法,完成填充包问题。

IDbService dbService =  Kingdee.BOS.App.ServiceHelper.GetService<IDBService>();
dbService.LoadReferenceObject(this.Context, new List<DynamicObject>(), BillMetaData.BusinessInfo.GetDynamicObjectType());


赞 29