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

建立一个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报表,具体报表的设计等操作以后可能会单独分享。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/282697.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于Java的厦门旅游电子商务预订系统(Vue.js+SpringBoot)

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 景点类型模块2.2 景点档案模块2.3 酒店管理模块2.4 美食管理模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 学生表3.2.2 学生表3.2.3 学生表3.2.4 学生表 四、系统展示五、核心代码5.1 新增景点类型5.2 查询推荐的…

CANoe自带的TCP/IP协议中TCP发送时的一个特殊处理(我一定是第一个发现的)

我们知道,CANoe软件中配置以太网通道后,添加的仿真节点可以作为一个主机或者一个应用来实现以太网通信。但不管是作为主机还是应用,仿真节点都需要配置TCP/IP协议栈。 有了TCP/IP协议栈,设置了网卡信息后(IP地址、MAC地址等),仿真节点就可以通过编写CAPL代码的方式发送和…

关于UDP协议

UDP协议是基于非连接的发送数据就是把数据包简单封装一下,然后从网卡发出去就可以,数据包之间没有状态上的联系,UDP处理方式简单,所以性能损耗非常少,对于CPU、内存资源的占用远小于TCP,但是对于网络传输过…

[综述笔记]A Survey on Deep Learning for Neuroimaging-Based Brain Disorder Analysis

论文网址:Frontiers | A Survey on Deep Learning for Neuroimaging-Based Brain Disorder Analysis (frontiersin.org) 英文是纯手打的!论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误,若有发现欢迎评论…

visual studio卸载几种方法

1、控制面板卸载; 2、有时候会发现控制面板卸载会失败,无法卸载,这时候要先把下面目录的关于visual studio的都删除,然后重启电脑后,重新安装vs即可。

java Flink(四十三)Flink Interval Join源码解析以及简单实例

背景 之前我们在一片文章里简单介绍过Flink的多流合并算子 java Flink(三十六)Flink多流合并算子UNION、CONNECT、CoGroup、Join 今天我们通过Flink 1.14的源码对Flink的Interval Join进行深入的理解。 Interval Join不是两个窗口做关联,…

全流程ArcGIS Pro技术应用

GIS是利用电子计算机及其外部设备,采集、存储、分析和描述整个或部分地球表面与空间信息系统。简单地讲,它是在一定的地域内,将地理空间信息和 一些与该地域地理信息相关的属性信息结合起来,达到对地理和属性信息的综合管理。GIS的…

HQYJ 2024-3-19 作业

TCP通信三次握手和四次挥手: 并行和并发的区别:并发是单核处理器处理多个线程任务,并行是多核处理器同时处理多个线程任务。并发过程中会抢占CPU资源,轮流使用;并行过程不会抢占CPU资源。 阻塞IO和非阻塞IO&#xff…

【系统架构师】-计算机网络

1、网络的划分 网络性能指标:速率、带宽(频带宽度或传送线路速率)、吞吐量、时延、往返时间、利用率。 网络非性能指标:费用、质量、标准化、可靠性、可扩展性、可升级性、易管理性和可维护性。 总线型(利用率低、干扰大、价格低)、 星型(交换机转发形…

Python PyQt5

实现界面开发,与tkinter功能一致,网上已有详细资料,此处仅记录自己的代码: 文章目录 1. 实操1.1 main.py1.2. 窗体模块代码1.3. 页面效果 2. 参考资料2.1. PyQt5 参考资料2.2. tkinter 参考资料 3. 安装注意事项3.1. 下载3.2 Pyc…

解决jenkins运行磁盘满的问题

参考:https://blog.csdn.net/ouyang_peng/article/details/79225993 分配磁盘空间相关操作: https://cloud.tencent.com/developer/article/2230624 登录jenkins相对应的服务或容器中查看磁盘情况: df -h在102挂载服务器上看到是这两个文件…

数据结构:详解【栈和队列】的实现

目录 1. 栈1.1 栈的概念及结构1.2 栈的实现1.3 栈的功能1.4 栈的功能的实现1.5 完整代码 2. 队列2.1 队列的概念及结构2.2 队列的实现2.3 队列的功能2.4 队列的功能的实现2.5 完整代码 1. 栈 1.1 栈的概念及结构 栈:一种特殊的线性表,其只允许在固定的…

leecode1793 | 好子数组的最大分数 | 求给高度矩阵最大值

题目我就不念了,就一个字难理解,给的题总是这么难懂,总感觉出题人的语文是体育老师教的? 还有就是思维转变,才能能好的理解?一味的钻牛角尖死理解,效果不好 思维的转变 >悟性?&am…

使用远程工具连接Mysql

(若想要远程连接Mysql需要下面解决四个问题) 1、目标地址 直接查询 2、端口号 3306 3、防火墙关闭 [rootlocalhost date]# systemctl stop firewalld.service 4、授权mysql数据库root用户权限(因为mysql开始不允许其他IP访问&#xff0…

Docker 学习笔记

Play With Docker一个免费使用的基于web界面的Docker环境 常用docker命令 可使用docker COMMAND --help查看命令的用法 Docker镜像相关 1、docker image pull:用于下载镜像,镜像从远程镜像仓库服务的仓库中下载,默认从Docker Hub的仓库中拉…

ssm基于Vue.js的在线购物系统的设计与实现论文

摘 要 随着科学技术的飞速发展,各行各业都在努力与现代先进技术接轨,通过科技手段提高自身的优势;对于在线购物系统当然也不能排除在外,随着网络技术的不断成熟,带动了在线购物系统,它彻底改变了过去传统的…

OKR与敏捷开发、精益创业等方法如何协同工作?

在快速变化的市场环境中,企业需要更加灵活和高效地应对各种挑战。目标与关键成果法(OKR)、敏捷开发以及精益创业等方法,作为现代企业管理的重要工具,各自在推动企业发展、提高团队效率、优化产品迭代等方面发挥着不可或…

社科赛斯考研:二十二载岁月铸辉煌,穿越周期的生命力之源

在考研培训行业的浩瀚海洋中,社科赛斯考研犹如一艘稳健的巨轮,历经二十二载风礼,依然破浪前行。在考研市场竞争白热化与学生对于考研机构要求越来越高的双重影响下,社科赛斯考研却以一种分蘖成长的姿态,扎根、壮大&…

基于springboot的mysql实现读写分离

前言: 首先思考一个问题:在高并发的场景中,关于数据库都有哪些优化的手段?常用的有以下的实现方法:读写分离、加缓存、主从架构集群、分库分表等,在互联网应用中,大部分都是读多写少的场景,设置两个库,主库和读库,主库的职能是负责写,从库主要是负责读…

2核4G服务器优惠价格和性能测试,2024年

阿里云2核4G服务器租用优惠价格,轻量2核4G服务器165元一年、u1服务器2核4G5M带宽199元一年、云服务器e实例30元3个月,活动链接 aliyunfuwuqi.com/go/aliyun 活动链接如下图: 阿里云2核4G服务器优惠价格 轻量应用服务器2核2G4M带宽、60GB高效…