问题描述
如何从 Blue Prism 检索未来计划的时间表/日历(如控制选项卡中所示)?
在 Blue Prism sql 数据库中,我已经能够找到一些与调度相关的表(例如 BPASchedule 和 BPAScheduleTrigger,等等),但似乎没有一个包含有关未来时间表/日历事件的信息。这些信息是否存储在任何地方?如果没有,我如何使用可用数据以编程方式重建时间表?
解决方法
Blue Prism 数据库仅存储每个计划的重复模式数据;它不存储时间表本身——而是即时计算时间表。
以下 SQL 查询返回我们自己以编程方式重建 Blue Prism 时间表所需的所有数据:
SELECT bpaschedule.name,period,unittype AS periodunit,startdate,enddate,startpoint,endpoint,COALESCE(workingweek,dayset) AS dayset
FROM bpascheduletrigger
LEFT JOIN bpaschedule ON ( bpascheduletrigger.scheduleid = bpaschedule.id )
LEFT JOIN bpacalendar ON bpacalendar.id = calendarid
WHERE retired = 0
AND bpaschedule.NAME IS NOT NULL
AND ( enddate > Getdate() OR enddate IS NULL )
AND ( ( unittype = 0 AND startdate > Getdate() ) OR unittype != 0 )
ORDER BY scheduleid
(此查询仅检索将来至少发生一次的活动计划)。
示例输出
姓名 | 期间 | 周期单位 | 开始日期 | 结束日期 | 起点 | 端点 | 白天 |
---|---|---|---|---|---|---|---|
进程A | 10 | 6 | 2019-03-08 23:00:00.000 | NULL | 30600 | 66000 | 4 |
进程B | 10 | 6 | 2019-04-11 07:15:00.000 | NULL | 25500 | 29700 | 62 |
进程C | 1 | 2 | 2020-07-22 15:59:00.000 | NULL | 0 | 86399 | 62 |
流程 D | 1 | 3 | 2020-05-08 16:50:00.000 | 2021-06-06 14:20:00.000 | 0 | 86399 | 32 |
流程 E | 1 | 3 | 2020-04-06 08:00:00.000 | NULL | 0 | 86399 | 2 |
流程 F | 1 | 3 | 2020-04-07 06:45:00.000 | NULL | 0 | 86399 | 4 |
许多列的含义相当不透明,所以让我们剖析它们...
期间
期间列表示相关期间单位中的期间时间。
Period unit 取七个值之一,如下所示:
0 = Once
1 = Hour
2 = Day
3 = Week
4 = Month
5 = Year
6 = Minute
period 为 17,periodunit 为 6,因此意味着“每 17 分钟安排一次”。
开始和结束日期
对于所有计划,这些值表示计划有效的日期时间范围。
然后,根据其他参数,从 startdate 开始的时间可能表示计划运行的时间。 startdate 在 period = 1 时(或者,当 startpoint 和 endpoint 分别为 0 和 83999 时)像这样使用.
当计划设置为永不过期时,计划的enddate 为 NULL
。
起点和终点
当时间表设置为 Hourly / Minutely
时,必须指定日内开始和结束时间(在 Blue Prism 控制室中)。 Startpoint 和 endpoint 代表这些时间,以秒为单位,从 00:00 开始。
进程 B 的起点为 25500 秒。这相当于 7 小时 4 分 59 秒 - 换句话说,该过程首先在 07:04:59AM 开始。
白天
Dayset 表示 bitset 的整数值,其中每个位对应于一周中的一天:
None = 0
Sun = 1
Mon = 2
Tue = 4
Wed = 8
Thu = 16
Fri = 32
Sat = 64
因此,62 天集(如表中所示)对应于周一至周五(Mon | Tue | Wed | Thu | Fri
的按位 OR 的整数值);仅在周一和周四运行的日程安排的日期是 18 (2+16)。
将所有这些放在一起,自然语言中的第 1 行相当于:
进程 A 在星期二的 08:30:00 和 18:20:00 之间每 10 分钟运行一次(无结束日期)。
...最后一行相当于:
流程 E 每周周五早上 8 点无限期运行。
现在由您将此处讨论的逻辑转换为代码,将来自 SQL 查询的 Blue Prism 计划条目转换为可通过编程方式查询的重复(日历)事件。考虑使用执行重复计算的库;这样的库应该可以轻松回答以下问题:
这个时间表下次运行是什么时候?
日期 1 和日期 2 之间运行哪些时间表?