拆解PowerApps - 请假申请 -1
从今天开始,我们一起来拆解Powerapps模板库里的一个"请假申请", 看看其构成模块、涉及到的函数、处理逻辑等,希望能从中学到点新东西。
同时,解析的内容中如有差错,也还请朋友们随时指出,感激不尽!!!
1. 首先登录到Powerapps里,利用模板创建出"Leave Request"这个App。
2. 看一下App的总体结构
等App创建完成后,从左边的树状视图里可以看到App的所有Screen构成。
最下面的三个是App的参数配置说明,本文就不加描述了。
剩下的就是App运行所需的各个主体Screen(如下面的截屏),接下来我们根据App的运行逻辑来逐个进行解析。
3. 第一个组件 -- App
这里的“App”是一个对象,用于为当前的App 提供数据(比如全局变量、集合数据)及总体性的控制。App 对象里有两个属性最常用:
- ConfirmExit -- 算是一种容错机制。设置了这个属性后,用户在选择退出App时会有对话框弹出来问用户确认是否要退出,以免数据未保存而丢失。
- OnStart -- App 启动后就会执行 OnStart里的设定。在OnStart属性里,App 创建者可以利用navigate来设定App运行后显示的第一个页面,利用Set 函数来设置全局变量,以及利用Collect来设置集合。
本文的App对象里就在OnStart属性里使用了 Set 和 Collect 函数,下面具体来看OnStart属性的代码设置:
OnStart = //设置启动时要执行的操作
Concurrent( //同时执行多个函数,语法:Concurrent( Formula1, Formula2 [, ...])
ClearCollect( //ClearCollect代码段的目的: 将假期类型添加到自定义的集合LeaveTypeCollection中。
//ClearCollect相当于Clear 和 Collect 两个命令的组合,也就是先把集合里的数据清除“Clear”,然后再添加”Collect”新的数据。
//语法 :ClearCollect(集合名,条目,...)
LeaveTypeCollection, //ClearCollect函数的第一个参数,集合名LeaveTypeCollection
{ type:"Vacation", icon:vacation, description:"说明什么是Vacation." },
{ type:"Sick Leave", icon:'sick-leave', description:"说明什么是Sick-leave "},
{ type:"Floating Holiday", icon: 'floating-holiday', description:"说明什么是Floating Holiday." },
{ type:"Jury Duty", icon: 'jury-duty', description:"说明什么是Jury Duty." },
{ type:"Bereavement", icon: bereavement, description:"说明什么是Bereavement." } //ClearCollect的第2、3、4、5、6个参数,也就是集合里的五个假期类型的数据(包括假期类型名,对应的图标和假期类型的说明)。同时,如要对假期类型进行自定义,也可以在这里增删或修改。
), //Concurrent的第一个函数 --- ClearCollect()
Set(_myProfile,Office365Users.MyProfile()); // 这里利用Set函数 将用户的Profile 赋予全局变量 "_myProfile"。
//Concurrent的第二个函数 --- Set(), 注意:这里是以 分号 结尾,表示这个Set 函数会和下面的两个Set 函数以及一个 IF 函数组合在一起,作为一个函数集合做Concurrent的第二个"函数"。
Set(_defaultApprover,Office365Users.Manager(_myProfile.Id)); //把用户的经理作为审批人赋值给变量 _defaultApprover
Set(_defaultApproverPhoto, If(Office365Users.UserPhotoMetadata(_defaultApprover.Id).HasPhoto, Office365Users.UserPhoto(_defaultApprover.Id))); //设置审批人的头像。 其中的If语句只设置了条件为真的操作,没有设置条件为假的操作。
If(
IsBlank( //通过 IsBlank() 函数的结果来作为If语句的判断条件, 下面的LookUp函数的输出就是IsBlank的参数。
LookUp(Balance, Year = Text(Year(Now())) && EmployeeEmail = _myProfile.UserPrincipalName)), //通过LookUp()函数,查询Balance表,看用户今年在表里有没有年假可用天数。
//如果没有,IsBlank就为假,反之If语句的值为真,就会继续执行下面的Patch命令来为用户添加今年的默认的假期天数已经相关的信息。
//另外,这里链接了一个数据源,名为Balance, 它是存储在OneDrive 里一个Excel文件里的表格。默认的,通过模板创建了这个App后,会在下面的路径下生成一个data.xlsx文件, 里面包含Leave,Holidays, Balance 三个表格。
Patch(Balance, Defaults(Balance), // 当上面的 If 语句返回为 真 时,通过 Patch 命令向Balance表的各个字段(如下面的截图)添加数据
{
EmployeeEmail: _myProfile.UserPrincipalName,
EmployeeName: _myProfile.DisplayName,
Year: Text(Year(Now())),
Vacation:10, //这里可以自定义各种假期默认的天数
VacationUsed:0,
Sick:8,
SickUsed:0,
Floating:8,
FloatingUsed:0,
JuryDuty:3,
JuryDutyUsed:0,
Bereavement:5,
BereavementUsed:0,
BalanceID:_myProfile.UserPrincipalName&Text(Now(), "[$-en-US]mm-dd-yyyy-hh-mm-ss-fff")
}
) // Patch 函数结束
), //IF语句结束, 同时,也结束了Concurrent 函数的第二个“函数” (上面提到过,其实这第二个是四条函数组合而成的一个函数组合)
ClearCollect(EmailTemplate, //和上面一样,这里又用到了ClearCollect函数,目的是:设置用来发送请假申请通知的电子邮件模板。
{Row: 1, Value:
"<html>
<head>
<meta http-equiv=""Content-Type"" content=""text/html; charset=us-ascii"">
</head>
<body>
<p> There is a leave request from: {SubmitterName} pending your approval. <ul><li>Type: {LeaveType}</li><li>Title: {LeaveTitle}</li><li>Description: {LeaveDescript}</li><li>Start Date: {LeaveStart}</li><li>End Date: {LeaveEnd}</li>" & " </p>
</body>
</html>"},
{Row: 2, Value:
"<html>
<head>
<meta http-equiv=""Content-Type"" content=""text/html; charset=us-ascii"">
</head>
<body>
<p> Your leave request from {LeaveStart} to {LeaveEnd} has been {LeaveStatus}" & "</p>
</body>
</html>"}) //Concurrent 的第三个函数 ClearCollect(),也是这个Concurrent的最后一个公式
); //结束整个ConCurrent函数。
//由此总体来看,这个Onstart属性是利用Concurrent 函数做了三件事:
//第一,利用ClearCollect 设置假期类型的说明。
//第二,利用几个Set 函数设置了全局变量,以及利用Patch 函数向Excel 文件里写入变量值
//第三,利用ClearCollect 设置了一个电子邮件模板, 当用户提交请假申请后,他的主管就会收到一封提示邮件,样式如下。
------------------------ 本节结束,下一节继续-- --------------------------
拆解PowerApps - 请假申请 -1相关推荐
- 拆解PowerApps - 请假申请 -11
续接上一节,今天我们要解析的这个页面是新建请假申请的最后一个页面ConfirmationScreen. 页面结构 这个页面初看感觉很简单,稍一拆析发现还是有点意思,这个页面里其实是包括了两个" ...
- OA系统十九:请假申请五:【请假申请】这个内嵌页面的前台文件;设置【点击左侧菜单栏的“请假申请”后】在首页的“功能区”显示【请假功能】这个内嵌页面;
本篇博客的主要内容是: 本篇博客有几点特别说明下: (1)前端的东西挺复杂的,感受到了[学会一个成熟的前端框架]的重要性.毕竟,框架可以提高前段文件的开发效率,简化开发步骤! (2)前端的Ajax请求 ...
- 实例演示使用RDIFramework.NET 框架的工作流组件进行业务流程的定义—请假申请流程-Web
实例演示使用RDIFramework.NET 框架的工作流组件 进行业务流程的定义-请假申请流程-Web 参考文章: RDIFramework.NET - 基于.NET的快速信息化系统开发框架 - 系 ...
- 实例演示使用RDIFramework.NET 框架的工作流组件进行业务流程的定义—请假申请流程-WinForm
实例演示使用RDIFramework.NET 框架的工作流组件 进行业务流程的定义-请假申请流程-WinForm 参考文章: RDIFramework.NET - 基于.NET的快速信息化系统开发框架 ...
- OA系统十七:请假申请三:【请假申请】这个内嵌界面中【提交请假表单数据】的Service层;(PS:在EmployeeDao中初次遇到@Param()参数设置)
本篇博客的主要内容是: 本篇博客的需要注意的点有: (1)根据业务需求,规划好整体的代码结构和编码逻辑: (2)一种目前认可的编程小细节:(PS:随着以后经验增多,可能会抛弃这种想法,或者有其他理解 ...
- OA系统十五:请假申请一:【请假申请】这个内嵌界面的数据库设计;(即请假申请这个线型工作流程的数据库设计!)
本篇博客的主要内容是:设计[请假申请]相关的数据表: 目录 一:[多级请假审批流程]的数据库设计:分析 1.请假工作流程图 2.工作流程表的设计分析 3.设计约束 二:具体表设计 1.leaveFor ...
- OA系统十八:请假申请四:【请假申请】这个内嵌界面中【提交请假表单数据】的Controller层;
本篇博客的主要内容是: 本篇博客需要注意的点: (1)一种策略,或称之为一种思想:一个Controller的url设置成通配符的形式,从而实现不同的请求调用不同方法: (2)加深感受下Session这 ...
- Oracle Workflow Demo 1 - 一个简单的请假申请工作流
分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 目标:通 ...
- Activiti6自学之路(九)——请假申请和请假审批数据库表设计
一.请假申请流程图回顾 前面我们设计了请流程审批的流程图,并且完成了流程图任务分配等功能, 上述的流程图具有四个任务节点 1.填写请假申请 2.经理审批 3.总监审批 4.人力资源审批 二.Activ ...
最新文章
- 每日一皮:自己运行正常,测试一测就有bug
- 通过这12张手绘图,搞懂什么是微服务架构
- DNS隧道工具使用 不过其网络传输速度限制较大
- Leetcode 283. 移动零 解题思路及C++实现
- 带你玩转关键字Synchronized
- lazada开店平台费用都有哪些,产品如何来做定价?
- echarts定时加载动画数据
- c++变量的作用域、生存期和可见性
- 简述LINQ的发展历程
- 使用数据库恢复专家,修复数据库
- mysql dbd 卸载_mysql首次使用过程以及彻底卸载过程
- 初接触RTMP流媒体实时消息传输协议
- ImportError: libcudart.so.9.2: cannot open shared object file: No such file or directory
- 记录10本关于开关电源的书
- 怎么换c语言程序窗口背景图,vc++如何给窗体添加背景图片
- JS实现图片验证码功能
- 计算机网络自顶向下方法(二)——应用层
- 【SQL SERVER】将查询结果转换为字符串
- eclipse设置pom.xml打开方式
- 【Eclipse使用技巧】格式化代码的方法 + 解决注释是繁体字的方法