|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?注册账号
×
T+铝材行业实际过磅和理论数量控制【问题现象】
在广东铝材行业比较多,铝材行业只有销售出库的时候才会磅出准确的重量,企业内流通一般用的是一个理论重量。 问题:希望可以在销售时能将实际重量与理论重量进行对比,控制差额高于N%或者低于N%,才可以保存出库吗? 客户需求,设置差额率例如5%,(实际重量-理论重量),上下不超过5%允许保存出库,如果超过5%,那么不允许出库。
【问题分析】
理论重量就是销售出库单上的“数量”,而实际的过磅重量可以使用自定义项来实现,通过公式 (实际重量-销售出库单上的数量)/销售出库单上的数量,得出这个差额率,控制差额率的绝对值不超出5%的情况下可以保存,此需求软件无法直接实现,但是可以通过做触发器来实现。
【解决方案】
1、T+软件中,点击单据设计,选择库存核算--销售出库单,明细--自定义项设置,启用一个数值公用自定义项,将显示名称改成“过磅数量”,适用单据选择销售出库单,值来源选择手工录入。如下图所示:
2、写触发器来控制(实际重量-销售出库单上的数量)/销售出库单上的数量
(1)触发器:顾名思义就是做一个操作的时候可以带动另外一个操作。触发器就是一段语句,可以在保存单据或者审核单据的时候让它达到修改或者受到某一控制的效果。本案例就是要达到控制到不能保存的效果。
(2)触发器是一段语句,故它是有一个固定书写格式,这里只介绍常用的一种格式
CREATE TRIGGER 触发器名
ON {表|视图}
FOR insert,UPDATE,DELETE
AS
DECLARE定义变量
SELECT 变量=表中的字段名 from inserted,deleted where 条件以及其他的SQL语句
(3)inserted和deleted是由数据库系统自动形成的两个临时表,在保存单据之前,单据上填写的数据都是在inserted中,而删除单据,会提示是否进行删除,删除后将无法恢复在没有点是之前,,数据是保存在deleted中,而修改单据,点击修改后,修改之前的数据是在deleted,修改后未点击保存前的数据是在inserted中。
(4)点击开始程序,找到SQL SERVER2008R2,然后再找SQL SERVER management studio,用windows身份连接,点击UFTSYSTEM数据库找到EAP_Account
然后右键打开前1000行,通过其中记录找到账套对应数据库的名称,然后点击该数据库右键新建查询。由于是对销售出库单进行控制,并且所有出入库单在后台数据库中都是在同一张表中,故需要做所有的出入库单,然后查询出来销售出库单的标志。
发现上图中的,红色区域是不一样的,并且做了两张出库单都是同样的标志19。
(5)做触发器:
create TRIGGER [chao]
ON ST_RDRecord_b
FOR INSERT,update
as
DECLARE @quantity decimal(28, 14),
@pubuserdefdecm1 decimal(28, 14),
@idRDRecordDTO int,
@idvouchertype int ,
@fnumber1 VARCHAR(100)
SELECT@idRDRecordDTO=idRDRecordDTO,@pubuserdefdecm1=pubuserdefdecm1,@quantity=quantity FROM INSERTED
set @idvouchertype=(select idvouchertype from ST_RDRecord where ST_RDRecord.id=@idRDRecordDTO)
IF abs((@quantity-@pubuserdefdecm1)/@quantity*100)>5 and @idvouchertype=19
BEGIN
set @fnumber1 = '过磅数量异常,请联系经理!'
RAISERROR(@fnumber1,18,18)
GOTO H_Error
END
H_Error:
注释:
①create TRIGGER [chao]:创建一个命名为chao的触发器。
②ON ST_RDRecord_b:ST_RDRecord_b是出入库单字表,而ON ST_RDRecord_b是对出入库单字表来创建的触发器。
③FOR INSERT,update:是对新增单据或者修改单据的时候,有效果的。
④DECLARE @quantity:quantity是数量字段,idRDRecordDTO是主表和子表关联的id号,pubuserdefdecm1是自定义项目过磅数量,进行定义变量的时候,需要定义成和表中的字段一样的名称一样类型。
SELECT@idRDRecordDTO=idRDRecordDTO,@pubuserdefdecm1=pubuserdefdecm1,@quantity=quantity FROM INSERTED:把在做单据并且没有保存之前的数据,取值到变量中,为后面的判断做准备。
⑤set @idvouchertype=(select idvouchertype from ST_RDRecord where ST_RDRecord.id=@idRDRecordDTO):从主表中找到和正在新增尚未保存的销售出库单类型的标志,并且把值取给该变量。
⑥IF abs((@quantity-@pubuserdefdecm1)/@quantity*100)>5 and @idvouchertype=19:判断数量和过磅数量的差超出理论数量的正负百分之五并且单据类型是销售出库单,则开始执行后面的语句,没有超出就不执行。
⑦RAISERROR(@fnumber1,18,18):弹出提示的信息框。
(6)触发器是SQL语句,故打开SQL SERVER management studio,没有触发器的时候是如下图所示:
把写好的触发器脚本语句复制到SQL SERVER management studio,如下图:
然后点击执行后,会在表中形成如下图所示:
(7)在T+中尚未加入触发器之前,操作T+中的软件下图所示:
执行触发器后:
总结:在软件中有些功能不能直接实现,可以考虑使用触发器,不过如果考虑做触发器其实对数据库是要特别的了解,并且只有写的多,才能书写自如。 |
|