套打.二开案例.数据表格动态列

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

套打.二开案例.数据表格动态列

针对数据表格输出动态内容包括两种情况:

<1>数据表格列数是固定的,只是不同场景下对应的取值字段不一样

案例:

单据上有采购数量A和采购数量B两个字段,用户1仅对采购数量A有权,用户B仅对采购数量B有权,想在一个模板上打印采购数量字段。


解决方案:

这个时候就可以通过套打干预数据包,绑定一个动态字段,判断当前上下文的用户是否对字段有权从而填入套打数据包中;又或者是账表中业务实现的动态列——多栏式明细账,也可以通过这个处理。参考【套打】python插件加二开字段实现自定义功能

<2>数据表格列数是非固定的,可多可少,根据不同数据列数不一样

案例:

单据的分录上的物料有辅助属性尺码,针对同一个物料的尺码有不同的采购数量,打印想将同一个物料下的放在同一行。

image.webp


解决方案:

针对这种输出动态内容的场景,我们提供的方案是使用数据表格动态列。

(1)数据准备

image.webp

(2)配置套打模板

image.webp

(3)表单插件

    表单插件的处理逻辑

    ①套打动态列调整接口:首先针对物料分组,然后计算尺码下的数量,根据尺码的类型生成动态列的数量

image.webp

image.webp

    

    ②套打数据包干预接口:根据调整的动态列字段以及准备好的物料-尺码-数量字典,生成新的数据包实体以及填充数量

image.webp

以上实现关联的辅助属性数据包参考获取辅助属性内容;套打数据包干预套打数据包干预


效果:

image.webp


注意事项:

a、动态列为对当前列宽平分到所有子列上,目前还不支持自定义列宽调整(考虑到不支持超出模板外部导致打印时的打印机异常问题)

b、支持设置统计字段,参考属性,示例后续补充

image.webp

c、当数据表格位于布局表格容器内,需要设置标识(考虑兼容问题)

image.webp


代码:

[Kingdee.BOS.Util.HotUpdate]

    public class NotePrintDynamicColumnEdit : AbstractDynamicFormPlugIn

    {

        /// <summary>

        /// 数据源标识

        /// </summary>

        private string DataSoruecId = "FPOOrderEntry";

        /// <summary>

        /// 数据表格标识

        /// </summary>

        private string DataGridId = "dataGrid1";

        /// <summary>

        /// 动态列标识

        /// </summary>

        private string DynamicColumnId = "column3";


        /// <summary>

        /// 套打动态列干预接口

        /// </summary>

        /// <param name="e"></param>

        public override void OnQueryDynamicColumns(QueryDynamicColumnsEventArgs e)

        {

            base.OnQueryDynamicColumns(e);

            if (e.DataGridId == DataGridId && e.DynamicColumnId == DynamicColumnId && e.DataSourceId == DataSoruecId)

            {

                InitMaterialSizeCntMap();

                if (sizeSet.Count == 0)

                    return;

                var orderSizeList = sizeSet.ToList();

                orderSizeList.Sort();

                List<DynamicColumn> dynamicCols = new List<DynamicColumn>();

                //创建以"NotePrint_Size"的自定义取值标识,用作绑定数据包显示

                foreach (var sizeItem in orderSizeList)

                {

                    var dyanmicColumn = new DynamicColumn()

                    {

                        Caption = sizeItem == -1 ? "未定义" : string.Format("尺码{0}", sizeItem),

                        FieldKey = string.Format("NotePrint_{0}", sizeItem),

                        IsStatistic = false

                    };

                    dynamicCols.Add(dyanmicColumn);

                }

                e.DynamicColumns = dynamicCols;

            }

        }

        private string OrmKey_MaterialId = "MaterialId_Id";

        private string OrmKey_Flex = "AuxPropId";

        private string OrmKey_Size = "F100004";

        private string OrmKey_Qty = "Qty";


        private HashSet<int> sizeSet = new HashSet<int>();

        private Dictionary<int, Dictionary<int, int>> idSizeCntMap = new Dictionary<int, Dictionary<int, int>>();

        /// <summary>

        /// 以表单插件为例,初始化物料-尺寸-采购数量字典

        /// </summary>

        private void InitMaterialSizeCntMap()

        {

            sizeSet = new HashSet<int>();

            idSizeCntMap = new Dictionary<int, Dictionary<int, int>>();

            Entity entity = this.View.BillBusinessInfo.GetEntryEntity(DataSoruecId);

            if (entity == null)

                return;

            DynamicObjectCollection entityObjectCollection = this.View.Model.GetEntityDataObject(entity);

            foreach (var entityRow in entityObjectCollection)

            {

                int materialId = ObjectUtils.Object2Int(entityRow[OrmKey_MaterialId]);

                int qty = ObjectUtils.Object2Int(entityRow[OrmKey_Qty]);

                int size = -1;

                DynamicObject flexDynamicObject = entityRow[OrmKey_Flex] as DynamicObject;

                if (flexDynamicObject != null)

                {

                    size = ObjectUtils.Object2Int(flexDynamicObject[OrmKey_Size], -1);

                }

                if (!idSizeCntMap.ContainsKey(materialId))

                {

                    idSizeCntMap[materialId] = new Dictionary<int, int>();

                }

                if (!idSizeCntMap[materialId].ContainsKey(size))

                {

                    idSizeCntMap[materialId][size] = 0;

                }

                idSizeCntMap[materialId][size] += qty;

                sizeSet.Add(size);

            }

        }

        private string FieldKey_MaterialId = "FMaterialId_Id";


        /// <summary>

        /// 套打干预数据包接口

        /// </summary>

        /// <param name="e"></param>

        public override void OnPrepareNotePrintData(PreparePrintDataEventArgs e)

        {

            base.OnPrepareNotePrintData(e);

            if (!e.DataSourceId.EqualsIgnoreCase(DataSoruecId) || e.DataObjects.Length == 0)

                return;

            if (sizeSet.Count == 0 || idSizeCntMap.Count == 0)

                return;

            var objectType = e.DynamicObjectType;

            foreach (var sizeItem in sizeSet)

            {

                var key = string.Format("NotePrint_{0}", sizeItem);

                objectType.RegisterProperty(key, typeof(string));

            }

            List<DynamicObject> displayData = new List<DynamicObject>();

            HashSet<int> fillMaterialSet = new HashSet<int>();

            foreach (var dataRow in e.DataObjects)

            {

                var material = Convert.ToInt32(dataRow[FieldKey_MaterialId]);

                if (fillMaterialSet.Contains(material))

                    continue;

                fillMaterialSet.Add(material);

                var newRow = new DynamicObject(objectType);

                foreach (var prop in dataRow.DynamicObjectType.Properties)

                {

                    newRow[prop] = dataRow[prop];

                }

                if (idSizeCntMap.ContainsKey(material))

                {

                    foreach (var sizeQtyItem in idSizeCntMap[material])

                    {

                        var key = string.Format("NotePrint_{0}", sizeQtyItem.Key);

                        newRow[key] = sizeQtyItem.Value;

                    }

                }

                displayData.Add(newRow);

            }

            e.DataObjects = displayData.ToArray();

        }

    }


套打.二开案例.数据表格动态列

针对数据表格输出动态内容包括两种情况:<1>数据表格列数是固定的,只是不同场景下对应的取值字段不一样案例:单据上有采购数量A和采购数量...
点击下载文档
确认删除?
回到顶部
客服QQ
  • 客服QQ点击这里给我发消息