以前我们曾演示过工作流的清理技术,实际上是一种事后补救措施。很多客户在设计ES工作流时会直接在表单上设置工作流,这样做看似简单,实际上给后台数据库留下了无穷隐患。研究过数据库Wi表的人会发现,这个表的体积是原表的N倍(N=工作流完成节点数)。
很多时候,我们只是需要某个流程审核通过一下,并不更改数据,这个时候就没有必要在原单据上设置工作流。本次,我们将展示针对审核类ES工作流的进阶设计方案,突破想象。
系统表
。SysRec
。注意:这里sysid字段我们叠加在了入库单号上。
单号
,日期
,结果
。注意:这种对应到系统表字段的超链接可以根据单号打开不同模板的表单。
点击单号的超链接时能查看对应的入库单或出库单。
使用(映射)系统表实现多模板超链接技术。
使用通用审核模板的工作流提醒审核者办理。
不在原单据使用工作流将极大减少数据库开支。
有些时候我们用逗号分隔多个值,另外一些时候又需要把这些值单独拆开。
在ES中,两者之间的转化可以通过数据库视图来快速实现。
create function f_mergaChar(#Dept varchar(50))
returns varchar(6000)
as
begin
declare #values varchar(6000)
select @values=isnull(@values + ',','') + 姓名
from 合并测试_D where 部门=@Dept
return @values
end
记录合并在sql2000中需要使用自定义函数,在ES视图中调用函数实现。
记录拆分也类似,如果有基础表作为辅助,也可以直接通过ES视图实现,例如本文示例。
其他类似方法还有许多,例如SQL2005中的CTE递归等,本文为SQL2000下的解决方案。
其他进阶方案请参考宝典3.12节。
村长点评:使用nxcells和sql2008+可以直接在提数中用for xml path来合并记录,更快更方便。
ES虽有定时备份,但为防止服务器硬盘发生故障而导致数据丢失无法恢复,我们可以采用一些异地存储的方案。
本文介绍一种局域网内的简单存储方案,除了压缩使用的WinRAR外不需任何第三方软件。
首先,在局域网内选择一台用于存储备份的计算机,共享一个文件夹,例如D:\esbak,选择-右键-属性-共享-高级共享-勾选共享此文件夹-在共享名后加一个“$”符号,并设置好写权限。
通过前面的设置,建立了一个隐藏
的共享文件夹。在ES服务器上,映射一下网络驱动器。
方式:我的电脑-右键-映射网络驱动器,或者是进入我的电脑选工具菜单的映射。
由于共享文件夹是隐藏的,所以要手工输入路径:\共享主机名\esbak$。
其中共享主机名
填前面共享文件夹的计算机名,示例中是Wyl-380。
映射成功后,可以从我的电脑直接访问这个Z盘,新建一个txt文件测试写权限。
在服务器的ES备份盘根目录(示例为C盘)建立一个空白txt文件,填入下列脚本:
@set s=c:\esdata\
@set d=z:\
@for %%F in (%s%esdbbak*.*) do (@"c:\program files\WinRAR\WinRAR.exe" u -y –hp123 -ibck %d%%%~nF.rar%s%%%~nxF)
Exit
其中c:\esdata\
改为ES的备份文件所在目录,z:\
改为映射的驱动器盘符。代码中的u是指更新文件,跳过已备份的文件;-y指应答全部选“是”;-hp123
是加密为123,密码123可修改为其他字符;-ibck是后台运行。(c:\program files\WinRAR\WinRAR.exe
是WinRAR的安装路径)
实际的作用是:将ES备份文件分别加密压缩并存放到映射盘下
。
然后,选择:文件-另存为-保存类型:所有文件-文件名改为:Esbak.bat。
双击运行一下,可以看到Z盘下生成的压缩备份,打开时需要密码。
在服务器端,选择控制面板-计划任务-添加计划任务-选择Esbak.bat-设置每天的备份时间:
设置隐藏共享文件夹可以增强信息安全。
采用WinRAR加密压缩可以减少磁盘占用,压缩后体积约为原备份文件的1/10!
采用计划任务实现无人值守自动备份。
村长补记:该方法要求服务器保持用户登录,因此需要关闭休眠等。我们可以直接用SecondCopy等软件做定时异地备份,也十分简单可靠。
交叉表是ES中的一种数据表结构,在制作大型报表,动态图表等方面有着非常重要的作用。但是交叉表的设计和维护较繁琐,能否用好交叉表很大程度上反映了设计者对ES系统的整体掌控力。
交叉表
。日期值
被存放于同一个字段内,在其他模板中能很方便的调用。交叉表比较难以维护,因为有些维护技巧即使从官方也很难获取。
交叉表一般用于生成报表或查询,尽量不要用于保存数据,因为保存一个m行n列的交叉表意味着ES数据库中要存放m*n条数据,例如100个员工30天的排班就会生成记录3000条!
–表间公式–
触发器
进行自动清理。交叉表的优点是直观,灵活;缺点是这种直观灵活是以牺牲存储为代价的。
使用交叉表做报表(纯查询)可以避开交叉表的缺点。
使用筛选条件或条件取值公式可以在表间公式中灵活填充交叉表数据。
使用数据库触发器可以减轻数据库存储压力(提高访问效率)。
交叉表跟日期是天生的好搭档,在表格中出现日期序列(1~31),月序列(1~12),年序列(2010~2018)等等时,你就应该考虑采用交叉表了。
在做物料需求计算时,我们经常会用到去尾法
和进一法
。
例如,一种原料的需求量是1245件,采购时有不同要求:
去掉百位后的尾数,即1200件,如何计算?
自动进位到百位,也就是1300件,如何计算?
要求“三舍四入”到百位,即1300,如何计算?
(不要怀疑三舍四入
这个概念,这是真实的案例)
在EXCEL表格中,我们可以用EXCEL公式来求取这些值,主要涉及公式分别是去尾法(int
),进一法(roundup
)和四舍五入(round
)。
使用表间公式也可以实现去尾法和进一法,而这一切只需要一个“四舍五入”的表间公式。
上面的表间公式方案看起来不可思议,因为表间公式中“四舍五入”的说明实在是太简单了。
在数据库中,“四舍五入”等价于“round()”,让我们看看round函数的真正诠释:
在表间公式说明中未指出的第三参数就是一切问题的关键,我们可以简单的认为:
省略第三参数就是“四舍五入”,第三参数填1时就是去尾函数(INT)
通过一个简单的表间公式我们就能解答最初提出的问题了
同样的,我们完全能够在这基础上轻松得到“二舍三入
”,“五舍六入
”等计算方案。
这就是“四舍五入”真正的奥义。