关于WDSQL检查的使用说明.docx
- 文档编号:29349724
- 上传时间:2023-07-22
- 格式:DOCX
- 页数:14
- 大小:56.41KB
关于WDSQL检查的使用说明.docx
《关于WDSQL检查的使用说明.docx》由会员分享,可在线阅读,更多相关《关于WDSQL检查的使用说明.docx(14页珍藏版)》请在冰豆网上搜索。
关于WDSQL检查的使用说明
WDSQL检查功能使用说明
业务背景:
在905系统实际的实施使用过程中,单据保存、删除、审批、取消审批时,经常会写一些触发器完成某些列值得检查或其它更新操作,例如:
客户资质审核更新客户合格标志,资质有效期判断等。
又因为需求较为特殊,无法合并到标准产品中,从而会被开发上直接屏蔽掉。
是否能够在这些操作中提供一种方法供实施人员灵活配置?
实现方式:
在单据保存、删除、提交、取消提交、审批、取消审批时,调用wdsql检查功能,实施人员可以自行向其中增加检查等语句,实现可配置的检查更新。
例如在提单保存时判断,XSTD_C1不能为空,则仅需要向WDSQL中手工插入检查语句即可,不用做其它设置
insertintowdsql
values('S','001','BZHSTD','selectcasertrim(XSTD_C1)WHEN‘’THEN1ELSE0ENDFROMXSTDWHEREXSTD_TDLS=?
','','','1')
使用说明:
1.WDSQL列说明
WDSQL_LX保存前执行’S’,删除前执行’D’,(审批’A’(approve批准),取消审批’V’(veto否决))
WDSQL_DJBHLSBLM中的逻辑表名,如标准回收提单为’BZHSTD’,综合管理中文档项目定义的四位编号,如WD1104,该列数据取1104
WDSQL_BH顺序号,同一种单据同一类型不要重复
WDSQL_SQL检查更新用的SQL,最大不要大于32000个字符,注意,必须用一个“?
”号接收传入的单据流水编号列
WDSQL_CCTS
WDSQL_QXTS提示信息
WDSQL_CHECK是检查’0’,还是处理’1’
2.WDSQL检查的使用
如果设置WDSQL_CHECK为’0’就会进行检查处理。
检查可以返回三种值,-1(小于0都可以)不严格判断,只提示,0不判断,1(大于0都可以)严格判断
(1)统一的提示
如下图,如图所示,提示会集中在一个窗口中显示出来。
[必须信息]下面的提示就是严格判断必须遵循的业务规则的信息提示。
[参考信息]下面的提示信息就是不严格判断的信息提示。
如图所示,提示将集中在一个窗口中
(2)不严格提示,允许用户交互
对于不严格检查,让用户选择是否继续操作
(3)简单检查
相应的WDSQL中的设置如下
--严格控制,select出来的是>0就可以
存盘时控制:
insert into wdsql
values('S','001','BZHSTD','select 1 from xstd where xstd_tdls = ?
','提示','ERRORMSG',’0’)
审批或者提交(免审)时控制:
insert into wdsql
values('A','001','BZHSTD','select 1 from xstd where xstd_tdls = ?
','提示','ERRORMSG',’0’)
--如果发票明细上税率都为0,则不允许发票表头的c5字段为“增值税发票”
insert into wdsql
values('S','001','BZHSTD','select case count
(1) when 0 then 0 else -1 end from xstd,xstdmx where xstd_tdls =xstdmx_tdls and xstd_tdls = ?
and ltrim(rtrim(xstd_c5)) = ''增值税发票'' having sum(xstdmx_sl) = 0','提示','增值税发票,税率不能为0',’0’)
--如果发票明细上税率不一样时,不允许保存
insert into wdsql
values('S','002','BZHSTD','select case count
(1) when 1 then 0 else -1 end from xstd,(select 1 f_count,xstdmx_tdls from xstdmx where xstdmx_tdls =?
group by xstdmx_tdls,xstdmx_sl) b where b.xstdmx_tdls = xstd_tdls','提示','提单明细税率必须一致',’0’)
(4)复杂的检查(MSS语法)
能不能加工或者调用一个存储过程来进行复杂的判断?
是可以的
首先可以定义一个函数
DROPfunctionlc0039999.f_test
go
CREATEfunctionlc0039999.f_test(@@BBVARCHAR(20))
returnsint--返回值必须为整型
as
BEGIN
RETURN
(1)
END
增加wdsql保存前检查语句
insert into wdsql
values('S','001','BZHSTD','select lc0039999.f_test(?
)','提示','增值税发票,税率不能为0',’0’)
增加wdsql审批前检查语句
insert into wdsql
values('A','001','BZHSTD','select lc0039999.f_test(?
)','提示','增值税发票,税率不能为0',’0’)
3.非检查的其它处理
如果设置WDSQL_CHECK为’1’就会认为是进行非检查的其它处理,可以提供下列三类处理的调用。
除非出现执行错误,否则非检查处理不会返回提示信息。
(1)一般处理方式
如:
客户资质审核通过后更新客户合格标志;物料检验台帐与检验记录同步。
--客户资质审和通过后更新客户合格标志
insert into wdsql
values('A','001','1A81','updatezwdwexsetzwdwex_hgkh=’’1’’wherezwdwex_dwbh=(selectWD1A81_DWBHFROMWD1A81_LSBH=?
)','','',’1’)
--物料检验台帐删除时,同时删除检验记录台帐
insert into wdsql
values('D','001','1A8Q','DELETEFROMWD1A8PWHEREWD1A8P_LSBH=?
','','',’1’)
--WD1000取消审批(无审批流程单据取消提交)时,同时删除WD2000的纪录
insert into wdsql
values('V','001','1000','DELETEFROMWD2000WHEREWD1000_LSBH=?
','','',’1’)
--物料检验台帐增加时,同时增加检验记录台帐(更新也是一样的用’S’)
insert into wdsql
values('S','001','1A8Q','insertintoWD1A8PSELECT*FROMWD1A8QFROMWD1A8Q_LSBH=?
','','',’1’)
(2)复杂的处理(区分数据库,下面是MSS写法)
除了可以使用保存前检查、删除、更新、插入,还可以进行组合使用。
--创建测试表
Createtablet_test(col1varchar(100),col2varchar(100))
Insertintot_testvalues(‘old’,’’)
--先在t_test增加一条数据,再更新其它col1为old的数据
insert into wdsql
values('S','001','BZHSTD','BEGINDECALRE@LSBHVARCHAR(20);INSERTINTOT_TESTVALUES(‘‘新增加的’’,@lsbh);updatet_testsetcol2=@lsbhfromt_testwherecol1=’’old’’;end','','',’1’)
--测试后,测试表中的数据
select*fromt_test;
old0001
新增加的0001
WDSQL中的语句整理后就是这样的,和存储过程触发器的写法是一致的,只要注意每句话后都要带分号,单引号要双写(例如’old’要写为’’old’’)
Begin
Declare@lsbhvarchar(20);
Set@lsbh=?
;
INSERTINTOT_TESTVALUES(‘‘新增加的’’,@lsbh);
updatet_testsetcol2=@lsbhfromt_testwherecol1=’’old’’;
end
(3)还可以调用存储过程(区分数据库,下面是MSS写法)
再以上复杂处理中,还可以调用存储过程实现更复杂的处理。
--先在t_test增加一条数据,再更新其它col1为old的数据
insert into wdsql
values('S','001','BZHSTD','BEGINDECLARE@AVARCHAR(20);DECLARE@BMVARCHAR(20)SET@A=?
;SELECT@BM=XSTD_BMBHFROMXSTDWHEREXSTD_TDLS=@A;/*执行存储过程,你可以加上注释*/EXECPR_TEST@A,@BM;END','','',’1’)
WDSQL中的语句整理后就是这样的,和存储过程触发器的写法是一致的,你甚至可以添加注释
BEGIN
DECLARE@AVARCHAR(20);
DECLARE@BMVARCHAR(20);
SET@A=?
;
SELECT@BM=XSTD_BMBHFROMXSTDWHEREXSTD_TDLS=@A;
/*执行存储过程,你可以加上注释*/
EXECPR_TEST@A,@BM;
END
(4)一个复杂应用的例子(销售提单保存时,在lspcsx表中增加批次信息)
deletefromwdsqlwherewdsql_djbh='BZHSTD'andwdsql_bh='003'
go
--保存前检查,自动把批次属性信息插入到lspcsx中
insertintowdsql
values('S','003','BZHSTD',
'BEGIN
declare@lv_tdlsvarchar(20)
declare@lv_wlbhvarchar(30)
declare@lv_pchvarchar(20)
declare@lv_ywrqvarchar(8)
declare@lv_c1varchar(8)
declare@lv_scrqvarchar(8)
declare@lv_sxrqvarchar(8)
declare@ln_wl_bzqxu001
declare@lv_tempvarchar(10)
set@lv_tdls=?
declareXSTDFZ_CURSORcursorfor
selectxstdmx_wlbh,xstdfz_jh,xstd_ywrq,LSWLZD_BZQX
fromxstd,xstdmx,xstdfz,LSWLZD
wherexstd_tdls=xstdmx_tdlsandxstdmx_tdls=xstdfz_lsbhandxstdmx_tdfl=xstdfz_flbhandxstd_tdls=@lv_tdls
andxstdmx_wlbh=lswlzd_wlbh;
OPENXSTDFZ_CURSOR;
FETCHNEXTFROMXSTDFZ_CURSORINTO@lv_wlbh,@lv_pch,@lv_ywrq,@ln_wl_bzqx;
WHILE@@FETCH_STATUS=0
BEGIN
ifnotexists(select1fromlspcsxwherelspcsx_wlbh=@lv_wlbhandlspcsx_pch=@lv_pch)
begin
set@lv_temp=''20''+substring(@lv_pch,1,4);
iflen(@lv_pch)>=4andisdate(@lv_temp)=1
begin
set@lv_c1=substring(CONVERT(VARCHAR,dateadd(MONTH,@ln_wl_bzqx-1,@lv_temp+''01''),120),1,7);
set@lv_scrq=@lv_temp+''01'';
set@lv_sxrq=substring(CONVERT(VARCHAR,dateadd(MONTH,@ln_wl_bzqx,@lv_temp+''01''),112),1,8);
INSERTINTOLSPCSX(LSPCSX_WLBH,LSPCSX_PCH,LSPCSX_RKRQ,LSPCSX_SCRQ,LSPCSX_SXRQ,LSPCSX_FJRQ,LSPCSX_YSPH,LSPCSX_C1)
VALUES(@lv_wlbh,@lv_pch,@lv_ywrq,@lv_scrq,@lv_sxrq,@lv_sxrq,@lv_pch,@lv_c1);
end
end
FETCHNEXTFROMXSTDFZ_CURSORINTO@lv_wlbh,@lv_pch,@lv_ywrq,@ln_wl_bzqx;
END
CLOSEXSTDFZ_CURSOR;
DEALLOCATEXSTDFZ_CURSOR;
END','提示','批次属性保存失败',1)
go
4.自定义的返回提示信息
有时候,可能需要自己定义返回的错误信息提示,比如:
“XXX的帐期超过###天,请检查!
”,格式为
“-1**(错误提示)”:
表示不严格判断,原来的-1、“-1”仍然有效
“+1**(错误提示)”:
表示严格判断,原来的1、“1”仍然有效
“00**(错误提示)”:
表示不判断,原来的0、“0”、“00”仍然有效
(1)通过一般的SQL方式处理
Selectcasecount
(1)when>1then‘-1**资信已超:
’+cast(xstd_u1asvarchar)else0endfromxstd;
(2)通过存储过程处理,更加随意
例子:
createtablet_test1(col1varchar(20));--创建测试用表
createprocedurepr_show_test(@lsbhvarchar(20))—创建测试用存储过程
as
begin
insertintot_test1values(@lsbh);
select'-1**这是一个存储过程返回自定义信息的测试例子';
end
go
--测试用的保存前检查WDSQL
deletefromwdsqlwherewdsql_djbh='BZHSTD'andwdsql_bh='004'
go
--保存前检查,如果含税单价和销售底价不一样,并且销售底价<>0,需要提示是否选择预提
insertintowdsql
values('S','004','BZHSTD',
'execpr_show_test@lsbh=?
','提示','含税单价和销售底价不一样,请选择预提',0)
Go
返回以下窗口:
帐期类问题可以通过以上两种方式进行处理,大于90小于30天返回-1,小于30返回1即可。
但是对于提示,确无法进行处理,这时我们可以分开为多条检查语句即可。
(3)特别注意,这样的写法不正确
insert into wdsql
values('S','001','BZHSTD',
'BEGIN
DECALRE@LSBHVARCHAR(20);
Set@lsbh=?
INSERTINTOT_TESTVALUES(‘‘新增加的’’,@lsbh);
updatet_testsetcol2=@lsbhfromt_testwherecol1=’’old’’;
select“-1**这是一个测试”;
end','','',’1’)
如果最后一列”WDSQL_CHECK”值为“1”,并且过程中要返回信息“select“-1**这是一个测试”;”就不能使用上面的语法“begin…end”。
需要把它们放到一个存储过程中。
如果没有“select“-1**这是一个测试”;”类似的返回信息,就可以
5.WDSQL的调试
增加了WDSQL后,往往不知道如何调试,其实也是较为简单的,下面以这样一个例子说明。
我要把发票表体的物料名称加逗号分割后更新到发票表头的xsfp_c7字段上。
相应的SQLServer下的wdsql如下,Oracle差不多:
/*启用,把发票明细上的物料名称更新到表头的一个字段上*/
insertintowdsql
values('S','910','BZHSFP','
begin
declare@lv_xsfp_lsbhvarchar(40)
declare@lv_wlmcvarchar(250)
declare@lv_tempvarchar(250)
set@lv_xsfp_lsbh=?
set@lv_wlmc=''''
DECLARExsfpmx_CursorCURSORFOR
SELECTLSWLZD_WLMCFROMXSFPMX,LSWLZDWHEREXSFPMX_WLBH=LSWLZD_WLBHANDXSFPMX_FPLS=@lv_xsfp_lsbh
OPENxsfpmx_Cursor
FETCHNEXTFROMxsfpmx_CursorINTO@lv_temp
WHILE@@FETCH_STATUS=0
BEGIN
set@lv_wlmc=@lv_wlmc+ltrim(rtrim(isnull(@lv_temp,'''')))+'',''
FETCHNEXTFROMxsfpmx_CursorINTO@lv_temp
END
CLOSExsfpmx_Cursor
DEALLOCATExsfpmx_Cursor
UPDATEXSFPsetXSFP_C7=substring(@lv_wlmc,1,250)WHEREXSFP_FPLS=@lv_xsfp_lsbh
end','提示','把发票明细上的物料名称更新到表头时出现错误!
',1)
go
(1)首先找到一张要测试的发票,假设找到的发票流水为‘104’
selectxsfp_c7,*fromxsfpwherexsfp_fpls='104'
(2)然后把对应的WDSQL语句复制到查询分析器中
begin
declare@lv_xsfp_lsbhvarchar(40)
declare@lv_wlmcvarchar(250)
declare@lv_tempvarchar(250)
set@lv_xsfp_lsbh=?
set@lv_wlmc=''''
DECLARExsfpmx_CursorCURSORFOR
SELECTLSWLZD_WLMCFROMXSFPMX,LSWLZDWHEREXSFPMX_WLBH=LSWLZD_WLBHANDXSFPMX_FPLS=@lv_xsfp_lsbh
OPENxsfpmx_Cursor
FETCHNEXTFROMxsfpmx_CursorINTO@lv_temp
WHILE@@FETCH_STATUS=0
BEGIN
set@lv_wlmc=@lv_wlmc+ltrim(rtrim(isnull(@lv_temp,'''')))+'',''
FETCHNEXTFROMxsfpmx_CursorINTO@lv_temp
END
CLOSExsfpmx_Cursor
DEALLOCATExsfpmx_Cursor
UPDATEXSFPsetXSFP_C7=substring(@lv_wlmc,1,250)WHEREXSFP_FPLS=@lv_xsfp_lsbh
End
(3)把语句中的set@lv_xsfp_lsbh=?
中的?
号换为‘104’,并执行,如果有问题继续修改调试即可
(4)把语句中的set@lv_xsfp_lsbh=‘104’中的‘104’再换为?
号
6.目前已实现WDSQL功能的单据
采购:
请购单、采购计划、报价单、询价单、价格审批单、采购协议、采购订单、采购发票
库存:
入库单、出库单
销售:
订单、提单、发票保存删除、回款保存删除
综合管理所有单据
7.其它说明
1.对于一般性的检查,语句基本上是通用的,但是对于复杂的检查和处理,不同的数据库会有不同的写法。
2.wdsql检查时针对整张单据的,不是针对明细的,但仍可处理部分明细问题的判断,比如判断明细的单价不能小于物料最低单价等
8.优点
1.提示统一在一个界面中,比触发器要规范
2.可以用户交互,允许用户终止或继续操作
3.对于好的控制点,可以内置到建账SQL中,增强系统功能,而又不用修改程序
4.可有效降低开发工作量,降低升级风险
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 关于 WDSQL 检查 使用说明