【插件开发笔记】套打插件
【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://wenku.my7c.com/article/40108
能否提供一个python版本的呀。
是的,我看明白了,谢谢指点。
应该是缺少了一段代码。。。
DynamicObject obj = new DynamicObject(dot);
foreach (var p in e.DataObjects[0].DynamicObjectType.Properties)
{
obj[p] = e.DataObjects[0][p];
}
在动态赋值之前加上这个就好了
噢噢,明白。另外想问一下,我现在预览的时候,除了我自定义的表体的动态字段有值之外,表体的其他字段都没有值,是不是和循环赋值那里有问题?就是下面这块:
foreach (var Data in DaDate)
{
DynamicObject notePrintEntryRow = new DynamicObject(dot);
notePrintEntryRow["FPo"] = Data["SQL对应FPo字段名"];
notePrintEntryRow["FPoste"] = Data["SQL对应FPoste字段名"];
notePrintEntryRows.Add(notePrintEntryRow);
}
请问一下,DaDate是什么数据包来的?
OnPrepareNotePrintData一次操作,同一单据怎么多次进入?因为两次打印数据取值不一样
【插件开发笔记】套打插件
本文2024-09-16 17:26:52发表“云星空知识”栏目。
本文链接:https://wenku.my7c.com/article/kingdee-k3cloud-15759.html