建立一个SSRS报表主要有以下8个步骤:
目录
1、新建合约类
合约类(Contract Class)的作用是获取查询数据源所需要的数据,在我们点开报表的时候,系统会弹出一个对话框让我们来选择字段来筛选要查询数据,合约类就是用来设置这里可以有哪些可以用于查询的字段的。
2、建立临时表
临时存储DP类查询到的数据,功能上感觉有点类似Dao类。
3、建立DP类
DP(Data Provider)类会根据合约类收到的筛选数据来从数据库中查数据,功能上感觉有点类似Model接口,只不过DP类只会用于查询罢了。
4、建立报表
可以把临时表中存的数据展示在报表(Report)中。
5、建立控制器类
控制器类(Controller Class)有着一个main方法,用来启动报表,这个跟一般印象中的Controller类就有点不一样了。
6、创建一个菜单项
在界面中添加一个菜单项(Menu Item),点击后可以让控制器类run起来,也就是菜单项运行控制器类,控制器类启动报表这么一个流程。
7、把这个菜单项添加到菜单扩展中
就是设置把菜单项添加到页面中的哪个位置。
8、建立一个安全权限
这个的作用是让所有有权限的人都可以访问这个报表,否则的话就只有系统管理员才能看这个报表了,D365权限相关的设置我们以后可能会分享。
在正式开始搭建报表之前,我们要先确保我们要建立报表的那个表单所在的Model,以及Application Foundation这个Model,已经导入到我们项目所在的Model里了,最好在新建Model的时候就直接导进去。
如果没有导入可以在这里导入一下。
1、首先我们需要在项目中新建合约类
合约类的代码类似于下面这样,就是设置一个查询条件,根据我们的需要设置即可,如果我们不需要设置查询条件,也可以直接把这个类空着。
[DataContract]
class SSRSReportContract{// 我需要对PaymTermId这个字段做筛选,所以我要先建一个PaymTermId类型的对象PaymTermId paymTermId;// 然后建一个获取PaymTermId数据的方法[DataMember('PaymTermId')]public PaymTermId parmPaymTermId(PaymTermId _paymTermId = paymTermId) {paymTermId = _paymTermId;return paymTermId;}}
注意,每多一个查询条件就要多建一个对象和方法。
我们在合约类中设置的查询条件将在这里 ↓ 体现出来。
2、然后我们建立临时表
对于临时表中字段的创建,我们可以打开数据源表,直接把需要的字段给拖到临时表里。
这样可以帮我们省不少功夫。
既然是临时表,我们就需要把这张表的类型设置成临时表类型,这样这张表中的数据就只是临时数据,不会长期存储,但在改表类型之前,我们需要先把这一项 ↓ 给改成否。
否则的话将无法把表修改为临时表。
改完了我们再去修改表类型。
3、建好临时表后我们来建立DP类
建类(Class)的方法上边已经有图了,这里就不放了。
DP类的代码类似于下边这样,主要部分还是根据条件拿数据那一块。
// 选择合约类
[SRSReportParameterAttribute(classStr(SSRSReportContract))]
class SSRSReportDP extends SRSReportDataProviderBase{// 建立临时表的对象SSRSReportTem reportTem;// 选择临时表[SRSReportDataSetAttribute(tableStr(SSRSReportTem))]public SSRSReportTem getTem(){select reportTem;return reportTem;}public void processReport(){// 建立合约类和数据源的对象SSRSReportContract contract = this.parmDataContract() as SSRSReportContract;CustGroup custGroup;// 拿到合约类获取的查询条件PaymTermId paymTermId = contract.parmPaymTermId();// 根据合约类拿到的查询条件来查询数据,并把数据存入临时表while select custGroup where custGroup.PaymTermId == paymTermId{reportTem.clear();reportTem.CustGroup = custGroup.CustGroup;reportTem.Name = custGroup.Name;reportTem.PaymTermId = custGroup.PaymTermId;reportTem.ClearingPeriod = custGroup.ClearingPeriod;reportTem.insert();}}}
4、建好DP类后我们来建立报表
建好报表后需要进来给报表设置数据源。
我们这里把数据源类型设置为DP类,然后设置查询为从DP类关联的那个临时表中查询所有字段。
选择DP类。
如果找不到需要的DP类,就先把项目Build一下。
选择与DP类关联的临时表中的所有字段,这个根据实际情况来选就好了,不过按理来说不需要的字段在建临时表的时候就不会放进来了吧,所以临时表中的字段按理来说应该都是我们需要的。
之后我们需要给报表新建一个Design,这里我采用第二种Design
然后开始设置这个Design。
这里如果想要进入拖拉拽的编辑模式貌似是需要安一个插件,不然的话默认是用XML编辑的;不过这无所谓,点编辑的时候VS就会提醒用户是否要装这个插件,点是然后一步一步跟着走就好了。
如果我们安好了插件,进来以后可以在这个Toolbox这里找到许多图表控件。
在这个Report Data中可以拿到我们数据源中的数据,可以直接拖到图表中。
如果Report Data没有出来,或者被关了需要再打开,可以在这里开。
图表也支持写表达式
做好了以后别忘了发布报表。
5、建好报表之后我们来建立Controller类
Controller类的代码类似于下边这样。
class SSRSReportController extends SrsReportRunController{public static SSRSReportController construct(){return new SSRSReportController();}public static void main(Args _args){SSRSReportController controller = SSRSReportController::construct();controller.parmArgs(_args);// 指定要打开的报表(ssrsReportStr的第一个参数)和要打开的报表设计(ssrsReportStr的第二个参数)controller.parmReportName(ssrsReportStr(SSRSReport, Report));controller.startOperation();}}
6、建好Controller类之后我们来创建一个菜单项
把该菜单项的Object Type属性改为Class,因为我们要通过这个菜单项来启动Controller类;然后再把Object属性指定为我们刚才建的那个Controller类。
别忘了设置菜单项的Label属性,Label的值是什么,到时候该菜单项在菜单页中显示的名称就是什么。
7、然后我们来把这个菜单项添加到菜单扩展中
在需要的菜单中新建一个菜单扩展,我这里就建在Accounts receivable下了,如果我们以前在这个菜单中建过一个菜单扩展,那也可以直接把这个菜单扩展给添加到当前项目中。
在该菜单扩展中新建一个子菜单。
把我们建好的菜单项拖到这个子菜单下。
也别忘了设置子菜单的Label值。
8、最后我们来新建一个安全权限
把刚才新建的菜单项拖到Enrty Points下边就好了。
之后构建项目,我们就可以直接在D365菜单中找到我们的表单了。
本次分享重点在创建SSRS报表,具体报表的设计等操作以后可能会单独分享。