K3CLOUD报表分SQL直接账表、简单账表、树形账表、分页账表。SQL直接账表比较简单,如果有动态列(比如账期,是不固定的)、复杂的计算,就需要用其它三个报表了,此文以简单账表为列。
报表服务端取数插件是继承自AbstractSysReportPlugIn,它有几个常用的方法:
GetReportTitles: 为报表头字段赋值,筛选窗的条件要在报表头显示,需要方法中进行赋值
GetReportHeaders:构建报表体的列
BuilderReportSqlAndTempTable:报表数据产生逻辑,可以在此调用SQL,并把数据插入临时表。现有报表的二次开发,可以在此方法中把临时表表名传递给存储过程对数据再次处理。
GetSummaryColumnInfo:设置合计列
1、如何对现有报表做二次修改。
需要继承原始报表取数插件,重写虚方法BuilderReportSqlAndTempTable
public override void BuilderReportSqlAndTempTable(IRptParams filter, string tableName) {
IDBService service = ServiceHelper.GetService(); this.customRptTempTableNames = service.CreateTemporaryTableName(base.Context, 1); string text = this.customRptTempTableNames[0]; base.BuilderReportSqlAndTempTable(filter, text); using (new SessionScope()) {
StringBuilder stringBuilder = new StringBuilder(); string format = "/*dialect*/SELECT t1.*,t1.fseq as FBILLSEQ,cast( '' as nvarchar(255)) AS F_PXJT_ProjectName,cast( '' as nvarchar(255)) AS F_PXJT_ClientPO,cast( '' as nvarchar(255)) AS F_PXJT_BusinessName INTO {0} FROM {1} T1 "; stringBuilder.AppendFormat(format, tableName, text); DBUtils.Execute(base.Context, stringBuilder.ToString()); List list = new List(); list.Add(new SqlParam("@tableName", KDDbType.String, tableName)); DBUtils.ExecuteStoreProcedure(base.Context, "SP_RptFix", list); } }
此方法参数tableName,就是报表的临时表,报表结果就保存在这个表中。
2、动态列的报表实现。报表窗体中,可以不添加列,把存储过程中的列自动填充进来。需要继承SysReportBaseService。
重写虚方法BuilderReportSqlAndTempTable,把tableName传递给存储过程,在存储过程中用select * into {tableName} from的方式把数据传递回来
[Description("物料项目周需求分析服务端插件")] public class MtrlProjReqAnalysis:SysReportBaseService {
bool _firstRun = true; string _sql = "EXEC [PXJT_INV_MtrlRequire] @projName='{0}',@isRpt=1,@rptTmpTableName='{1}'"; ReportHeader _rptHeader = new ReportHeader(); public override void Initialize() {
base.Initialize(); this.ReportProperty.ReportType = ReportType.REPORTTYPE_NORMAL; this.ReportProperty.ReportName= new Kingdee.BOS.LocaleValue("物料项目周需求报表", 2052); this.ReportProperty.DetailReportId = "PXJT_MFG