前段时间以“开源:企业管理信息系统完全DIY,短平快,.NET源码大放送 ”为题在我的Blog上发在,布并被CSDN主页收录头条精华后,很多人来信问我“如何实现数据流代替工作流解决”?其实在公布的WebMIS快速开发的平台程序中已给出了答案,可能是有些朋友还没有下载的数据库分析的原因没有找到答案。前些天抽空帮着原客户维护了一下,想总结一下。
准备写一篇工作流的文章,标题就是“数据流代替工作流解决方案”。
如果大家有这方面的格式模板,请给我一个,不胜感激。在此简单的说下原理:例如,市场人员因为查看库存没有要的货物,于是填了一张采购申请单,要求某时要货给客户,这时,这张单据状态是未审核,所以,还不能进行采购计划(计划条件一:审核人不为空)。相关部门自动接收采购申请单数据(条件:审核人为空),于是根据实际情况审核。  采购计划人员在制作计划筛选的时候,发现有已审核的采购申请,于是可以实施下一步的工作流程,在制单过程中,数据源为已审核的采购申请数据。  采购计划后,也是根据情况审核...下一步工作...,计划单据审核成功后,采购申请人员可以查看自己申请的货物及计划状态,如果已采购,还可以查看采购到货后分配给自己的数量。  总之,信息管理理的就是数据,一切皆数据,一切皆数据流。

