【插件开发笔记】套打插件

栏目:云星空知识作者:金蝶来源:金蝶云社区发布:2024-09-16浏览:1

【插件开发笔记】套打插件

【emoji】

【写在前面的话】

  1. 一般我写套打插件都是写在OnPrepareNotePrintData事件中

  2. 视项目情况可能会有列表和表单两个Class要写

  3. 动态表单没办法使用标准套打因为没法去后台获取数据【套打估计是直接取数据库啦】

  4. 【注意】:OnPrepareNotePrintData应该是会多次进入的每次进入赋值主体是不一致的。注意判断处理表头还是处理表体【这部分建议做代码追踪就会有概念了】

  5. 取套打ID根据套打ID使用不同的取数规则

    1. OnPrepareNotePrintData事件中的e有e.NotePrintTplId属性是存放套打模板标识的可以调用【我遇到过失效的情况,但是忘了是什么时候出现的了不过大部分情况下是没问题的】

  6. 动态套打字段的使用【其实挺简单的就这么几步:获取数据集合类别:然后注册动态字段:然后赋值】

    1. 首先在套打模板这里加上动态字段

      image.webp

    2. 然后在代码里面加上这一句注册一下你加的动态字段【注意不要和标准字段重名】

      image.webp

    3. 然后根据条件赋值

      image.webp

    4. 之后把数据包还给e就大功告成了

      image.webp

  7. 标准字段数据的替换【其实就是替换一下数据包】

           这个其实和动态字段的使用步骤类似,就是少了代码注册字段到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一次操作,同一单据怎么多次进入?因为两次打印数据取值不一样

【插件开发笔记】套打插件

【emoji】【写在前面的话】一般我写套打插件都是写在OnPrepareNotePrintData事件中视项目情况可能会有列表和表单两个Class要写动态表单没办...
点击下载文档
确认删除?
回到顶部
客服QQ
  • 客服QQ点击这里给我发消息