富盛SBO程序开发框架中缺省集成了FastReport作为报表打印的控件,并且可以轻易实现SBO报表查询和打印集成。
 
富盛SBO程序开发框架支持使用Matrix或者Grid组件作为报表查询结果显示控件,当然,也可以不在SBO中显示查询结果,而直接将报表数据结果显示在FastReport中。
 
富盛SBO程序开发框架使用Grid组件进行FastReport报表打印、显示集成的基类为fsSboReportGridQueryForm,这个基类包括以下几个属性:
  • 报表文件:ReportFileName,字符型
  • 报表查询语句,包括四部分,基类会在GetReportQuerySQL函数中组装,
    • SELECT语句:ReportQueryStr,字符型
    • WHERE子句:根据查询条件由GetReportWhereSQL()生成,应该被重载
    • GROUP子句:ReportGroupStr,字符型
    • ORDER子句:ReportOrderStr ,字符型
  • 子报表类型,比如:分配排序等:strSubReportList,字符型
    • 格式:
      • 格式1:子报表1代码,子报表1描述|子报表2代码,子报表2描述|...|子报表n代码,子报表n描述
      • 格式2:子报表1描述|子报表2描述|...|子报表n描述 ,这时代码为1,2,3...n
    • 子报表名称为: ReportFileName + 子报表代码 + ".fr3"
    • 请继承PostExtPrintTypeSet,并处理这些子报表对应的查询语句
    • 实例:
      • strSubReportList = "测试报表类型01|测试报表类型02|测试报表类型03";
      • strSubReportList = "Test1,测试报表类型01|Test2,测试报表类型02|Test3,测试报表类型03";
  • 是否在当前界面上通过显示Grid显示报表信息:UseReportGrid,布尔型
    • UseReportGrid = true;使用Grid控件,这个时候请不要指定ButtonTop值
    • UseReportGrid = false;不使用Grid控件
上面的属性指定之后,调用由fsSboReportGridQueryForm集成的类实例,就完成了基础的布局。最简单的,这个时侯需要获得报表分析的条件。报表分析条件对于报表来讲应该是必须的,也是动态的,为此富盛SBO程序开发框架开放了报表分析条件方法GetReportWhereSQL,在报表分析类中,这个方法应该被重载。
 
如果指定了子报表类型strSubReportList,报表类将自动根据子报表类型找到相应的子报表,当然子报表的数据显示格式可能不同,所以对应的报表名称也就各自不同(子报表名称=主报表名称+子表代码),当然对于子报表的数据分析条件也应该有所动态化的定义,那么请重载方法PostExtPrintTypeSet即可完成,以处理这些子报表对应的查询语句。
 
实例:以下这个简单的类,就实现了使用FastReport进行数据分析报表及其子报表的管理,看看富盛SBO程序开发框架的确非常简便了很多复杂问题的解决。
 
class fsCxFRptTestForm : fsSboReportGridQueryForm
    {
        public fsCxFRptTestForm(fsSboCommon fs)
            : base(fs)
        {
            ReportFileName = fsSbo.thiSAPpPath + @"Reports\fsCxFRpt.fr3";
            ReportQueryStr = "___select " + fsSbo.GetAllUserField4Table("@FSCXFITEMBATINFO", true, "a") + " FROM [@FSCXFITEMBATINFO] a "; ;
            ReportGroupStr = "";
            ReportOrderStr = "U_WhsCode, U_InDate, U_ItemCode";
            strSubReportList = "Test1,测试报表类型01|Test2,测试报表类型02|Test3,测试报表类型03";
            UseReportGrid = false;
        }
        //将报表的检索统计条件加入到界面中,必须被重载
        protected override bool AddQueryConditions2Form()
        {
            Boolean bRet = base.AddQueryConditions2Form();
            try
            {
                oForm.DataSources.UserDataSources.Add("dsWhs", BoDataType.dt_SHORT_TEXT, 20);
                fsSbo.AddStaticText2Form(ref oForm, "stWhs", "仓库", 10, 10, 60, 14);
                ComboBox cbx = fsSbo.AddCombox2Form(ref oForm, "cbWhs", "", "dsWhs", 10, 70, 80, 14);
                fsSbo.AddValidValues2Combox(ref cbx, "___select WhsCode, WhsName FROM OWHS Order by WhsCode");
                cbx.ValidValues.Add("", "所有");
                if (UseReportGrid) fsSbo.AddButton2Form(ref oForm, "btnQuery", "检索", 7, 220, 65, 20);
                AllowReportPrint = true;
            }
            catch (Exception ex)
            {
                fsSbo.ShowMsg("错误:" + ex.Message);
                bRet = false;
            }
            return bRet;
        }
        //获得报表查询语句中的WHERE查询子句的函数,这个函数应该被重载
        protected override string GetReportWhereSQL()
        {
            string strRet = "";
            try
            {
                string strValue = fsSbo.GetValue4Item(oForm, "cbWhs");
                if (strValue.Length > 0)
                {
                    strRet = "U_WhsCode=N'" + strValue + "'";
                    ReportNotesStr = " 仓库 " + fsSbo.GetDescription4Combox(oForm, "cbWhs") + "[" + strValue + "]";
                }
                if (strRet.Length > 0)
                    if (!strRet.Trim().ToUpper().StartsWith(" WHERE ")) strRet = " WHERE " + strRet;
            }
            catch (Exception ex)
            {
                strRet = "";
                fsSbo.ShowMsg("错误:" + ex.Message);
            }
            return strRet;
        }
    }
}
 
结果展示,上述代码的运行结果如下图所示。
 
点击看大图
 
左下角就是子报表的显示列表,不过在这个例子中我们并没有对子报表的相关条件进行处理和约束,真正要做报表的时候需要处理,否则子报表就显得没有任何意义。
 
点击打印按钮就可以实现报表数据的现实和打印,点击设计按钮就可以实现对打印报表的格式设计。因为我没有对报表结果进行打印设计,所以在此就不展示打印结果了。
 
就这么简单的几十行代码--一些还是系统自动生成的,就完成了使用富盛SBO程序开发框架中使用FastReport进行报表设计。
 
需要指出的是,富盛SBO程序开发框架下的报表集成不光支持SELECT查询分析语句,还支持存储过程调用。