关于AbstractSysReportPlugIn插件的疑问
金蝶云社区-天冥异
天冥异
2人赞赏了该文章 1800次浏览 未经作者许可,禁止转载编辑于2018年07月27日 11:40:47

为一个简单帐表做表单插件,新增一个按钮点击事件,点击按钮时 取报表里的部分数据,用这部分数据代理创建另一个单据。
求解:如何取得报表的表体的数据和表头的数据?按AbstractDynamicBillPlugIn的this.View.Model.GetEntityDataObject和this.View.Model.GetValue似乎不行


如下示例代码,是演示如何在双击简单账表单元格时,打开对应的单据界面的。
场景与楼主的不太符合,但是,其中读取了表格单元格的值,可以参考:

//****************************************************
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.ComponentModel;
using Kingdee.BOS;
using Kingdee.BOS.Util;
using Kingdee.BOS.Core;
using Kingdee.BOS.Core.DynamicForm.PlugIn;
using Kingdee.BOS.Core.DynamicForm.PlugIn.Args;
using Kingdee.BOS.Core.Report;
using Kingdee.BOS.Core.Report.PlugIn;
using Kingdee.BOS.Core.Report.PlugIn.Args;
using Kingdee.BOS.Core.Bill;
using Kingdee.BOS.Core.DynamicForm;
using Kingdee.BOS.Core.Metadata;
using Kingdee.BOS.Core.SqlBuilder;
using Kingdee.BOS.ServiceHelper;

