简单账表开发步骤详解
金蝶云社区-勤劳的小蜜蜂
勤劳的小蜜蜂
32人赞赏了该文章 11393次浏览 未经作者许可,禁止转载编辑于2019年04月23日 20:59:22

第一步:打开BOS新建空白对象--->简单账表


第二步:进行简单账表界面设计


第三步:新建过滤窗口:新建->继承->BOS->应用框架-公共过滤


第四步:进行过滤界面设计


第五步:将过滤界面与简单账表页面进行对应


第六步:发布报表,观看效果;建议开发时不要设置权限



第七步:利用开发工具VS 新建工程



第八步:挂载插件
过滤页面挂载:表单插件
简单账表挂载:服务器插件
第九步:编写代码

代码参考:https://vip.kingdee.com/article/148691报表单据头赋值请重写

注:简单账表,默认是不会使用界面设计列表列,除非在插件中,初始化报表时设置
this.ReportProperty.IsUIDesignerColumns = true;
如果有此设置,则会直接使用设计器设计的列表列,这样就不需要重写GetReportHeaders,直接在设计器添加列就可以了。
简单账表汇总贴:
https://vip.kingdee.com/article/9144
https://vip.kingdee.com/article/9147https://vip.kingdee.com/article/150601 报表汇总行数据重复

[tr][td]如何设置同一单据的单据头字段各行合并显示吗?

要实现此功能,关键有两点:

1. 如何让系统知道,哪些行是属于同一个单据的?

重载 Initialize 事件, 设置 this.ReportProperty.PrimaryKeyFieldName 属性为单据内码字段名,例如:
this.ReportProperty.PrimaryKeyFieldName = "FID";

2. 如何让系统知道,哪些字段需要合并显示?

如果需要实现字段支持合并显示,必须使用插件动态构建列并指定列 Mergeable 属性;

请重载 GetReportHeaders 事件,构建全部列。
如果需要字段支持超链接,则需要同步在设计器中,添加此列,并指定其采用显示为超链接

例:
public override ReportHeader GetReportHeaders(IRptParams filter)
{

// FID, FEntryId, 编号、状态、物料、数量、单位、单位精度、单价、价税合计
ReportHeader header = new ReportHeader();

// 编号
var billNo = header.AddChild("FBillNo", new LocaleValue("单据编号"));
billNo.ColIndex = 0;
billNo.IsHyperlink = true; // 支持超链接(这句代码实际不起作用。需要显示超链接的列,必须在BOS设计器中,添加字段定义,在设计器中设置其显示为超链接)
billNo.Mergeable = true; // 此字段在同一张单据的多行时融合



// TODO : 其他字段略
}

-------------------------------------------------代码参考---------------------------------------------------------------using System;
using System.Collections.Generic;


using System.ComponentModel;
using Kingdee.BOS;


using Kingdee.BOS.Core.Report;


using Kingdee.BOS.Contracts.Report;
using Kingdee.BOS.App.Data;
using Kingdee.BOS.Orm.DataEntity;
using Kingdee.BOS.Core;


