很多时候我们应该对单据模板进行锁定条件设置,以防止被修改或全选误删。
例如在月饼库中,入库单结算后锁定可以设置:本表.结账日期 有值
很简单,可以设置:1=1
可以设置:间隔时间(hh,系统变量.报表填报时间,系统变量.当前日期时间)>2
例如:有t1、t2两个模板,当t1存在某个字段值(id)时,填报t2后锁定t2中对应的的单据。
本表.id 属于 此集合(1)
祝新年快乐!^_^
村长点评:Nxcells平台的控制规则原生支持跨表锁定和禁删改
本文为吐槽文,欢迎前排围观,一起来扒一扒ES那些奇葩的坑。
目前网上流传的XX版主要有7.1.7、8.4、9.2.335、9.4.124、10.199。因为XX版的存在,ES取得了不小的知名度。作为企业正版用户,我先吐槽一下:版本更新快,代码质量不敢恭维。早年我曾一年升级好几次,几乎每次都跳到到某个不稳定版本
,结果不仅劳命伤身(C/S架构,客户端自动升级失败),还陷入了无限升级的坑爹境地。
不管是不是正版用户,只要能满足需要,就不要为了某些新特性去升级。要注意的是现在X宝贩卖的10.199
版存在很多bug,例如不能调用存储过程,运行缓慢等,不建议使用,相较而言9.4.124
更稳定。
这玩意早已被吐槽得体无完肤了吧,慢!丑!冷!
如果按网站打开4秒以上就会流失一半用户的说法,ESWEB已流失殆尽了吧?
如果说工作台的VB界面是老土,那这个WEB界面是肿么回事儿?为啥也这么土?设计好的模板为啥到WEB版就揉到一起去了??
各大QQ群谈WEB就呵呵,入冷宫,不翻身,有木有!!!
这里包括许多方面,首先ES客户端要电脑管理员账户才好用,有木有?
其次,ES本身的角色权限除了admin,其他基本用不到,特别是dept admin,这货就是猴子派来的逗比
啊,官方说设置admin的部门限制可以防止这货变身,问题是这货自己改自己的所属部门后还是能变身啊!
再次,ES的超链接存在权限缺陷,如果设置了“不存在则新建,存在则修改
”那么任何人
都将获得修改权!如果设置了“修改
”方式打开的超链接,则任何人
都获得查看权限!
网盘是旗舰版的功能,对于客户端来说是一个特制的不用填账号密码的FTP工具,用来做系统附件的存储方案是不错,可以避免用数据库直接存储大文件。
网盘的坑主要有两点:一是网盘的备份还原存在问题,明明有几G附件,备份出来肿么就变成几百M了勒?还原还是直接整个文件夹复制粘贴过去靠谱一点。第二个就是用户网盘,很多筒子想拿来作为企业内部的公共盘,我建议还是算了,内网建域
,配置一下共享文件权限或者买台NAS,比这个要强百倍,直接双击打开修改都行,有木有啊!
VB土黄的界面就不说了,请个好点的美工又不会怀孕,也就咱们80后能接受吧,90后那些界面党会喜欢ES才怪,哎,说多了都是泪……
老是要重启服务是肿么回事儿,以前是一个月要重启一次,现在是一周重启一次
,不然自动邮件,自动任务就挂了
,别跟我谈升级,戒了!
这玩意非常耗费数据库资源,另外存在跳号问题,建议尽量不使用,或用提数公式(最大值)实现。
另外即使新建不保存也会产生废号,一般用几年后分析数据库也会发现跟ID有关的表(例如IdUsed等)都奇大无比。
不管是不是EXCEL高手,一定不要把ES当EXCEL用,很多ES设计者本身的EXCEL水平一流,平时设计个表格,用EXCEL公式就可以完成很多事情。但在ES中,滥用EXCEL会有许多意料之外的后果,不说ESWEB的支持有限,偶尔出现EXCEL公式丢失,导致修改时的更新问题就够喝一壶了,另外,数组公式不能大量在明细中使用
,否则数据多时表单打开会奇慢无比。
有许多新手不知道模板上的公式必须在模板打开后才能触发,想当然的认为模板上EXCEL公式改了,后台数据会自动更新,阿门,真相是多么的残酷。
同EXCEL公式一样,很多ES设计者的VBA水平也不赖,甚至能用EXCEL开发小工具。但在ES中,滥用VBA也会带来许多麻烦,其中最忌讳的是使用工作表的selectionChange和Change事件
,这点跟EXCEL数组公式类似,导致表单打开时奇慢无比。
EXCEL公式和VBA都是客户端脚本,就像WEB中的JS代码一样,使用时要适可而止。ES本身的表单打开过程是这样的:首先下载和加载EXCEL模板,然后下载数据,逐个单元格填充数据,最后显示给用户。如果我们使用了Change事件,逐个单元格填充数据时就会重复执行事件代码,如果明细数据量比较大,呵呵,恭喜入坑。
没错,这个ES的“精髓技术”也存在许多需要注意的事项。
一般来说,一个模板的表间公式包括提数和回写不超过10个
,如果滥用,一个是数据库设计的架构问题,另一个是模板架构的问题。
表间公式中最稳定的是提数
公式,回写公式中的新建表单
和删除表单
比较稳定,而修改
,补充明细
,删除明细
公式有大概率会跳票,所以不滥用表间公式也是为了系统的稳定着想,这里俺不禁又要吐槽了:官方经常说他们某个大客户,几十几百十个并发回写没出过问题。问题是“ES表间公式一定稳定”这个命题只要有一个反例就能证明是假命题,正版用户们,你们说对不对?!
这个ES经常炫的技术被扒开后也十分骇人听闻。
工作流的原理是表单按设定的路线传递,传递过程中的每个节点都保存一个副本(Wi表),这样撤销时,数据就可以回滚到某个副本。通俗点说就是一传十,十传百,例如表单有填报和审核两步,审核有10个人并行参与,那这个报表在数据库中会存储11份!如果每个表单都这样跑工作流,不久的将来咱们的数据库文件可能飙到到100G,数据分析师过来一看,呵呵,您的系统只有500M有价值的数据!问题是每次备份要100G啊,坑爹啊!所以能不跑工作流就不跑,能用抢先式就不用会签式,能用会签式就不用并行式
。
我曾经见官方炫过下面这样一个工作流需求图,阿门,请上帝救救这家单位
的数据库吧。
2017/7/7新增:工作流新建不保存也会生成一条repcase记录,这个表过大直接影响工作台显示速度!
成也工作台,败也工作台!
最早相中ES就是因为觉得工作台右侧的主表+明细的展示方式正是我需要的。我最早设计的物料表是带有进出明细的,在工作台点击某个物料时,下方明细就显示物料的近期收发情况,后来我学习了解了数据库的设计规范后,取消了这种设计。
我们不难发现ES的系统表都是符合第三范式的,但如果用户想在工作台展示详细的数据就只能使用第二范式来设计数据库,这意味这我们想在工作台的入库单显示物料描述,就要在数据库里也保存物料描述,我想在入库单显示供应商名称就要在数据表里也保存供应商名称。很多人没有意识到这种设计的可怕。
假设我们有基础表:物料表和供应商表。
如果按第三范式,入库单的设计是这样(简化字段):合计96个字节
如果想在工作台显示描述信息,就是第二范式,入库单的设计是这样:合计374个字节
范式等级的差异十分明显,如果描述文字很多的话,这种冗余和浪费将十分严重,是数据库设计的大忌!依赖工作台直接显示是硬伤,除非显示规则能像表间公式一样可以设定!
元芳,你怎么看?
村长点评:目前勤哲已经逐步没落,推荐Nxcells等新型平台来开发ERP
ES官方VBA接口说明已久未更新,本VBA接口简写可供读者参考。
'-----------------------------------------------------
'VBA简化代码by woylin 2014-9-28
'-----------------------------------------------------
'★提数★
Private Sub btn1_Click()
Application.COMAddIns("esclient10.connect").Object.execquery"提数1"
End Sub
'★回写★
Private Sub btn2_Click()
If Application.COMAddIns("esclient10.connect").Object.execupdate("回写1")Then MsgBox "OK"
End Sub
'★新建★
Private Sub btn4_Click()
Application.COMAddIns("esclient10.connect").Object.newreport"入库单"
End Sub
'注意第二参数用于控制关闭调用源表单,官方教程中未指出,加该参数易导致崩溃
Private Sub btn5_Click()
Application.COMAddIns("esclient10.connect").Object.newreport"出库单",1
End Sub
'以下为带传入参数的新建
Private Sub btn5_Click()
with Application.COMAddIns("esclient10.connect").Object
.addinitData 字段1,值1
.addinitData 字段2,值2
'......
.newreport"出库单"
End with
End Sub
'★弹出规范★
Private Sub btn1p_Click()
[i6].Select:Application.COMAddIns("esclient10.connect").Object.poptree "名字_树"
End Sub
'注意该接口可调用列表规范,官方教程中未指出
Private Sub btn2p_Click()
[d6].Select:Application.COMAddIns("esclient10.connect").Object.poptree "批次库存_列表"
End Sub
'★插入行★
Private Sub btn9_Click()
Application.COMAddIns("esclient10.connect").Object.InsertRow1, 6, 1
End Sub
'★保存★
Private Sub btnSave_Click()
Application.COMAddIns("esclient10.connect").Object.savecase, , 0
End Sub
'★存储过程★
Private Sub btn1n_Click()
Dim sErr$
If Application.COMAddIns("esclient10.connect").Object.ExecProc("存储过程名",sErr, "参数") Then MsgBox "已更新"
End Sub
'★存储过程(带结果集)★
Private Sub btn2n_Click()
Dim Rs As New ADODB.Recordset, sErr$
If Application.COMAddIns("esclient10.connect").Object.ExecQryProc("存储过程名",Rs, sErr, "参数") Then myGrid1.SetDatasource Rs
End Sub
PS:示例库见群文件EdenSolution_11th_final.zip
ES也能实现类似编程中的MVC架构,基本原理就是通过ES维护数据库基表数据,基表数据生成数据库视图,ES读取视图完成UI显示。在这种循环结构中,存储和显示是分离的,从而使数据库能实现3NF(第三范式)。
本文将对sql视图所能实现的功能做一些演示,希望能启发读者进一步拓展ES后台功能。
SELECT * FROM ESSystem..ES_seslog --可在工作台显示用户连接状态
SELECT B1.RtIds ASRtIds, B1.RtNames AS RtNames, B1.TaskId AS TaskId,
B1.UserId ASUserId, A1.UserName AS UserName
FROM ES_User A1
INNER JOIN ESSystem..ES_AFPlan B1 ON A1.UserId = B1.UserId
SELECT B1.日期,B1.仓库,B1.单位部门,B2.描述,B1.批号,B1.入库,B1.出库,B2.单位,B1.备注,B2.物料编码,B2.物料分类
FROM ( SELECT 日期,仓库,交货方 AS 单位部门,物料编码,批号,数量 AS 入库,NULL AS 出库,备注
FROM 入库单 A1,入库单_D A2 WHERE A1.EXCELSERVERRCID=A2.EXCELSERVERRCID
UNION ALL
SELECT 日期,仓库,发交,物料编码,批号,NULL,数量,备注
FROM 出库单 A3,出库单_D A4 WHERE A3.EXCELSERVERRCID=A4.EXCELSERVERRCID) B1
INNER JOIN 物料表 B2 ON B1.物料编码=B2.物料编码
SELECT 姓名1,工号1,部门1 FROM 培训记录明细
UNION ALL
SELECT 姓名2,工号2,部门2 FROM 培训记录明细
总库存/批次库存,此略(详见第六弹)
在途库存(单据未经确认的数据视为“在途”)
SELECT B2.描述,B1.数量 AS 在途数量,B2.单位,B2.物料编码,B2.物料分类
FROM ( SELECT 物料编码,SUM(数量) AS 数量
FROM( SELECT 物料编码,数量 FROM 入库单 A1,入库单_D A2 WHERE A1.EXCELSERVERRCID=A2.EXCELSERVERRCIDAND ISNULL(A1.确认人,’’)=’’
UNION ALL
SELECT 物料编码,-数量 FROM 出库单 A3,出库单_D A4 WHERE A3.EXCELSERVERRCID=A4.EXCELSERVERRCIDAND ISNULL(A3.确认人,’’)=’’
) N
GROUP BY 物料编码
) B1
RIGHT JOIN 物料表 B2 ON B1.物料编码=B2.物料编码
SELECT 仓库,物料分类,描述,数量,单位 FROM v_PCKC
UNION ALL
SELECT 仓库,物料分类 + '-小计' AS 物料分类,''AS描述,SUM(数量),单位
FROM V_PCKC GROUPBY 仓库,物料分类,单位
UNION ALL
SELECT 仓库+ '-合计','' AS 物料分类,''AS 描述,SUM(数量),单位
FROM V_PCKC GROUP BY 仓库,单位
ORDER BY 仓库,物料分类
--视图1,带单价进出明细
SELECT 日期,物料编码,单价,数量 AS 收入,0 AS 发出
FROM 入库单 A1,入库单_D A2
WHERE A1.EXCELSERVERRCID= A2.EXCELSERVERRCID
UNION ALL
SELECT 日期,物料编码,0,0 AS 收入,数量 AS 发出
FROM 出库单 A1,出库单_D A2
WHERE A1.EXCELSERVERRCID= A2.EXCELSERVERRCID
--视图2,物料价格历史
SELECT 日期,
物料编码,
结存=ISNULL((SELECTSUM(收入)-SUM(发出) FROM VPRICEDWHERE 物料编码=A.物料编码 AND 日期<MIN(A.日期)),0),
结存价=ISNULL((SELECT SUM(收入*单价)/(SUM(收入)) FROM VPRICED WHERE 物料编码=A.物料编码 AND 日期<MIN(A.日期)),0),
SUM(收入)AS 收入,
AVG(单价)AS 单价,
SUM(发出)AS 发出
FROM VPRICED A
GROUP BY 日期,物料编码
--视图3,物料均价
select 日期,物料编码,
均价=(结存*结存价+收入*单价)/(结存+收入)
FROM vPriceHis
无级BOM,此略(详见第九弹)。
订单状态切换*(该部分仅做演示)
SELECT DNO,T2S.S,CDATE FROM S,T2S WHERE S.V=T2S.CTL ANDS.T=T2S.TID
UNION ALL
SELECT ONO,T2S.S,ODATE FROM ODA,T2S WHERE ODA.S=0 ANDODA.V=T2S.CTL AND ODA.T=T2S.TID
UNION ALL
SELECT ONO,STAT,CDATE FROM ODB WHERE ODB.S=0 --获取所有订单状态
SELECT DNO,MAX(S) AS S FROM VORDSTAT GROUP BY DNO –获取订单当前状态
ES视图是友好的,可以直接写SQL语句,所以不需要借助VBA就能在后台完成大量运算。
当多个模板中使用同样的多个数据源表定义提数公式时,可以考虑定义视图简化提数。
当大量使用回写公式时,可以考虑换一下思路,用视图完成相同的功能往往比回写更稳定。
视图可以减轻数据库存储压力,并且所能实现的功能远超以上罗列项……
【点击右键】—【所有任务】-【导入数据】
AgentSet 代理人设置
AgentUser 代理人
Dept 部门
Role 角色
User 用户
UserMgr 用户管理
UserRole 用户角色