库存成本核算系统的需求分析和系统设计.doc_第1页
库存成本核算系统的需求分析和系统设计.doc_第2页
库存成本核算系统的需求分析和系统设计.doc_第3页
库存成本核算系统的需求分析和系统设计.doc_第4页
库存成本核算系统的需求分析和系统设计.doc_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

实习题:库存成本核算系统 设计一个库存成本核算程序STOCK。位于世界贸易大厦底层的成本部管理着食品仓、日用仓、烟酒仓等仓库,并将仓库中的货物调拨给超级市场、西餐厅、酒吧、潮江春等部门。采购货物进仓时,进库单上记录着货物的编号、数量以及金额;部门领料时,出库单上记录着货物的编号与数量,出库金额(即成本)是根据先进先出的原则计算的。成本部要求掌握每日进货与领料的明细清单,以及每一样货物的最新库存数量与金额。每个月终还要求汇总每一个仓库本月的采购数量与金额(每一样货物的明细以及小计)、每一个部门本月的领料数量与金额(每一样货物的明细以及小计)。(提示:完成你的类设计后,请考虑以下问题:有了新的货物品种后可以加入吗?有了新的仓库也可以管理吗?大厦新开了一间日本料理店,你的程序可以处理吗?如果发现以前的入库单或出库单录入时有错,你的程序是否允许修改?如果可以修改,相应的成本是否可以正确地重新调整?)首先明确系统功能,上述需求中以下句子涉及系统功能:1.成本部管理着食品仓、日用仓、烟酒仓等仓库;2.成本部将仓库的货物调拨给超级市场、西餐厅、酒吧、潮江春等部门;3.(成本部)采购货物进仓;4.部门领料,领料时要按照先进先出的原则计算成本(出库金额);5.成本部要掌握每日进货与领料的明细清单;6.成本部要掌握每一样货物的最新库存数量和金额;7.每个月终要求汇总每个仓库本月的采购数量与金额(每一样货物的明细及小计);8.每个月终要求汇总每个部门本月的领料数量与金额(每一样货物的明细及小计)。上述功能需求可归纳为以下几条:1.入库管理:包括采购货物进仓、查询每日进货明细清单以及月终汇总;2.部门领料:包括部门从仓库领料、查询每日领料明细清单以及月终汇总;3.库存查询:成本部要掌握每一样货物的最新库存数量和金额;对系统功能有初步了解后,考虑系统的可能对象。可发现下面一些可能对象:1.成本部;2.仓库,很容易地知道,仓库应该是类,而食品仓、日用仓、烟酒仓等是对象;3.部门,部门是类,而超级市场、西餐厅、酒吧、潮江春等是对象;4.进库单和出库单;5.每日进货与领料清单,每月汇总的进货与领料表。不难发现“成本部”是系统的使用者,系统并不需要对其信息进行保存和加工,可以说是系统边界外的活动者。而“每日的进货与领料清单,每月汇总的进货与领料表”可由进库单与出库单计算得到。根据“库存查询”功能得知系统最好设置“库存货物”对象,以保存最新的库存数量和金额,当然最新库存数量和金额也可通过进库单和出库单计算得到,但这种计算很复杂,而且仓库就是用于保存货物的,所以设置库存货物对象也很合理,有应用领域所对应的事物。同理也应增加“货物”对象,以保存有关货物的一般信息。因此,初步得到的对象包括:1.仓库:保存仓库的信息;2.部门:保存部门的信息;3.货物:保存货物的一般信息;4.进库单:货物进库的凭证;5.出库单:部门领料的凭证;6.库存货物:保存存放在仓库中货物的信息。下面考虑每个对象的属性:1.仓库:应至少有名称,而且最好每个仓库有一个编码,因为仓库的名称可能不唯一,也可能很长,不适合用于唯一区分每个仓库。根据常识,仓库属性可能还包括地点,容量等。但经分析可发现,这些属性与系统功能无直接关系,是可有可无的属性。2.部门:至少有编码和名称,也许还有负责人等,但该属性也是可有可无的。3.货物:至少有编码和名称。可能还要对货物进行分类,例如分为食品类、日用类、烟酒类等,货物分类可用编码体现。通常许多行业经营管理的货物都有其分类和编码标准。4.进库单:应该有进库日期、进库仓库、进库货物的数量和金额,不难知道,每个进库单可能进库多种货物,因此应使用进库货物对象保存每个进库单的某个进库货物信息,包括货物编码、名称、数量和金额等。进库单可能还需要经手人等属性。5.出库单:应该有出库日期、出库仓库、领料部门、出库货物的数量和金额,同样应使用出库货物对象保存某个出库货物的信息,包括货物编码、名称、数量和金额等。出库单也可能还需要有经手人等属性。6.库存货物:至少有存货仓库、货物编号、货物数量和货物金额等属性。下面考虑每个对象应提供的服务:1.对于仓库、部门、货物等对象,从完成系统功能角度看,没有特别的服务需要提供,主要用于保存某些信息。如果从实现角度看,它们也许需要提供一些简单服务,例如根据仓库编号查找相应名称等,这些服务可在设计阶段再仔细考虑。2.进库单:根据系统功能应提供货物进库、汇总每日货物进库清单、汇总每月货物进库总数等服务。3.出库单:根据系统功能应提供货物出库、汇总每日货物出库清单、汇总每月部门领料总数等服务。4.库存货物:至少应提供取某种货物当前最新数量和金额,根据进库单或出库单修改货物当前最新数量和金额等服务。至此已经得到了整个系统的轮廓,但读者肯定还会觉得有不少模糊之处。这主要是因为对货物进库以及货物出库这两个功能还没有作更进一步的分析,在对这两个关键的功能进行分解后,就可以更加确定对象所应提供的属性和服务。在分解这两个功能前分析一下上述对象之间的关系很有用处,这使得我们对这些对象可有更深入的了解。因为考虑消息连接会涉及许多服务的实现细节,所以消息连接在分解上述两个关键功能后再考虑。这里先考虑对象间的继承关系、聚合关系和实例连接。首先考虑继承关系,最容易想到的继承关系可能是,库存货物是否能继承货物类?另外进库货物和出库货物是否也可继承货物类?而且不难发现进库单和出库单有许多相同的属性和行为,是否能为它们设置共同的基类,例如称为“库存单据”?其次考虑聚合关系,发现有进库货物是进库单的部分类,出库货物是出库单的部分类。最后考虑实例连接,可发现有如下实例连接:1.仓库管理库存货物,每个仓库管理多个库存货物,而一种库存货物只由一个仓库存放,因此这是一对多的关系。2.仓库采购货物进库,并产生进库单,每一次采购产生一个进库单,一个进库单有多种采购的进库货物。3.部门从仓库领料,并产生出库单,多个部门从多个仓库领料,但每一次领料产生一个出库单,一个出库单有多种出库货物。在深入思考这些对象类及其关系时,读者也许会感觉到有一个越来越突出的问题,就是上面初步确定的对象类到底代表该类的某个对象的类型,还是代表该类的所有对象的全体?例如,对于入库单,到底指某具体的入库单的抽象描述,还是所有入库单的全体的抽象描述?我们认为这是习惯用C+语言思考的开发人员在开发管理信息系统这类软件时常常迷惑的问题。C+语言的类就是对象的类型,从而容易产生这种误解。我们认为类倾向于是全体对象所具有的共同特性的抽象,而对象的类型更倾向于是单个对象的抽象。为分开这两种不同的类,确定系统要实现的类包括:1.仓库编码表类STORAGE_LIST和仓库类STORAGE:仓库编码表类用于模拟所有仓库的全体,对具体的仓库类对象进行管理,包括增加、修改和删除仓库对象等。2.部门编码表类DEPART_LIST和部门类DEPART。3.货物编码表类GOODS_LIST和货物类GOODS。4.进库单清单类PURCHASE_BILL_LIST和进库单类PURCHASES_BILL,进库单清单类表示所有进库单的全体,这样汇总每日货物进库清单、汇总每月货物进库总数等行为应属于进库单清单类对象的行为,而不是某具体进库单的行为。同样,进库货物的全体为进库货物清单类PURCHASE_GOOD_LIST,而某具体进库货物为PURCHASE_GOOD.5.出库单清单类SELL_BILL_LIST和出库单类SELL_BILL,以及出库货物清单类SELL_GOOD_LIST和出库货物类SELL_GOOD。6.库存货物清单类STORAGE_GOOD_LIST和库存货物类STORAGE_GOOD。不难看出,在系统中代表所有对象全体的类象容器类,用于存放和管理其它对象,所以在实现时它们应用数组或链表表示,或者若用数据库存放则代表数据库表本身的抽象,而那些由具体对象抽象得到的类是数据库表的记录的抽象。但是否用数据库实现,现在还暂时不用考虑。现在需进一步分析上述类应具有的属性和行为,那些由具体对象的抽象得到的类,应保存上述分析中得到的各种属性,行为应该主要是设置和返回这些属性的值。而对于管理具体对象的类,其属性应是一个数组或者一个链表,行为则包括创建、修改、删除和查找所管理的对象。当然,这些类的更多行为还需在对进库和出库功能的分解后才能确定。对于进库,其过程可分解如下:1.填写进库单,包括进库日期、进库单编号、进库仓库及进库货物的数量、金额等;2.检查进库单的正确性,例如进库仓库的正确性、货物编码的正确性,数量和金额不能为零等。3.对进库单的每种货物,修改进库仓库的库存货物的数量和金额。为更深入理解进库功能,使用Use Case交互图描述该功能如下: Use Case 进库单清单类 进库单类 仓库类 货物类 库存货物类填写进库单 创建进库单检查进库单 读取指定编号的仓库信息FOR 进库单的每种货物 DO检查货物信息的正确性 读取指定编号的货物信息ENDFORFOR 进库单的每种货物 DO修改库存货物信息 修改库存货物信息ENDFOR注意:上图只是简单地说明进库时所要涉及的对象类,没有详细给出对象类之间的消息交互,至少进库单类、仓库类、货物类和库存货物类向进库单清单类发回的返回消息没有标记出来。实际管理时,填写进库单与审核进库单及修改库存货物可能不是同时进行,且往往由不同的经手人员处理。因此应将进库单划分为两种状态,一是进库前状态,一是进库后状态,进库前可进行修改、删除,进库后则真正修改了库存货物的信息,该进库单不能再被修改和删除。如果发现已进库的进库单有错,那么要更正这种错误则十分麻烦,因为这不仅要重新修改库存货物信息,还要重新计算出库单成本(即出库金额)。实际管理时将填写进库单与真正进库分开也就是为尽量减少这种错误。因此进库单的状态转换关系是: 创建进库单 进库前 修改库存货物信息 进库后对于出库,其过程可分解如下:1.填写出库单2.检查出库单的正确性3.根据出库单中的每种货物进行出库,这时要计算每种出库货物的出库金额对于第三步,还需作进一步分解,这一步的分解与成本计算方法有关,除教材介绍的先进先出法外,还有移动平均法(该方法用计算机最易处理)、后进先出法等,每种方法得到的出库金额都不一样。这里根据题目要求,使用先进先出法计算每一货物的出库金额:3.1检查库存货物数量是否小于出库货物数量,如果小于,则出库不成功!否则,3.2检查库存货物数量是否等于出库货物数量,如果等于,则出库金额等于库存货物金额(即货物数量出完,金额也出完)。否则,3.3令已出库货物数量为零,已出库货物金额为零,下面称出库单中的出库货物数量为总出库货物数量。3.4做下面的步骤,直到已出库货物数量等于总出库货物数量:3.4.1查找进库时间最早且有剩余数量的进库单3.4.2如果该进库单中的剩余数量小于或等于总出库货物数量减去已出库货物数量,则已出库数量等于原先的已出库数量加上该进库单的剩余数量,已出库金额等于原先的已出库金额加上该进库单的剩余金额,同时该进库单剩下的数量和金额置为零。否则,3.4.3令临时数量等于总出库货物数量减去已出库货物数量,临时单价等于该进库单的金额除以该进库单的数量,临时金额等于临时数量乘以临时单价,而已出库金额等于原先的已出库金额加上该临时金额,已出库货物数量等于总出库货物数量。进库单的剩余数量为原来数量减去临时数量,剩余金额为原先的金额减去临时金额。3.5出库单中的库存金额置为刚才计算出来的已出库货物金额。而且将库存货物数量置为原先的库存货物数量减去已出库货物数量,库存货物金额置为原先的库存货物金额减去已出库货物金额。实现上述算法的关键是能找到进库时间最早的没有出完其数量的进库单,这要求进库单在逻辑上能按进库时间排序,并且要记录每个进库单的剩余数量和金额。上述算法十分详细,这里不再使用Use Case和交互图方法给出该功能的进一步说明。出库单也应有两种状态,即出库前与出库后两种状态。为进一步明确各对象类的属性和行为,现在重新考虑各对象类之间的关系,并进一步考虑如何增加对象的属性和行为以体现这种关系。对于继承关系,可考虑为所有管理性质的类抽象出一个基类,例如命名为数据表类DATA_LIST,其主要行为与链表类或数组类相同,但也有与待开发系统密切相关的属性和行为,例如若使用数据库的话,那么该类应负责完成与数据库接口的公共功能,若使用文件系统的话,那么负责与文件系统的接口。设置类DATA_LIST后,就也应为其所管理的的对象抽象出基类,这命名为数据记录类DATA_RECORD。也可让库存货物继承货物类,而让进库货物和出库货物再继承库存货物类。库存货物和出库货物只比一般货物增加数量和金额两个属性,进库货物则除增加这两个属性外,还要增加剩余数量和剩余金额两个属性。提供的服务则主要用于设置和返回各属性的值。我们认为没有必要增加库存单据类作为进库单和出库单的共同基类,其原因是,一是这两种单据包含不同货物,为货物设置的基类不适合作为库存单据类所包含的货物。二是进库单和出库单类的属性和行为都不复杂,增加共同基类所提供的代码重用意义不大。聚合关系仍只存在于进库单与进库货物,出库单与出库货物之间。当然也可认为管理性质的类与它所管理的类都具有聚合关系,但我们更倾向于将这种关系理解为利用关系。对于实例连接,考虑怎样体现仓库管理库存货物这个实例连接,这可在仓库类中设置库存货物清单对象,用于代表该仓库存放的货物,也可在库存货物类使用所属仓库的属性指明该货物由哪个仓库存放。后一种方法更简单,因此这里采用后一种方法。对于仓库采购货物进库的实例连接,也采用进库单类中增加进库仓库的属性标识该进库单所进库的仓库。对于部门从仓库领料的实例连接,则在出库单类中增加出库仓库以及领料部门的属性。读者可能发现这里已涉及了许多实现细节。实际上现在应该已经算进入了设计阶段。不过面向对象方法的分析阶段和设计阶段本来就没有严格的界限。现在要决定的事情是用数据库保存信息,还是用文件系统保存信息。如果用文件系统保存信息,就要设计文件系统的结构,显然用数据库比较简单。这时需要设计数据库,决定使用哪些数据库,各数据库使用哪些字段等。根据上述分析,再加上一点点数据库设计知识(这些知识将在数据库课程学到)就可设计本系统的数据库,这里不再详细给出数据库的设计。在设计阶段还要确定的事情是如何设计用户界面。C+语言提供的输入输出流的功能显然不够。一般来说,当前流行的C+语言编程环境,如Visual C+或C+ Builder都会提供许多有关界面的类库,实际开发软件时要利用这些类库。用户界面的实现更多地依赖于编程环境所提供的类库,但也有一些决策点,需要在设计阶段的早期确定,包括使用下拉菜单还是使用图标,使用基于浏览器的界面,还是非浏览器界面等等。这里我们也不设计用户界面。至此,需要实现的类包括:1.数据表类DATA_LIST,用于提供管理性质类的共同基类;2.数据记录类DATA_RECORD,用于提供被管理的对象的共同基类;3.仓库编码表类STORAGE_LIST,管理所有仓库信息;4.仓库类STORAGE,具体仓库信息的抽象;5.部门编码表类DEPART_LIST,管理所有部门信息;6.部门类DEPART,具体部门的信息的抽象;7.货物编码表类GOODS_LIST,管理所有货物的编码;8.货物类GOODS,具体货物信息的抽象;9.进库单清单类PURCHASE_BILL_LIST,管理所有进库单;10.进库单类PURCHASE_BILL,具体进库单信息的抽象;11.进库货物清单类PURCHASE_GOOD_LIST,管理某进库单的所有进库货物;12.进库货物类PURCHASE_GOOD,进库单的某具体进库货物信息的抽象;13.出库单清单类SELL_BILL_LIST,管理所有出库单;14.出库单类SELL_BILL,具体出库单信息的抽象;15.出库货物清单类SELL_GOOD_LIST,管理某出库单的所有出库货物;16.出库货物类SELL_GOOD,出库单的某具体出库货物信息的抽象;17.库存货物清单类STORAGE_GOOD_LIST,管理所有库存货物;18.库存货物类STORAGE_GOOD,具体库存货物信息的抽象。根据上述分析,下面使用C+语言给出每个类的主要数据成员和成员函数,当然这些类界面在实现时可能还要作进一步的细化和修改。/ 数据记录类DATA_RECORD,用于提供被管理的对象的共同基类class DATA_RECORD public:/ 使用数据库存放对象的真正信息,这里的虚函数load()用于从数据库读取当前记录(对象)/ 的信息。save()用于将当前对象信息保存到数库当前记录中。返回值表示操作是否成功。virtual int load() = 0;virtual int save() = 0;/ 使用与用户界面有关的构件,给出输入对象信息的界面,并保存有关的信息。virtual int input() = 0;/ 使用与用户界面有关的构件,输出一个对象的信息。virtual int output() = 0;/ 数据表类DATA_LIST,用于提供管理性质类的共同基类class DATA_LIST public:DATA_LIST(char* base);/ 参数base指定数据库名称。DATA_LIST();/ 增加一个对象。返回值用于表示操作是否成功。virtual int add(const DATA_RECORD& obj);/ 删除一个对象,参数obj只包含该对象的关键码属性的值。后面的设计指出了每个/ 从DATA_RECORD类派生的类的关键码属性。返回值用于表示操作是否成功。virtual int remove(const DATA_RECORD& obj);/ 修改一个对象,参数old存放旧的对象的关键码属性的值,参数new_obj存放该对象的/ 新的属性值。返回值用于表示操作是否成功。virtual int modify(const DATA_RECORD& old, const DATA_RECORD& new_obj);/ 查找对象,参数obj给出所要查找的对象的关键码属性的值。返回值表示是否找到。virtual int locate(DATA_RECORD& obj);/ 返回第一个对象,返回值表示是否有第一个对象。virtual int get_first(DATA_RECORD& obj);/ 返回下一对象,返回值表示是否有下一对象。调用get_first()后,连续调用get_next()可得到/ 数据库保存的所有对象。这两个函数的实现依赖于数据库的接口构件,例如数据库一般提供/ 当前记录的概念。通常数据库的接口构件也会提供与这两个函数类似的功能。virtual int get_next(DATA_RECORD& obj);protected:/ 数据表类用于完成与数据库的接口(准确地说是完成与数据库接口构件,如ODBC构件的接/ 口),用以屏蔽数据存放方式。从其它类看来只需知道可通过设置关键码属性得到一个对象/ 的信息,或顺序地可获得所有对象的信息,至于这些对象信息的存储、组织方式则完全不需/ 要关心。因此此类的属性依赖于数据库接口构件,通常用于作为缓冲区,存放从数据库接口/ 构件获得的对象的有关信息。char* base_name;/ 存放数据的数据库名称;/ 仓库编码表类STORAGE_LIST,管理所有仓库信息class STORAGE_LIST: public DATA_LIST public:STORAGE_LIST(char* base);/ 必要时要重定义DATA_LIST的部分成员函数。/ 不难设想如何实现仓库信息的管理。假定界面构件能让用户发出插入仓库的请求,在接收到/ 该请求时,该构件创建一个STORAGE对象,并调用其input()函数输入STORAGE对象的信/ 息,然后调用STORAGE_LIST对象(这个对象应早已创建)的add()函数将该STORAGE对/ 象增加到数据库。修改和删除仓库对象的方法类似。/ 因此为管理仓库信息,要使用类STORAGE的对象保存某个仓库的信息,并提供界面在必要/ 时输入仓库的信息。类STORAGE_LIST的对象负责与数据库接口,对外屏蔽仓库信息的存/ 储方式。有关的界面构件则与用户进行交互,并驱动这两个类完成插入、修改和删除等管理/ 工作。这里与数据库接口的构件(考虑如何存储信息)、与用户交互的构件(考虑如何得到/ 信息),以及所处理的信息本身的抽象这三个构件分开,使得整个系统的结构更为清晰。/ 其他信息,如货物编码、部门编码等的管理(插入、修改和删除等)类似,不再赘述。;/ 仓库类STORAGE,具体仓库信息的抽象class STORAGE: public DATA_RECORD public:STORAGE(char* code = NULL, char* name = NULL);STORAGE();/ 重定义在DATA_RECORD所定义的纯虚函数virtual int load();virtual int save();virtual int input();virtual int output();/ 设置仓库属性的值void set_code(char* code);void set_name(char* name);/ 返回仓库属性的值char* get_code();char* get_name();protected:char* code;/ 仓库编号char* name;/ 仓库名称/ 暂时只考虑这两个属性,因为其他的属性对于成本核算来说不是必需的。;/ 部门编码表类DEPART_LIST,管理所有部门信息class DEPART_LIST: public DATA_LIST public:DEPART_LIST(char* base);/ 部门类DEPART,具体部门信息的抽象class DEPART: public DATA_RECORD public:DEPART(char* code = NULL, char* name = NULL);DEPART(); / 重定义在DATA_RECORD所定义的纯虚函数/ 设置部门属性的值void set_code(char* code);void set_name(char* name);/ 返回部门属性的值char* get_code();char* get_name();protected:char* code;/ 部门编号char* name;/ 部门名称;/ 货物编码表类GOODS_LIST,管理所有货物的编码;class GOODS_LIST: public DATA_LIST public:GOODS_LIST(char* base);/ 货物类GOODS,某个货物的有关信息的抽象;class GOODS: public DATA_RECORD public:GOODS(char* code = NULL, char* name = NULL);GOODS(); / 重定义在DATA_RECORD所定义的纯虚函数/ 设置货物属性的值void set_code(char* code);void set_name(char* name);void set_unit(char* unit);/ 返回货物属性的值char* get_code();char* get_name();char* get_unit();protected:char* code;/ 货物编号char* name;/ 货物名称char* unit;/ 计量单位/ 实际系统中,货物规格型号可能也是一个很重要的属性,货物编码不可能编制得很细致,/ 同一编号、不同型号货物的价格等可能大不相同。这里为简单起见,暂不考虑货物规格型号。;/ 进库单清单类PURCHASE_BILL_LIST,管理所有进库单class PURCHASE_BILL_LIST: public DATA_LIST public:PURCHASE_BILL_LIST(char* base);/ 将指定的进库单进库,其实现详情请参见上面的分解int check_in_storage(const PURCHASE_BILL& bill);/ 返回指定日期范围内的所有进库单,可利用该服务汇总每日进库清单int get_all_bills(char* start_date, char* end_date, PURCHASE_BILL_LIST* bills);/ 对指定日期范围内的进库单进行汇总,返回进库货物的总数和金额等int total_all_bills(char* start_date, char* end_date, GOODS_LIST* goods);/ 给定货物,给出其剩余数量和金额大于零的最早进库单int get_the_pioneer(const GOODS& goods, PURCHASE_BILL& bill);/ 单据状态enum STATUS NO_CHECK,/ 该单据刚刚输入,还没有进库或者出库CHECKED/ 该单据已经进库或者出库;/ 进库单类PURCHASES_BILL,具体进库单信息的抽象class PURCHASE_BILL: public DATA_RECORD public:PURCHASE_BILL();PURCHASE_BILL();/ 设置进库单各属性的值int set_no(char* no);int set_date(char* date);int set_storage(char* storage);int set_good(PURCHASE_GOOD_LIST* good);int set_status(STATUS status);/ 返回进库单各属性的值char* get_no();char* get_date();char* get_storage();PURCHASE_GOOD_LIST* get_good();STATUS get_status();/ 查找是否有指定的货物,如果有则返回其数量和金额,剩余金额和数量等信息int find(PURCHASE_GOOD& good);protected:char* no;/ 进库单编号char* date;/ 进库时间char* storage;/ 进库仓库PURCHASE_GOOD_LIST* good_list;/ 进库货物STATUS status;/ 进库货物清单类PURCHASE_GOOD_LIST,管理某进库单的所有进库货物class PURCHASE_GOOD_LIST: public DATA_LIST public:PURCHASE_GOOD_LIST(char* base);/ 装入指定进库单号的所有进库货物的清单int load(char* bill_no);/ 查找是否有指定的货物,如果有则返回其数量和金额,剩余金额和数量等信息int find(PURCHASE_GOOD& good);/ 进库货物类PURCHASE_GOOD,进库单的具体进库货物信息的抽象class PURCHASE_GOOD: public GOODS public:PURCHASE_GOOD();PURCHASE_GOOD();/ 返回进库货物的各属性double get_qty();double get_cost();double get_remain_qty();double get_remain_cost();/ 设置进库货物的各属性int set_qty(double qty);int set_cost(double cost);int set_remain_qty(double qty);int set_remain_cost(double cost);protected:double qty;/ 货物数量double cost; / 货物金额double remain_qty;/ 出库后货物剩余数量double remain_cost;/ 出库后货物剩余金额;/ 出库单清单类SELL_BILL_LIST,管理所有的出库单class SELL_BILL_LIST: public DATA_LIST public:SELL_BILL_LIST(char* base);/ 将指定的出库单出库,其实现详情请参见上面的分解int check_out_storage(const SELL_BILL& bill);/ 返回指定日期范围内的指定部门的所有出库单,可利用该服务汇总每日出库清单int get_all_bills(char* start_date, char* end_date, char* depart, SELL_BILL_LIST* bills);/ 对指定日期范围内的出库单进行汇总,返回出库货物的总数和金额等int total_all_bills(char* start_date, char* end_date, GOODS_LIST* goods);/ 出库单类SELL_BILL,具体出库单信息的抽象class SELL_BILL: public DATA_RECORD public:SELL_BILL();SELL_BILL();/ 设置出库单的各属性的值int set_no(char* no);int set_date(char* date);int set_storage(char* storage);int set_depart(char* depart);int set_good(SELL_GOOD_LIST* good);int set_status(STATUS status);/ 返回出库单的各属性的值char* get_no();char* get_date();char* get_storage();char* get_depart();SELL_GOOD_LIST* get_good();STATUS get_status();/ 查找是否有指定的货物,如果有则返回其数量和金额,剩余金额和数量等信息int find(PURCHASE_GOOD& good);protected:char* no;/ 出库单编号char* date;/ 出库时间char* storage;/ 出库仓库char* depart;/ 领料部门SELL_GOOD_LIST* good_list;/ 出库

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论