关于WDSQL检查的使用说明.docx

上传人:b****2 文档编号:17158795 上传时间:2023-07-22 格式:DOCX 页数:14 大小:56.41KB
下载 相关 举报
关于WDSQL检查的使用说明.docx_第1页
第1页 / 共14页
关于WDSQL检查的使用说明.docx_第2页
第2页 / 共14页
关于WDSQL检查的使用说明.docx_第3页
第3页 / 共14页
关于WDSQL检查的使用说明.docx_第4页
第4页 / 共14页
关于WDSQL检查的使用说明.docx_第5页
第5页 / 共14页
关于WDSQL检查的使用说明.docx_第6页
第6页 / 共14页
关于WDSQL检查的使用说明.docx_第7页
第7页 / 共14页
关于WDSQL检查的使用说明.docx_第8页
第8页 / 共14页
关于WDSQL检查的使用说明.docx_第9页
第9页 / 共14页
关于WDSQL检查的使用说明.docx_第10页
第10页 / 共14页
关于WDSQL检查的使用说明.docx_第11页
第11页 / 共14页
关于WDSQL检查的使用说明.docx_第12页
第12页 / 共14页
关于WDSQL检查的使用说明.docx_第13页
第13页 / 共14页
关于WDSQL检查的使用说明.docx_第14页
第14页 / 共14页
亲,该文档总共14页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

关于WDSQL检查的使用说明.docx

《关于WDSQL检查的使用说明.docx》由会员分享,可在线阅读,更多相关《关于WDSQL检查的使用说明.docx(14页珍藏版)》请在冰点文库上搜索。

关于WDSQL检查的使用说明.docx

关于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.可有效降低开发工作量,降低升级风险

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 医药卫生 > 基础医学

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2