有一个表用来存储业务流程,即审批流程的定义,说明如下
f_bmbm表示需要经过审批的部门,f_xh 表示先后顺序,f_must表示流程中必须经过这个部门的审核
create table tbnote_check_order
(
f_xh int Not Null, --序号
f_bmbm varchar(15) Not Null, --部门编码
f_must int Not Null, --必须(0否1是)
Constraint tbnote_check_order_key Primary Key(f_xh)
)具体业务流程中,所有审批信息全部存储在另外一个字段f_spyj,这里面的格式是这样存储的|linebegin| --行前缀,表示一个部门的审批开始
|lineend| --行后缀,表示一个部门的审批结束
|bmbegin| --部门前缀,表示审批的部门
|bmend| --部门后缀,表示审批的部门
|ygbmbegin| --员工前缀,表示审批的部门的员工
|ygbmend| --员工后缀,表示审批的部门的员工举个例子,f_spyj里存的信息如下:
|linebegin|20070101|bmbegin|001|bmend||ygbmbegin|yg01|ygbmend|审要通过 |lineend|现在问题如下:
1,如何判断某个部门审批已经在了
2,如何判断所有审批已经全了
3,如何删除一条审批信息
f_bmbm表示需要经过审批的部门,f_xh 表示先后顺序,f_must表示流程中必须经过这个部门的审核
create table tbnote_check_order
(
f_xh int Not Null, --序号
f_bmbm varchar(15) Not Null, --部门编码
f_must int Not Null, --必须(0否1是)
Constraint tbnote_check_order_key Primary Key(f_xh)
)具体业务流程中,所有审批信息全部存储在另外一个字段f_spyj,这里面的格式是这样存储的|linebegin| --行前缀,表示一个部门的审批开始
|lineend| --行后缀,表示一个部门的审批结束
|bmbegin| --部门前缀,表示审批的部门
|bmend| --部门后缀,表示审批的部门
|ygbmbegin| --员工前缀,表示审批的部门的员工
|ygbmend| --员工后缀,表示审批的部门的员工举个例子,f_spyj里存的信息如下:
|linebegin|20070101|bmbegin|001|bmend||ygbmbegin|yg01|ygbmend|审要通过 |lineend|现在问题如下:
1,如何判断某个部门审批已经在了
2,如何判断所有审批已经全了
3,如何删除一条审批信息
select * from tbName where charindex('|bmbegin|部門ID|bmend|', f_spyj)>0
|linebegin| --行前缀,表示一个部门的审批开始
|lineend| --行后缀,表示一个部门的审批结束
|bmbegin| --部门前缀,表示审批的部门
|bmend| --部门后缀,表示审批的部门
|ygbmbegin| --员工前缀,表示审批的部门的员工
|ygbmend| --员工后缀,表示审批的部门的员工
下例用 xxx 替换 abcdefghi 中的字符串 cde。SELECT REPLACE('abcdefghicde','cde','xxx')
GO下面是结果集:------------
abxxxfghixxx
(1 row(s) affected)
declare @str varchar(100)
set @str='|bmbegin|001|bmend|'
select replace(replace(@str, '|bmbegin|', ''), '|bmend|', '')--result
001(1 row(s) affected)
关于这个,首先在f_spyj里面把所有'|bmbegin|部门|bmend|'中的部门取出来形成一个总的字符串,同时在tbnote_check_order里,把所有部门形成一行,两个字符串作比较,如果一致就表示已经全了,如何做?
(
f_djlxbm varchar(3) Not Null, --单据类型编码
f_xh int Not Null, --序号
f_bmbm varchar(15) Not Null, --部门编码
f_must int Not Null, --必须(0否1是)
Constraint tbnote_check_order_key Primary Key(f_djlxbm,f_xh)
)
就是不同的单据有不同的审批业务流程,上面我只是要求一种单据的业务流程,难道这么难写吗?
设计思路:先得到tbnote_check_order中全部必须审核的部门的数目,然后在对审批信息进行解码,遇到部门字符时进行判断是不是必须审核部门,
如果条件成立,则表示所有的审核流程中的其中一个已经满足,循环结束可得知审批信息中所包含的必须审核部门数目是否等于tbnote_check_order
中规定的数目
参数说明:
@vDjlxbm
表示要进行审核的单据类型
@vSpInfo
传入的审批信息字符串
返回参数:
@iIsOver
0表示没有
1表示全部通过
2表示没有审批流程
*/
create procedure p_SpIsOver(@vDjlxbm varchar(3),@vSpInfo varchar(8000),@iIsOver int output)
as
begin
declare @s as varchar(8000)
declare @i as int
declare @j as int
declare @len as int
declare @bm as varchar(30)
select @i=count(f_bmbm) from tbnote_check_order where f_djlxbm=@vDjlxbm and f_must=1
if @i>0
begin
set @len=len(@vSpInfo)
if @len=0
begin
set @iIsOver=0
return
end
else
begin
while @len>1
begin
if substring(right(@vSpInfo,@len),1,len('|bmbegin|'))='|bmbegin|'
begin
set @bm=substring(@vSpInfo,len(@vSpInfo)-@len+len('|bmbegin|')+1,charindex('|bmend|',right(@vSpInfo,@len))-len('|bmbegin|')-1)
select @j=count(f_bmbm) from tbnote_check_order where f_djlxbm=@vDjlxbm and f_must=1 and f_bmbm=@bm
if @j=1 set @i=@i-1
end
set @len=@len-1
end
if @i=0 set @iIsOver=1
else set @iIsOver=0
end
end
else
begin
set @iIsOver=2
return
end
end
(
f_djlxbm varchar(3) Not Null, --单据类型编码
f_xh int Not Null, --序号
f_bmbm varchar(15) Not Null, --部门编码
f_must int Not Null, --必须(0否1是)
Constraint tbnote_check_order_key Primary Key(f_djlxbm,f_xh)
)insert into tbnote_check_order
select 'abc',1,'001',1 union all
select 'abc',2,'002',0 union all
select 'abc',3,'004',1 declare @c int
exec p_SpIsOver 'abc','|linebegin|haha2007-1-1|bmbegin|001|bmend|hehe123|ygbmbegin|001|ygbmend|sdjklsd|lineend|',@c out
select @c--result
0declare @c int
exec p_SpIsOver 'abc','|linebegin|haha2007-1-1|bmbegin|001|bmend|hehe123|ygbmbegin|001|ygbmend|sdjklsd|lineend|
|linebegin|haha2007-2-1|bmbegin|004|bmend|hehe123|ygbmbegin|001|ygbmend|sdjkfddfdfssfdlsd|lineend|
',@c out
select @c
--result
1declare @c int
exec p_SpIsOver 'abc','|linebegin|haha2007-1-1|bmbegin|001|bmend|hehe123|ygbmbegin|001|ygbmend|sdjklsd|lineend|
|linebegin|haha2007-2-1|bmbegin|002|bmend|hehe123|ygbmbegin|001|ygbmend|sdjkfddfdfssfdlsd|lineend|
',@c out
select @c
--result
0declare @c int
exec p_SpIsOver 'abc','|linebegin|haha2007-1-1|bmbegin|001|bmend|hehe123|ygbmbegin|001|ygbmend|sdjklsd|lineend|
|linebegin|haha2007-2-1|bmbegin|002|bmend|hehe123|ygbmbegin|001|ygbmend|sdjkfddfdfssfdlsd|lineend|
|linebegin|haha2007-2-1|bmbegin|004|bmend|hehe123|ygbmbegin|001|ygbmend|sdjkfddfdfssfdlsd|lineend|
',@c out
select @c
--result
1
exec p_SpIsOver 'aaa','|linebegin|haha2007-1-1|bmbegin|001|bmend|hehe123|ygbmbegin|001|ygbmend|sdjklsd|lineend|',@c out
select @c
--result
2
create procedure p_SpIsExist(@vDjlxbm varchar(3),@vSpInfo varchar(8000),@vBm varchar(30),@iIsExist int output)
as
begin
select @iIsExist=count(*) from tbnote_check_order where charindex('|bmbegin|'+@vBm+'|bmend|', @vSpInfo)>0 and f_bmbm=@vBm and f_djlxbm=@vDjlxbm
endcreate function fun_getspinfo(@vSpInfo varchar(8000))
returns varchar(8000)
as
begin
return(isnull(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(@vSpInfo,'|linebegin|',''),'|lineend|',''),'|bmbegin|',''),'|bmend|',''),'|ygbmbegin|',''),'|ygbmend|',''),''))
endcreate function fun_DelBmSpyj(@vSpInfo varchar(8000),@vBm varchar(30))
returns varchar(8000)
as
begin
declare @w int
declare @len int
declare @line varchar(8000)
declare @s varchar(8000)
set @len=len(@vSpInfo)
if @len>0
begin
set @s=@vSpInfo
while @len>1
begin
if substring(right(@vSpInfo,@len),1,len('|linebegin|'))='|linebegin|'
begin
set @line=substring(@vSpInfo,len(@vSpInfo)-@len+1,charindex('|lineend|',right(@vSpInfo,@len))+len('|lineend|')-1)
set @w=charindex('|bmbegin|'+@vBm+'|bmend|',@line)
if @w>0 set @s=REPLACE(@vSpInfo,@line,'')
end
set @len=@len-1
end
end
else set @s=@vSpInfo
return isnull(@s,'')
end--测试
declare @s varchar(8000)
set @s='fdssdf|linebegin|haha2007-1-1|bmbegin|001|bmend|hehe123|ygbmbegin|001|ygbmend|sdjklsd|lineend|123'
select dbo.fun_DelBmSpyj(@s,'001')
--result
fdssdf123
set @s='fdssdf|linebegin|haha2007-1-1|bmbegin|001|bmend|hehe123|ygbmbegin|001|ygbmend|sdjklsd|lineend|123'
select dbo.fun_DelBmSpyj(@s,'004')--result
fdssdf|linebegin|haha2007-1-1|bmbegin|001|bmend|hehe123|ygbmbegin|001|ygbmend|sdjklsd|lineend|123
【VB基础类】 考考你,一行代码完成这道小题 (人气:264)
【C#】 我为这个问题哭了好久,大家帮帮我 (人气:239)
【SQL Server】 单据审批流程的sql如何写 (人气:176)
【ASP.NET 】 请教关于用户控件传值到aspx页 (人气:160)
【SQL Server】 简单统计问题100分 (人气:250)
【ASP.NET 】 [问个白痴问题]关于asp.net里的HTML~ (人气:138)
【VB.NET 】 祝大家元旦快快乐! (人气:126)
【C#】 50分求建议:搞软件开发,想买笔记本,大家给点建议 (人气:644)
【ASP.NET 】 asp.net,大家伙跟着它累不累? (人气:601)
【C/C++】 祝愿大家新年快乐 (人气:187)
【C#】 大文本文件的读取与写入 (人气:391)
【ASP】 asp生成HTM问题,急,请高手解决 (人气:263)
【.NET非技术】 新年到,发一个源码给大家,要的留下e_mail或QQ~~ (人气:616)
【J2SE基础类】 散分~~祝大家新年快乐!! (人气:155)
【ASP.NET 】 年前最后一问,来者有分!我用存储过程分页,我无法得到返回值,... (人气:267)
【C++ 语言】 熟悉链接器的符号解析的进来帮忙看看啊。cout<<hex<<(int)m... (人气:269)
【ASP.NET 】 散分:2006年最后一个贴子.祝全体csdn社区网友新年快乐,万事如意 (人气:183)
【ASP】 求解ASP动态生成表格的分页程序,比较难解 (人气:184)
【C++ 语言】 C++学习,请大家指点一下! (人气:664)
【J2SE基础类】 初学JAVA,什么教材上手比较好? (人气:717)
01月02日 21