【Dynamics 365 FO】在Dynamics 365中建立一个SSRS报表

商务合作请加微信:dynamicscn

建立一个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的时候就直接导进去。

52b032e7816cfe729448377628107140.png

如果没有导入可以在这里导入一下。

ff0901347be8d37a1fc04521d8a7fd31.png

 

1、首先我们需要在项目中新建合约类

f410915601fc373ce0359502bf97d21b.png

合约类的代码类似于下面这样,就是设置一个查询条件,根据我们的需要设置即可,如果我们不需要设置查询条件,也可以直接把这个类空着。

[DataContract]
class SSRSReportContract{
    // 我需要对PaymTermId这个字段做筛选,所以我要先建一个PaymTermId类型的对象
    PaymTermId paymTermId;
    // 然后建一个获取PaymTermId数据的方法
    [DataMember('PaymTermId')]
    public PaymTermId parmPaymTermId(PaymTermId _paymTermId = paymTermId)       
    {
        paymTermId = _paymTermId;
        return paymTermId;
    }
  }

注意,每多一个查询条件就要多建一个对象和方法。

我们在合约类中设置的查询条件将在这里 ↓ 体现出来。

b1afc90f025456e00b83a012dd5a1b37.png

 

2、然后我们建立临时表4bf7d1456c5ae0417e5f255fc63985b1.png

对于临时表中字段的创建,我们可以打开数据源表,直接把需要的字段给拖到临时表里。

1594b8f665dddfed45c022f1afd3d7f5.png

这样可以帮我们省不少功夫。

既然是临时表,我们就需要把这张表的类型设置成临时表类型,这样这张表中的数据就只是临时数据,不会长期存储,但在改表类型之前,我们需要先把这一项 ↓ 给改成否。

11047230ffe58aeb3f5d19de02969569.png

否则的话将无法把表修改为临时表。

改完了我们再去修改表类型。

7297ef12e093708922729d64ce80d3c6.png

 

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类后我们来建立报表

be476c0b2c1dcebb98aa13848234b485.png

66e509b181f08a3d9461dca7296bea99.png

建好报表后需要进来给报表设置数据源。

e0b4a3f635ea156fb453901c71a2f7a9.png

我们这里把数据源类型设置为DP类,然后设置查询为从DP类关联的那个临时表中查询所有字段。

efa188776bedb344dad95dd61accd37e.png

选择DP类。

04c6ffad28112a307d36b6b45d5eeaec.png

如果找不到需要的DP类,就先把项目Build一下。2e1cf75f8ca0dd3495db296ba52ade52.png

选择与DP类关联的临时表中的所有字段,这个根据实际情况来选就好了,不过按理来说不需要的字段在建临时表的时候就不会放进来了吧,所以临时表中的字段按理来说应该都是我们需要的。

c02f36382e304fbd8c6888c7696addee.png

之后我们需要给报表新建一个Design,这里我采用第二种Design

789aa1b2e6848ea936a9a732f2d3fe22.png

然后开始设置这个Design。

a72660562c63a617f6f326c713f1a7b2.png

这里如果想要进入拖拉拽的编辑模式貌似是需要安一个插件,不然的话默认是用XML编辑的;不过这无所谓,点编辑的时候VS就会提醒用户是否要装这个插件,点是然后一步一步跟着走就好了。

如果我们安好了插件,进来以后可以在这个Toolbox这里找到许多图表控件。

1d1b72c7519c34a8cd7563b8c467dab9.png

在这个Report Data中可以拿到我们数据源中的数据,可以直接拖到图表中。

f68ca4fb9808e5ec5965a76391e059d3.png

如果Report Data没有出来,或者被关了需要再打开,可以在这里开。

6550cd31bd75b8f88f2bf9533774a308.png

图表也支持写表达式

8ea7793eea9d54a13fa0ac754e2882f2.png

做好了以后别忘了发布报表。

20ec358e3cbc5c59ba4e1dcab1ec4f66.png

 

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类之后我们来创建一个菜单项

d4ac621fc785b3a0c1102b7b353e4fd4.png

把该菜单项的Object Type属性改为Class,因为我们要通过这个菜单项来启动Controller类;然后再把Object属性指定为我们刚才建的那个Controller类。

93373b8effde000bc602a05dc592cf23.png

别忘了设置菜单项的Label属性,Label的值是什么,到时候该菜单项在菜单页中显示的名称就是什么。

209021483a62b2722b6d9604d0167f07.png

0baad4c7a6dbdca822ebe9de9c0a08d3.png

 

7、然后我们来把这个菜单项添加到菜单扩展中

在需要的菜单中新建一个菜单扩展,我这里就建在Accounts receivable下了,如果我们以前在这个菜单中建过一个菜单扩展,那也可以直接把这个菜单扩展给添加到当前项目中。

6ce54f8fa775660474b29f1a27a7b4c4.png

在该菜单扩展中新建一个子菜单。

948af4242e5ee91aab90019fe7be7df0.png

把我们建好的菜单项拖到这个子菜单下。

ea97fe8a6164d194e591e31ff2f5e317.png

也别忘了设置子菜单的Label值。

38edb0badcfdc500603763f95bbf01cf.png

a711dc03c5636b7a4c42449571132e50.png

 

8、最后我们来新建一个安全权限

de52e34585444b3c947ad8c0f831c232.png

把刚才新建的菜单项拖到Enrty Points下边就好了。

94663230f600a7b9b85ba11b1d2cec12.png

之后构建项目,我们就可以直接在D365菜单中找到我们的表单了。

01618d0c2cf7d2fdb5b1b7fc349afb54.png

本次分享重点在创建SSRS报表,具体报表的设计等操作以后可能会单独分享。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值