使用存储过程创建简单报表临时表原创
金蝶云社区-Howhy
Howhy
6人赞赏了该文章 2,509次浏览 未经作者许可,禁止转载编辑于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;
        }
    }
}


运行效果:

image.png

图标赞 6
6人点赞
还没有人点赞,快来当第一个点赞的人吧!
图标打赏
0人打赏
还没有人打赏,快来当第一个打赏的人吧!