主题
3.7.1 取数公式
取数公式概述
取数公式是为了正确的将数据库中的数据提取到当前的表单中,要顺利的完成取数操作,整个实现过程可分为四步,分别是选择数据源,设置筛选条件,明确数据填充及确定执行时机。
一、选择数据源
确定数据的取数来源,数据源可以是系统中的任何一个或者多个数据表的所有数据。
二、设置筛选条件
选择数据源后获得的数据我们称之为“脏数据”,设置筛选条件是为了对选取的源数据进行清洗,得到我们需要的“干净数据”。
三、明确数据填充
筛选完的干净数据属于“待用数据”,因为一条数据中会有多个字段,我们需要将数据中每个字段与当前表进行对应,完成数据的填充。
四、确定执行时机
前面三步确定了取数的完整逻辑,最后一步是为了在合适的时间点取出数据。我们可以设置新增表单的时候取数,也可以设置保存表单的时候取数等等。
取数公式的设置,其实就是将SQL语法进行了封装,它等同于数据库的功能。在使用Workfine时,即使我们不懂数据库,只要掌握了这套逻辑,也能够完成很多数字化的处理工作。下面,我们用一个简单的例子给大家介绍一下取数公式的基本操作。
在采购管理中,我们需要先下采购订单,然后再进行采购入库,为了保证入库时能够对应到相应的采购订单,需要在入库单上选取相应的订单编号,然后进行订单数据的提取。此时就需要利用取数公式提取采购订单数据。如下是取数公式的基本介绍,也是案例的实现过程,请仔细观看。 图:取数公式的基本介绍
取数公式:
通过上述介绍我们了解到了取数公式的基本操作。在取数公式操作的4个步骤中,每一步都会有一些重要的知识点。在本章后面的学习中,我们将对每一步进行拆分讲解,同时通过一些案例引证,让大家快速的掌握取数公式的应用。
一、选择数据源
选取数据源是我们使用取数公式的第一步操作。在前面的讲解中,为了便于理解,主要都是选取单个数据表作为数据来源。数据来源的知识点,主要是当数据来源是多个数据表时,我们如何理解其中的关联关系。 由于数据表关联的内容与我们后面要讲解的常规视图内容有所重叠,并且,该知识点对初始用户又有一定的难度。所以,我们将数据表关联的知识放在后面的视图章节中来讲,小伙伴们在有过一段学习经历后,理解起来会更加的容易。届时,我们再来学习数据表关联的核心内容。本节,我们只需要对数据表关联有一定的理解即可。 还是先用一个例子,让我们更好的理解数据表关联。在采购管理中,采购部门在向供应商下采购订单后,供应商就会根据订单内容进行送货,因为下单与送货的时间不同,现在采购部门想了解有哪些订单还没有完成送货?
图:如何根据订单和入库的信息得到待入库产品信息
要实现上面的要求,我们要先理解业务关系。业务从采购订单流转到入库,采购订单上有所有的采购信息,入库单上有所有的入库信息。在进行入库操作时,我们需要清楚每一笔入库是跟哪一笔订购单对应。只有让采购订单与采购入库形成关联,我们才能够获得订单未入库的信息。
下图:是订单与入库关联得到未入库的信息
采购订单
序号 | 订单编号 | 供应商名称 | 订单日期 | 合计 |
---|---|---|---|---|
1 | DD001 | 无锡本牛 | 2022/8/1 | 2000 |
2 | DD002 | 无锡宏泰 | 2022/8/2 | 1000 |
3 | DD003 | 常州常青 | 2022/8/3 | 1200 |
订单入库
序号 | 入库单号 | 订单编号 | 供应商名称 | 仓库名称 | 入库日期 |
---|---|---|---|---|---|
1 | RK001 | DD001 | 无锡本牛 | 仓库A | 2022/9/1 |
2 | RK002 | DD002 | 无锡宏泰 | 仓库A | 2022/9/9 |
采购订单 左关联 订单入库
序号 | 订单编号 | 供应商名称 | 订单日期 | 合计 | 入库单号 |
---|---|---|---|---|---|
1 | DD001 | 无锡本牛 | 2022/8/1 | 2000 | RK001 |
2 | DD002 | 无锡宏泰 | 2022/8/2 | 1000 | RK002 |
3 | DD003 | 常州常青 | 2022/8/3 | 1200 | null |
在这里,我们需要掌握一个数据库知识点。当两表关联时,如果入库单中有对应订单号,则两边订单号相等表示实现关联。如果入库单中没有对应订单号,那么该如何表示没有关联上呢?在数据库中,未实现关联,使用null来表示,比如:字段A=null 或者 字段A is null。null值不是我们理解的空值,我们可以理解为特殊的值,为什么特殊呢,因为null值只会在数据表关联中产生,同时它不参与任何运算。因此当字段有null值时,有些运算是无效的,要让他们正常参与运算,我们还需要将null值进行一些转化。 这里也给我们在遇到问题时,提供了一个排查原因的思路。当我们有数据表关联时,如果数据参与运算没有得到我们预期的结果,而数据本身又没有发现问题,那可能是因为数据表关联产生了null值,而影响了我们的运算导致的。 下面是采购订单到入库后,如何查询待入库的订单的案例演示。对于数据表关联的知识点,我们会在后面的视图章节中重点介绍。
图:数据源
数据源:
二、筛选条件
筛选条件是在上一步选择数据源后,如何对数据进行清洗的操作。我们可以将数据源选取过来的数据视为"脏"数据,进行筛选后的数据为"干净"数据。比如上一小结中,我们的数据源是所有采购订单和采购入库单的信息,但是我们只需要未入库的那部分信息,因此,我们就需要对数据进行一定程度的筛选。 数据筛选,是在一个数据筛选框中完成的。筛选框总共分为六部分构成,它完成了数据筛选的所有功能。因为很多小白用户是初次接触,我们现将筛选框的具体组成给大家做个详细介绍。
图:取数公式筛选框
1、来源数据表
选择数据源后,所有的数据表和字段将在1区域中展示,它代表的就是所有的源数据。
2、本表
本表指用户操作的表单数据,很多时候是需要将来源表数据与本表数据进行比对,来进行数据筛选。
3、逻辑运算符
逻辑运算符是我们筛选数据,进行逻辑编辑时所需要的连接符或者判断符。比如来源表单号=本表单号,等于号就是其中的判断符;来源单号=本表单号 并且 来源明细号=本表明细号,等于号是其中的判断符,并且是其中的连接符。 整个筛选条件的编写,其实是通过逻辑运算符将字段连接起来,形成完整的逻辑关系。逻辑运算符所表达的含义,以及如何编写表达式来体现我们想要表达的逻辑是至关重要的,这在一定程度上是对我们逻辑能力的锻炼。
逻辑运算符 | 含义 | Workfine设计端表达式 |
---|---|---|
+ | 加号,数值相加直接得合计值(1+1结果为2),文本相加变成组合形式('a' +'b'结果为'ab' ) | 表.字段1+表.字段2 |
- | 减号,数值相减得到减值结果,(2- 1结果为1) | 表.字段1-表.字段2 |
* | 乘号,数值相乘得到乘积结果,(2*3结果为6) | 表.字段1*表.字段2 |
/ | 除号,数值相除得到商结果,(6/2结果为3) | 表.字段1/表.字段2 |
<= | 小于等于,2<=3 | 表.字段1<=表.字段2 |
< | 小于,1<2 | 表.字段1<表.字段2 |
> | 大于,2>1 | 表.字段1>表.字段2 |
>= | 大于等于,3>=2 | 表.字段1>=表.字段2 |
= | 等于,2=2 | 表.字段1=表.字段2 |
<> | 不等于,2<>3 | 表.字段1<>表.字段2 |
' ' | 单引号,如果是文本固定值,需用单引号引起来, 来源表.字段='无锡本牛科技' | 表.字段1='文本值' |
() | 双括号,可以指定相应逻辑判断的优先级 (字段1=字段2 或者 字段2=' ') 并且(字段3=字段4 或者 字段4=' ') | (表.字段1=表.字段2或者 表.字段2='本牛') 或者 表.字段2='本牛科技' |
并且 | 并且 左右两边的表达式要同时成立 1=1并且2=2 成立, 1=1并且2=3 不成立 | 表a.字段1=表b.字段2 并且 表a.字段3=表b.字段4 |
或者 | 或者 左右两边的表达式成立任何一个即可 1=1或者2=2 成立, 1=2或者2=3不成立 | 表a.字段1=表b.字段2 或者 表a. 字段3=表b.字段4 |
形如 | 形如 模糊匹配字段内容 '无锡本牛科技' 形如 '本牛科技' 'workfine' 形如 ' work' | 表.字段1 形如 '%无锡本牛科技%' |
属于 | 数据字段内容在某个集合中 'a' 属于 {a,b,c,d,e}, 'b' 属于 {a,b,c,d,e} | 表.字段1 属于此集合('本牛科技','本牛','workfine') |
不属于 | 数据字段内容不在某个集合中 'a' 不属于 {a,b,c,d,e}, 'b' 不属于 {a,b,c,d,e} | 表.字段1 不属于此集合( '本牛科技', '本牛','workfine') |
表:各逻辑运算符的含义
学习逻辑表达式中基本的书写规范,让我们熟悉如何通过符号来表达基本的逻辑关系。就像我们读书时学习的1+1=2是一个数学公式,我们要通过逻辑表达式来反映我们所需要的数据。比如,表达式:来源表.字段A=本表.字段A,表示要从来源数据中取出与当前表单字段A值相同的数据;表达式:来源表.字段A=' ',表示要从源数据中取出字段A值为空的所有数据;表达式:来源表.字段A=本表.字段A 并且 来源表.字段B=本表.字段B 表示要从来源数据中取出与当前表单字段A值和字段B值都相同的数据……我们就是通过书写表达式的方式,来表达我们需要的逻辑。 我们先来看下逻辑表达式中的逻辑运算符,它分为算术运算符、关系运算符、空值标识、关系连接符、优先判断符。 图:表达式中的逻辑运算符
算术运算符:
包括加减乘除( + - * / ),用法与我们数学课本中使用的方式类似,只是从一个具体数字变成了一个字段,1+1 换成了 表.字段1+表.字段2 ,如果是除法,同样要考虑分母为0的情况。
关系运算符:
等于,不等于,大于等于,小于等于,也是与我们平常的使用方法一样,如果要表达两个字段相等就用 表.字段1=表.字段2 来表示;要表达某个字段为固定值,就用 表.字段1='某值' 表示。我们将一个关系运算符连接的表达式,叫做一个关系,一个关系就是一个最小的逻辑表达式。
空值标识:
Workfine中要表示某个字段为空值的表达式为: 表.字段=' ' ,空值的表达是两个单引号,这时的字段类型是文本型或日期型,如果是数值字段,则表示为 表.字段=0 。这里要提出的是空值和null值的区别,我们在数据源中提到,null值是一个特殊的值,他与空值不同,只产生在数据表的左右关联中,表达方式是 表.字段=null 或者 表.字段 is null
关系连接符:
上面我们说过,一个关系运算符连接的表达式,就叫做一个关系,关系与关系之间是通过关系连接符进行连接的,比如 来源表.字段1=本表.字段1 并且 来源表.字段2=本表.字段2,是要求来源表的字段1和字段2要与本表的字段1和字段2同时相等;来源表.字段1=本表.字段1 或者 来源表.字段2=本表.字段2,是要求来源表的字段1和字段2要与本表的字段1和字段2只要满足其中一个相等即可。并且和或者就是我们的关系连接符,不同关系表达式之间的连接方式,要么是并且,要么是或者,不会存在第三种连接方式。
关系1 并且 关系2 表示关系1 和关系2的条件要同时满足。
关系1 或者 关系2 表示关系1和关系2的条件只需要满足其中一个即可。
优先判断符:
我们先来看下我们小学时的一个运算公式: 2x3+4=10和2x(3+4)=14。我们发现,当在第二个公式中添加了括号后,所得到的运算结果就不一样了,原因是括号将运算的顺序调整了。同样的,当我们写出表达式
来源表.字段1=本表.字段1 或者 本表.字段1=' ' 并且 来源表.字段2=本表.字段2
和
来源表.字段1=本表.字段1 或者 (本表.字段1=' ' 并且 来源表.字段2=本表.字段2)
这两个表达式所表示的逻辑含义也不一样,使用括号会先将括号中的几个关系当做一个大的"关系"先判断,然后再与其它的关系一同判断。
4、系统字段
系统字段与我们在数据规范中学习的系统变量有类似之处,都是系统提供给我们的一些信息,我们需要了解每个字段的含义以及常见的应用场景,这样才能在我们需要的时候进行灵活的调用。
序号 | 系统字段 | 含义 |
---|---|---|
1 | @RID | |
2 | @填报人ID | 填报人ID |
3 | @填报人部门ID | 填报人部门ID |
4 | @填报日期 | 填报日期 |
5 | @最后修改人ID | 最后修改人ID |
6 | @最后修改时间 | 最后修改时间 |
7 | @流程标识 | |
8 | @锁定标识 | |
9 | @表单状态 | |
10 | @错误标识 | |
11 | @流程描述 | 流程描述 |
表:系统字段的列表和含义
5、高级表达式(函数)
在Workfine设计器中提供了丰富的函数功能,能够帮助我们在进行逻辑判断或者聚合运算时,更加便捷的得到我们想要的结果。高级表达式是表达式功能的一部分,它提供了各种功能方便我们完成各种逻辑表达。 高级表达式总共分为统计函数,字符串函数,数学函数,类型转换函数,日期函数,系统变量,系统常量七大部分,每部分对应一些函数。其中统计函数也叫聚合函数,包括合计、计数、最大值、最小值等,统计函数不能直接应用在筛选条件中,它主要应用在我们下一节讲解的填充中;字符串函数应用的比较多的是取拼音码函数,他在我们的数据规范、列表设置中使用的非常频繁,希望大家一定要掌握;日期函数是我们使用非常频繁的部分,我们需要熟练掌握日期函数中每个函数的应用方法和应用场景,下面,是我们常用函数的列表和使用方法。
常用函数列表和说明:
类别 | 常用函数名 | 含义 |
统计函数 | 合计([数字型字段名]) | 函数返回数值型字段的合计值 |
平均([数字型字段名]) | 函数返回数值型字段的平均值 | |
计数([字段名]) | 函数返回字段的个数 | |
计数排除重复([字段名]) | 函数返回字段不重复的个数 | |
最大值([字段名]) | 函数返回字段的最大值 | |
最小值([字段名]) | 函数返回字段的最小值 | |
字符串函数 | 取子串([字符串],[起始位置],[截取长度]) | 取一个字符串的子串,从起始位置开始 |
字符串长度([字符串]) | 获取一个字符串的长度 | |
转大写([字符串]) | 将字符串转化为大写形式 | |
转小写([字符串]) | 将字符串转化为小写形式 | |
去左边空格([字符串]) | 去除字符串左边的所有空格 | |
去右边空格([字符串]) | 去除字符串右边的所有空格 | |
取文本左边([字符串],[长度]) | 返回字符串中最左侧指定数目的字符 | |
取文本右边([字符串],[长度]) | 返回字符串中最右侧指定数目的字符 | |
查找字符([条件],[字符串],[起始位置(可忽略参数)]) | 返回字符串中指定字符的开始位置 | |
替换字符串([字符串],[被替换字符串],[替换为字符串]) | 替换字符串中被替换的内容 | |
重复字符串([字符串],[重复次数]) | 返回字符串重复指定次数的结果 | |
拼音码([字符串]) | 获取指定字符串拼音码 | |
数学函数 | 略 | |
类型转换函数 | 数值转字符([数值] AS VARCHAR) | 将数值类型转换成字符类型 |
日期转字符(VARCHAR,[日期],[格式]) | 将日期类型转换成字符类型 | |
字符转日期型(datetime,[字符串],[格式]) | 将字符类型转换成日期类型 | |
空值转替换值([字符串],[替换字符串]) | 将字段中为NULL的记录替换为指定任何类型的值 | |
日期时间函数 | 年份([日期]) | 函数返回指定日期的年份值。 |
月份([日期]) | 函数返回指定日期的月份值。 | |
日期([日期]) | 函数返回指定日期的日值。 | |
(季度值([日期])-1)/3+1 | 函数返回指定日期的季度值。 | |
星期值(weekday,[日期]) | 函数返回指定日期的星期值。 | |
日期加减(unit,1,[日期]) | 函数返回一个日期加上一段时间偏移量的结果。 | |
日期间隔(unit,[开始日期],[结束日期]) | 函数返回两个日期的差值,以给定的unit作为基本时间计算单位。 | |
月天数([日期]) | 函数返回日期中月份的总天数 | |
星期一([日期]) | 函数返回日期所在星期的星期一 | |
年月日([日期]) | 函数返回日期的年月日字符串 如:20120501 | |
年月([日期]) | 函数返回日期的年和月组合字符串 例如:201205 | |
月初([日期]) | 函数返回本月第一天 | |
月末([日期]) | 函数返回本月最后一天 | |
年初([日期]) | 函数返回本年第一天 | |
年末([日期]) | 函数返回本年最后一天 | |
季初([日期]) | 函数返回日期所在季度起始日期 | |
季末([日期]) | 函数返回日期所在季度结束日期 | |
系统变量 | 系统变量.当前用户ID | 当前用户ID |
系统变量.当前用户姓名 | 当前用户姓名 | |
系统变量.当前用户登录名 | 当前用户登录名 | |
系统变量.当前用户角色 | 当前用户角色 | |
系统变量.当前用户所在部门 | 当前用户所在部门 | |
系统变量.当前用户部门编号 | 当前用户部门编号 | |
系统变量.当前用户部门全称 | 当前用户部门全称 | |
系统变量.当前用户兼职部门 | 当前用户兼职部门 | |
系统变量.当前用户所在单位 | 当前用户所在单位 | |
系统变量.当前用户单位编号 | 当前用户单位编号 | |
系统变量.当前日期 | 当前日期 | |
系统变量.当前日期时间 | 当前日期时间 | |
系统变量.当前用户登陆IP | 当前用户登陆IP | |
系统常量 | 系统常量.锁定标识_未锁定 | 表单未锁定状态常量 |
系统常量.锁定标识_已锁定 | 表单已锁定状态常量 | |
系统常量.表单状态_未审核 | 表单未审核状态常量 | |
系统常量.表单状态_已审核 | 表单已审核状态常量 | |
系统常量.表单状态_已作废 | 表单已作废状态常量 |
表:常用函数列表和说明
日期时间函数:
日期时间函数 | |
---|---|
注意:函数返回的字段类型,要与被填充的字段类型保持一致 | |
年份([日期]) | 数值型 |
月份([日期]) | 数值型 |
日期([日期]) | 数值型 |
(季度值([日期])-1)/3+1 | 数值型 |
星期一([日期]) | 数值型 |
月天数([日期]) | 数值型 |
日期加减(unit,1,[日期]) | |
日期间隔(unit,[开始日期],[结束日期]) | |
年月日([日期]) | 文本型 |
年月([日期]) | 文本型 |
月初([日期]) | 日期型 |
月末([日期]) | 日期型 |
年初([日期]) | 日期型 |
年末([日期]) | 日期型 |
季初([日期]) | 日期型 |
季末([日期]) | 日期型 |
表:日期时间函数
日期时间函数:
日期加减函数:
日期加减函数 | |
---|---|
功能: | 返回日期加上时间偏移量的结果 |
结构: | 日期加减(unit,n,[日期]) |
unit部分 | yy或者yyyy 年(不能是一个y)、m或者mm 月 、d或者dd 日、q 季、ww 星期、hh 时、n 分、s 秒 |
例如: | 日期加减(yyyy,1,2020-04-01)得到的日期是:2021-04-01 只对年份加1处理 日期加减(mm,-1,2020-04-01) 得到的日期是:2020-03-01 只对月份减1处理 日期加减(dd,1,2020-04-01) 得到的日期是:2020-04-02 只对天数加1处理 |
表:日期加减函数
日期加减函数:
日期转字符函数:
在Workfine中,使用日期转字符函数,可以将日期字段可以转成文本字段。
函数: 日期转字符(VARCHAR,日期,格式)
【VARCHAR】:替换为需要进行转换的日期字段
【格式】:替换为日期显示格式对应的Style ID ,具体数值参见下表。
如:日期转字符(表1.字段,日期,101)
Style ID | Style 格式 |
---|---|
100或者0 | mon dd yyyy hh: miAM (或者PM) |
101 | mm/dd/yy |
102 | уу. mm. dd |
103 | dd/mm/yy |
104 | dd. mm. yy |
105 | dd-mm-yy |
106 | dd mon yy |
107 | Mon dd, yy |
108 | hh: mm: ss |
109或者9 | mon dd yyyy hh: mi: ss: mmmAM (或者PM) |
110 | mm-dd-yy |
111 | yy/mm/dd |
112 | уymmdd |
113或者13 | dd mon yyyy hh: mm: ss: mmm(24h) |
114 | hh: mi: ss: mmm(24h) |
120或者20 | уyyy-mm-dd hh: mi: ss(24h) |
121或者21 | yyyy-mm-dd hh: mi: ss. mmm(24h) |
126 | уyyy-mm-ddThh: mm: ss. mmm (没有空格) |
130 | dd mon yyyy hh: mi: ss: mmmAM |
131 | dd/mm/yy hh: mi: ss: mmmAM |
6、逻辑编辑框
逻辑编辑框是实现我们逻辑编写的区域,通过1、2、3、4、5提供的内容供我们在逻辑框中编写各种逻辑表达式,我们需要应对不同的数字化问题编写不同的逻辑表达式,但在这个过程中是有一定的规则可依的。下面,我们将会提供大家两种逻辑表达式的编辑范式,通过这个范式来完成绝大多数情况下的数据筛选。 图:逻辑表达范式
书写范式
我们在书写逻辑表达式的时候,是一个个关系通过关系连接符和优先判断符连接起来,实现我们想表达的逻辑。我们可以编写出 关系1 并且 关系2 或者 关系3 的逻辑表达式,也可以编写出 关系1 并且 (关系2 或者 关系3)的表达式。 每个关系中又是一个完整的判断公式 比如关系1的判断公式是 来源表.字段1=本表.字段1;关系2的判断公式是 来源表.字段1<>本表.字段1等等,这与我们学习的数学公式是类似的。 通过编写逻辑表达式,我们可以表述出很多逻辑关系,但在实际的应用场景中,可以将我们要表达的逻辑关系分为两个大类,一个是精确查询的逻辑表达范式,一个是模糊查询的逻辑表达范式
精确查询 | 正确写法 |
---|---|
单表字段 | 来源表.字段=本表.字段 并且 本表.字段!= ' ' |
多表字段 | (来源表.字段A=本表.字段A 并且 本表.字段A!= ' ') 并且 (来源表.字段B=本表.字段B 并且 本表.字段B!= ' ') |
模糊查询 | 正确写法 |
---|---|
单表字段 | 来源表.字段=本表.字段 或者 本表.字段=' ' |
多表字段 | (来源表.字段A=本表.字段A 或者 本表.字段A=' ') 并且 (来源表.字段B=本表.字段B 或者 本表.字段B=' ') |
精确查询范式
上面我们介绍了逻辑表达式的基本书写规范,需要我们就如何书写逻辑表达式有一个基本的概念,本节和下节我们将学习两个基本的筛选范式,以便让我们能够快速掌握表达式的应用。 第一个逻辑表达式范式叫做精确查询,他是在表单上输入条件后,要求输入的条件都满足,从而得到精确的结果,如果不输入条件将查询不出内容。比如我们在采购入库单上,要输入具体的采购订单号,才能将采购订单的内容查询到采购入库单上。精确查询的范式就是关系与关系之间用并且连接,并且要求本表的字段内容不为空。精确查询标准的书写范式是 (来源表.字段A=本表.字段A 并且 本表.字段A<>' ') 并且 (来源表.字段B=本表.字段B 并且 本表.字段B<>' ') …… 该书写范式中,所有的关系都是通过并且连接,括弧括起来的逻辑单元表示当前表的字段内容要与来源表的字段内容匹配,并且当前表的字段内容不为空,这样表述就会更加严谨。 我们先来看下精确查询的介绍视频,小伙伴在看视频的同时,也要跟着一起练习,这样才能对每一个操作细节有更加深刻的了解
精确查询 | 正确写法 |
---|---|
单表字段 | 来源表.字段=本表.字段 并且 本表.字段!= ' ' |
多表字段 | (来源表.字段A=本表.字段A 并且 本表.字段A!= ' ')并且(来源表.字段B=本表.字段B 并且 本表.字段B!= ' ') |
表:精确查询
精确查询:
模糊查询范式
模糊查询范式是指在查询的时候,查询的条件越多,满足条件的数据越少;查询的条件越少,满足条件的数据越多。比如在报表查询中,会设置一些查询字段,然后设置取数公式根据查询字段取出查询结果,当不输入查询条件时,就得到所有数据;当输入一个查询条件时,就得到与该查询条件匹配的数据;当输入多个查询条件时,就得到与多个查询条件匹配的数据。 图:根据查询条件提取查询结果
模糊查询的范式主要用于查询模板中进行数据查询,我们在查询模板中利用这样的范式基本上能够满足所有的查询要求,查询模板的编写范式为 (来源表.字段A=本表.字段A 或者 本表.字段A=' ') 并且 (来源表.字段B=本表.字段B 或者 本表.字段B=' ') …… 我们以一个括号中所表达的关系为例来解释表达式的意思: (来源表.字段A=本表.字段A 或者 本表.字段A=' ')表达式要求 来源表字段与本表字段相等,或者本表字段为空 这个时候,当在本表字段中输入内容时,就满足前面一段逻辑,得到了精确的结果,当本表字段中不输入任何内容时,就满足了后面一段的逻辑,得到了所有的结果,而两个关系又用或者连接,满足其一即可,所以就实现了输入内容查询出对应的结果,不输入内容就得到了所有结果的目的。
同样,下面,我们通过视频来给大家介绍模糊查询的应用,请大家一定要仔细观看并熟练掌握。
模糊查询 | 正确写法 |
---|---|
单表字段 | 来源表.字段=本表.字段 或者 本表.字段=' ' |
多表字段 | (来源表.字段A=本表.字段A 或者 本表.字段A=' ')并且(来源表.字段B=本表.字段B 或者 本表.字段B=' ') |
表:模糊查询
模糊查询:
两个编写范式中,精确查询相对好理解一些,也符合我们大多数人的思维模式,模糊查询使用比较广泛,因为任何一个系统都离不开查询报表的建立。 这里要提醒的是,表达范式是提供了大家遇到类似场景时的基本编写准则,不要完全照搬。而是根据需要灵活变动,但基本的结构是不会改变。比如有的时候等于号要换成不等于号,或者形如;日期字段需要用日期函数处理一下等等,后面我们会对范式中的一些典型应用再做个介绍,以便大家在实际应用中能够使用的更加顺利。
形如的判断
形如是一种模糊匹配的表达式,我们先看下,在下图的来源表和本表中,姓名字段不同内容对应的关系
来源表姓名 | 本表姓名 | 关系 |
---|---|---|
张三 | 张三 | 等于 |
张三 | 张三三 | 形如 |
张三 | 李四 | 不等于 |
表:数据的匹配关系
当来源表的内容是张三时,本表的内容也是张三,那他们的关系就是等于关系;当本表的内容是张三三时,他们的内容就是形如关系;当本表的内容是李四时,那么他们的内容就是不等于关系。在不同的场景中,我们做出的逻辑判断并不一定是等于关系,有些场景中,我们也会用到形如或者不等于的关系。 在形如的应用中,两个字段内容一个是长字段内容,另一个是短字段内容,形如的用法是:长字段内容 形如 短字段内容;我们还有另一个函数叫做charindex,用法是charindex(短字段内容,长字段内容)>0,也能表示形如的关系,如果要表达不匹配的关系,则可以用charindex(短字段内容,长字段内容)=0来表示。
下面,是模糊匹配使用的具体介绍:
形如判断: |
---|
长字段 形如 '%' + 短字段 + '%' |
charindex判断: |
charindex(短字段,长字段)> 0 匹配上 |
charindex(短字段,长字段)= 0 匹配不上 |
表:形如的判断
形如的判断:
日期判断
在我们逻辑表达式的书写中,如果是对日期型字段做判断,就要重点注意。原因是日期在数据库中的格式是年月日时分秒存储的,但在显示上有的是按年月日显示,有的是按年月显示等。所以我们看到的日期样式与实际存储的内容可能并不一致。 图:日期的存储和显示是分开的
因此,我们在进行日期字段的判断时,需要先进行字段转化,然后再进行判断。比如我们要写两个日期相等的判断。需要我们先弄清楚是要判断这两个日期的年月日相同,还是两个日期的年月日时分秒都相同。确定好比较的精细度后,我们才能进行日期的判断。这个时候我们就需要用到日期函数了,在日期函数中,不仅要设置两个日期参数,还需要设置日期是以年、月、日还是时、分、秒来做比较。 以下,是对日期函数中日期间隔函数的使用介绍,请小伙伴们仔细查看并理解。
日期间隔函数 | |
---|---|
结构: | 日期间隔 (datepart , [开始日期] , [结束日期] ) |
功能: | [结束日期] - [开始日期],根据datepart指令,得出两个日期的间隔值 |
Datepart: | yy年、qq季度、mm月、wk周、dd日、hh时、mi分、ss秒 |
例如: | 日期间隔 (yy,2022年8月1日,2022年9月1日)=0 日期间隔 (mm,2022年8月1日,2022年8月8日)=0 日期间隔 (dd,2022年8月1日,2022年8月1日)=0 |
应用范围: | 日期间隔相等判断: 日期间隔(datepart,来源表.日期字段,本表.日期字段)=0 日期间隔范围判断: 在查询表中提前设置日期范围:开始日期,结束日期 日期间隔(datepart,来源表.日期字段,本表.开始日期字段)<=0 日期间隔(datepart,来源表.日期字段,本表.结束日期字段)>=0 |
表:日期间隔函数
日期间隔函数:
小结
筛选条件属于表达式中比较重要的功能点,知识涵盖面也比较广泛,需要我们认真消化和吸收,从逻辑标识符,到逻辑编写范式,再到一些函数的使用都需要我们认真的研究和总结。学过这个章节之后,就相当于我们翻过了数字化开发平台使用的大山,在后面不停建设和应用的过程中,我们将更加清楚系统开发的本质。
三、字段填充
本节,我们来讲解取数公式的填充。相较于筛选条件,字段填充的内容理解起来会更加的轻松。我们只需要了解填充的几种应用场景,然后根据需要进行套用即可。 字段填充是指,当我们筛选出需要的数据后,源数据是一条条信息,每条信息包含多个字段,我们需要将每个字段的内容依次填入当前表的字段中。在填充时,还有可能再对源数据做一些加工处理,最终得到我们想要的数据。 图:筛选后进行数据填充
填充时需要注意,填充的源字段与当前的本表字段类型要一一对应,文本型不要填入数值型,数值型不要填入日期型等。填充时的业务场景主要分为3种,包括明细填充,聚合填充,条件填充。其中聚合填充和条件填充是我们需要重点掌握的,明细填充引入进来是能够让我们快速的对填充有个概念。 这里给大家介绍一个设计的小技巧,填充时,我们要善于利用批量填充的设置,能提高我们的开发效率。 图:批量填充设置位置
1、明细填充
以采购订单查询为例,我们在产生很多采购订单数据后,需要对采购订单的数据进行查询,这个时候,可以设计一个采购订单查询模板,通过取数公式,将采购订单的数据提取到采购订单查询表中。 这个时候,我们可以根据需求设置好查询模板的样式,在查询模板中,主表可以设置不同的筛选条件,子表是我们想查询出的数据展示,然后利用取数公式选取采购订单为数据来源,筛选条件可参照上一节的模糊查询范式进行编写,最后将数据提取到查询表中,这就是整个的取数过程。 下面我们通过视频介绍,来看下明细填充的实现过程。 图:明细填充
2、聚合填充
聚合填充是指,提取源数据时,需要对源数据进行聚合运算后再展示,比如对采购金额做合计,对采购订单做计数,对采购价格取最小值等,都是一种聚合运算。聚合填充的使用也很简单,只需要在填充时,对要聚合的字段使用一个聚合函数即可,比如要对采购金额做合计,只需要用:合计(采购金额) ,表示即可。 聚合填充时,需要注意两个知识点: 1、一个填充字段,只能使用一个聚合函数,比如在填充金额字段时,我们不能用合计(金额字段)+最大值(金额字段) 这样表示,如果确实需要多个聚合函数运算后得出结果,可以通过我们数据集成中的视图功能处理后,再进行填充。 2、聚合填充时,我们要正确选择非聚合的填充字段。比如,我们要对供应商的采购金额做合计,在填充时,我们除了要填充合计金额字段外,还要填充其它相关字段。如果我们还填充日期的年月和供应商字段,那么每行的数据是表示每个月,每个供应商的采购总额;如果我们填充了日期的年月,供应商名称还有产品名称,那么每行的数据是表示每个月,每个供应商,每件商品的采购总额。因此非聚合字段填充的不同,对应每行数据所表示的意义也不同。 下面,我们还是通过采购订单查询表,来学习一下聚合填充的视频教程 图:聚合填充
3、条件填充
条件填充是指,在填充时,我们可以根据不同的条件填充不同的值。比如我们在查询库存状态时,当产品数量大于30小于100时,我们想显示库存正常;当小于30时,我们想显示库存紧张;当数据大于100时,我们想显示库存积压,这个时候我们就需要根据不同的情况填充不同的内容。 学习条件填充,实际是学习case when 函数的使用,它与我们excel中if函数的使用类似,中文翻译过来就是当情况1发生时,我们填充状态1;当情况2发生时,我们填充状态2;当情况3发生时,我们填充状态3……(以此类推),否则,我们填充状态N;结束。 (case when 条件1 then 结果1 when 条件2 then 结果2 when条件3 then 结果3 ……else 结果N end )
条件填充的使用也需要注意两点:
1、case when 函数中,整个语法 case when 条件 then 结果 end ,是最小的语法单元,开头case when * then * 是必须要的,中间 when * then * 可根据条件判断需要进行添加,else then * 是否则的判断,可以根据需要选择添加或者不添加;最后一句end 是与开头的case when 呼应的,必须要添加;
2、当遇到聚合函数与条件填充组合使用时,需要将聚合函数写在外面,并且同一个字段只能填充一个聚合函数,比如在合计时要做条件填充,正确的写法是: 合计( case when 条件1 then 结果1 when 条件2 then 结果2 …… else 结果N End )
错误的写法 case when 条件1 then 合计(结果1 ) when 条件2 then 合计(结果2) ……else 合计(结果N) End
以下,是条件填充的视频介绍,请大家仔细学习并练习 图:条件填充
我们通过前面的学习基本上能够对取数公式的使用有了一定的掌握,从取数,筛选到填充,让我们对整个数据治理有了一定的理解,同时,也为我们数字化思维的转变夯实了基础。 在今后的学习中,我们只需要将所学习的知识牢固掌握,通过不同的应用场景能够融会贯通。很快,我们就能拥有建设数字化系统的能力。
四:执行时机
执行时机是指,我们在完成取数的逻辑后,要确定这个取数逻辑是在什么情况下执行。我们在应用端填写表单时,会有很多操作时机:从打开表单开始,在表单上填写数据,然后保存,后面又会有修改,删除等情况。这些都是对表单的操作,我们把对表单的各个操作过程分成了不同的节点,不同操作节点对应不同的公式执行时机。满足时机时,我们才会触发公式。执行时机就如同我们发射火箭时的口令,只有听到口令后,才会有发射的动作,同样的,只有公式满足执行时机后,才会触发执行。 我们根据操作表单的不同状态,将公式的执行时机分为7种时机。分别是新建时,修改时,查看时,保存时,自动,手动和应用于工作流。其中新建时执行是新增表单时执行,保存时执行是点击保存按钮时执行,自动执行是,表上的某个字段内容发生变化时执行;手动执行是指点击按钮执行。以下,是各个公式执行时机的具体说明
1、公式的执行时机和说明
执行时机 | 说明 |
---|---|
新建时执行 | 【新增表单】时执行公式 |
手动执行 | 不具体指明触发时机,需要用户手动点击【按钮】触发公式执行这个按钮是系统默认的查询按钮,也可以在【按钮/事件】中绑定新按钮 |
自动执行 | 在当前表中,当参与筛选条件的字段内容发生变化时,触发公式执行注意:通过Excel公式导致筛选条件的字段值发生变化时,不会触发公式执行 |
查看时执行 | 历史记录中,点击【查看按钮】时执行公式 |
修改时执行 | 历史记录中,点击【编辑按钮】时执行公式 |
保存时执行 | 在【保存表单】时执行公式 |
应用于流程 | 将公式指定在工作流的某一个节点上执行同时还需要勾选其他执行时机:如新建、自动执行等 |
需要注意的是,公式的执行时机是可以多选的。是因为同一个取数,可能在多个时机点都需要,我们需要根据不同的业务场景选择合适的时机。比如我们在出库单上一个库存查询的取数公式,因为库存会随着出入库的变化而变化,我们在编辑的时候要保证库存查询的及时性,要选择自动执行;在保存时,防止同时有其他同事操作,造成库存变化,还要选择保存时执行;在查看和修改时可能随着时间影响,库存发生了变化,还要选择修改和查看时执行。因此,在一个库存取数公式中,我们设置了4个查询时机。 但是公式执行的时机并不是越多越好,设置多了不仅会影响操作效率,同时可能会影响数据的交互逻辑。因为多个公式执行时,可能需要满足一定的执行顺序,设置错误的执行时机会造成执行顺序的紊乱,也有可能得出错误的结果。 以下,是关于执行时机的介绍视频,请各位小伙伴们认证观看
2、执行条件
我们刚刚讲解了执行时机,是在操作表单的某个节点时,执行公式。这一节,我们讲解执行条件,执行条件是指在执行时机下,只有满足了执行条件,公式才会执行。执行条件仅应用在自动执行的执行时机下,它与执行时机是两个完全不同的概念。 执行条件是什么意思呢? 我们在执行时机中讲过,在自动执行的时机下,当参与筛选条件的字段内容发生变化时,公式就会触发执行。这种情况下,当筛选条件有多个本表字段时,只要参与筛选条件的本表字段内容发生变化就会触发公式执行。这样,就会造成公式的频繁执行,不仅浪费效率,也会影响体验。某些情况下,我们可能需要参与筛选条件的几个字段都有值后,才触发公式。这个时候,我们就可以设置执行条件,要求参与筛选条件的某几个字段同时不为空时,再触发公式,这样触发时机就会更加的精准。
3、清除方式
很多初学的小伙伴在学习取数公式时,很难理解为什么要有清除方式这样的功能项,我们还是通过一个例子来理解一下:在采购订单查询表中,我们利用取数公式来查询订单信息。如果不进行先清除之前内容,当我们第一次通过筛选条件查询出订单信息后,再更换查询条件再次查询,我们会发现之前查询的订单信息还在;后查询的订单内容会显示在之前查询数据的下面,显然是不合理的。 图:清除方式为不清除时的情景说明
因此,清除方式的一个目的是为了在公式多次被触发后,对填充字段内容的清除处理。如果我们用取数公式提取扩展表数据,公式第一次按条件取出了结果;然后我们再修改查询条件,第二次提取数据,那么第一次的取数结果应该先清除掉,否则的话,就会与第二次的结果混淆在一起,得不到我们想要的结果了。 以下,是我们对清除方式的具体视频介绍,请各位小伙伴们仔细学习
表达式功能是Workfine设计最重要的功能点,而取数公式就是表达式功能最典型的代表。我们能将取数公式的知识点吸收、消化,基本上就掌握了系统设计的核心思想。表达式功能实质是SQL语法的一种应用,而所有的企业管理软件都是基于这种关系型数据库的应用。因此,我们掌握了表达式功能,就能够掌握企业管理软件的设计。