操作服务插件中复制(Clone)整张单据问题
金蝶云社区-Hope_wp
Hope_wp
4人赞赏了该文章 2,770次浏览 未经作者许可,禁止转载编辑于2014年04月11日 10:58:21
现需要通过插件在点击按钮时,实现:复制当前整张单据(包括单据头以及所有单据体),更改其中部分字段后保存生成新的单据。
思路:①通过直接写sql操作数据库;
②通过Clone复制单据信息,更该字段后再通过ISaveService进行保存;
问题:现在在尝试上述第二种方法
①发现Clone后返回的是源数据的引用,更改dyosclon 时,dyos 同样被改变了;
②在对dyosclon 通过ISaveService保存后,结果是原来的单据被update,而不是insert一条新数据;并且新数据除了我在代码中修改的字段外,其他的字段都被清空。
[code]public override void EndOperationTransaction(EndOperationTransactionArgs e)
{
base.EndOperationTransaction(e);
if (e.DataEntitys.Length > 0)
{
for (int i = 0; i < e.DataEntitys.Length; i++)
{
string billno = e.DataEntitys[i]["BillNO"].ToString();
//e.DataEntitys[i].Clone();
IViewService ivs = Kingdee.BOS.App.ServiceHelper.GetService();
MetaDataService metaService = new MetaDataService();
FormMetadata formmeta = metaService.Load(this.Context, "YL_T_TMS_ForwardInfo") as FormMetadata;
DynamicObjectType dt = formmeta.BusinessInfo.GetDynamicObjectType();
DynamicObject[] dyos = ivs.Load(this.Context, new object[] {e.DataEntitys[i]["Id"]}, dt);
if (dyos.Length > 0)
{
DynamicObject[] dyosclon = dyos.Clone() as DynamicObject[];
if (dyosclon != null)
{
IEnumerable infopk =
ServiceHelper.GetService()
.GetSequenceInt64(this.Context, "YL_T_TMS_ForwardInfo", 1);
dyosclon[0]["Id"] = infopk.ElementAt(0);
dyosclon[0]["BillNo"] = dyosclon[0]["BillNo"] + "QC";
//dyosclon[0][""]
DynamicObjectCollection forwardInfoForw =
dyosclon[0]["YL_T_TMS_ForwardInfoForw"] as DynamicObjectCollection;
if (forwardInfoForw.Count > 0)
{
//int[] forwpk = ServiceHelper.GetService().GetSequenceInt32(this.Context, "YL_T_TMS_ForwardInfoForw", forwardInfoForw.Count);
//for (int j = 0; j < forwardInfoForw.Count; j++)
//{
// forwardInfoForw[j]["Id"] = forwpk[j];
//}
forwardInfoForw.Clear();
}
DynamicObjectCollection dyocmat = dyosclon[0]["YL_T_TMS_ForwardInfoMAT"] as DynamicObjectCollection;
if (dyocmat.Count > 0)
{
//int[] matpk = ServiceHelper.GetService().GetSequenceInt32(this.Context, "YL_T_TMS_ForwardInfoMAT", dyocmat.Count);
for (int j = 0; j < dyocmat.Count; j++)
{
dyocmat[j]["Id"] = infopk.ElementAt(0);
}
}
ISaveService ise = Kingdee.BOS.App.ServiceHelper.GetService();
ise.Save(this.Context, formmeta.BusinessInfo, dyosclon);
}
}
}
}
}[/code]