使用存储过程创建简单报表临时表原创
6人赞赏了该文章
2,672次浏览
编辑于2022年12月27日 14:43:35
有时候,我们需要通过存储过程来创建临时表,这种情况下,我们需要把平台生成的临时表名,排序字段和过滤条件(where)传递到存储过程里面。在存储过程里面,本示例示例了Select into语句来生成临时表。也可以通过CREATE TABLE 方式来创建临时表,然后填充临时表数据。
首先编写存储过程,接受3个参数,分别是临时表名,排序字段和过滤语句,存储过程如下:
Create PROCEDURE p_SimReport @tempTable varchar(50), --临时表名 @orderBy varchar(200), --排序SQL,用于生成报表主键 @whereSql varchar(200) --where语句,报表过滤使用 AS declare @sqlStr nvarchar(max) set @sqlStr='select t0.FID, t1.FENTRYID ,t0.FBILLNO ,t0.FDate ,t0.FDOCUMENTSTATUS ,t2.FLOCALCURRID ,ISNULL(t20.FPRICEDIGITS,4) AS FPRICEDIGITS ,ISNULL(t20.FAMOUNTDIGITS,2) AS FAMOUNTDIGITS ,t1.FMATERIALID ,t1M_L.FNAME as FMaterialName ,t1.FQTY ,'+@orderBy+ ' INTO '+ @tempTable+ ' from T_PUR_POORDER t0 inner join T_PUR_POORDERFIN t2 on (t0.FID = t2.FID) left join T_BD_CURRENCY t20 on (t2.FLOCALCURRID = t20.FCURRENCYID) inner join T_PUR_POORDERENTRY t1 on (t0.FID = t1.FID) left join T_BD_MATERIAL_L t1M_L on (t1.FMATERIALID = t1m_l.FMATERIALID and t1M_L.FLOCALEID = 2052) where 1=1 '+@whereSql exec sp_executesql @sqlStr GO
简单报表插件如下:
调用时,使用如下方法,把参数传递进去
string execSql = string.Format("exec p_SimReport '{0}','{1}','{2}'", tableName, KSQL_SEQ, string.Empty); DBUtils.Execute(this.Context, execSql);
using System; using System.Collections.Generic; using System.ComponentModel; using System.Linq; using System.Text; using Kingdee.BOS; using Kingdee.BOS.App.Data; using Kingdee.BOS.Contracts.Report; using Kingdee.BOS.Core.Metadata.ControlElement; using Kingdee.BOS.Core.Report; using Kingdee.BOS.Util; namespace Witt.Cloud.PlugIn.Report { public class SpReportPlugIn : SysReportBaseService { public override void Initialize() { base.Initialize(); // 简单账表类型:普通、树形、分页 this.ReportProperty.ReportType = ReportType.REPORTTYPE_NORMAL; this.IsCreateTempTableByPlugin = true; this.ReportProperty.IsUIDesignerColumns = false; this.ReportProperty.IsGroupSummary = true; // 单据主键:两行FID相同,则为同一单的两条分录,单据编号可以不重复显示 this.ReportProperty.PrimaryKeyFieldName = "FID"; // this.ReportProperty.IsDefaultOnlyDspSumAndDetailData = true; } public override void BuilderReportSqlAndTempTable(IRptParams filter, string tableName) { base.BuilderReportSqlAndTempTable(filter, tableName); if (filter.FilterParameter.SortString.IsNullOrEmpty()) { this.KSQL_SEQ = string.Format(this.KSQL_SEQ, " t1.FMATERIALID asc"); } else { this.KSQL_SEQ = string.Format(this.KSQL_SEQ, filter.FilterParameter.SortString); } string execSql = string.Format("exec p_SimReport '{0}','{1}','{2}'", tableName, KSQL_SEQ, string.Empty); DBUtils.Execute(this.Context, execSql); } public override List<SummaryField> GetSummaryColumnInfo(IRptParams filter) { var result = base.GetSummaryColumnInfo(filter); result.Add(new SummaryField("FQty", Kingdee.BOS.Core.Enums.BOSEnums.Enu_SummaryType.SUM)); return result; } public override ReportHeader GetReportHeaders(IRptParams filter) { // FID, FEntryId, 编号、状态、物料、数量、单位、单位精度、单价、价税合计 ReportHeader header = new ReportHeader(); // 编号 var dateHeader = header.AddChild("FDate", new LocaleValue("日期1")); dateHeader.TextAlign = ControlAppearance.TEXTALIGN_RIGHT; dateHeader.ColIndex = 0; dateHeader.Width = 100; var status = header.AddChild("FDocumentStatus", new LocaleValue("状态2")); status.ColIndex = 7; var billNo = header.AddChild("FBillNo", new LocaleValue("单据编号3")); billNo.ColIndex = 1; billNo.IsHyperlink = true; // 支持超链接 var material = header.AddChild("FMaterialName", new LocaleValue("物料4")); material.ColIndex = 2; var qty = header.AddChild("FQty", new LocaleValue("数量5"), SqlStorageType.SqlDecimal); return header; } } }
运行效果:
赞 6
6人点赞
还没有人点赞,快来当第一个点赞的人吧!
打赏
0人打赏
还没有人打赏,快来当第一个打赏的人吧!
推荐阅读