解决方案 »

  1.   

    代码:其实有了这个平台,代码就不用写了,配置就搞定,要写就写SQL,业务逻辑和工作流就体现在这里。
    打开配置,就发现申请单的数据显示视图如下:单据列配置:
    No|产品库ID|分类|质量等级|国标代码|片芯型号|规格|型号|需方代码|需方型号|执行标准|品牌型号|品牌|尺寸|组别|电压|容量|端头|引脚|其它特性|最小包装|包装形式|单位|不含税单价|税率|含税单价|数量|不含税金额|含税金额|要求到货日|客户编码|客户名称|客户订单号|紧急程度|扩展一|扩展二|扩展三|扩展四|已计划|待计划|计划状态|小注主表视图:
    Select fcOperator,Convert(nchar(10), fdMakeDate,120) ,fcApplicationNo,fcMemo
    From bps_Application
    Where fcApplicationNo='@ReceiptNo'明细表视图:
    Select 产品库ID,分类,质量等级,国标代码,国标型号,规格,型号,需方代码,需方型号,执行标准,品牌型号,品牌,
          尺寸,组别,电压,容量,端头,引脚,其它特性,最小包装,包装形式,单位,
          fnPrice 不含税单价,fnTaxRate 税率,fnTaxPrice 含税单价,fnQuantity 数量,fnAmount 不含税金额,fnTaxAmount 含税金额,
          Convert(char(10),fdIntoGoods,120) As 要求到货日,fcCustomerCode 客户编码,I_Customer.fcName 客户名称,
          fcCustomerOrderNo 客户订单号,fcExigentFlag 紧急程度,fcExpandA 扩展1,fcExpandB 扩展2,fcExpandC 扩展3,fcExpandD 扩展4,      dbo.GetApplicationQuantityOfPlan(bps_ApplicationDetail.fcApplicationNo,bps_ApplicationDetail.fgProductLibID)  As 已计划,
          fnQuantity - dbo.GetApplicationQuantityOfPlan(bps_ApplicationDetail.fcApplicationNo,bps_ApplicationDetail.fgProductLibID)  As 待计划,
          dbo.GetPlanStateForApplication(bps_ApplicationDetail.fcApplicationNo,bps_ApplicationDetail.fgProductLibID)  As 计划状态,      fcRe 小注
    From bps_ApplicationDetail
        Inner Join uv_ProductLibSelect
            On bps_ApplicationDetail.fgProductLibID=uv_ProductLibSelect.产品库ID
        --可能不指定客户,因此为左连接
        Left Join I_Customer
            On bps_ApplicationDetail.fcCustomerCode=I_Customer.fcCode
    Where fcApplicationNo='@ReceiptNo'
    Order By DetailSn这样,一张申请单搞定
      

  2.   

    工作流的下一步主要工作就是采购计划,采购计划数据流来源依据于很多,其中之一就是申请。
    单据列配置:
    No|产品库ID|分类|质量等级|国标代码|国标型号|规格|型号|需方代码|需方型号|执行标准|品牌型号|品牌|尺寸|组别|电压|容量|端头|引脚|其它特性|最小包装|包装形式|单位|不含税单价|税率|含税单价|计划数量|不含税金额|含税金额|到货日期|申请单号|申请人|申请数量|共计划|计划状态|已采购|小注主表视图:
    Select fcOperator As 制单人,Convert(nchar(10), fdMakeDate,120) As 制单日期,fcPlanNo As 单据编号,fcMemo As 备注
     From bps_Plan
    Where fcPlanNo='@ReceiptNo'明细表视图:Select 产品库ID,分类,质量等级,国标代码,国标型号,规格,型号,需方代码,需方型号,执行标准,品牌型号,品牌,
          尺寸,组别,电压,容量,端头,引脚,其它特性,最小包装,包装形式,单位,
          bps_PlanDetail.fnPrice 不含税单价,bps_PlanDetail.fnTaxRate 税率,bps_PlanDetail.fnTaxPrice 含税单价,
          bps_PlanDetail.fnQuantity 数量,bps_PlanDetail.fnAmount 不含税金额,bps_PlanDetail.fnTaxAmount 含税金额,
          Convert(nchar(10),bps_PlanDetail.fdIntoGoods,120) 计划到货日期,bps_PlanDetail.fcApplicationNo 申请单号,bps_Application.fcOperator 申请人,
          dbo.GetApplicationQuantity(bps_PlanDetail.fcApplicationNo,bps_PlanDetail.fgProductLibID) As 申请数量,
          dbo.GetApplicationQuantityOfPlan(bps_PlanDetail.fcApplicationNo,bps_PlanDetail.fgProductLibID) As 共计划,fcPlanState As 计划状态,
          dbo.GetPlanQuantityOfPurchase(bps_PlanDetail.fcPlanNo,bps_PlanDetail.fgProductLibID) As 已采购,
          bps_PlanDetail.fcRe 小注
    From bps_PlanDetail
        Inner Join uv_ProductLibSelect
            On bps_PlanDetail.fgProductLibID=uv_ProductLibSelect.产品库ID    --可能不走申请而直接选产品库,因此为左连接
        Left Join bps_Application
            On bps_PlanDetail.fcApplicationNo=bps_Application.fcApplicationNo
            
    Where fcPlanNo='@ReceiptNo'
    Order By bps_PlanDetail.DetailSn其实配置的列“国标型号”数据源参照选择配置的是一个存储过程名称“up_bps_PlanSelectApplication”up_bps_PlanSelectApplication实现如下:--采购计划中选择申请的产品并且审核有效且未关闭,按产品排序,同一产品按到货日期排,先要到货的先显示
    CREATE PROCEDURE up_bps_PlanSelectApplication  AS Select 产品库ID,分类,质量等级,国标代码,国标型号,规格,型号,需方代码,需方型号,执行标准,品牌型号,品牌,
          尺寸,组别,电压,容量,端头,引脚,其它特性,最小包装,包装形式,单位,
          fnPrice 不含税单价,fnTaxRate 税率,fnTaxPrice 含税单价,fnQuantity 数量,fnAmount 不含税金额,fnTaxAmount 含税金额,
          Convert(char(10),fdIntoGoods,120) As 要求到货日,bps_Application.fcApplicationNo 申请单号,bps_Application.fcOperator 申请人,
          dbo.GetApplicationQuantityOfPlan(bps_ApplicationDetail.fcApplicationNo,bps_ApplicationDetail.fgProductLibID)  As 已计划,
          fnQuantity - dbo.GetApplicationQuantityOfPlan(bps_ApplicationDetail.fcApplicationNo,bps_ApplicationDetail.fgProductLibID)  As 待计划,
          fcRe 小注
          --GetApplicationQuantityOfPlan(申请单号,产品ID),用于返回计划单中响应的申请单中指定产品数量
    From bps_ApplicationDetail
        Inner Join bps_Application
            On bps_ApplicationDetail.fcApplicationNo=bps_Application.fcApplicationNo
        Inner Join uv_ProductLibSelect
            On bps_ApplicationDetail.fgProductLibID=uv_ProductLibSelect.产品库ID
        Left Join I_Customer
            On bps_ApplicationDetail.fcCustomerCode=I_Customer.fcCode
    --Where fcApplicationNo='@ReceiptNo'
    Where Isnull(fcChecker,'') <> ''  --首先是审核人不为空,即要审核了的
               And Isnull(fbCancel,0) = 0 --其次是本单据没有被取消
               And Isnull(fbDefault,1)= 1 --再次,为了扩展加的条件
    --以上是固定条件,下面是其它条件
               --计划中响应申请的数量小于申请人申请的数量时显示
               And dbo.GetApplicationQuantityOfPlan(bps_ApplicationDetail.fcApplicationNo,bps_ApplicationDetail.fgProductLibID) < bps_ApplicationDetail.fnQuantity
               --只要计划终止的,不再显示
               And dbo.GetPlanStateForApplication(bps_ApplicationDetail.fcApplicationNo,bps_ApplicationDetail.fgProductLibID)<>'关闭' Order By 产品库ID,fdIntoGoods --按产品排序,同一产品按到货日期排,先要到货的先显示
    GO
      

  3.   

    由存储过程up_bps_PlanSelectApplication可知,逻辑包含在此,并实现工作流其实是采购计划数据流(来流)。数据库表
    S_ReceiptSetup 实现每个业务单据如“采购申请”、“采购计划”的界面配置及一些简单的业务逻辑配置,如标题、子标题、ISO文件号、表顶、表头、表脚、表底、多层表头、明细表列、列宽、有效性、完整性验证、格式、动态计算、合计等。S_ReceiptSetup还一个作用就是配置审核程序。
    如果单据的主表有fcChecker这个字段,你可以不用在S_ReceiptSetup配置审核程序,而是直接在表S_CheckReceiptConfig中填写,如:采购计划审核(fcCheckName字段)  采购计划(fcReceipName字段)当然,你也可以自己写审核的逻辑:
    如“撤销采购计划审核”的逻辑为:
    (fcFilterString字段)
    SELECT fcPlanNo + '|' + CONVERT(nchar(10), fdMakeDate, 120) + '|' + fcOperator AS t From bps_Plan Where IsNull(fcChecker,'')<>'' And fcPlanNo Not In (Select fcPlanNo From bps_PurchaseDetail Where bps_PurchaseDetail.fcPlanNo = bps_Plan.fcPlanNo)(fcUpdateString字段)Update bps_Plan Set fcChecker='' Where fcPlanNo='@ReceiptNo'采购申请的审核类同上面的“采购计划审核”。所以,申请单据填写后(主表明细表有数据),经过授权主管审核(fcChecker不为空了),采购计划的数据源就有了。工作流:申请--审核申请--计划,而这,就是用数据流做的。
      

  4.   

    不是很明白标题的意思,文字也写得不是很好懂,楼主所指的“被替代的”“工作流”系统里难道没有“数据流”的存在?“数据流”这个概念可是所有MIS系统都具备的,没听说过独立的“数据流”系统呀
      

  5.   

    大哥,你说的这些明明都是工作流,数据流是建立在工作流之上的,你自己不明白,请别乱混淆
    概念,我还以为你有多大的新创造呢!现在市场上有很多工作流中间件,这种中间件都支持数据流的传递,到网上查查什么叫BPM!现在CSDN档次是越来越低了!
      

  6.   

    晕,我也来一篇,《Ajax技术代替JavaScript网络技术》
      

  7.   

    强烈关注……woaiwanghuan(我不学习是猪) 你也可以把你的创新思想写一下来看看,flygoldfish这种精神很好不是所有人都能做的到啊
      

  8.   

    to:woaiwanghuan(我不学习是猪) 《Ajax技术代替JavaScript网络技术》
    不要进行人身攻击!!!把自己的想法拿出来和大家分享,你们能做到吗?关注本贴.
      

  9.   

    数据流反映的不就是工作流程的信息化吗,我喜欢称他为信息流,还是基于实际的工作流的吗,我们要做的其实是用数据流来反映工作流,并且规范化不标准业务流程,怎么说可以替代呢,难道在数据库里插两条数据,money就出来了.
      

  10.   

    可能不叫代替吧,不是说了“总之,信息管理理的就是数据,一切皆数据,一切皆数据流”么?
    如果说代替,其实是说我们并非要用现在吹得很虚的XXX“工作流”。
      

  11.   

    市场上确实吹的不少,什么XXX工作流,那是吹给用户听的,实质,不还是数据控制的。现在CSDN档次是越来越低了!?也许确实如此吧,今天刚刚看到飞刀的Blog,难怪飞刀“已经向CSDN提出辞职,不再担任了.Net
    大版主的职位了。 ”
    (http://feidao.cnblogs.com/archive/2005/10/18/256808.html)
    其中有一句:
    没有讨论,只有提问,久而久之,也就失去了当年的动力。我现在是要讨论,又不是搞什么学术论文,怎能搞得woaiwanghuan认为是档次太低?--------------------------------------
    woaiwanghuan(我不学习是猪) 
    大哥,你说的这些明明都是工作流,数据流是建立在工作流之上的,你自己不明白,请别乱混淆
    概念,我还以为你有多大的新创造呢!现在市场上有很多工作流中间件,这种中间件都支持数据流的传递,到网上查查什么叫BPM!现在CSDN档次是越来越低了!
      

  12.   

    bitsbird一语道破
    -----------------------------------------------------------------
    bitsbird(一瓢 在路上...) 
    搂主的意思是不是基于数据库数据操作的工作流,而非工作流引擎的组件?
      

  13.   

    楼主这是工作流吗? 好像只有数据流啊.而且, 所有MIS/CRM/ERP都会有这样的东东吧. 没有什么新意, 本来就和工作流不搭边的东西, 非要扯上一个工作流(有审核就是工作流?), 回头才发现逻辑没有那么复杂, 居然"以数据流代替工作流"...晕啊晕.支持楼主的分享精神.
    不过没有必要把代码写这么详细.
      

  14.   

    工作流机的脱离是一种进步,完全基于数据库数据操作的工作流系统伸展性和性能都不行呀------------------------------------------------------------------------------ flygoldfish(长江支流) ( ) 信誉:97  2006-05-10 16:49:00  得分: 0  bitsbird一语道破
    -----------------------------------------------------------------
    bitsbird(一瓢 在路上...) 
    搂主的意思是不是基于数据库数据操作的工作流,而非工作流引擎的组件?
      

  15.   

    难道楼主的数据流就是单纯的更改数据库吗,我觉得不合适吧,最起码要有FLAT FILE做依据吧
      

  16.   

    这样的东西有意义做。如果要做设计工具等图形化IDE可能会遇到困难。
      

  17.   

    ChumpKlutz(朽木) 应当更接近工作流的核心,就是业务是常变化的。
    工作流的核心应当是数据流的抽象。
      

  18.   

    ftiger说的有些道理,配置准备保存到XML或数据库。
    ---------------------------
    ftiger(哈哈鱼) 
    ChumpKlutz(朽木) 应当更接近工作流的核心,就是业务是常变化的。
    工作流的核心应当是数据流的抽象。
    图形化工具我现在已在AnyReport上实现了,以后如果项目需要,就搞出一个简单工作流。
    ------------------------------------
    zeusvenus(清柳)(C#/ASP.NET)
    这样的东西有意义做。如果要做设计工具等图形化IDE可能会遇到困难。
      

  19.   

    看看这个贴,根本不用写程序,为何要搞个工作流引擎?
    http://blog.csdn.net/flygoldfish/archive/2006/03/13/623115.aspx正如搞设计模式,本来一个很简单的问题,非要套一些模式,明明一个if就可以搞定,还要考试将来扩展扩展,导至花1块钱的成本要花10块钱甚至更多。总之,正过渡设计一样,我不需要的工作流引擎,用简单的数据流处理,为何需要强加进来?为何还要讲一些大道理?软件,讲究的实用,讲究扩展性,只有快速开发、维护方便的实用软件,才是好的软件。
    不知道吹吹吹工作流引擎讲一些大道理的朋友如何 想?
      

  20.   

    觉得superhasty(鸟儿自空中飞过) 的一句话说得FIT,“工作流的难点是高度抽象,而又能够具体化。就是用户或者维护人员能够自定义工作流。”,用楼主的想法来实现工作流,似乎比较难做到这点。
      

  21.   

    ------------------------------------------------------------------------------------
    正如搞设计模式,本来一个很简单的问题,非要套一些模式,明明一个if就可以搞定,还要考试将来扩展扩展,导至花1块钱的成本要花10块钱甚至更多。总之,正过渡设计一样,我不需要的工作流引擎,用简单的数据流处理,为何需要强加进来?为何还要讲一些大道理?软件,讲究的实用,讲究扩展性,只有快速开发、维护方便的实用软件,才是好的软件。
    ------------------------------------------------------------------------------------我非常赞同楼主的这一观点,但是设计模式很多时候重要的原因是因为项目管理,简单地来说,自己做一个程序,用不用设计模式都不重要,只要自己把代码写规整.流程做正确,早点Release 赚到money 就好,但是如果是一个100人同时开发的系统呢?参与开发的人越多往往导致代码量的增加,例如singleTon模式,完全就是因为考虑到每个人都可能去 new一个singleton对象而创造的,从性能上来将根本没有一点好处.我个人认为软件民工(我)和软件工程师(反正不是我)最大的区别就是软件工程师是站在工程的角度去考虑一个程序的,而亲爱的软件民工是站在代码的角度....我在说什么..
      

  22.   

    同意楼上,国内招人老这个条件那个条件的,很多无知的人宣称30岁搞不了软件了。不同下如下观点:
    我个人认为软件民工(我)和软件工程师(反正不是我)最大的区别就是软件工程师是站在工程的角度去考虑一个程序的,而亲爱的软件民工是站在代码的角度.工程的角度应是项目经理考虑的事情,软件工程师即使是普通的程序员,是用程序完成指定的功能需求。建议搞了一两年程序的人一定要看看设计模式,也许你已用了一些模式,但是为了交流方便以及学习一些前人大师的总结是很有必要的。
    说到这,友情链接卢彦一篇:
    设计模式学习经历(http://www.agilelabs.cn/blogs/linkin/archive/2006/04/07/853.aspx)
      

  23.   

    长江支流,我想呢误会helloworld的话了,他对“软件工程师”和“软件民工”的区分不是从职位或要干多少活干什么活的角度,而是从对软件工程的设计分析角度来进行区别的,一个是宏观、一个是微观。另外,项目经理考虑的是项目管理,而不是工程设计
      

  24.   

    好,有人提概念
    工作流简单或者不标准的时候,工作流怎么处理?
    作为产品,现在工作流厂家都在推引擎,组件
    和传统erp又怎么结合?
    所谓企业再造怎么实现?
      

  25.   

    本来任何东西不能绝对化。
    送用户一个简单的介绍企业的网站还要用设计模式?
    但是像ERP系统那么大的东西不用就不行。
      

  26.   

    工作流和数据流是两个不同的东西。
    工作流可以说是一个平台。数据流只是在这个平台上的一个应用而已。把数据流替换工作流?那不就是把QQ替换了windows了?
      

  27.   

    CSDN需要的是创新,是有价值的创新,不是胡说!
    如果把胡说都当作创新,那我们都是超级发明家了!我建议,以后在CSDN上发帖子,必须通过斑竹的审核才能发出来,
    不然CSDN都成垃圾堆了,苍蝇漫天飞!
      

  28.   

    从此没有专业了,大家都混吧,也不要什么设计了!呵呵......CSDN
      

  29.   

    面向对象很重要的一点就是让程序语言与业务模型更接近,其设计方式无疑更接近正常的思维方式,是为了解放程序设计人员,让他们更多专著于业务逻辑lz反其道而行之,把所有业务逻辑归并为sql语句,对于小规模业务软件来说,代码书写量小且运行效率高,但是随着程序规模的扩大,代码可读性差的缺点就逐渐暴露,并且牵一发可动全身,对大型系统确是在灾难程序员如果每天纠缠于非常难读的sql语句,难免体虚力戒,三十而衰怕是难于避免了hibernate之流的风采,设计模式的巧妙,都被楼主废除了,不知是好是坏
      

  30.   

    娱乐圈的人喜欢这样说:电影是上乘艺术,电视是下乘艺术,电影电视同样是挣钱,却的确有高下之分,柏林嘎那奥斯卡都是给电影的,很少听说导电视剧的成名导用sql确实同样可以实现所有逻辑,但是向往大项目走确实不易,程序员的高下也许就从这里成了分水岭
      

  31.   

    自动生成代码只能解决编写的问题,终归是编写程序的辅助,很多逻辑还是要由人完成,楼主说的完全不用写也太夸张了吧?
    是程序就有变更,企业应用的逻辑更始千变万化,比如更改主表的业务逻辑,楼主的思维是把所有有关的脚本更新一遍?那人工书写的代码不是被覆盖掉了?如果完全没有人工编码,那微软ibm都要附首称臣了