介绍
今天我们就一起来看一下,如何在西门子Mendix里面使用OQL进行数据的过滤吧。通过简单的例子,可以让我们更好的理解OQL如何使用。
要测试报告功能,您需要一些数据。此数据不可用,因此您需要创建它。您将为每个部门生成14个班次。为了创建这个模拟数据,让我们构建一个微流。
- 在Studio Pro中,右键单击UserManager并选择添加文件夹...。将其命名为MockData。
- 右键单击MockData文件夹并选择添加 微流...。将其命名为ACT_Shift_CreateMockData。
- 将检索操作添加到您的微流以检索所有部门。
由于您将在循环中创建多个班次,因此开始考虑性能非常重要。西门子Mendix 中的每个微流都在事务中运行,因此只有当微流成功完成时,数据才会最终存储在数据库中。但是,数据库查询仍在执行,并且会耗尽系统资源。如果您要在一个循环中提交您的更改,它会给您与数据库的连接带来很大的压力。最好批量提交。Mendix 中完成此操作的标准模式是创建一个列表,您将向其中添加新创建的对象。
- 为Shift添加一个创建列表活动。您将在循环结束时提交此列表。这将比在循环内提交更有效。
现在我们已经建立了基础,是时候介绍另一个微流元素:循环活动。这允许您一次处理一个元素列表。在循环内部,您将有一个可用的迭代器,它将包含列表中的当前元素。Loop活动中的所有活动都将在循环的每次迭代期间执行。
- 将Loop活动添加到您的微流并将其设置为迭代DepartmentList。将循环类型保留为For each。
- 在Loop中,添加一个Create variable 活动,将其命名为NumberOfShifts 。将值设置为 14。
- 将创建变量活动添加到循环并将创建变量活动连接到它。将数据类型设置为Date and time ,在表达式编辑器中将值设置为 [%BeginOfCurrentWeekUTC%]并将名称设置为 CurrentShiftStart。
是时候在循环活动中创建循环了。这次您将创建一个while循环而不是使用迭代器。While 循环将循环直到满足您指定的条件。
- 在第一个循环中添加第二个循环并将Loop 类型设置为While。添加标题 NumberOfShifts >0 并将表达式设置为 $NumberOfShifts >0。您的目标是让这个循环运行 14 次。您每次都会从 NumberOfShifts 变量中减去 1,然后当数字达到 0 时它将停止循环!将Create 变量连接到此循环。
while 循环目前并没有做很多事情,因此您也应该在其中添加一些活动。您需要创建班次,将它们添加到列表中并更改一些变量。
- 将Create 对象和Change 列表活动添加到 While 循环。Create object活动应该创建一个Shift并设置StartTime 、EndTime和UserManager.Department成员。确保EndTime比StartTime晚 8 小时。您可以使用表达式窗口中的addHours()函数来执行此操作。 您的更改列表活动应该将您的新班次添加到您的ShiftList。
- 添加更改变量活动。将 8 小时添加到CurrentShiftStart变量,这样当您创建下一个班次对象时,其 StartTime 将正确地晚于 8 小时。
- 通过添加另一个 Create Variable 活动来完成 While 循环。这是将减少 NumberOfShifts 的那个。
这个微流程的最后一步是添加一个Commit活动来提交ShiftList。确保您设置:
-将事件设置为是
-在客户端刷新为是。
最终的微流应该如下图所示。
- 将一个项目添加到您的导航菜单以触发此微流程。
- 允许管理员模块角色执行此微流程。
这对于测试来说几乎是完美的,但存在一个潜在的问题。如果将班次分配给员工怎么办?您是否仍然可以删除班次?这听起来是个坏主意,不是吗?所以也许你也应该为Shift_Employee关联添加一些删除行为。听起来您应该在该关联上配置防止删除。
- 打开域模型,单击Shift_Employee关联并将On delete of 'Shift' object的删除行为设置为Delete 'Shifs' object only if it is not associated with 'Employee' object(s) 并添加适当的错误消息。这将确保在删除计划期间时将被孤立的所有班次在您删除计划期间时被清除。完成后,单击确定。
启用分配班次
现在您已经为医院员工创建了轮班,他们需要能够分配它们。更新您的Shift_NewEdit页面以帮助他们!您将创建一个计算属性,该属性将结合您的Employee实体的各种名称属性来创建一个全名。这将更容易选择正确的员工。
-
打开UserManager 域模型并打开 Employee实体的属性。
-
添加一个名为FullName的新 字符串属性,并设置以下项目:****
-
Value: Calculated
-
Pass entity: Yes
-
Microflow: a new microflow called CAL_Employee_FullName
-
- 打开新的CAL_Employee_FullName微流并添加具有相同属性的Create Variable活动,如以下截图所示。
- 确保结束事件返回创建的FullName变量。
- 打开Shift_NewEdit页面并找到Employee.Title的 引用选择器。将其数据源设置为使用我们新创建的FullName属性。
添加 OQL
要在微流中使用 OQL,您必须从 Marketplace 安装 OQL 模块。这在 Mendix 中很容易——您可以在 Studio Pro 中完成。
- 单击 Studio Pro 窗口右上角的购物车图标。
- 使用 App Store 中的搜索功能搜索 OQL 。
- 单击 OQL并 在新窗口中 选择 下载。
- 确保将操作设置为 Add as a new module 并单击 Import。
- 对Community Commons包重复这些步骤 。OQL 模块依赖于该模块中的一些内容。
注意:有些版本的 MxModelReflection 具有引用不再存在的布局的页面。如果您看到与缺少布局相关的错误,请单击该错误并将问题页面的布局设置为Atlas_Default。
您可以 在Project > App Store modules 下 的Project Explorer中找到它。
汇总每个部门的班次数据
要显示所有未分配的班次,您将使用微流作为仪表板的数据源。OQL 模块不提供语法检查,因此要验证查询,您将使用可以连接到仪表板上的报告网格的 数据集来检查结果。完成查询后,添加图表将需要一个新实体。由于您只会使用此实体来显示数据,因此您可以将其设为非持久实体。现在您知道了它的计划,是时候为您的仪表板创建数据源了。****
- 打开您的域模型并添加一个名为UnassignedShift的新非持久实体,其属性DepartmentName为String类型,Number为Integer类型。
- 根据下面的屏幕截图为您的新实体设置实体访问权限。
- 右键单击UserManager并选择添加文件夹。将其命名为Reporting。
- 右键单击新文件夹并选择添加其他 → 数据集。 将其命名为Dataset_Shift_Unassigned。
- 使用下面的查询粘贴到您的新数据集中:
SELECT D.Name DepartmentName, COUNT(S/id) Number
FROM UserManager.Shift S
JOIN S/UserManager.Shift_Department/UserManager.Department D
LEFT OUTER JOIN S/UserManager.Shift_Employee/UserManager.Employee E
WHERE E/ID = NULL
GROUP BY D.Name
此查询选择部门名称和班次计数。它使用两个联接(一个在Department上,一个在Employee上)来创建结果集。
- 右键单击 文件夹Reporting并选择Add microflow... 。将其命名为DS_Employee_UnassignedShifts。
- 在工具箱中找到执行 OQL 语句并将其拖到您的流程中。
- 从数据集中复制查询并双击活动。单击语句右侧的编辑并将查询粘贴到窗口中。在语句周围添加单引号以使其成为字符串。将返回实体设置为您刚刚创建的非持久实体,并将Amount、Offset和Preserve 参数设置为下图中的值。也改一下标题。
- 双击微流的结束事件并对其进行编辑以匹配下图。
- 添加一个参数,以便您的微流可以与您要构建的页面交
在仪表板中显示未分配的班次
要显示数据集和微流将收集的所有数据,您需要一个新页面。此页面将包含一个带有每个部门数值的报告网格和一个直观地显示未分配班次数量的条形图。这样,Summerhill Hospital 的人员将能够快速查看图表中的概览,同时还能够在需要时进行更深入的挖掘。
- 右键单击 UserManager 并选择 添加页面...。确保选择 Atlas_TopBar 作为 导航布局 和 空白 页面模板。将其命名为 UnassignedShift_Dashboard。单击 确定。
- 选择布局网格中的列并单击鼠标右键,然后选择 Add column left 。
- 对于台式机、平板电脑和手机,将两列的宽度设置为 6。
- 在左列中添加 报告网格。 将 数据源设置 为 UserManager.Dataset_Shift_Unassigned 并单击 OK。
- 删除报表网格的第三列。
- 将另外两列重命名为 Department 和 Unassigned Shifts。您可以通过双击要重命名的列来执行此操作。
- 选择其中一列并切换到 屏幕右侧的“连接器”选项卡。 如果连接器不可见,请单击屏幕底部的连接器选项卡。将 DepartmentName 拖到 Department 列,将 Number 拖到 Unassigned Shifts 列。
- 完美,您已完成报表网格的设置!为这个新仪表板添加指向导航菜单的链接。不要忘记设置安全性,以便 管理员 和 KeyUser 模块角色可以查看此页面、执行微流程并访问非持久实体。
到这我们今天关于OQL的实战就结束了,可以庆祝一下,又学会了新的技能了。
低代码新手入门系列,快速导航
- 第14章 低代码新手入门系列,西门子Mendix OQL语法
- 第13章 低代码新手入门系列,西门子Mendix XPath提高应用安全性
- 第12章 低代码新手入门系列,西门子Mendix 设置模块的安全
- 第11章 低代码新手入门系列,西门子Mendix 安全管理
- 第10章 低代码新手入门系列,西门子Mendix XPath数据过滤
- 第9章 低代码新手入门系列,西门子Mendix 微流如何进行Debug?
- 第8章 低代码新手入门系列,西门子Mendix 创建我们的第一个微流
- 第7章 低代码新手入门系列,西门子Mendix 图形逻辑组件,微流
- 第6章 低代码新手入门系列,西门子Mendix UI页面组件
- 第5章 低代码新手入门系列,西门子Mendix页面编辑器
- 第4章 低代码新手入门系列,西门子Mendix领域模型和数据存储
- 第3章 低代码新手入门系列,西门子Mendix面向专业开发者的IDE
- 第2章 低代码新手入门系列,西门子Mendix团队如何进行协作?
- 第1章 低代码新手入门系列,西门子Mendix 平台简介