必须要说,SBO在中小型企业ERP软件中的确是佼佼者,灵活的配置,周延的考虑,不错的泛型适应性,友好的业务结构跟踪,强大的二次开发支持,尽管二次开发包帮助文件中似乎总是欲露还留的那么一手,让开发人员无法展开手脚在其之上自如的开发。
不过,据我观察,SBO也存在着设计上的缺陷--当然也可能是因为本人目前还没有琢磨透SBO的基础构架或者设计理念。今天在此向谈一谈的是SBO在单据对象--即凭证对象上的设计局限。
SBO的单据对象,至少由两个数据表予以业务支持,一个是我在描述中所谓的信息表--SBO中称之为凭证标题,另一个我称之为单据清单--SBO称之为凭证行,SBO的称呼更加合适。当然不同的单据对象在不同的管理方式下可能还存在着不同的业务表单支持,在此不予讨论。
单据信息表--凭证标题--用于记录单据发生时候的状态信息,同时记录了这个凭证的业务对象类型,对应的关键字段为:objType、docEntry、docNum、docDate,这几个字段分别是业务类型、凭证内部编号、凭证号码、凭证日期。尽管每个业务对象对应着不同的数据表,仍然在单据信息表中通过objType字段指明了业务类型。
单据清单--凭证行--用于记录了单据发生时单据项目对应的清单信息,包括项目在单据中所在的位置(LineNum)、项目内容(itemCode, Dscription)、项目发生属性(Quantity、Price、Currency等),同时指明了项目的业务类型(objType)。考虑到单据之间的互相引用,用baseType、baseEntry、baseNum、baseLinNum分别指明引用项在原业务单据中的属性即引用业务项目的业务类型、单据内部编号、单据号码、项目在清单中的行号;同时,单据还用TargetType、TargetEntry指明被引用的目标单据的类型和内部编号。
如果某个单据被另一个单据业务所引用,SBO也缺省在信息表中的备注和Ref1、Ref2字段中指明被引用单据的单据号码。
这的确是个不错的设计方案!熟悉算法的朋友们看到这种结构就会马上联想到双向链表吧,我曾经在电信97工程--电信营销系统中采用过类似的方法,我们当时的确称之谓面向数据表的双向链表,这种设计结构将不同的对象以链表的形式链接在一起了。
不过,用双向链表支持的业务总是简单的,支持更加复杂的多引用业务就会显得力不从心了。因为这个时候数据关系呈现的是树形结构。
是的,SBO是这样的,SBO的单据业务被引用后将导致被引用单据处于关闭状态,其它的单据业务对象无法再引用这张单据。无法让SBO的单据项被引用两次--特别被不同业务单据引用两次甚至更多次数,但是,这种业务还是有很多需求的。比如销售200台电视机,通过三次交货,每次分别交货80台、70台、50台,交货引用这个业务项目的时候,targetEntry到底应该怎么填写呢?结果是,或者根本无法实现多次交货--代客发货,很普遍的业务呀,或者这个targetEntry没有了实际意义。这还是同一业务的分次引用,事实上不同业务引用同一个单据项,又是怎样处理的呢?
不知道SBO到底怎样处理一个单据项目行被不同业务的多次引用是怎样处理的,但是通过其数据结构分析,应该很难支持。到底是因为对SBO了解的过于肤浅,还是SBO的设计局限甚至缺陷,在此还是留个问号吧!