namespace SF.K3Cloud.Report.Plugin
{
[Description("穗丰测试报表")]
[Kingdee.BOS.Util.HotUpdate]
public class SFTest : SysReportBaseService
{

public override void Initialize()
{
base.Initialize();
// 简单账表类型:普通、树形、分页
this.ReportProperty.ReportType = ReportType.REPORTTYPE_NORMAL;
// 报表名称
this.ReportProperty.ReportName = new LocaleValue("穗丰测试报表", base.Context.UserLocale.LCID);
//
this.IsCreateTempTableByPlugin = true;
// 不利用动态构建列
this.ReportProperty.IsUIDesignerColumns = false;
//
this.ReportProperty.IsGroupSummary = true;
//
this.ReportProperty.SimpleAllCols = false;
// 单据主键:两行FID相同,则为同一单的两条分录,单据编号可以不重复显示
this.ReportProperty.PrimaryKeyFieldName = "FID";
//
this.ReportProperty.IsDefaultOnlyDspSumAndDetailData = true;


// 报表主键字段名:默认为FIDENTITYID,可以修改
//this.ReportProperty.IdentityFieldName = "FIDENTITYID";
}


public override string GetTableName()
{
var result = base.GetTableName();
return result;
}
///
/// 向报表临时表,插入报表数据
///

///
///
public override void BuilderReportSqlAndTempTable(IRptParams filter, string tableName)
{
base.BuilderReportSqlAndTempTable(filter, tableName);

SortedList list = new SortedList();//存储过滤条件
DynamicObject customFil = filter.FilterParameter.CustomFilter;//获取快捷页面的参数
// 默认排序字段:需要从filter中取用户设置的排序字段
string seqFld = string.Format(base.KSQL_SEQ, "FBILLNO");
string sql = string.Format(@"/*dialect*/select top 1000
SAL_ORDER.fid,SAL_ORDER.FBILLNO,SAL_ORDER.FCUSTID FCUST,CUSTOMER.FNUMBER FCUSTID,CUSTOMER_L.FNAME FCustName, SAL_ORDER.FDATE,
SAL_ORDER.FSALEORGID FSALEORG,Organizations.FNUMBER FSALEORGID,Organizations_L.FNAME FSALEORGName,
SAL_ORDERENTRY.FMATERIALID FMATERIAL ,MATERIAL.FNUMBER FMATERIALID, MATERIAL_L.FNAME FMATERIALName,
SAL_ORDERENTRY.FQTY,SAL_ORDERENTRY_F.FAMOUNT,{0}
into {1} from T_SAL_ORDER SAL_ORDER
left join T_SAL_ORDERENTRY SAL_ORDERENTRY
on SAL_ORDER.FID=SAL_ORDERENTRY.FID
left join T_SAL_ORDERENTRY_F SAL_ORDERENTRY_F
on SAL_ORDERENTRY_F.FENTRYID=SAL_ORDERENTRY.FENTRYID
left join T_BD_MATERIAL MATERIAL
on MATERIAL.FMATERIALID=SAL_ORDERENTRY.FMATERIALID
left join T_BD_MATERIAL_L MATERIAL_L
on MATERIAL_L.FMATERIALID=SAL_ORDERENTRY.FMATERIALID and MATERIAL_L.FLOCALEID=2052
left join T_ORG_Organizations Organizations
on Organizations.FORGID=SAL_ORDER.FSALEORGID
left join T_ORG_Organizations_L Organizations_L
on Organizations_L.FORGID=SAL_ORDER.FSALEORGID and Organizations_L.FLOCALEID=2052
left join T_BD_CUSTOMER CUSTOMER
on CUSTOMER.FCUSTID=SAL_ORDER.FCUSTID
left join T_BD_CUSTOMER_L CUSTOMER_L
on CUSTOMER_L.FCUSTID=SAL_ORDER.FCUSTID and CUSTOMER_L.FLOCALEID=2052",
seqFld, tableName);
DBUtils.ExecuteDynamicObject(this.Context, sql.ToString());


}
///
/// 构建报表列
///

///
public override ReportHeader GetReportHeaders(IRptParams filter)
{
ReportHeader header = new ReportHeader();
// 订单编号
var FBILLNO = header.AddChild("FBILLNO", new LocaleValue("穗丰&单据头&订单编号"));
FBILLNO.Mergeable = true;
FBILLNO.Index = 0;
// 客户编码
var FCUSTID = header.AddChild("FCUSTID", new LocaleValue("穗丰&单据头&客户编码"));
FCUSTID.Mergeable = true;
FCUSTID.Index = 1;
// 客户名称
var FCustName = header.AddChild("FCustName", new LocaleValue("穗丰&单据头&客户名称"));
FCustName.Mergeable = true;
FCustName.Index = 2;
//日期
var FDATE = header.AddChild("FDATE", new LocaleValue("穗丰&单据头&日期"), SqlStorageType.SqlDatetime);
FDATE.Mergeable = true;
FDATE.Index = 3;
//销售组织编码
var FSALEORGID = header.AddChild("FSALEORGID", new LocaleValue("穗丰&单据头&销售组织编码"));
FSALEORGID.Mergeable = true;
FSALEORGID.Index = 4;
//销售组织名称
var FSALEORGName = header.AddChild("FSALEORGName", new LocaleValue("穗丰&单据头&销售组织名称"));
FSALEORGName.Mergeable = true;
FSALEORGName.Index = 5;
//物料编码编码
var FMATERIALID = header.AddChild("FMATERIALID", new LocaleValue("穗丰&单据体&物料编码"));
FMATERIALID.Mergeable = true;
FMATERIALID.Index = 6;
//物料编码名称
var FMATERIALName = header.AddChild("FMATERIALName", new LocaleValue("穗丰&单据体&物料编码名称"));
FMATERIALName.Mergeable = true;
FMATERIALName.Index = 7;
//FBILLNO.IsHyperlink = true; // 支持超链接
//数量
var FQTY = header.AddChild("FQTY", new LocaleValue("穗丰&单据体&数量"));
FQTY.Index = 7;
// 金额
var FAMOUNT = header.AddChild("FAMOUNT", new LocaleValue("穗丰&单据体&金额"));
FQTY.Index = 8;
var FID = header.AddChild("FID", new LocaleValue("穗丰&单据体&订单内码"));
FID.Visible = false;
FID.Index = 9;
return header;
}


public override ReportTitles GetReportTitles(IRptParams filter)
{
ReportTitles titles = new ReportTitles();
string FSolderOrgNumber = "对于鲁迅这个人物,大家是再熟悉不过了。他的作品不仅多次出现在教材之中,而且还是大家公认的大文豪,他被评为世界十大文豪之一。鲁迅先生是我最崇拜的作家。看到这里,你们一定会感到很奇怪,世界文学史上有那么多的作家,你为什么就崇拜鲁迅呢?今天我就来说说,我为什么崇拜大文豪鲁迅先生" +
"我崇拜鲁迅先生的第一个原因,是因为他面对敌人的威逼利诱,可以做到从容不迫,一点都不受威胁。鲁迅生活在民国时期,当时的社会是由国民党反动派统治的,国民党反动派剥削劳动人民、疯狂的镇压着人民百姓,他们不分黑白、颠倒是非,把自己的卖国行为说成是爱国的举动。鲁迅先生深深地感受到了国民党反动派的腐败无能和人民百姓的生活极其的" +
"他用笔作箭划破黑暗,写出了一篇篇激励人心的文章,那都是揭示了国民党反动派阴暗一面的文章。国民党反动派恐惧极了,下令全力逮捕鲁迅先生。但是,我们的鲁迅先生,丝毫都不会畏惧,他换了一百多个笔名,继续进行文学革命工作。由此可见,鲁迅先生是多么的伟大啊,他把解放全中国的事业当成了是自己与生俱来的责任," +
"这是多么崇高的爱国精神啊!我崇拜鲁迅先生的第二个原因,是他在当时人民都处于麻木地生活着的时候,能够做到发出内心呐喊的声音,发出反对国民党反动派统治的声音。这是多么了不起啊,在当时那个黑暗社会,“人吃人”是常有的事情,但是鲁迅先生却没有麻木的生活着,相反是他还写下了一篇篇文章,呼吁人们醒悟过来,同国民党反动派作斗争!" +
"这是多么了不起的精神呐!这一点从他的白话小说《狂人日记》中就可以看出来。我崇拜鲁迅先生的第三个原因,是因为他懂得时间是宝贵的,他懂得珍惜时间。他曾经说过一句话:“时间就像海绵里的水,只要你愿意挤,总会是有的。”他不仅仅是口头上这么说说而已,他还落实到了自己的行动中,他的一生都是在拼时间、拼时间,常常是别人都做了好几个美梦了" +
"他还没上床睡觉;别人还没起床,他又开始伏案工作了";
titles.AddTitle("F_PAEZ_Remarks", FSolderOrgNumber);
return titles;
}


///
/// 设置报表合计列
///

///
///
public override List GetSummaryColumnInfo(IRptParams filter)
{
var result = base.GetSummaryColumnInfo(filter);
result.Add(new SummaryField("FQTY", Kingdee.BOS.Core.Enums.BOSEnums.Enu_SummaryType.SUM));
result.Add(new SummaryField("FAMOUNT", Kingdee.BOS.Core.Enums.BOSEnums.Enu_SummaryType.SUM));
return result;
}
protected override string GetSummaryColumsSQL(List summaryFields)
{
var result = base.GetSummaryColumsSQL(summaryFields);
return result;
}
protected override System.Data.DataTable GetListData(string sSQL)
{
var result = base.GetListData(sSQL);
return result;
}
protected override System.Data.DataTable GetReportData(IRptParams filter)
{
var result = base.GetReportData(filter);
return result;
}
protected override System.Data.DataTable GetReportData(string tablename, IRptParams filter)
{
var result = base.GetReportData(tablename, filter);
return result;
}
public override int GetRowsCount(IRptParams filter)
{
var result = base.GetRowsCount(filter);
return result;
}

public override void CloseReport()
{
base.CloseReport();
}
protected override void CreateTempTable(string sSQL)
{
base.CreateTempTable(sSQL);
}
public override void DropTempTable()
{
base.DropTempTable();
}
}
}