1.概述
1.1 应用场景
先说一下,为什么有默认时间这个设置。大家都知道,时间对于数据分析来说,是一个必不可少的条件,而时间条件又是非常多场景的,比如,财务数据一般看上月;业务数据一般看当月;电商或生产看板可能是实时看(当日);对于制造业来说,通常是晚上更新数据,今天可以看到截止昨天的数据(昨日)。并且,时间条件还经常影响指标的计算,比如总计、本月累计、本年累计、同比、环比等。
市面上绝大多数BI系统的实现方法是这样的:有一个预设的系统时间参数,然后根据这个参数来绑定配置每个图表的筛选条件。但是大家也都可以认识到,当报表中的图表对象比较多的时候,非常麻烦,并且,指标涉及到累计、同比环比时,就更加需要设置复杂的参数规则了。这样,一旦需要修改,很容易出现错漏。
为了从根本上解决这个问题,奥威BI在10多年前就已经提出了一个默认时间设置的解决方案,并成熟应用到今天,得到了许多用户的认可及好评。接下来,我们将通过一个示例来给大家展示一下,如何通过简单的默认时间设置,就可以实现任意时间条件的筛选配置。
示例内容大体如下图所示:
在动手做之前,我们先分析一下要展示内容中容易搞错的地方:
(1)、当月销售:这个很容易理解,也很容易搞错,我们都知道这个对用户来说,希望看到的是截止到当天的本月累计销售,比如当天是2020-6-19,要展现的就是2020-6-1到2020-6-19的销售汇总数据。——这个大家很容易理解,但是,容易搞错的是什么呢?比如当天是2020-6-19,但我们临时想看截止到2020-6-15号的本月累计是不是也可以正确展现呢?这个我们后面会在实操中将这个问题暴露出来。
(2)当月销售环比:这个很容易搞错,对于用户来说,如果当天是2020-6-19,他希望看到的是与截止到上月同一天(即2020-5-19)的当月累计进行对比,而不是与5月整个月进行对比。
(3)当年销售:这个与当月销售是一样的,同样很容易理解,也很容易搞错。对于用户来说,希望看到的是截止到当天的本年累计销售,比如当天是2020-6-19,要展现的就是2020-1-1到2020-6-19的销售汇总数据。——这个大家很容易理解,但是,容易搞错的是什么呢?比如当天是2020-6-19,但我们临时想看截止到2020-6-15号的本年累计是不是也可以正确展现呢?这个我们后面会在实操中将这个问题暴露出来。
(4)当年销售同比:这个和当月销售环比一样容易搞错,对于用户来说,如果当天是2020-6-19,他希望看到的是与截止到上年同一天(即2019-6-19)的本年累计进行对比,而不是与2019年整年进行对比。
(5)截止上月末库存:库存一般是看截止到某一个时间点的余额,在正常情况下,ERP会提供月末核算来计算截止到月末最后一天的期末余额,所以,我们只要正确显示上月最后一天的库存金额就可以了。但是,如果当天是2020-6-19,如何才能保证系统能正确显示出2020-5-31的库存金额呢?在奥威BI中,有一个基于内存计算的聚合方式:期末。具体怎么用,后面我们会在实操中说明。
(6)总结一下,其实,我们的系统就是要能很聪明的知道,当天是哪一天,并且根据当天的日期,结合各个图表的时间筛选要求,计算得到正确的结果并展示出来,并且,还允许用户在切换时间条件的情况下,仍然得到正确的结果。
接下来,我们来看到底如何配置。
1.2 流程图
2.操作流程
2.1 第一步:设计图表控件
首先,我们先在报表中增加相应的图表控件,并设计好数据集,分别如下图所示:
(1)当月销售走势
选择折线图:
配置数据集构建器:
(2)当日销售
选择仪表盘分类中的多值KPI图:
配置数据集构建器:
(3)当月销售
选择仪表盘分类中的多值KPI图:
配置数据集构建器:
(4)当年销售
选择仪表盘分类中的多值KPI图:
配置数据集构建器:
(5)截止上月库存
选择饼图:
配置数据集构建器:
2.2 第二步:配置默认时间设置
接下来,我们来配置每个图表控件的默认时间设置:
操作方式为,选择某个图表控件后,在右侧的属性面板,选择【图表】,配置相关的【时间设置】属性即可。
(1)当月销售走势
【时间月】【按月】即代表按当前月来筛选显示数据。
(2)当日销售
【时间天】【按今日】即代表按当天来筛选显示数据。
(3)当月销售
【时间月】【按月】即代表按当前月来筛选显示数据。
(4)当年销售
【时间年】【按年】即代表按当年来筛选显示数据。
(5)截止上月库存
【时间月】【按上月】即代表按上月来筛选显示数据。
2.3 第三步:验证数据
接下来,我们就来验证一下数据是否按照我们的期望正确显示出来了。那到底要如何验证呢?验证数据要从两个方面来验证:
(1)验证各个图表控件数据集的时间筛选条件是否正确
首先,从浏览状态下打开报表。这里一定要注意一下,到底什么才是浏览状态。很多朋友会认为,在设计报表时,右上角有一个浏览的按钮,就是进入到浏览状态,但事实上那只是一个预览状态,并不是真正的浏览状态,下面这几种进入方式才是真正的浏览状态:
从新建报表中进入后,在不选择数据源的情况下,打开某个报表是进入浏览状态:
从菜单浏览进入打开的报表,则一定是进入浏览状态,但前提是报表已经通过菜单发布功能发布出来了。
设计报表状态下预览报表也是可以快速切换到真正的浏览状态的,这里讲一个小小的技巧:将浏览器地址栏中的URL地址中,有一串【&fdesign=true】的文字,在【true】后面加一个1,即改为【&fdesign=true1】,然后再回车重新访问一下即可从设计状态改为浏览状态。
其次,在浏览状态下,就会看到右侧的公共筛选区域自动增加了时间筛选条件,同时,我们可以通过每个图表控件的工具栏中的【数据集】图标看到构建器中的筛选条件是否正常。
(2)验证各个图表控件最终展示的数据是否正确
在上述第1步的验证正确之后,还需要验证最终显示的数据是否正确。因为里面许多数据都是通过内存计算得到的,所以,我们还需要通过手工查询计算的方式去核验,但这样工作量稍微有些大,我们其实是有一个比较便捷的方式来进行核验的。
先将报表另存一份,作为数据验证用。
【温馨提示】这里一定要注意另存,不要直接在原报表上修改,以免出现不可预期的情况。
将图表控件更换为表格,这样更便于进行数据核对,具体操作方法如下图所示:
同时,我们还要修改时间筛选条件,以确保数据结果仍然是准确的。
(3)数据验证问题分析及解决方案
在核验过程中,我们发现了一个重大的错误,那就是当月与当年的数据,得到的结果并不是我们真正想要的本月累计及本年累计数据。为什么会出现这种情况呢?原来,问题出在当月与当年的图表控件,采取了不正确的聚合方式及默认时间设置。
我们先来回顾一下之前当月销售的配置情况:
我们构建当月销售的数据集时,第一个汇总列【销售收入】的聚合是使用的默认聚合方式【汇总】,而图表控件的默认时间设置为按月,在这种组合的情况下,我们系统的取数规则为:根据当前日期,计算所在月份,然后把当前月份销售收入进行汇总,这样计算的结果,不论当前日期是2008年6月12日,还是修改为2008年6月8日,得到的结果都是将2008年6月份整个的销售收入进行汇总,而且,上月的销售收入也是计算2008年5月份整个的销售收入汇总。所以,这样展示出来的结果肯定不是我们真正想要的。
那正确的方式应该是怎么配置呢?我们应该将第一个汇总列【销售收入】的聚合改为【本月累计】,而且图表控件的默认时间设置改为按今日。在这种组合的情况下,我们系统的取数规则为:根据当前日期(本例中为2008年6月12日),计算所在月份的月初即2008年6月1号到6月12号的销售收入汇总,上月的销售收入是计算2008年5月1号到5月12号的销售收入汇总;而当修改为2008年6月8日时,系统会计算所在月份即2008年6月1号到6月8号的销售收入汇总,并且,上月的销售收入也是计算2008年5月1号到5月8号的销售收入汇总,这样展示出来的结果才是我们真正想要的。
所以,按日-本月累计和按月-汇总得到的结果是不一样的,多数情况下,使用前一种方案来设置才是我们想要的结果。
而当年销售的问题与当月销售的问题是同样的原因。
我们构建当年销售的数据集时,第一个汇总列【销售收入】的聚合是使用的默认聚合方式【汇总】,而图表控件的默认时间设置为按年,在这种组合的情况下,我们系统的取数规则为:根据当前日期,计算所在年份,然后把当年销售收入进行汇总,这样计算的结果,不论当前日期是2008年6月12日,还是修改为2008年6月8日,得到的结果都是将2008年整年的销售收入进行汇总,而且,上年的销售收入也是计算2007年整年的销售收入汇总。所以,这样展示出来的结果肯定不是我们真正想要的。
那正确的方式应该是怎么配置呢?我们应该将第一个汇总列【销售收入】的聚合改为【本年累计】,而且图表控件的默认时间设置改为按今日。在这种组合的情况下,我们系统的取数规则为:根据当前日期(本例中为2008年6月12日),计算所在年份的年初即2008年1月1号到2008年6月12号的销售收入汇总,上年的销售收入是计算2007年1月1号到2007年6月12号的销售收入汇总;而当修改为2008年6月8日时,系统会计算所在年份年初即2008年1月1号到6月8号的销售收入汇总,并且,上年的销售收入也是计算2007年1月1号到2007年6月8号的销售收入汇总,这样展示出来的结果才是我们真正想要的。
所以,按日-本年累计和按年-汇总得到的结果是不一样的,多数情况下,使用前一种方案来设置才是我们想要的结果。
经过修正之后,正确的报表结果显示为:
3.一般人我不告诉他
3.1 正确设置时间列
奥威BI的时间维度是系统预设的,所以,要正确使用默认时间功能,首先要正确设置好时间列。系统在构建分析模型(数据源视图)时,会自动定位事实表的某个日期类型的字段,并将其设置为时间列。但在视图的表较多,或者同一个表中有多个日期类型的字段的情况下,仍然需要手工指定才更精准。
3.2 固定当前时间
对于第一次打开报表时,系统到底是如何计算当前时间的呢?默认情况下,系统时间是根据服务器的当前时间来计算的。但如果是测试数据是历史数据,没有截止到最新日期的数据,我们又不想每次打开报表时都修改时间筛选条件怎么办?
修改服务器时间是一个办法,但这个办法会带来许多不可预知的影响,所以,我们的系统保留了一个可以设置当前日期的地方:在支撑库的t_system表中有一行FKey为curdate的记录,默认是空(此时系统会自动根据服务器当前时间来计算),我们可以将Fvalue设置为某个日期即可。比如本例中我们需要模拟今天是2008年6月12号,就将curdate设置为 2008-6-12 即可。一旦修改了之后,再次打开任何报表,都会按当前时间为2008年6月12号来计算默认时间。
3.3 同步默认时间
如果报表中所有或者绝大多数的图表对象的默认时间都是一样的,有没有办法快速配置呢?有的,这时可以使用同步默认时间的功能,系统会自动将左上角第一个图表控件的默认时间设置同步到所有的图表对象中。(注:V8.1版本之前才是这样,V8.1版本之后,则改为将当前选择的图表控件默认时间设置同步到所有的图表对象中。)
如果本张报表默认时间都是显示上月的数据,则在左上角第一个图表控件的默认时间设置为上月后,然后同步默认时间,这时会发现,显示出来的数据是不对的,具体表现为:除了左上角第一个图表的时间条件上正确的之外,其他图表的默认时间都变成了上上月。为什么会这样呢?原来系统会先根据第一个图表的默认时间来计算日期,然后再传送给其他图表对象,此时,就会发现第二个控件起,上月就都变成上上月了。
那怎么办呢?这时,可以人为在左上角放置一个无用的控件,配置好一个正常的数据集,图表属性配置为隐藏(实际不显示出来),然后将该控件的默认时间设置为按日。这样就可以解决了。
注:上述问题V8.1版本之前才存在,V8.1之后的版本是根据报表属性来计算的,自然就不存在类似的情况了。
4.功能更新(V8.1.36之后的版本)
(1)报表属性中增加【默认时间来自于】。原来的时间计算依据为系统时间,或者是t_system表中固定死的时间,从V8.1开始,增加了一个新的时间计算依据为最大日期,即系统会自动寻找当前事实表中最大的时间来作为计算依据(如果有多个事实表,则会取各事实表时间列中最大日期的最小值)。它介于在t_system表中固定时间与系统时间之间,对于不是最新数据的情况来说,既不至于按系统时间计算没有结果,又不需要手工在t_system表中固定时间。
(2)报表属性增加【默认时间偏移】,根据上面的【默认时间筛选级别】来选择是本日/月/年还是上日/月/年,升级上来的【默认时间筛选级别】为空,【默认时间偏移】也为空,此时,系统会按原来的规则处理(即根据报表左上角第一个图表对象的时间基于设置);新建的报表默认【默认时间筛选级别】为年-月-日,【默认时间偏移】为昨日。
原来的默认时间计算是根据报表中左上角第一个图表控件的默认时间设置来作为基准来计算的,在实际操作中存在不便,所以,经过优化之后,系统直接通过报表属性【默认时间来自于】这个里面的数据来计算,同时,【默认时间筛选级别】也需要设置一下。这里的默认时间筛选级别就是指右侧公共筛选区域的时间筛选级别。原来系统会自动根据左上角第一个图表控件的默认时间设置的时间级别来生成,升级之后,则根据【默认时间筛选级别】的设置来生成。
升级前(V8.1之前版本)
升级后(V8.1之后版本)
(3)报表属性增加【时间筛选一致性】开关,升级过来是打开。新建的报表也为打开。增加提示信息:当打开时,报表中的图表对象统一按当前筛选时间进行筛选,忽略上年、上月、上周或上日,否则,根据各图表对象的时间条件属性进行筛选。
经过V8.1优化后,默认时间的功能就分为两部分来理解:
(1)打开报表时的默认时间是按什么来筛选的:在升级前,原来是根据左上角第一个图表对象,现在完全可以根据报表属性的【默认时间来自于】【默认时间筛选级别】【默认时间偏移】三个属性来定义。而为了保证升级的可用性,所以,升级上来【默认时间筛选级别】为空,继续走原来的方式(即根据报表左上角第一个图表对象的时间基于设置);
(2)更改时间筛选条件时,各图表的时间条件如何计算并传递的:报表属性增加【时间筛选一致性】开关,正常情况下,打开即可。但如果想每个图表对象都根据自己的时间基于来计算并传递,则可以关闭该属性。在本次举的例子中,因为同一个报表中,既有本月,又有上月,所以,要想得到预期的效果,就应该关闭【时间筛选一致性】开关。