为一个简单帐表做表单插件,新增一个按钮点击事件,点击按钮时 取报表里的部分数据,用这部分数据代理创建另一个单据。
求解:如何取得报表的表体的数据和表头的数据?按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);
}
}
}
推荐阅读