凭证打印二次开发,关于重置科目名称方法,套打二次开发
金蝶云社区-dotqi
dotqi
0人赞赏了该文章 2,361次浏览 未经作者许可,禁止转载编辑于2015年10月24日 14:53:39

版本:v5.1+910+1015
参考{{{/article/1659363}}}


需求:如上图?科目代码与科目全名与核算维度,在一个格内打印,核算维度用【】区分。单当没有核算维度时【】也显示,现在不想让他显示。
实现方法:


如上图通过凭证表单插件,想通过重写OnPrepareNotePrintData事件,更新打印数据包。
问题:


如上图。
1、通过跟踪调试发现。e里的FACCOUNTID_FFullName的VALUE是一个OBJECT,如果想获取一下这个值,代码怎么写谢谢(可能有点基础),
e.DataObjects[0]["FACCOUNTID_FFullName"][0]用这种方法时提示错误。OBJECT不支持[]。
2、通过跟踪调试发现。e里没有核算维度组合值,只有一个FDETAILID。那么,如何取得核算维度的文本值。
3、如果想在这里,直接把“科目代码与科目全名与核算维度+++++现金流量项目”拼接成字符串如何处理。谢谢。。。

----------------------------------------------------------------------------------------------------
johnnyding@kingdee.com的全全支持下,这个问题以经完美解决,现附解决办法。
以凭证打印为例,其他自行开发
效果,当没有核算维度时不打印【】

1、宽展凭证表单插件如图。


2、修改套打模板


其中必须设置FDETAILID如果不设置,打印数据包内就不包含核算项目ID。但在插件中对其值进行更新0也就不在打印。
3、源代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Kingdee.BOS;
using Kingdee.BOS.App;
using Kingdee.BOS.Business.PlugIn;
using Kingdee.BOS.BusinessEntity;
using Kingdee.BOS.Core;
using Kingdee.BOS.DataEntity;
using Kingdee.BOS.ServiceHelper;
using Kingdee.BOS.Core.Bill.PlugIn;
using Kingdee.BOS.Core.DynamicForm.PlugIn.Args;
using Kingdee.BOS.Core.Metadata.FieldElement;
using Kingdee.BOS.Core.Metadata;
using Kingdee.BOS.Orm.DataEntity;

namespace L_K3CloudPrint
{
public class GL_Voucher : AbstractBillPlugIn
{
public override void OnPrepareNotePrintQueryParam(PrepareNotePrintQueryParamEventArgs e)
{
base.OnPrepareNotePrintQueryParam(e);
}
public override void OnPrepareNotePrintData(PreparePrintDataEventArgs e)
{
//单据头BillHead单据体FEntity
if (e.DataSourceId == "FEntity")
{
//循环处理分录
for (int i = 0; i < e.DataObjects.Length; i++)
{
//获取科目打印数据
DynamicObject acctObj = e.DataObjects[i]["FAccountId_Ref"] as DynamicObject;
string FNumber_ = "";
//获取科目ID
long FAccountId_ = (long)e.DataObjects[i]["FAccountId_Id"];
if (FAccountId_!=0)
{
//获取科目对应的信息
BaseDataField acctItem = this.View.BillBusinessInfo.GetField("FACCOUNTID") as BaseDataField;
DynamicObject[] acctItems = BusinessDataServiceHelper.LoadFromCache(this.Context, new object[] { FAccountId_ }, acctItem.RefFormDynamicObjectType);
FNumber_ += acctItems[0]["Number"].ToString();
FNumber_ += '_' + acctItems[0]["FullName"].ToString();
}
//获取核算维度ID
long FDetailId_ = (long)e.DataObjects[i]["FDetailId"];
if (FDetailId_ != 0)
{
//获取核算维度信息
RelatedFlexGroupField fldItem = this.View.BillBusinessInfo.GetField("FDETAILID") as RelatedFlexGroupField;
DynamicObject[] itemDetails = BusinessDataServiceHelper.LoadFromCache(this.Context, new object[] { FDetailId_ }, fldItem.RefFormDynamicObjectType);
foreach (var prop in itemDetails[0].DynamicObjectType.Properties)
{
DynamicObject item = prop.GetValue(itemDetails[0]) as DynamicObject;
if (item != null)
{
//获取类型值,如Department部门Expense费用项目,可通过不同的费用类型控制打印顺序
//item.DynamicObjectType.Name
//组合科目编码
FNumber_ += '【' + item["Name"].ToString() + '】';
}
}
}
//将核算维度信息设置为0为的不打印
e.DataObjects[i]["FDetailId"] = 0;
//将合并好的字符串更新科目编码
acctObj["Number"] = FNumber_;
}
}
base.OnPrepareNotePrintData(e);
}
}
}

注意的是,在测试时发现 更新 acctObj["Number"] = FNumber_; 这个值时,一定要用= 不要用+= 因为。当一个凭证,点一下打印预览后,第二次点预览时acctObj["Number"] 这个值会以上次更新的值为基值,这么会造成多次预览后,值也会多次叠加。

源代码-----
开发环境
V5.1+910+1015
VS2010+SP1

[/i][/i][/i][/i]