富盛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.thi SAPpPath + @"Reports\fsCxFRpt.fr3";
{
public fsCxFRptTestForm(fsSboCommon fs)
: base(fs)
{
ReportFileName = fsSbo.thi SAPpPath + @"Reports\fsCxFRpt.fr3";
ReportQueryStr = "___select
" + fsSbo.GetAllUserField4Table("@FSCXFITEMBATINFO", true, "a") + " FROM [@FSCXFITEMBATINFO] a "; ;
ReportGroupStr = "";
ReportOrderStr = "U_WhsCode, U_InDate, U_ItemCode";
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();
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("", "所有");
{
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);
}
catch (Exception ex)
{
fsSbo.ShowMsg("错误:" + ex.Message);
bRet = false;
}
}
return bRet;
}
}
//获得报表查询语句中的WHERE查询子句的函数,这个函数应该被重载
protected override string GetReportWhereSQL()
{
string strRet = "";
protected override string GetReportWhereSQL()
{
string strRet = "";
try
{
string strValue = fsSbo.GetValue4Item(oForm, "cbWhs");
if (strValue.Length > 0)
{
strRet = "U_WhsCode=N'" + strValue + "'";
{
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 = "";
if (!strRet.Trim().ToUpper().StartsWith(" WHERE ")) strRet = " WHERE " + strRet;
}
catch (Exception ex)
{
strRet = "";
fsSbo.ShowMsg("错误:" + ex.Message);
}
}
return strRet;
}
}
}
}
}
}
结果展示,上述代码的运行结果如下图所示。
左下角就是子报表的显示列表,不过在这个例子中我们并没有对子报表的相关条件进行处理和约束,真正要做报表的时候需要处理,否则子报表就显得没有任何意义。
点击打印按钮就可以实现报表数据的现实和打印,点击设计按钮就可以实现对打印报表的格式设计。因为我没有对报表结果进行打印设计,所以在此就不展示打印结果了。
就这么简单的几十行代码--一些还是系统自动生成的,就完成了使用富盛SBO程序开发框架中使用FastReport进行报表设计。
需要指出的是,富盛SBO程序开发框架下的报表集成不光支持SELECT查询分析语句,还支持存储过程调用。
本文转自foresun 51CTO博客,原文链接:http://blog.51cto.com/foresun/103133,如需转载请自行联系原作者