namespace JDSample.FormPlugIn.Report
{
    [Description("用户点击报表单元格式时,打开指定单据")]
    public class S160615ShowLinkBillRptPlug : AbstractSysReportPlugIn
    {
        /// <summary>
        /// 表格行双击事件:简单账表,不会触发此事件
        /// </summary>
        /// <param name="e"></param>
        public override void EntityRowDoubleClick(EntityRowClickEventArgs e)
        {
            base.EntityRowDoubleClick(e);
        }
        /// <summary>
        /// 方案一,用户双击单元格:读取焦点单元格记录的单据编号,打开对应单据
        /// </summary>
        /// <param name="e"></param>
        /// <remarks>
        /// 单元格不需要显示为超链接格式;
        /// </remarks>
        public override void CellDbClick(CellEventArgs Args)
        {
            // 略过系统的标准联查单据处理
            Args.Cancel = true;
            int rowSeq = Args.CellRowIndex;     // 行序号,以1开始
            string fldKey = Args.Header.FieldName;
            // 根据当前所选的单据编号字段名,确定需要打开的单据类型
            // 示例代码,以打开采购订单为例
            string formId = string.Empty;
            if (fldKey.EqualsIgnoreCase("FBillNo"))
            {
                // 以打开采购订单为例
                formId = "PUR_PurchaseOrder";
            }
            if (string.IsNullOrWhiteSpace(formId))
            {
                // 双击的是普通单元格,不需要显示单据
                return;
            }
            string billNo = this.GetBillNo(fldKey, rowSeq - 1);
            if (string.IsNullOrWhiteSpace(billNo))
            {
                // 单元格无内容,不确定需要打开那张单据
                return;
            }
            // 根据单据编号,加载单据内码
            string pkValue = this.LoadPKValue(formId, billNo);
            // 显示指定单据
            this.ShowForm(formId, pkValue);
        }
        /// <summary>
        /// 方案二,用户点击带链接的单元格:读取此单元格记录的单据编号,打开对应单据
        /// </summary>
        /// <param name="e"></param>
        public override void EntryButtonCellClick(EntryButtonCellClickEventArgs e)
        {
            int rowSeq = e.Row;     // 行序号,以1开始
            string fldKey = e.FieldKey;
            // 根据当前所选的单据编号字段名,确定需要打开的单据类型
            // 示例代码,以打开采购订单为例
            string formId = string.Empty;
            if (fldKey.EqualsIgnoreCase("FBillNo"))
            {
                // 以打开采购订单为例
                formId = "PUR_PurchaseOrder";
            }
            if (string.IsNullOrWhiteSpace(formId))
            {
                // 双击的是普通单元格,不需要显示单据
                return;
            }
            string billNo = this.GetBillNo(fldKey, rowSeq - 1);
            if (string.IsNullOrWhiteSpace(billNo))
            {
                // 单元格无内容,不确定需要打开那张单据
                return;
            }
            // 根据单据编号,加载单据内码
            string pkValue = this.LoadPKValue(formId, billNo);
            // 显示指定单据
            this.ShowForm(formId, pkValue);
        }
        /// <summary>
        /// 获取指定行指定列对应的单据编号值
        /// </summary>
        /// <param name="fldKey">焦点单元格列名</param>
        /// <param name="rowIndex">焦点行号</param>
        /// <returns></returns>
        private string GetBillNo(string fldKey, int rowIndex)
        {
            // 方案一:使用行索引,到报表数据源中自行获取行
            // 报表显示的数据源
            DataTable dt = ((ISysReportModel)this.View.Model).DataSource;
            if (dt.Rows.Count == 0 || rowIndex >= dt.Rows.Count)
            {
                return string.Empty;
            }
            DataRow currRow = dt.Rows[rowIndex];
            string billNo = Convert.ToString(currRow[fldKey]);
            // 方案二:获取报表当前选择的数据行
            DataRow[] rows = ((ISysReportView)this.View).SelectedDataRows;
            //billNo = Convert.ToString(rows[0][fldKey]);
            return billNo;
        }
        /// <summary>
        /// 根据单据编号,读取单据内码
        /// </summary>
        /// <param name="formId"></param>
        /// <param name="billNo"></param>
        /// <returns></returns>
        private string LoadPKValue(string formId, string billNo)
        {
            FormMetadata meta = MetaDataServiceHelper.Load(this.Context, formId) as FormMetadata;
            // 构建取数参数
            QueryBuilderParemeter queryParam = new QueryBuilderParemeter();
            // 指定单据FormId及其元数据
            queryParam.FormId = formId;
            queryParam.BusinessInfo = meta.BusinessInfo;
            // 指定需要加载的字段:使用单据设计时的字段标识(Key)
            // 单据主键
            queryParam.SelectItems.Add(new SelectorItemInfo(meta.BusinessInfo.GetForm().PkFieldName));
            // 取单据编号字段
            var fldBillNo = meta.BusinessInfo.GetBillNoField();
            // 构造过滤条件:根据单据编号取数, 单据编号值以SQL参数的形式传入
            queryParam.FilterClauseWihtKey = string.Format(" {0} = @FBillNo ", fldBillNo.Key);
            SqlParam billNoParam = new SqlParam("@FBillNo", KDDbType.String, billNo);
            queryParam.SqlParams.Add(billNoParam);
            // 读取数据
            var rows = QueryServiceHelper.GetDynamicObjectCollection(this.Context, queryParam);
            string pkValue = string.Empty;
            if (rows != null && rows.Count > 0)
            {
                pkValue = Convert.ToString(rows[0][0]);
            }
            return pkValue;
        }
        /// <summary>
        /// 打开单据界面,显示指定的单据
        /// </summary>
        /// <param name="formId"></param>
        /// <param name="pkValue"></param>
        private void ShowForm(string formId, string pkValue)
        {
            // using Kingdee.BOS.Core.Bill;
            string pageId = Guid.NewGuid().ToString();
            BillShowParameter showParameter = new BillShowParameter();
            showParameter.FormId = formId;
            showParameter.OpenStyle.ShowType = ShowType.Floating;
            showParameter.PageId = pageId;
            showParameter.Status = OperationStatus.EDIT;
            showParameter.PKey = pkValue;
            this.View.ShowForm(showParameter);
        }
    }
}



赞 2