有一个表用来存储业务流程,即审批流程的定义,说明如下
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.   

    --1
    select * from tbName where charindex('|bmbegin|部門ID|bmend|', f_spyj)>0
      

  2.   

    4,如何在显示时,以下这些标记不要显示
    |linebegin|               --行前缀,表示一个部门的审批开始
    |lineend|               --行后缀,表示一个部门的审批结束
    |bmbegin|               --部门前缀,表示审批的部门
    |bmend|               --部门后缀,表示审批的部门
    |ygbmbegin|               --员工前缀,表示审批的部门的员工
    |ygbmend|               --员工后缀,表示审批的部门的员工
      

  3.   

    示例
    下例用 xxx 替换 abcdefghi 中的字符串 cde。SELECT REPLACE('abcdefghicde','cde','xxx')
    GO下面是结果集:------------
    abxxxfghixxx
    (1 row(s) affected)
      

  4.   


    declare @str varchar(100)
    set @str='|bmbegin|001|bmend|'
    select replace(replace(@str, '|bmbegin|', ''), '|bmend|', '')--result
    001(1 row(s) affected)
      

  5.   

    找到了001,也就找到了001的lineend,再找到linebegin即可,有方法吗?
      

  6.   

    2,如何判断所有审批已经全了
    关于这个,首先在f_spyj里面把所有'|bmbegin|部门|bmend|'中的部门取出来形成一个总的字符串,同时在tbnote_check_order里,把所有部门形成一行,两个字符串作比较,如果一致就表示已经全了,如何做?
      

  7.   

    一行可能有多個|linebegin|, |lineend| 是嗎?
      

  8.   

    这里的一行指的是一个部门的审批信息,字符数没有限制的,就是说一个部门的审批信息用linebegin和lineend括起来了,就把它理解成一对{}就行了
      

  9.   

    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)
    )
    就是不同的单据有不同的审批业务流程,上面我只是要求一种单据的业务流程,难道这么难写吗?
      

  10.   

    /*
    设计思路:先得到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
      

  11.   

    --测试环境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
    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
      

  12.   

    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
      

  13.   

    用Sql2005中的CLR,用C#来写这个存储过程应是很简单的
      

  14.   


    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
      

  15.   

    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
      

  16.   

    技术热贴 
    【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
      

  17.   

    工作流的项目建议参考wfmc或者bpel规范。