日期:2014-05-19  浏览次数:20758 次

单据审批流程的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)