首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

单据审批流程的sql怎么写

2012-01-29 
单据审批流程的sql如何写有一个表用来存储业务流程,即审批流程的定义,说明如下f_bmbm表示需要经过审批的部

单据审批流程的sql如何写
有一个表用来存储业务流程,即审批流程的定义,说明如下
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,如何删除一条审批信息



[解决办法]
--1
select * from tbName where charindex( '|bmbegin|部門ID|bmend| ', f_spyj)> 0

[解决办法]
用replace()函數
[解决办法]

declare @str varchar(100)
set @str= '|bmbegin|001|bmend| '
select replace(replace(@str, '|bmbegin| ', ' '), '|bmend| ', ' ')

--result
001

(1 row(s) affected)

[解决办法]
這樣的表結構不好做
[解决办法]
一行可能有多個|linebegin|, |lineend| 是嗎?
[解决办法]
学习
[解决办法]
表結構有間題
[解决办法]
/*
设计思路:先得到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
[解决办法]
--测试环境

create table 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)
)

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
0

declare @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
1

declare @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
0

declare @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

[解决办法]
declare @c int
exec p_SpIsOver 'aaa ', '|linebegin|haha2007-1-1|bmbegin|001|bmend|hehe123|ygbmbegin|001|ygbmend|sdjklsd|lineend| ',@c out
select @c
--result
2
[解决办法]
用Sql2005中的CLR,用C#来写这个存储过程应是很简单的
[解决办法]

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
end

create 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| ', ' '), ' '))
end

create 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

[解决办法]
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, '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
[解决办法]
不太明白LZ的意思
多部门审批流???
[解决办法]
认为还是该改设计
[解决办法]
工作流的项目建议参考wfmc或者bpel规范。
[解决办法]
只会oracle的.

热点排行