本文讲述了套打插件开发中处理OnPrepareNotePrintData事件时涉及的动态表单、套打模板、动态字段和标准字段替换等内容。提到在事件中根据套打ID处理不同取数规则,动态注册和赋值字段,通过SQL查询获取数据并构建数据包。特别提醒了e.DynamicObjectType仅包含套打用字段,需对获取的数据进行处理并返回。提供了部分代码示例和学习链接。
【emoji】
【写在前面的话】
一般我写套打插件都是写在OnPrepareNotePrintData事件中
视项目情况可能会有列表和表单两个Class要写
动态表单没办法使用标准套打因为没法去后台获取数据【套打估计是直接取数据库啦】
【注意】:OnPrepareNotePrintData应该是会多次进入的每次进入赋值主体是不一致的。注意判断处理表头还是处理表体【这部分建议做代码追踪就会有概念了】
取套打ID根据套打ID使用不同的取数规则
OnPrepareNotePrintData事件中的e有e.NotePrintTplId属性是存放套打模板标识的可以调用【我遇到过失效的情况,但是忘了是什么时候出现的了不过大部分情况下是没问题的】
动态套打字段的使用【其实挺简单的就这么几步:获取数据集合类别:然后注册动态字段:然后赋值】
首先在套打模板这里加上动态字段
然后在代码里面加上这一句注册一下你加的动态字段【注意不要和标准字段重名】
然后根据条件赋值
之后把数据包还给e就大功告成了
标准字段数据的替换【其实就是替换一下数据包】
这个其实和动态字段的使用步骤类似,就是少了代码注册字段到DynamicObjectType直接进行数据包干涉然后赋值 返回
///写个事件 纯代码控制的数据表体【有部分数据的话要做数据承接的处理】
public override void OnPrepareNotePrintData(PreparePrintDataEventArgs e)
{
base.OnPrepareNotePrintData(e);
if (e.NotePrintTplId == "Dev_ID") ///判断模板ID
{
if (e.DataSourceId.Equals("FMaSubEntity", StringComparison.OrdinalIgnoreCase)) ///单据体标识
{
//动态字段注册赋值
DynamicObjectType dot = e.DynamicObjectType;
dot.RegisterSimpleProperty("FPo", typeof(object),
attributes: new SimplePropertyAttribute() { Alias = "FPo" });//PO#
dot.RegisterSimpleProperty("FPoste", typeof(object),
attributes: new SimplePropertyAttribute() { Alias = "FPoste" });//FPoste
// 基于套打要求的ORM数据模型,构建数据包,取单据体的字段值
// 特别注意:e.DynamicObjectType,仅包含了套打会用到的单据体字段
List<DynamicObject> notePrintEntryRows = new List<DynamicObject>();
DynamicObject[] BillHradObject = e.DataObjects;
//获取集合中的数据包
DynamicObject BillHradDate = BillHradObject[0];
if (BillHradDate != null)////判断是不是空了
{
String FID = BillHradDate["FID"].ToString();
///根据FID获取数据清单
string sql = string.Format(@"/*dialect*/ 这个SQL就不说了自己写 ", FID);
var sqlDate = DBUtils.ExecuteDynamicObject(this.Context, sql);
if (sqlDate.Count <= 0)
{
this.View.ShowErrMessage("获取单据数据包异常!请确认");
//这里个人也觉得有点多此一举毕竟都获取到ID了,不过还是留下了万一网络玩花活呢
return;
}
foreach (var Data in DaDate)
{
DynamicObject notePrintEntryRow = new DynamicObject(dot);
notePrintEntryRow["FPo"] = Data["SQL对应FPo字段名"];
notePrintEntryRow["FPoste"] = Data["SQL对应FPoste字段名"];
notePrintEntryRows.Add(notePrintEntryRow);
}
e.DataObjects = notePrintEntryRows.ToArray();
e.DynamicObjectType = dot;
}
}
}
//代码盲敲的仅供参考具体自己调整
写的比较乱顺便贴个学习的链接叭:https://vip.kingdee.com/article/40108
推荐阅读