图书管理系统论文

山 东 英 才 学 院

毕 业 论 文

论文题目: 图书管理系统

二 级 学 院: 计算机学院

学 科 专 业: 计算机信息管理

学 号: [1**********]0 姓 名: 冯志飞

班 级: 4班

指 导 教 师: 张立然

摘要: 管理信息系统是一个不断发展的新型学科,企业要生存要发展,要高效率地把企业活动有机地组织起来,就必须加强企业管理,即加强对企业内部的各种资源(人、财、物等)的有效管理,建立与自身特点相适应的管理信息系统。 本文介绍了在PowerBuider 环境下采用“自上而下地总体规划,自下而上地应用开发”的策略开发一个管理信息系统的过程。通过分析传统的人工管理图书馆的不足,创建了一套行之有效的计算机管理图书馆的方案。文章详细介绍了图书管理信息系统的系统分析部分,包括可行性分析、组织机构分析、管理职能分析、业务流程分析、数据流程分析、数据字典、处理描述等等。图书馆管理系统是典型的信息管理系统,其开发主要包括后台数据库的建立和维护以及前端的应用程序的开发两个方面。对于前者要求建立数据的一致性和完整性,对于后者则要求应用程序功能的完备,易用等的特点。基于上述考虑本系统主要利用PowerBuilder 8作前端的应用开发工具 ,利用Adaptive Server Anywhere 7 作为后台的数据库,利用WINDOWS 作为系统平台开发的图书管理系统。另外本图书馆管理系统利用软件工程化思想和方法,总体上是采用结构化生命法进行系统分析和设计的,而系统实现等步骤则采用了原型法和面对对象的方法。

关键字:管理信息系统、图书管理、PowerBuider 应用

Abstract: The management information system is the new discipline which develops unceasingly, the enterprise must survive must develop, wants the high efficiency organically to organize the enterprise activities, must strengthen the business management, namely strengthens to enterprise interior each resources (personnel and so on) the effective management, establishes the management information system which adapts with own characteristic. This article introduced uses “from the top downward the overall plan under the PowerBuider environment, applies the development from bottom to top” the strategy develops a management information system's process. Through the analysis tradition's labor management library's insufficiency, founded a set of effective computer management library plan. The article introduced the books management information system's system analysis part in detail, including feasibility analysis, organizations and agencies analysis, management function analysis, Operation flow analyses, data flow analysis, data dictionary, processing description and so on. The library management system is the typical information management system, its development mainly includes the backstage database the establishment and the maintenance as well as the front end application procedure development two aspects. Regarding the former request establishment data uniformity and integrity, regarding the latter, then request application program function completeness, Yi Yong and so on characteristic. Based on above considered that front end this system mainly 8 makes using PowerBuilder the application development kit, 7 takes the backstage using Adaptive Server Anywhere the database, takes the system platform development using WINDOWS the books management system management system. Moreover the library management system use software engineering thought and the method, as a whole use the structurization .

Key words: Management information system, books management, PowerBuider application

目 录

一 前 言 .................................................................................................. 5

1 MIS系统开发方法 . .................................. 5

2 MIS系统开发过程 . .................................. 6

二 系统需求分析 .................................................................................... 6

1现行业务描述....................................... 7

2现行系统存在问题的分析 . ............................ 8

3解决方案 .......................................... 8

三 系统总体结构设计.........................................................................................9

1 系统目标设计 ...................................... 9

2 系统功能分析 ..................................... 10

3系统各功能模块设计 . ............................... 11

4数据流图 ......................................... 11

四 数据库设计...................................................................................................14

1数据库需求分析 ........................................ 14

2 数据库逻辑结构设计 ............................... 15

五 管理系统的具体实现...................................................................................20

1 PowerBuilder开发工具简介 . ........................ 21

2 Powerbuilder 8应用程序开发的基本步骤 ............. 21

3 编码规范 ......................................... 22

4 创建祖先窗口和全局函数 ........................... 22

5 应用程序对象 App_librarain ....................... 24

6具体窗口的体现 . ................................... 25

六 结束语 ............................................................................................ 46

参考文献 „„„„„„„„„„„„„„„„„„„„„„„„„„„47

一 前 言

随着人类社会的发展,人类对知识的需求也不断地增长。在这种形势下,书籍就渐渐地成为人们获取并增长知识的主要途径,而图书馆就自然而然地在人们的生活中占据了一定的位置,如何科学地管理图书馆不但关系到读者求知的方便程度,也关系到图书馆的发展,因此,开发一套完善的图书馆管理系统就必不可少了。

管理信息系统(简称MIS) 是介于信息论,经济管理理论,统计学与运筹学及计算机科学之间的一门边缘性,综合性,系统性的交叉科学,它是随着管理科学,信息技术,计算机技术等的发展而产生和发展起来的。

图书馆管理系统是典型的信息管理系统,其开发主要包括后台数据库的建立和维护以及前端的应用程序的开发两个方面。对于前者要求建立数据的一致性和完整性,对于后者则要求应用程序功能的完备,易用等的特点。基于上述考虑本系统主要利用PowerBuilder 8作前端的应用开发工具 ,利用Adaptive Server Anywhere 7 作为后台的数据库,利用WINDOWS 作为系统平台开发的图书管理系统。另外本图书馆管理系统利用软件工程化思想和方法,总体上是采用结构化生命法进行系统分析和设计的,而系统实现等步骤则采用了原型法和面对对象的方法。

1.1 MIS系统开发方法

管理信息系统的开发方法有生命周期法、原型法和面向对象的开发方法等:

生命周期法(Life Cycle Method )是20世纪60年代发展起来的一种应用广泛且比较成熟的管理系统开发方法,它的基本思想是将系统的开发工作从开始到结束划分为若干个阶段,每个阶段都有明确的任务,而系统开发出来后,并不意味着生命周期的结束,而意味着根据组织的需要对系统的修改和重建的开始。

原型法(Prototyping Method)是20世纪80年代发展起来的,旨在改变生命周期法的缺点的一种系统开发方法,该法的开发思路是首先根据用户的要求,由用户和开发者共同确定系统的基本要求和主要功能,利用系统快速生成工具,建立一个系统模型,再在此基础上与用户交流,将模型不断补充、修改、完善,如此反复,最终直至用户和开发者都比较满意为止,从而形成一个相对稳定、较为理想的管理信息系统。

面向对象(Object Oriented)的开发方法于20世纪80年代开始兴起的,是一种基于问题对象的自底向上的一种系统开发方法,这种方法的特点是以对象为基础,对象是分析问题和解决问题的核心。

1.2 MIS系统开发过程

一个MIS 系统的开发过程一般包括如下几个步骤:

(1)需求分析:需求分析主要是了解用户的需求。需求了解得越详细,程序的后期开发与维护费用就会越少。一般的开发团队中,需求分析都是由资历较深的系统分析员或项目经理担当,可见它的重要性。需求分析制订好后,需要反复修改。将最后的结果交给用户审定,确认无误后,由系统分析员完成需求分析文档,再开始下一步工作。

(2)概要设计:概要设计紧跟在需求分析之后。用户需求明确后,将得到的数据分析后,开始构建数据库的逻辑结构。此时,数据库中的表格还未成形,通过各种分析工具(如PowerDesigner 等)画出数据流图,最后就可抽象出数据库的具体表结构。这时由系统分析人员反复审核。确认所有的需求都考虑在内,没有遗漏后,就可以开始制订概要设计文档。概要设计文档形成后,整个程序的逻辑框架也就形成了。

(3)详细设计:概要设计完成后,根据设计中制订的业务模块。就可以进行详细分析设计了。详细设计就是将各个业务模块的窗口全部建好,各个窗口控件的处理代码全部用语言表达出。所以详细设计是整个系统中最繁琐的环节。详细设计完成后,整个程序就确定了,再由编程人员根据详细设计文档将代码完成。整个开发工作就宣告结束。

1) 程序编码:程序编码相对于其他环节来说比较简单,程序员只需要根据详细分析文档写程

序编码,保证代码没有错误即可。程序编码需要注意的是整个程序书写中命名的规范化与编程风格的规范化,这需要较长时间的培养来形成。需要在不断的实践中形成自己独特的风格。总的来说,不要过分地追求复杂的算法,因为那可能会导致后期维护人员无法读懂你的代码而造成维护的困难。

(4)测试:程序编码完成后,就需要测试。测试有几种类型,主要是测试代码有无逻辑错误以及在加载数据环境下程序的稳定性问题。测试工作中发现的错误应及时改正,然后将它记录到测试文档中。

(5)打包:测试完成,确认无误后。程序就可以打包发行了。打包一般使用工具如PWISE 等。

以上是一个完整的MIS 系统开发过程,其实不仅MIS 系统,其他类型的程序开发也基本相同。

二 系统需求分析

整个软件生命周期中,开发所占的费用和时间都很小。后期维护工作一般要占整个软件生命周期的80% 以上。所以系统分析很重要,一个好的系统分析可以减少很多后期维护工作。

2.1现行业务描述

下面以一所学校的图书馆为例子进行分析,画出图书馆的组织结构图如下:

图2.1 图书馆的结构图

该图书馆各个部门负责的主要业务如下:

(1)采编组主要负责图书采编工作,包括购置新书、打印编目、增加数量。

(2)目录厅主要负责读者查询工作,包括可借图书(按图书类别、图书名称或图书作者查询);新书目录(按图书类别、日期查询)。

(3)借阅组主要负责图书流通、查询统计、借阅查询等工作。

(4)阅览室、工具书室主要负责读者阅览工作,包括:阅览各种杂志、报纸、阅览各种工具书。

下面绘制出图书馆流通业务中借书的流程图:

(1)读者在目录厅查阅索引卡;

(2)读者写出所借图书的分类号、种次号、交给图书管理员,并出示本人的借书证;

(3)图书管理员根据图书的分类号、种次号到书库找书;

(4)将图书交给读者,并由读者填写所借图书的借书卡。

(5)图书管理员把借书卡保存到写有该读者借书证号的口袋里。

得出该图书馆业务流程图如下所示:

图2.2 业务流程图

2.2现行系统存在问题的分析

该图书馆工作大部分还是进行着手工管理,工作起来效率很低,由于不可避免的人为因素,经常造成数据的遗漏、误报。计算机信息化管理有着储存信息量大、速度快等许多优点,提供给我们的处理信息及时快捷,同时也提高了我们工作人员的自身素质。

2.3解决方案

基于以上的对问题的分析,利用计算机给我们提供信息,及时地调整学校图书馆图书结构,并且对学生们的借阅过程形成一整套动态的管理就十分必要了。

图书馆信息系统的建立,需要进行用户的需求调查与分析,以确定系统目标,提出解决 问题的详细方案,这是系统建设的重要环节。

学校图书馆规模相对于商业图书馆小,但要有着完善的图书信息,对每一册书要有详细的记录信息,功能上对系统的需求是全面的。因此对用户的需求可分为四个方面:一方面是图书馆工作人员通过计算机来管理各类图书,分类编号,调整图书结构,增加图书库存,适应学生的需求;二方面是学生们能通过计算机来查询浏览图书馆中的图书,来确定自己需要的书籍,为借阅做好准备;三方面是工作人员对学生们的借书证发放;四方面也是图书馆的核心工作,对图书的借阅管理。

这四个方面形成了学校图书馆一个工作整体,采用计算机自动化信息处理,可方便快捷地共享信息、交流信息,高效地协同工作。

在软、硬件方面对系统的需求,软件要求易学,界面友好,容易掌握,可以很简单方便的管理各种图书信息。硬件的配置要求不能太高,这样可以很好的适应当前的学校图书馆。 在开发方式上对系统的需求,由于学校图书馆是一种无商业利益的,所以系统设计开发的周期要短,在短时间内完成,减少开发成本,提高开发效率,方便、简单、实用作为系统开发的指导思想。

三 系统总体结构设计

如果要完成一个完整的图书管理系统,需要的相关信息很多。由于种种条件的限制,同时考虑到开发成本,所以本系统仅实现基本的管理功能。并不能完全满足上面例子所描述的图书馆,使用前应进行二次开发。

3.1 系统目标设计

系统开发的总目标是实现内部图书借阅管理的系统化、规范化和自动化。

能够对图书进行注册登记,也就是将图书的基本信息(如:书名、作者、价格等)预先存入数据库中,供以后检索。

能够对借阅人进行注册登记,包括记录借阅人的姓名、地址、电话等信息。

提供方便的查询方法。如:以书名、作者、出版社、出版时间(确切的时间、时间段、某一时间之前、某一时间之后)等信息进行图书检索,并能反映出图书的借阅情况;以借阅人编号对借阅人信息进行检索;以出版社名称查询出版社联系方式信息。

提供统计分析功能。可以展现出图书类型比例、库存与借出比例。

提供旧书销毁功能,对于淘汰、损坏、丢失的书目可及时对数据库进行修改。

能够对使用该管理系统的用户进行管理,按照不同的工作职能提供不同的功能授权。 提供较为完善的差错控制与友好的用户界面,尽量避免误操作。

3.2 系统功能分析

根据以上功能,将图书管理系统的数据分为:

数据输入部分:主要包括图书基本信息的录入、借阅人基本信息的录入、用户基本信息的

录入。

数据输出部分:主要是各种统计查询,包括:根据图书信息(如书名、作者、出版社等)

查阅图书及其借阅信息、统计输出图书类型比例等。

数据处理部分:主要涉及借阅和归还的处理,如一本书借出后,必须在数据库中将该书标记为已借出,

以防出现数据库中有书但图书馆无书的情况;一本书归还后,同样必须在数据库中将其标记为已经归还,以便再次借出。

3.3系统各功能模块设计

在系统功能分析的基础上,考虑PowerBuilder 程序编制的特点,得到如图所示的系统功能模块图:

图3.1 系统功能模块图

3.4数据流图

(3.4.1)系统顶层DFD 图

图3、2 系统顶层DFD 图

(3.4.2)系统总体结构功能模块图

图3.3 总体结构DFD 图

(3.4.3)图书基本信息登记/修改

图3.4 登记修改图

说明:出版社信息人工录入后,存放在出版社信息库中,便于今后书籍信息的录入以及出

版社信息的查询。分类信息由图书馆进行分类定制,存放在图书分类信息库中,

用于图书的分类管理。登记新书时,当涉及到出版社和分类的填写时,只需做相应

的选择即可,并存放在图书信息库中。

(3.4.4)图书查询

图3.5 图书查询

说明:输入查询条件后,检索图书信息库,并反应出查询结果。

(3.4.5)图书统计

图3.6 图书统计

说明:根据选择的统计条件,检索图书分类信息库或图书信息库,并反应出统计结果。

(3.4.6)图书借阅

图3.7 图书借阅

说明:输入借阅人编号,通过检索借阅人信息库,核实借阅人身份。输入图书编号,通过

检索图书信息库,核实图书信息。进行图书借出处理后,在图书借阅库中进行登记, 并将借出图书的在借标志设为“是”。

(3.4.7)图书归还

图3.8 图书归还

说明:输入图书编号,检索在借信息库,反应出图输借阅情况。进行归还操作后,修改在

借信息库中相关条目,同时在图书信息库中修改相关图书在借标志为“否”

四 数据库设计

数据库的设计是MIS 系统的核心部分,设计数据库,首先要进行需求分析,然后进行数据库的概念结构设计、逻辑结构设计、数据库结构实现等步骤。

4.1数据库需求分析

根据以上的需求分析和数据组织,开始设计数据结构,即根据需求勾画出实体/关系图(E/R)。在概念上,E/R图代表的是系统需要的数据及其这些数据之间的关系。如图所示的实体/关系图:

从图中可以看出,在这个系统中实际存在的实体:图书和借阅人,其中借阅人和图书是多对多关系,针对本系统,通过对图书借阅管理的内容和数据流程分析,设计数据项和数据结构如下:

(1)图书基本信息,其数据项有图书编号、图书名称、作者、出版社等。 (2)借阅人基本信息,其数据项有借阅人编号、借阅人姓名、电话等。 (3)图书借阅登记,其数据项有借阅序号、借阅图书编号、借阅人编号等。 为了实现图书信息录入的方便性与规范性以及相关的统计功能,还应增加出版社信息 与图书分类信息:

(4)出版社信息,其数据项有出版社编号、出版社名称、地址、电话、传真等。 (5)图书分类信息,其数据项有分类编号、分类名称、同一类型图书数目。 同时针对于本系统的多用户使用特点,增加用户信息表: (6)用户信息表,其数据项有用户名、密码、用户权限。 为了实现图书借阅超期罚款制度,还应增设罚金规则表:

(7)罚金规则表,其数据项包括免费使用天数、罚金费率、规则启用开关。

4.2 数据库逻辑结构设计

数据库设计有几个范式,一般我们要做到的是第三范式,即数据表中没有冗余字段以及同一个表中的字段没有函数依赖关系,冗余字段即在一个表中已经保存过的信息,在另一个表中就不应该存在,如果需要的话,可以通过表间的关联来得到,函数依赖性就是一个表中的字段间不应该有计算关系,如一个表中有单价字段、数量字段,就不应该有一个总金额字段。如果程序运行过程中需要总金额,可以实时计算。不过在一些较常用的表中,我们可以适当地保留冗余字段,这样,在程序运行过程中可以减少由于表间互相关联而使用速度降低等问题。这就是所谓的第四范式。数据表设计时,最好不要使用用户输入的信息作为主键,每一个数据表自己定义一个主键,添加信息是由程序自动添加,这样就可以减少数据更新时产生的错误。表与表相关联的外键最好是由程序自动生成的主键,这样数据库就比较规范了。

另外,数据表设计时一般都应该有一些标志字段,标志字段可以定义成CHAR(1)或BIT 型。建议实际应用中定义成CHAR(1)字段可以存储多种可能的状态,在最初设计时,可能我们没有考虑到的一些情况,在程序后来的开发中,可以通过设计标志字段为不同的 值来解决,这样就避免了修改数据库结构。

数据库初期设计时一定要谨慎,把所有可能的情况都考虑进去,即使当时没有用到,也要将它留在数据库中作为备用字段以便将来扩充。

程序一旦开始编码,就应该尽量避免再修改数据库。因为如果数据库结构一旦改变, 所有与修改的数据表相关的业务都有可能受到影响,而某些影响还很难看到,这样就容易形成一个恶性循环。错误越改越多,越改越乱,最终导致程序的失败。PB 的数据窗口与其他语言的数据控件不一样,它的很多东西是预编译的。即使你一个模块已经调试无误,但只要数据库结构改动。相应的模块就一定要重新修改,否则一定会出问题。

图书借阅管理系统数据库中各个表的设计结果如下面几个表格所示。每个表格表示为数据库中的一个表。

借阅人基本信息表Is_stuid

说明:记录借阅人的基本情况,memberid 设为主键、索引。 表4.1

用户登录基本信息表w_fs29_longin

说明:记录系统用户的用户名、密码与权限,name 设为主键。 表4.2

图书基本信息表In_bookid

说明:记录图书基本信息,bookid 设为主键、索引。 表4.3

出版社基本信息表Is_publisher

说明:记录出版社信息,pubid 设为主键。 表4.4

分类信息表bookclass

说明:记录定制的分类情况,classid 设为主键。 表4.5

借阅情况信息表w_sf29_huaishu

说明:记录借阅的基本情况 表4.6

(1)规划有效的索引

a. 在组合表的列中创建索引,包括主关键字和外部关键字所在的列。 b. 在列或类组合中创建唯一的索引能增强唯一性。

c. 浏览索引并卸载不使用的索引。索引需要一定硬盘空间和时间来维护。具有较高数据插入操作频率的数据库最好不要索引。有较高读操作频率的数据库应该有更多的索引。 d. 避免在簇索引中包括不必要的列。在可能的情况下,使用较小的数据类型,例如用varchar 替代char 。

e. 考虑使用簇索引来支持排序和范围化查询。在为数据检索优化表时,簇索引必须支持数据的分组索引。为簇关键字选择列或列组,簇关键字以经常需要的顺序排序数据或以必须被一起访问的记录而分组记录。

f. 创建支持一般查询的查找参数索引。具有高选择性的列是索引的最好候选列。具有高密度的列是索引糟糕的候选列。 (2)使用约束实现数据的完整性

PRIMARY KEY约束在表中定义了主关键字,它是行唯一的标识符,它可以强制实体完整性。在使用PRIMARY KEY约束时考虑以下事实: a. 每个表只能有一个PRIMARY KEY约束。 b. 键入的值必须是唯一的。 c. 不允许有空值。

d. PRIMARY KEY约束在指定的列创建唯一的索引,可以指定簇索引和非簇索引(如果

非簇索引先前并不存在,簇索引是默认的)。

UNIQUE 约束指定,在一列中的两行不能有相同的值。该约束使用唯一的索引来强制实体的完整性。在已有一个主关键字时UNIQUE 约束很有用,例如雇员号,但是必须保证其他标识符(例如,雇员驾驶证号)也是唯一的。在使用UNIQUE 约束时,考虑以下事实; a. 允许有空值。

b. 在一个表中可以设置多个UNIQUE 约束。

c. 可以将UNIQUE 约束运用于具有唯一值的单列或多列,但不能用于表的主关键字。 d. 通过在指定的列或列组中创建唯一的索引,可以使UNIQUE 索引得到强制

五 图书管理系统的具体实现

5.1 PowerBuilder开发工具简介

PowerBuilder 是目前开发Client/Server结构的应用系统的主要工具之一。PowerBuilder8.0在继承与发展以前版本优秀功能的基础上,为适应网络应用程序的开发要求集成了Enterprise Application Studio 中PowerBuilder 以及Power Site的功能,在传统数据库开发的基础上,将Web 应用更好地集成到PowerBuilder 中。PowerBuilder 全面支持面向对象编程。是功能强大并易于使用的第4代编程语言(4GL),它内置了包括数据窗口在内的多种对象类,可以方便地访问数据库。相对于其他应用工具,PowerBuilder 具有工作效率高、成本低、质量高、功能强的特点。

5.2 Powerbuilder 8应用程序开发的基本步骤

我们要开发应用程序时,首先要对它进行分析。无论哪种、哪方面的应用程序,都要先建立一个应用对象。下面我们介绍以下PowerBuilder 8应用程序开发的基本步骤:

(1)首先要建立应用对象。

(2)创建窗口。在窗口里放置各种控件和编写事件响应的脚本。

(3)创建菜单。窗口里的菜单可包括菜单条,下拉式菜单,级联菜单和弹出式菜单为菜单编写事件响应的脚本。

(4)创建用户对象。如果想要重复使用某个控件的功能,可以把窗口上经常放置的控件定义为用户对象。

(5)创建数据窗口。数据窗口可以检索数据库中的数据,可以建立各种报或统计表,可以修改数据库。

(6)创建函数、结构、事件。为了能够更好地支持脚本,编写自定义的函数,定义结构类型变量,也可以为对象和控件定义自己的事件。

(7)运行与调试。可以在开发环境中随时运行应用程序,发现错误后,可以用调试工具进行调试。

(8)当应用程序开发完毕后,可以把它编译成可执行的文件,让用户比较容易地建立应用系统的运行环境。

5.3 编码规范

为了减少在软件开发过程中的错误,在软件开发过程中应该遵守一定的标准。

给对象命名要有一定的规范,部件名称可以达到40个字符,窗口的命名:W_功能代码_功能描述。数据窗口的命名:DW_功能代码_功能描述。菜单命名:M_功能代码_功能描述。

标识符命名时,应该使标识符有一定的字面含义,有助于程序的调试和脚本的可读性的提高。本系统中使用的命名规范为:变量作用域+变量类型+”_”+具有一定字面含义的名称。例如:li_selectrow反映出的含义:”l”代表是本地变量,是local 的缩写,”i ”代表是integer 类型的变量,selectrow 表示该变量是用来记录一个行号的计数器。

5.4 创建祖先窗口和全局函数

为充分利用PB 的面向对象的特性。程序开发时一般创建几个模板窗口。将功能窗口上的某些常用功能封装在模板窗口中。然后将这些模板窗口作为祖先窗口。所有的子孙窗口都可以通过继承的方法来生成。这样就减少了代码的书写量。使得整个程序界面保持整齐。当修改祖先窗口时,所有的子孙窗口都会自动修改。所以,祖先窗口的确定要十分谨慎。

全局函数与局部函数的作用类似。唯一不同的是全局函数的作用域是整个程序周期。不论你在任何一个模块的代码中都可以调用它。所以我们可以把某些常用功能写成全局函数。在程序的其他地方反复调用。

5.4.1函数level(character lev)

功能介绍:通过传入的lev 值,将某些菜单项设为“非使能”,以限制某些功能的使用。Lev

值即不同职责的权限(系统管理1、图书管理2、借阅人管理3、借阅操作员4),

从people 表中的level 字段中读取。

代码分析:

choose case lev

case "1"

case "2"

m_main.m_借阅人管理.enabled=false m_main.m_图书租赁.enabled=false

m_main.m_系统菜单.m_用户管理.enabled=false m_main.m_系统菜单.m_借阅规则设置.enabled=false m_main.m_系统菜单.m_图书信息设置.enabled=false

case "3"

m_main.m_图书管理.enabled=false m_main.m_图书租赁.enabled=false m_main.m_图书查询.enabled=false m_main.m_统计资料.enabled=false m_main.m_系统菜单.m_用户管理.enabled=false m_main.m_系统菜单.m_借阅规则设置.enabled=false m_main.m_系统菜单.m_图书信息设置.enabled=false

case "4"

m_main.m_图书管理.enabled=false m_main.m_借阅人管理.enabled=false m_main.m_系统菜单.m_用户管理.enabled=false m_main.m_系统菜单.m_借阅规则设置.enabled=false m_main.m_系统菜单.m_图书信息设置.enabled=false

end choose

5.4.2 函数countday

countday (date date1,date date2)

功能介绍:通过传入的date1(起始日期)值与date2(结束日期)值,计算出中间相差的天

数,返回值为integer 型。

代码分析:

int day

day=(integer(year(date2)) - integer(year(date1)))*365 +&

(integer(month(date2)) - integer(month(date1)))*30 +&

(integer(day(date2)) - integer(day(date1)))*1

return day

5.4.3 函数countfine

countfine (integer days, decimal fine, integer countday)

功能介绍:根据图书免费借阅天数days 、罚金费率fine, 以及已借阅的天数(由countday 函

数算出),计算出费用,返回值为decimal 型。

代码分析:

dec countfine

if countday>=0 and countday

countfine=0

else

countfine=(countday - days)*fine//超根据期多少计算罚金

end if

return countfine

5.5 应用程序对象 App_librarain

功能介绍:PB 程序由一个应用程序开始,即每个PB 程序在开始运行时,先执行应用程序对象

的Open 事件。在Open 事件中连接数据库,并打开登陆窗口w_login。

代码分析:

// Profile librarian

SQLCA.DBMS = "ODBC"

SQLCA.AutoCommit = False

SQLCA.DBParm = "ConnectString='DSN=librarian;UID=;PWD='"

Connect using SQLCA;

//判断数据库连接是否成功

if sqlca.sqlcode = 0 then

open(w_login)

else

messagebox('系统提示',' 连接数据库失败!')

end if

5.6 具体窗口的实现

(5.6.1)登录窗口

w_fs29-login

图6.1 系统登录窗口

功能介绍:本窗口主要是检查操作员输入的用户名及密码是否正确,如果正确,允许登录。

如果错误,显示出错误提示。

操作方法:填写“用户名”与“密码”后,点击“登录”按钮进行验证,点击“放弃”退出。 代码分析:

Open 事件:sle_1.setfocus()//“用户名”输入框获得焦点

this.width=923

this.height=588

“登录”按钮string ls_userid,ls_userpasswd,ls_userid1

ls_userid=trim(sle_1.text)

ls_userpasswd=trim(sle_2.text)

if ls_userid=""or ls_userpasswd="" then

messagebox('提示',' 用户名或密码不能为空,请重新输入!')

return

end if

select user_id into :ls_userid1 from fs29_user_info

where user_id=:ls_userid and user_passwd=:ls_userpasswd using sqlca;

if sqlca.sqlnrows>0 then

open(w_fs29_workspaces)

else

messagebox('提示',' 用户名或密码错误!')

end if

(5.6.2) 主窗口w_main

功能介绍:本窗口作为菜单及其他子窗口的容器。

窗口设置;本窗口为容器窗口,故它的WindowType 为mdihelp!, 表示本窗口为多文档界面,可以有菜单、工具栏与状态栏。WindowState 为maximized! ,表示窗口在运行时是最大化的风格。Menuname 属性设为m_main,即是与本窗口连接的菜单名称。

(5.6.3) 菜单m_main menu

图6.2 菜单窗口

功能介绍:打开各功能窗口

操作方法:点击菜单项或工具栏上相应的按钮,状态栏可显示帮助信息。

代码分析:每个相应的菜单项的clicked 事件都使用opensheet 方法来打开相应的功能窗口,

如“新书入库”的菜单项下的 clicked事件的处理代码为:

opensheet(w_newbook,"w_newbook",parentwindow,0,cascaded!)

(5.6.4)查询窗口

(1)按图书作者查询

图6.3 查询窗口(一)

功能介绍:按照图书的作者查询图书

操作方法:在相应的空中输入作者姓名,然后点击“查询”按钮即可。

代码分析 :

“查询”按钮:dw_1.settransobject(sqlca)

string ls_author

ls_author= trim(sle_1.text)

if isNULL(ls_author) or ls_author="" then

messagebox("提示"," 缺少作者姓名!")

return

end if

dw_1.retrieve(ls_author)

//dw_1.retrieve(ls_qauthor)

(2)按出版社查询

图6.4 查询窗口(二)

功能介绍:按照出版社查询图书

操作方法:在相应的空中输入出版社名称,然后点击“查询”按钮即可。

代码分析:

“查询”按钮 string ls_publisher

ls_publisher = trim (sle_1.text)

if not ls_publisher = "" then

dw_1.settransobject(sqlca) dw_1.retrieve (ls_publisher)

else

MessageBox ("查询出错"," 请输入有效的出版社名称!")

end if

sle_1.SetFocus()

(5.6.5)借书窗口w_fs29_jieshu

图 6.7 借书窗口

功能介绍:借阅图书,

操作方法:输入“学生学号”与“图书编号”后,学生姓名与图书书名将显示出来,然后点

击“借阅”按钮借阅图书。

代码分析:

long ls_stuid,ls_stuid2,ls_bookid,ls_bookid2

int ls_flag

//验证学号和图书编号是否为空

if sle_stuid.text=""OR isNULL(sle_stuid.text) then

messagebox("缺少数据!"," 请输入学生学号!")

sle_stuid.setfocus()

return

elseif sle_bookid.text=""OR isNULL(sle_bookid.text) then

messagebox("缺少数据!"," 请输入图书编号!")

sle_bookid.setfocus()

return

end if

ls_stuid=long(sle_stuid.text)

ls_bookid=long(sle_bookid.text)

select fs29_Student.stud_id//判断借阅人学号是否存在

into :ls_stuid2

from fs29_Student

where fs29_Student.stud_id=:ls_stuid;

if ls_stuid2=0 then//判断是否有该" 借阅人"

messagebox("系统提示"," 没有此借阅人信息!请验证后重新输入学号!")

sle_stuid.setfocus()//"学生学号" 输入框获得焦点

return

end if

select fs29_BookInfo.bookID

into :ls_bookid2

from fs29_BookInfo

where fs29_BookInfo.bookID=:ls_bookid;

if ls_bookid2=0 then

messagebox("系统提示"," 没有此图书信息!请验证后重新输入图书编号!")

sle_bookid.setfocus()

return

end if

SELECT delflag

INTO:ls_flag

FROM fs_29_jiebook WHERE bookID=:ls_bookid;

if ls_flag=1 then

messagebox("系统提示"," 本书已经外借!")

sle_bookid.setfocus()

return

end if

dw_1.retrieve(ls_bookid,ls_stuid)

dw_1.visible=true

cb_2.enabled=true

end if

long ls_stuid,ls_bookid,ls_count

date ls_loandates

integer ls_flag//0表示图书已归还(可再借),1表示图书已借出(不可再借)

ls_stuid=long(sle_stuid.text)

ls_bookid=long(sle_bookid.text)

ls_loandates=today()

//得到delflag 标记值

SELECT delflag

INTO :ls_flag

FROM fs29_Loan WHERE bookID=:ls_bookid;

//得到该生所借图书数量

SELECT COUNT(*)

INTO :ls_count

FROM fs29_Loan WHERE stud_id=:ls_stuid and delflag=1;

//判断该书是否借出

if ls_flag=1 then

messagebox("系统提示"," 本书已经外借!")

sle_bookid.setfocus()

return

else

if ls_count

INSERT INTO fs29_Loan

(bookid,stud_id)

VALUES (:ls_bookid,:ls_stuid);

UPDATE fs29_Loan

set

loandate=:ls_loandates,

returndate=NULL,

fine=0,

delflag=1

WHERE bookid=:ls_bookid;

messagebox("提示"," 图书编号为"+string(ls_bookid)+"的图书借出成功!")

else

messagebox("提示"," 该生所借图书数量已达最大(5本) !借阅失败!")

end if

end if

sle_bookid.text=""

sle_bookid.setfocus()

dw_1.visible=false

cb_2.enabled=false

(5.6.6) 还书窗口 w_fs29_huanshu

图6.8 还书窗口

功能介绍:归还图书

操作方法:输入“图书编号”,判断后显示出图书名称、借阅人编号、借阅人姓名。并根据是

否启用了“罚金制度”(在“罚金规则窗口”设置),决定是否计算罚金。

代码分析:

“确定”按钮

long ls_bookid,ls_bookid2,days

date ls_loandates,ls_returndates

dec ls_fine

//验证图书编号是否为空

if sle_1.text=""OR isNULL(sle_1.text) then

messagebox("缺少数据!"," 请输入图书编号!")

sle_1.setfocus()

return

end if

ls_bookid=long(sle_1.text)

//判断图书是否借出

select bookID

into :ls_bookid2

from fs29_Loan

where bookID=:ls_bookid and delflag=1;

if ls_bookid2=0 then

messagebox("系统提示"," 此图书未借出!请验证后重新输入图书编号!")

sle_1.setfocus()

return

end if

select loandate

into :ls_loandates

from fs29_Loan

where bookID=:ls_bookid;

ls_returndates=today()

days=daysafter(ls_loandates,ls_returndates)

sle_2.text=string(ls_loandates)

sle_3.text=string(ls_returndates)

if days>30 then

ls_fine=dec(days - 30) * 0.1

sle_4.text=string(days - 30)

sle_5.text=string(ls_fine)

else

sle_4.text="0"

sle_5.text="0"

end if

cb_2.enabled=true

“返还”按钮

long ls_stuid,ls_bookid,ls_bookid2,day

date ls_loandates,ls_returndates

integer ls_flag//0表示该书未借出

dec ls_fine

int ret

ls_bookid=long(sle_1.text)

//得到还书日期

ls_returndates=today()

//得到借书日期

SELECT loandate

INTO :ls_loandates

FROM fs29_Loan

WHERE bookID=:ls_bookid;

//计算借阅天数

day=daysafter(ls_loandates,ls_returndates)

//大于30天需交罚款

if day>30 then

ls_fine=dec(day - 30) * 0.1

messagebox("提示信息"," 所借书在"+string(ls_returndates)+ " 已超期,罚款"+string(ls_fine)+"元,请交罚款!")

ret=messagebox("询问"," 罚款"+string(ls_fine)+"元是否已交?",Question!,YesNo!,3)

if ret=2 then

return

end if

//DELETE loan where bookid=:ls_bookid;

end if

select bookID

INTO :ls_bookid2

FROM fs29_Loan

WHERE bookID=:ls_bookid and delflag=1;

//当图书成功归还后更新借书表信息

if ls_bookid=ls_bookid2 then

messagebox("提示信息"," 图书编号为"+string(ls_bookid)+"的图书已还借成功!") update fs29_Loan

set returndate=:ls_returndates,fine=:ls_fine,delflag=0

where bookID=:ls_bookid;

else

messagebox("提示信息"," 此书未借出!")

end if

sle_1.text=""

sle_2.text=""

sle_3.text=""

sle_4.text=""

sle_5.text=""

sle_1.setfocus()

cb_2.enabled=false

(5.6.7)新书入库登记 w_fs29_newru

图6.11 新书入库窗口

功能介绍:增加、修改图书信息。

操作方法:a. 增加图书信息:点击“新增”按钮,添加图书信息,完成后点击“保存”按钮 b.修改图书信息:通过“图书编号”检索出图书信息,修改后点击“保存”按钮 代码分析:

“入库”按钮 string ls_ISBN,ls_title,ls_author,ls_abstract,ls_keywords integer ls_words,ls_number

long ls_bookid, ls_bookid2,ls_bookid3,ls_publisherid,ls_price,ls_classid date ls_publishdate

//图书编号,ISBN 编号

if sle_1.text=""OR isNULL(sle_1.text) then

messagebox("缺少数据!"," 请输入图书编号!") sle_1.setfocus() return

elseif sle_2.text=""OR isNULL(sle_2.text) then

messagebox("缺少数据!"," 请输入ISBN 编号!") sle_2.setfocus() return

end if

//图书名称, 图书出版日期

if sle_3.text=""OR isNULL(sle_3.text) then

messagebox("缺少数据!"," 请输入图书名称!") sle_3.setfocus() return

elseif sle_4.text=""OR isNULL(sle_4.text) then

messagebox("数据错误!"," 请输入' 年-月-日' 格式的出版日期!") sle_4.setfocus() return

end if

//日期格式的验证

if sle_4.text""and not isnull(sle_4.text) then

if isDate(sle_4.text) then ls_publishdate=date(sle_4.text) else messagebox("数据错误!"," 请输入' 年-月-日' 格式的出版日期!") sle_4.setfocus()

return

end if

end if

//作者和出版社ID 的验证

if sle_5.text=""OR isNULL(sle_5.text) then

messagebox("缺少数据!"," 请输入作者名字!") sle_5.setfocus() return

elseif ddlb_1.text=""OR isNULL(ddlb_1.text) then

messagebox("缺少数据!"," 请输入出版社ID !") ddlb_1.setfocus() return

end if

//印刷册数和图书分类的验证

if sle_8.text=""OR isNULL(sle_8.text) then

messagebox("缺少数据!"," 请输入印刷册数!") sle_8.setfocus() return

elseif ddlb_2.text=""OR isNULL(ddlb_2.text) then

messagebox("缺少数据!"," 请输入图书分类!") ddlb_2.setfocus() return

end if

ls_bookid=long(sle_1.text)

ls_ISBN=trim(sle_2.text)

ls_title=trim(sle_3.text)

ls_publishdate=date(sle_4.text)

ls_author=trim(sle_5.text)

if not sle_6.text="" then

ls_words=integer(sle_6.text)

end if

ls_publisherid=long(ddlb_1.text)

ls_number=integer(sle_8.text)

ls_price=long(sle_9.text)

ls_keywords=trim(sle_10.text)

if not ddlb_2.text="" then

ls_classid=long(ddlb_2.text)

end if

ls_abstract=trim(mle_1.text)

select fs29_BookInfo.bookID

into :ls_bookid2

from fs29_BookInfo

where fs29_BookInfo.bookID=:ls_bookID; if ls_bookid20 then

messagebox("出错信息"," 图书编号第"+string(ls_bookid2)+"号重号!请改正!") sle_1.setfocus() return

end if

insert into "fs29_BookInfo"

("bookID",

"ISBN",

"title",

"publishdate",

"author",

"words",

"publisherID",

"number",

"price",

"keywords",

"abstract",

"classID")

values

(:ls_bookID,

:ls_ISBN,

:ls_title,

:ls_publishdate,

:ls_author,

:ls_words,

:ls_publisherid,

:ls_number,

:ls_price,

:ls_keywords,

:ls_abstract,

:ls_classID);

//判断是否添加成功

select fs29_BookInfo.bookID

into :ls_bookid3

from fs29_BookInfo

where fs29_BookInfo.bookID=:ls_bookID; if ls_bookid30 then

messagebox("提示"," 图书信息添加成功!") sle_1.setfocus()

sle_1.text=""

sle_2.text=""

sle_3.text=""

sle_4.text=""

sle_5.text=""

sle_6.text=""

ddlb_1.text=""

sle_8.text=""

sle_9.text=""

sle_10.text=""

mle_1.text=""

ddlb_2.text=""

sle_1.setfocus()

else

messagebox("提示"," 添加失败!")

end if

(5.6.8) 新书预览

w_fs29_newbook

图 6.12 新书预览窗口

功能介绍:查询新入库图书信息

操作方法:输入“借阅人编号”与“图书编号”后,借阅人姓名与图书编号将显示出来,然

后点击“确定”按钮即可。

代码分析:

“确定”按钮 long ln_bookid,ln_bookid2

ln_bookid=long(sle_1.text)

if not sle_1.text="" then

select bookid

into :ln_bookid2

from fs29_BookInfo

where bookid=:ln_bookid;

if ln_bookid2=0 then

messagebox("系统提示"," 没有此图书信息!请验证后重新输入图书编号!") sle_1.setfocus()

return

end if

dw_1.settransobject(sqlca)

cb_2.enabled=true

dw_1.retrieve(ln_bookid)

else

messageBox("数据不全"," 请输入图书编号")

end if

(5.6.9) 销毁旧图书

w_fs29_oldbook

图 6.13 销毁旧书窗口

功能介绍:删除图书信息。

操作方法:首先通过图书编号检索出图书信息,然后点击“删除”按钮注销图书。 代码分析:

long ls_bookid

ls_bookid=long(sle_1.text)

delete

from fs29_BookInfo

where fs29_bookinfo.BookID=:ls_bookid;

messagebox("提示"," 删除信息成功!")

sle_1.text=""

sle_1.setfocus()

dw_1.visible=false

cb_2.enabled=false

(5.6.10)出版社信息管理窗口

w_fs29_publisher

图 6.14 出版社信息管理窗口

功能介绍:出版社信息的添加、删除与修改。

操作方法:在对话框中依次输入相应的出版社信息,如出版社名称、地址等信息,然后按要求点击“添加”、“确定”、“删除”、“确定”按钮。

代码分析:

“添加:按钮long Is_publisherid,Is_postcode,Il_i

String Is_publisher,Is_address,Is_tel,Is_fax, Is_http,ll

if sle_1.text=""or iSNull(sle_1.text)then

messagebox("缺少数据"," 请输入出版社ID")

sle_1.setfocus()

return

end if

Is_publisherid=long(sle_1.text)

Is_publisher=trim(sle_2.text)

Is_address=trim(sle_3.text)

Is_tel=trim(sle_4.text)

Is_fax=trim(sle_5.text)

ll=trim(sle_6.text)

if not ll="" then

Is_postcode=long(sle_6.text)

end if

Is_http=trim(sle_7.text)

select fs29_PublisherInfo.publisherID

into:Il_i

from fs29_PublisherInfo

where fs29_PublisherInfo.publisherID=:Is_publisherid;

if Il_i0 then

messagebox("信息错误"," 出版社ID 第"+string(Il_i)+"号重号! 请改正!") sle_1.setfocus()

return

end if

insert into fs29_PublisherInfo

values(:Is_publisherid,

:Is_publisher,

:Is_address,

:Is_tel,

:Is_fax,

:Is_postcode,

:Is_http);

messagebox("提示"," 信息添加成功!")

sle_1.text=""

sle_2.text=""

sle_3.text=""

sle_4.text=""

sle_5.text=""

sle_6.text=""

sle_7.text=""

sle_1.setfocus()

“确定”按钮 long Is_publisherid,Is_publisherid2

Is_publisherid=long(sle_8.text)

if not sle_8.text="" then

select publisherid

into :Is_publisherid2

from fs29_PublisherInfo

where publisherid=:Is_publisherid;

if Is_publisherid2=0 then

messagebox("系统提示"," 没有此出版社信息!请验证后重新输入出版社编号!") sle_8.setfocus()

return

end if

dw_1.retrieve(Is_publisherid)

else

messageBox("数据不全"," 请输入出版社ID")

end if

tab_1.tabpage_2.cb_del.visible=true

tab_1.tabpage_2.dw_1.visible=true

(5.6.11)统计窗口 w_fs29_graph

各类图书比例窗口w_count_booktype、库存/借出比例窗口w_count_loan

说明:由于这两个窗口大同小异,所以仅对w_count_booktype进行说明。

图6.15 统计窗口

功能介绍:统计现有各类图书比例,并以饼型图显示出来。

代码分析:

long ll_sum,ll_i,ll_id,ll_j=1

string ls_name=""

dec i

SELECT Count(*)

INTO :ll_sum

FROM fs29_BookInfo;

DECLARE book CURSOR FOR

SELECT fs29_bookclass.classname,fs29_bookclass.classid

FROM fs29_bookclass;

open book;

if SQLCA.SQLCode = -1 then

MessageBox("数据库错误"," 请重新打开!")

else

do

if ls_name "" then

gr_1.addseries(ls_name)

SELECT Count(*)

INTO :ll_i

FROM fs29_bookinfo

WHERE fs29_Bookinfo.classid = :ll_id;

i = dec(ll_i)

i = i / ll_sum

gr_1.adddata(ll_j,i,1)

ll_j++

end if

FETCH book INTO :ls_name,:ll_id;

loop WHILE SQLCA.SQLCode = 0

end if

close book;

六 结束语

在对管理信息系统的开发过程有了基本了解后,本人使用PowerBuilder 8.0开发了这个“图书管理系统”。系统基本实现了内部图书借阅管理的系统化、规范化和自动化。例如对图书进行登记,对旧书进行销毁。添加借阅人以及注销借阅人。图书的借阅、归还。可以按作者、出版社、出版时间等信息对图书进行查询,并能反映出图书的借阅情况。实现了简单的统计分析功能,可以展示出库存图书与借出图书的比例、馆藏图书种类的情况。并能对借阅规则进行设置。还能够对使用该管理系统的用户进行管理,按照不同的工作职能提供不同的功能授权。

通过对该系统的设计、开发和调试,一方面让我了解了MIS 系统的开发过程与方法,另一方面,让我初步掌握了PowerBuilder 开发工具的使用方法,熟悉了窗口、菜单以及一些可视化控件的使用方法。通过使用还了解到窗口对象、数据窗口对象、各类控件的属性与方法。同时,在制作过程中遇到了不少问题和困难,通过查阅书籍及互连网得到了不小的帮助。

因为条件的限制,该管理系统还存在不少的缺点和漏洞,只能尽量改正与完善。不足之处,还请多多指教。

参 考 文 献

[1].罗超理,李万红.管理信息系统原理与应用.清华大学出版社,2002

[2].艾德才.计算机信息管理基础.中国水利水电出版社,2001

[3].Jeff Robin.Management of Information System.机械工业出版社,2002

[4].Tim F Lee.Implement MIS.北京出版社,2001

[5].萨师煊,王珊.数据库系统概论.高等教育出版社,2000

[6].Efrem G.Mallach.Decision Support and Data Warehouse Systems.电子工业出版社,2001

[7].Michael J.Hernandez.Database Design for Mere Mortals.中国电力出版社,2003

[8].Abraham Silberchatz.Database System Concepts.机械工业出版社,2003

[9].Graeme Malcolm.SQL Server 2000 with XML.清华大学出版社,2003

[10].李晓喆,张晓辉.SQL Server 2000管理及应用系统开发.人民邮电出版社,2002

[11].徐松林,路斌,王冬春.PowerBuilder 数据库应用开发教程.清华大学出版社,2003

[12].东方人华,仝丽娟.PowerBuilder 8.0 入门与提高.清华大学出版社,2003

[13].郭兴成.PowerBuilder 8 教程.北京希望电子出版社,2002

[14].王志勇,阮坚,王鹏.用PowerBuilder 开发小型数据库.人民邮电出版社,2002

[15].周刚,赵永军,方小伟.PowerBuilder 项目开发实践.中国铁道出版社,2003

致 谢

本次设计能得以顺利完成,首先感谢寝室好友的帮助和指导,从设计最初的需求分析到设计的最终实现,在这整个过程中,同学刘华众一直给以无微不至的帮助。其次感谢指导教师张立群,在整个设计过程中对本人的督促和指导,使得设计能按期完成。

山 东 英 才 学 院

毕 业 论 文

论文题目: 图书管理系统

二 级 学 院: 计算机学院

学 科 专 业: 计算机信息管理

学 号: [1**********]0 姓 名: 冯志飞

班 级: 4班

指 导 教 师: 张立然

摘要: 管理信息系统是一个不断发展的新型学科,企业要生存要发展,要高效率地把企业活动有机地组织起来,就必须加强企业管理,即加强对企业内部的各种资源(人、财、物等)的有效管理,建立与自身特点相适应的管理信息系统。 本文介绍了在PowerBuider 环境下采用“自上而下地总体规划,自下而上地应用开发”的策略开发一个管理信息系统的过程。通过分析传统的人工管理图书馆的不足,创建了一套行之有效的计算机管理图书馆的方案。文章详细介绍了图书管理信息系统的系统分析部分,包括可行性分析、组织机构分析、管理职能分析、业务流程分析、数据流程分析、数据字典、处理描述等等。图书馆管理系统是典型的信息管理系统,其开发主要包括后台数据库的建立和维护以及前端的应用程序的开发两个方面。对于前者要求建立数据的一致性和完整性,对于后者则要求应用程序功能的完备,易用等的特点。基于上述考虑本系统主要利用PowerBuilder 8作前端的应用开发工具 ,利用Adaptive Server Anywhere 7 作为后台的数据库,利用WINDOWS 作为系统平台开发的图书管理系统。另外本图书馆管理系统利用软件工程化思想和方法,总体上是采用结构化生命法进行系统分析和设计的,而系统实现等步骤则采用了原型法和面对对象的方法。

关键字:管理信息系统、图书管理、PowerBuider 应用

Abstract: The management information system is the new discipline which develops unceasingly, the enterprise must survive must develop, wants the high efficiency organically to organize the enterprise activities, must strengthen the business management, namely strengthens to enterprise interior each resources (personnel and so on) the effective management, establishes the management information system which adapts with own characteristic. This article introduced uses “from the top downward the overall plan under the PowerBuider environment, applies the development from bottom to top” the strategy develops a management information system's process. Through the analysis tradition's labor management library's insufficiency, founded a set of effective computer management library plan. The article introduced the books management information system's system analysis part in detail, including feasibility analysis, organizations and agencies analysis, management function analysis, Operation flow analyses, data flow analysis, data dictionary, processing description and so on. The library management system is the typical information management system, its development mainly includes the backstage database the establishment and the maintenance as well as the front end application procedure development two aspects. Regarding the former request establishment data uniformity and integrity, regarding the latter, then request application program function completeness, Yi Yong and so on characteristic. Based on above considered that front end this system mainly 8 makes using PowerBuilder the application development kit, 7 takes the backstage using Adaptive Server Anywhere the database, takes the system platform development using WINDOWS the books management system management system. Moreover the library management system use software engineering thought and the method, as a whole use the structurization .

Key words: Management information system, books management, PowerBuider application

目 录

一 前 言 .................................................................................................. 5

1 MIS系统开发方法 . .................................. 5

2 MIS系统开发过程 . .................................. 6

二 系统需求分析 .................................................................................... 6

1现行业务描述....................................... 7

2现行系统存在问题的分析 . ............................ 8

3解决方案 .......................................... 8

三 系统总体结构设计.........................................................................................9

1 系统目标设计 ...................................... 9

2 系统功能分析 ..................................... 10

3系统各功能模块设计 . ............................... 11

4数据流图 ......................................... 11

四 数据库设计...................................................................................................14

1数据库需求分析 ........................................ 14

2 数据库逻辑结构设计 ............................... 15

五 管理系统的具体实现...................................................................................20

1 PowerBuilder开发工具简介 . ........................ 21

2 Powerbuilder 8应用程序开发的基本步骤 ............. 21

3 编码规范 ......................................... 22

4 创建祖先窗口和全局函数 ........................... 22

5 应用程序对象 App_librarain ....................... 24

6具体窗口的体现 . ................................... 25

六 结束语 ............................................................................................ 46

参考文献 „„„„„„„„„„„„„„„„„„„„„„„„„„„47

一 前 言

随着人类社会的发展,人类对知识的需求也不断地增长。在这种形势下,书籍就渐渐地成为人们获取并增长知识的主要途径,而图书馆就自然而然地在人们的生活中占据了一定的位置,如何科学地管理图书馆不但关系到读者求知的方便程度,也关系到图书馆的发展,因此,开发一套完善的图书馆管理系统就必不可少了。

管理信息系统(简称MIS) 是介于信息论,经济管理理论,统计学与运筹学及计算机科学之间的一门边缘性,综合性,系统性的交叉科学,它是随着管理科学,信息技术,计算机技术等的发展而产生和发展起来的。

图书馆管理系统是典型的信息管理系统,其开发主要包括后台数据库的建立和维护以及前端的应用程序的开发两个方面。对于前者要求建立数据的一致性和完整性,对于后者则要求应用程序功能的完备,易用等的特点。基于上述考虑本系统主要利用PowerBuilder 8作前端的应用开发工具 ,利用Adaptive Server Anywhere 7 作为后台的数据库,利用WINDOWS 作为系统平台开发的图书管理系统。另外本图书馆管理系统利用软件工程化思想和方法,总体上是采用结构化生命法进行系统分析和设计的,而系统实现等步骤则采用了原型法和面对对象的方法。

1.1 MIS系统开发方法

管理信息系统的开发方法有生命周期法、原型法和面向对象的开发方法等:

生命周期法(Life Cycle Method )是20世纪60年代发展起来的一种应用广泛且比较成熟的管理系统开发方法,它的基本思想是将系统的开发工作从开始到结束划分为若干个阶段,每个阶段都有明确的任务,而系统开发出来后,并不意味着生命周期的结束,而意味着根据组织的需要对系统的修改和重建的开始。

原型法(Prototyping Method)是20世纪80年代发展起来的,旨在改变生命周期法的缺点的一种系统开发方法,该法的开发思路是首先根据用户的要求,由用户和开发者共同确定系统的基本要求和主要功能,利用系统快速生成工具,建立一个系统模型,再在此基础上与用户交流,将模型不断补充、修改、完善,如此反复,最终直至用户和开发者都比较满意为止,从而形成一个相对稳定、较为理想的管理信息系统。

面向对象(Object Oriented)的开发方法于20世纪80年代开始兴起的,是一种基于问题对象的自底向上的一种系统开发方法,这种方法的特点是以对象为基础,对象是分析问题和解决问题的核心。

1.2 MIS系统开发过程

一个MIS 系统的开发过程一般包括如下几个步骤:

(1)需求分析:需求分析主要是了解用户的需求。需求了解得越详细,程序的后期开发与维护费用就会越少。一般的开发团队中,需求分析都是由资历较深的系统分析员或项目经理担当,可见它的重要性。需求分析制订好后,需要反复修改。将最后的结果交给用户审定,确认无误后,由系统分析员完成需求分析文档,再开始下一步工作。

(2)概要设计:概要设计紧跟在需求分析之后。用户需求明确后,将得到的数据分析后,开始构建数据库的逻辑结构。此时,数据库中的表格还未成形,通过各种分析工具(如PowerDesigner 等)画出数据流图,最后就可抽象出数据库的具体表结构。这时由系统分析人员反复审核。确认所有的需求都考虑在内,没有遗漏后,就可以开始制订概要设计文档。概要设计文档形成后,整个程序的逻辑框架也就形成了。

(3)详细设计:概要设计完成后,根据设计中制订的业务模块。就可以进行详细分析设计了。详细设计就是将各个业务模块的窗口全部建好,各个窗口控件的处理代码全部用语言表达出。所以详细设计是整个系统中最繁琐的环节。详细设计完成后,整个程序就确定了,再由编程人员根据详细设计文档将代码完成。整个开发工作就宣告结束。

1) 程序编码:程序编码相对于其他环节来说比较简单,程序员只需要根据详细分析文档写程

序编码,保证代码没有错误即可。程序编码需要注意的是整个程序书写中命名的规范化与编程风格的规范化,这需要较长时间的培养来形成。需要在不断的实践中形成自己独特的风格。总的来说,不要过分地追求复杂的算法,因为那可能会导致后期维护人员无法读懂你的代码而造成维护的困难。

(4)测试:程序编码完成后,就需要测试。测试有几种类型,主要是测试代码有无逻辑错误以及在加载数据环境下程序的稳定性问题。测试工作中发现的错误应及时改正,然后将它记录到测试文档中。

(5)打包:测试完成,确认无误后。程序就可以打包发行了。打包一般使用工具如PWISE 等。

以上是一个完整的MIS 系统开发过程,其实不仅MIS 系统,其他类型的程序开发也基本相同。

二 系统需求分析

整个软件生命周期中,开发所占的费用和时间都很小。后期维护工作一般要占整个软件生命周期的80% 以上。所以系统分析很重要,一个好的系统分析可以减少很多后期维护工作。

2.1现行业务描述

下面以一所学校的图书馆为例子进行分析,画出图书馆的组织结构图如下:

图2.1 图书馆的结构图

该图书馆各个部门负责的主要业务如下:

(1)采编组主要负责图书采编工作,包括购置新书、打印编目、增加数量。

(2)目录厅主要负责读者查询工作,包括可借图书(按图书类别、图书名称或图书作者查询);新书目录(按图书类别、日期查询)。

(3)借阅组主要负责图书流通、查询统计、借阅查询等工作。

(4)阅览室、工具书室主要负责读者阅览工作,包括:阅览各种杂志、报纸、阅览各种工具书。

下面绘制出图书馆流通业务中借书的流程图:

(1)读者在目录厅查阅索引卡;

(2)读者写出所借图书的分类号、种次号、交给图书管理员,并出示本人的借书证;

(3)图书管理员根据图书的分类号、种次号到书库找书;

(4)将图书交给读者,并由读者填写所借图书的借书卡。

(5)图书管理员把借书卡保存到写有该读者借书证号的口袋里。

得出该图书馆业务流程图如下所示:

图2.2 业务流程图

2.2现行系统存在问题的分析

该图书馆工作大部分还是进行着手工管理,工作起来效率很低,由于不可避免的人为因素,经常造成数据的遗漏、误报。计算机信息化管理有着储存信息量大、速度快等许多优点,提供给我们的处理信息及时快捷,同时也提高了我们工作人员的自身素质。

2.3解决方案

基于以上的对问题的分析,利用计算机给我们提供信息,及时地调整学校图书馆图书结构,并且对学生们的借阅过程形成一整套动态的管理就十分必要了。

图书馆信息系统的建立,需要进行用户的需求调查与分析,以确定系统目标,提出解决 问题的详细方案,这是系统建设的重要环节。

学校图书馆规模相对于商业图书馆小,但要有着完善的图书信息,对每一册书要有详细的记录信息,功能上对系统的需求是全面的。因此对用户的需求可分为四个方面:一方面是图书馆工作人员通过计算机来管理各类图书,分类编号,调整图书结构,增加图书库存,适应学生的需求;二方面是学生们能通过计算机来查询浏览图书馆中的图书,来确定自己需要的书籍,为借阅做好准备;三方面是工作人员对学生们的借书证发放;四方面也是图书馆的核心工作,对图书的借阅管理。

这四个方面形成了学校图书馆一个工作整体,采用计算机自动化信息处理,可方便快捷地共享信息、交流信息,高效地协同工作。

在软、硬件方面对系统的需求,软件要求易学,界面友好,容易掌握,可以很简单方便的管理各种图书信息。硬件的配置要求不能太高,这样可以很好的适应当前的学校图书馆。 在开发方式上对系统的需求,由于学校图书馆是一种无商业利益的,所以系统设计开发的周期要短,在短时间内完成,减少开发成本,提高开发效率,方便、简单、实用作为系统开发的指导思想。

三 系统总体结构设计

如果要完成一个完整的图书管理系统,需要的相关信息很多。由于种种条件的限制,同时考虑到开发成本,所以本系统仅实现基本的管理功能。并不能完全满足上面例子所描述的图书馆,使用前应进行二次开发。

3.1 系统目标设计

系统开发的总目标是实现内部图书借阅管理的系统化、规范化和自动化。

能够对图书进行注册登记,也就是将图书的基本信息(如:书名、作者、价格等)预先存入数据库中,供以后检索。

能够对借阅人进行注册登记,包括记录借阅人的姓名、地址、电话等信息。

提供方便的查询方法。如:以书名、作者、出版社、出版时间(确切的时间、时间段、某一时间之前、某一时间之后)等信息进行图书检索,并能反映出图书的借阅情况;以借阅人编号对借阅人信息进行检索;以出版社名称查询出版社联系方式信息。

提供统计分析功能。可以展现出图书类型比例、库存与借出比例。

提供旧书销毁功能,对于淘汰、损坏、丢失的书目可及时对数据库进行修改。

能够对使用该管理系统的用户进行管理,按照不同的工作职能提供不同的功能授权。 提供较为完善的差错控制与友好的用户界面,尽量避免误操作。

3.2 系统功能分析

根据以上功能,将图书管理系统的数据分为:

数据输入部分:主要包括图书基本信息的录入、借阅人基本信息的录入、用户基本信息的

录入。

数据输出部分:主要是各种统计查询,包括:根据图书信息(如书名、作者、出版社等)

查阅图书及其借阅信息、统计输出图书类型比例等。

数据处理部分:主要涉及借阅和归还的处理,如一本书借出后,必须在数据库中将该书标记为已借出,

以防出现数据库中有书但图书馆无书的情况;一本书归还后,同样必须在数据库中将其标记为已经归还,以便再次借出。

3.3系统各功能模块设计

在系统功能分析的基础上,考虑PowerBuilder 程序编制的特点,得到如图所示的系统功能模块图:

图3.1 系统功能模块图

3.4数据流图

(3.4.1)系统顶层DFD 图

图3、2 系统顶层DFD 图

(3.4.2)系统总体结构功能模块图

图3.3 总体结构DFD 图

(3.4.3)图书基本信息登记/修改

图3.4 登记修改图

说明:出版社信息人工录入后,存放在出版社信息库中,便于今后书籍信息的录入以及出

版社信息的查询。分类信息由图书馆进行分类定制,存放在图书分类信息库中,

用于图书的分类管理。登记新书时,当涉及到出版社和分类的填写时,只需做相应

的选择即可,并存放在图书信息库中。

(3.4.4)图书查询

图3.5 图书查询

说明:输入查询条件后,检索图书信息库,并反应出查询结果。

(3.4.5)图书统计

图3.6 图书统计

说明:根据选择的统计条件,检索图书分类信息库或图书信息库,并反应出统计结果。

(3.4.6)图书借阅

图3.7 图书借阅

说明:输入借阅人编号,通过检索借阅人信息库,核实借阅人身份。输入图书编号,通过

检索图书信息库,核实图书信息。进行图书借出处理后,在图书借阅库中进行登记, 并将借出图书的在借标志设为“是”。

(3.4.7)图书归还

图3.8 图书归还

说明:输入图书编号,检索在借信息库,反应出图输借阅情况。进行归还操作后,修改在

借信息库中相关条目,同时在图书信息库中修改相关图书在借标志为“否”

四 数据库设计

数据库的设计是MIS 系统的核心部分,设计数据库,首先要进行需求分析,然后进行数据库的概念结构设计、逻辑结构设计、数据库结构实现等步骤。

4.1数据库需求分析

根据以上的需求分析和数据组织,开始设计数据结构,即根据需求勾画出实体/关系图(E/R)。在概念上,E/R图代表的是系统需要的数据及其这些数据之间的关系。如图所示的实体/关系图:

从图中可以看出,在这个系统中实际存在的实体:图书和借阅人,其中借阅人和图书是多对多关系,针对本系统,通过对图书借阅管理的内容和数据流程分析,设计数据项和数据结构如下:

(1)图书基本信息,其数据项有图书编号、图书名称、作者、出版社等。 (2)借阅人基本信息,其数据项有借阅人编号、借阅人姓名、电话等。 (3)图书借阅登记,其数据项有借阅序号、借阅图书编号、借阅人编号等。 为了实现图书信息录入的方便性与规范性以及相关的统计功能,还应增加出版社信息 与图书分类信息:

(4)出版社信息,其数据项有出版社编号、出版社名称、地址、电话、传真等。 (5)图书分类信息,其数据项有分类编号、分类名称、同一类型图书数目。 同时针对于本系统的多用户使用特点,增加用户信息表: (6)用户信息表,其数据项有用户名、密码、用户权限。 为了实现图书借阅超期罚款制度,还应增设罚金规则表:

(7)罚金规则表,其数据项包括免费使用天数、罚金费率、规则启用开关。

4.2 数据库逻辑结构设计

数据库设计有几个范式,一般我们要做到的是第三范式,即数据表中没有冗余字段以及同一个表中的字段没有函数依赖关系,冗余字段即在一个表中已经保存过的信息,在另一个表中就不应该存在,如果需要的话,可以通过表间的关联来得到,函数依赖性就是一个表中的字段间不应该有计算关系,如一个表中有单价字段、数量字段,就不应该有一个总金额字段。如果程序运行过程中需要总金额,可以实时计算。不过在一些较常用的表中,我们可以适当地保留冗余字段,这样,在程序运行过程中可以减少由于表间互相关联而使用速度降低等问题。这就是所谓的第四范式。数据表设计时,最好不要使用用户输入的信息作为主键,每一个数据表自己定义一个主键,添加信息是由程序自动添加,这样就可以减少数据更新时产生的错误。表与表相关联的外键最好是由程序自动生成的主键,这样数据库就比较规范了。

另外,数据表设计时一般都应该有一些标志字段,标志字段可以定义成CHAR(1)或BIT 型。建议实际应用中定义成CHAR(1)字段可以存储多种可能的状态,在最初设计时,可能我们没有考虑到的一些情况,在程序后来的开发中,可以通过设计标志字段为不同的 值来解决,这样就避免了修改数据库结构。

数据库初期设计时一定要谨慎,把所有可能的情况都考虑进去,即使当时没有用到,也要将它留在数据库中作为备用字段以便将来扩充。

程序一旦开始编码,就应该尽量避免再修改数据库。因为如果数据库结构一旦改变, 所有与修改的数据表相关的业务都有可能受到影响,而某些影响还很难看到,这样就容易形成一个恶性循环。错误越改越多,越改越乱,最终导致程序的失败。PB 的数据窗口与其他语言的数据控件不一样,它的很多东西是预编译的。即使你一个模块已经调试无误,但只要数据库结构改动。相应的模块就一定要重新修改,否则一定会出问题。

图书借阅管理系统数据库中各个表的设计结果如下面几个表格所示。每个表格表示为数据库中的一个表。

借阅人基本信息表Is_stuid

说明:记录借阅人的基本情况,memberid 设为主键、索引。 表4.1

用户登录基本信息表w_fs29_longin

说明:记录系统用户的用户名、密码与权限,name 设为主键。 表4.2

图书基本信息表In_bookid

说明:记录图书基本信息,bookid 设为主键、索引。 表4.3

出版社基本信息表Is_publisher

说明:记录出版社信息,pubid 设为主键。 表4.4

分类信息表bookclass

说明:记录定制的分类情况,classid 设为主键。 表4.5

借阅情况信息表w_sf29_huaishu

说明:记录借阅的基本情况 表4.6

(1)规划有效的索引

a. 在组合表的列中创建索引,包括主关键字和外部关键字所在的列。 b. 在列或类组合中创建唯一的索引能增强唯一性。

c. 浏览索引并卸载不使用的索引。索引需要一定硬盘空间和时间来维护。具有较高数据插入操作频率的数据库最好不要索引。有较高读操作频率的数据库应该有更多的索引。 d. 避免在簇索引中包括不必要的列。在可能的情况下,使用较小的数据类型,例如用varchar 替代char 。

e. 考虑使用簇索引来支持排序和范围化查询。在为数据检索优化表时,簇索引必须支持数据的分组索引。为簇关键字选择列或列组,簇关键字以经常需要的顺序排序数据或以必须被一起访问的记录而分组记录。

f. 创建支持一般查询的查找参数索引。具有高选择性的列是索引的最好候选列。具有高密度的列是索引糟糕的候选列。 (2)使用约束实现数据的完整性

PRIMARY KEY约束在表中定义了主关键字,它是行唯一的标识符,它可以强制实体完整性。在使用PRIMARY KEY约束时考虑以下事实: a. 每个表只能有一个PRIMARY KEY约束。 b. 键入的值必须是唯一的。 c. 不允许有空值。

d. PRIMARY KEY约束在指定的列创建唯一的索引,可以指定簇索引和非簇索引(如果

非簇索引先前并不存在,簇索引是默认的)。

UNIQUE 约束指定,在一列中的两行不能有相同的值。该约束使用唯一的索引来强制实体的完整性。在已有一个主关键字时UNIQUE 约束很有用,例如雇员号,但是必须保证其他标识符(例如,雇员驾驶证号)也是唯一的。在使用UNIQUE 约束时,考虑以下事实; a. 允许有空值。

b. 在一个表中可以设置多个UNIQUE 约束。

c. 可以将UNIQUE 约束运用于具有唯一值的单列或多列,但不能用于表的主关键字。 d. 通过在指定的列或列组中创建唯一的索引,可以使UNIQUE 索引得到强制

五 图书管理系统的具体实现

5.1 PowerBuilder开发工具简介

PowerBuilder 是目前开发Client/Server结构的应用系统的主要工具之一。PowerBuilder8.0在继承与发展以前版本优秀功能的基础上,为适应网络应用程序的开发要求集成了Enterprise Application Studio 中PowerBuilder 以及Power Site的功能,在传统数据库开发的基础上,将Web 应用更好地集成到PowerBuilder 中。PowerBuilder 全面支持面向对象编程。是功能强大并易于使用的第4代编程语言(4GL),它内置了包括数据窗口在内的多种对象类,可以方便地访问数据库。相对于其他应用工具,PowerBuilder 具有工作效率高、成本低、质量高、功能强的特点。

5.2 Powerbuilder 8应用程序开发的基本步骤

我们要开发应用程序时,首先要对它进行分析。无论哪种、哪方面的应用程序,都要先建立一个应用对象。下面我们介绍以下PowerBuilder 8应用程序开发的基本步骤:

(1)首先要建立应用对象。

(2)创建窗口。在窗口里放置各种控件和编写事件响应的脚本。

(3)创建菜单。窗口里的菜单可包括菜单条,下拉式菜单,级联菜单和弹出式菜单为菜单编写事件响应的脚本。

(4)创建用户对象。如果想要重复使用某个控件的功能,可以把窗口上经常放置的控件定义为用户对象。

(5)创建数据窗口。数据窗口可以检索数据库中的数据,可以建立各种报或统计表,可以修改数据库。

(6)创建函数、结构、事件。为了能够更好地支持脚本,编写自定义的函数,定义结构类型变量,也可以为对象和控件定义自己的事件。

(7)运行与调试。可以在开发环境中随时运行应用程序,发现错误后,可以用调试工具进行调试。

(8)当应用程序开发完毕后,可以把它编译成可执行的文件,让用户比较容易地建立应用系统的运行环境。

5.3 编码规范

为了减少在软件开发过程中的错误,在软件开发过程中应该遵守一定的标准。

给对象命名要有一定的规范,部件名称可以达到40个字符,窗口的命名:W_功能代码_功能描述。数据窗口的命名:DW_功能代码_功能描述。菜单命名:M_功能代码_功能描述。

标识符命名时,应该使标识符有一定的字面含义,有助于程序的调试和脚本的可读性的提高。本系统中使用的命名规范为:变量作用域+变量类型+”_”+具有一定字面含义的名称。例如:li_selectrow反映出的含义:”l”代表是本地变量,是local 的缩写,”i ”代表是integer 类型的变量,selectrow 表示该变量是用来记录一个行号的计数器。

5.4 创建祖先窗口和全局函数

为充分利用PB 的面向对象的特性。程序开发时一般创建几个模板窗口。将功能窗口上的某些常用功能封装在模板窗口中。然后将这些模板窗口作为祖先窗口。所有的子孙窗口都可以通过继承的方法来生成。这样就减少了代码的书写量。使得整个程序界面保持整齐。当修改祖先窗口时,所有的子孙窗口都会自动修改。所以,祖先窗口的确定要十分谨慎。

全局函数与局部函数的作用类似。唯一不同的是全局函数的作用域是整个程序周期。不论你在任何一个模块的代码中都可以调用它。所以我们可以把某些常用功能写成全局函数。在程序的其他地方反复调用。

5.4.1函数level(character lev)

功能介绍:通过传入的lev 值,将某些菜单项设为“非使能”,以限制某些功能的使用。Lev

值即不同职责的权限(系统管理1、图书管理2、借阅人管理3、借阅操作员4),

从people 表中的level 字段中读取。

代码分析:

choose case lev

case "1"

case "2"

m_main.m_借阅人管理.enabled=false m_main.m_图书租赁.enabled=false

m_main.m_系统菜单.m_用户管理.enabled=false m_main.m_系统菜单.m_借阅规则设置.enabled=false m_main.m_系统菜单.m_图书信息设置.enabled=false

case "3"

m_main.m_图书管理.enabled=false m_main.m_图书租赁.enabled=false m_main.m_图书查询.enabled=false m_main.m_统计资料.enabled=false m_main.m_系统菜单.m_用户管理.enabled=false m_main.m_系统菜单.m_借阅规则设置.enabled=false m_main.m_系统菜单.m_图书信息设置.enabled=false

case "4"

m_main.m_图书管理.enabled=false m_main.m_借阅人管理.enabled=false m_main.m_系统菜单.m_用户管理.enabled=false m_main.m_系统菜单.m_借阅规则设置.enabled=false m_main.m_系统菜单.m_图书信息设置.enabled=false

end choose

5.4.2 函数countday

countday (date date1,date date2)

功能介绍:通过传入的date1(起始日期)值与date2(结束日期)值,计算出中间相差的天

数,返回值为integer 型。

代码分析:

int day

day=(integer(year(date2)) - integer(year(date1)))*365 +&

(integer(month(date2)) - integer(month(date1)))*30 +&

(integer(day(date2)) - integer(day(date1)))*1

return day

5.4.3 函数countfine

countfine (integer days, decimal fine, integer countday)

功能介绍:根据图书免费借阅天数days 、罚金费率fine, 以及已借阅的天数(由countday 函

数算出),计算出费用,返回值为decimal 型。

代码分析:

dec countfine

if countday>=0 and countday

countfine=0

else

countfine=(countday - days)*fine//超根据期多少计算罚金

end if

return countfine

5.5 应用程序对象 App_librarain

功能介绍:PB 程序由一个应用程序开始,即每个PB 程序在开始运行时,先执行应用程序对象

的Open 事件。在Open 事件中连接数据库,并打开登陆窗口w_login。

代码分析:

// Profile librarian

SQLCA.DBMS = "ODBC"

SQLCA.AutoCommit = False

SQLCA.DBParm = "ConnectString='DSN=librarian;UID=;PWD='"

Connect using SQLCA;

//判断数据库连接是否成功

if sqlca.sqlcode = 0 then

open(w_login)

else

messagebox('系统提示',' 连接数据库失败!')

end if

5.6 具体窗口的实现

(5.6.1)登录窗口

w_fs29-login

图6.1 系统登录窗口

功能介绍:本窗口主要是检查操作员输入的用户名及密码是否正确,如果正确,允许登录。

如果错误,显示出错误提示。

操作方法:填写“用户名”与“密码”后,点击“登录”按钮进行验证,点击“放弃”退出。 代码分析:

Open 事件:sle_1.setfocus()//“用户名”输入框获得焦点

this.width=923

this.height=588

“登录”按钮string ls_userid,ls_userpasswd,ls_userid1

ls_userid=trim(sle_1.text)

ls_userpasswd=trim(sle_2.text)

if ls_userid=""or ls_userpasswd="" then

messagebox('提示',' 用户名或密码不能为空,请重新输入!')

return

end if

select user_id into :ls_userid1 from fs29_user_info

where user_id=:ls_userid and user_passwd=:ls_userpasswd using sqlca;

if sqlca.sqlnrows>0 then

open(w_fs29_workspaces)

else

messagebox('提示',' 用户名或密码错误!')

end if

(5.6.2) 主窗口w_main

功能介绍:本窗口作为菜单及其他子窗口的容器。

窗口设置;本窗口为容器窗口,故它的WindowType 为mdihelp!, 表示本窗口为多文档界面,可以有菜单、工具栏与状态栏。WindowState 为maximized! ,表示窗口在运行时是最大化的风格。Menuname 属性设为m_main,即是与本窗口连接的菜单名称。

(5.6.3) 菜单m_main menu

图6.2 菜单窗口

功能介绍:打开各功能窗口

操作方法:点击菜单项或工具栏上相应的按钮,状态栏可显示帮助信息。

代码分析:每个相应的菜单项的clicked 事件都使用opensheet 方法来打开相应的功能窗口,

如“新书入库”的菜单项下的 clicked事件的处理代码为:

opensheet(w_newbook,"w_newbook",parentwindow,0,cascaded!)

(5.6.4)查询窗口

(1)按图书作者查询

图6.3 查询窗口(一)

功能介绍:按照图书的作者查询图书

操作方法:在相应的空中输入作者姓名,然后点击“查询”按钮即可。

代码分析 :

“查询”按钮:dw_1.settransobject(sqlca)

string ls_author

ls_author= trim(sle_1.text)

if isNULL(ls_author) or ls_author="" then

messagebox("提示"," 缺少作者姓名!")

return

end if

dw_1.retrieve(ls_author)

//dw_1.retrieve(ls_qauthor)

(2)按出版社查询

图6.4 查询窗口(二)

功能介绍:按照出版社查询图书

操作方法:在相应的空中输入出版社名称,然后点击“查询”按钮即可。

代码分析:

“查询”按钮 string ls_publisher

ls_publisher = trim (sle_1.text)

if not ls_publisher = "" then

dw_1.settransobject(sqlca) dw_1.retrieve (ls_publisher)

else

MessageBox ("查询出错"," 请输入有效的出版社名称!")

end if

sle_1.SetFocus()

(5.6.5)借书窗口w_fs29_jieshu

图 6.7 借书窗口

功能介绍:借阅图书,

操作方法:输入“学生学号”与“图书编号”后,学生姓名与图书书名将显示出来,然后点

击“借阅”按钮借阅图书。

代码分析:

long ls_stuid,ls_stuid2,ls_bookid,ls_bookid2

int ls_flag

//验证学号和图书编号是否为空

if sle_stuid.text=""OR isNULL(sle_stuid.text) then

messagebox("缺少数据!"," 请输入学生学号!")

sle_stuid.setfocus()

return

elseif sle_bookid.text=""OR isNULL(sle_bookid.text) then

messagebox("缺少数据!"," 请输入图书编号!")

sle_bookid.setfocus()

return

end if

ls_stuid=long(sle_stuid.text)

ls_bookid=long(sle_bookid.text)

select fs29_Student.stud_id//判断借阅人学号是否存在

into :ls_stuid2

from fs29_Student

where fs29_Student.stud_id=:ls_stuid;

if ls_stuid2=0 then//判断是否有该" 借阅人"

messagebox("系统提示"," 没有此借阅人信息!请验证后重新输入学号!")

sle_stuid.setfocus()//"学生学号" 输入框获得焦点

return

end if

select fs29_BookInfo.bookID

into :ls_bookid2

from fs29_BookInfo

where fs29_BookInfo.bookID=:ls_bookid;

if ls_bookid2=0 then

messagebox("系统提示"," 没有此图书信息!请验证后重新输入图书编号!")

sle_bookid.setfocus()

return

end if

SELECT delflag

INTO:ls_flag

FROM fs_29_jiebook WHERE bookID=:ls_bookid;

if ls_flag=1 then

messagebox("系统提示"," 本书已经外借!")

sle_bookid.setfocus()

return

end if

dw_1.retrieve(ls_bookid,ls_stuid)

dw_1.visible=true

cb_2.enabled=true

end if

long ls_stuid,ls_bookid,ls_count

date ls_loandates

integer ls_flag//0表示图书已归还(可再借),1表示图书已借出(不可再借)

ls_stuid=long(sle_stuid.text)

ls_bookid=long(sle_bookid.text)

ls_loandates=today()

//得到delflag 标记值

SELECT delflag

INTO :ls_flag

FROM fs29_Loan WHERE bookID=:ls_bookid;

//得到该生所借图书数量

SELECT COUNT(*)

INTO :ls_count

FROM fs29_Loan WHERE stud_id=:ls_stuid and delflag=1;

//判断该书是否借出

if ls_flag=1 then

messagebox("系统提示"," 本书已经外借!")

sle_bookid.setfocus()

return

else

if ls_count

INSERT INTO fs29_Loan

(bookid,stud_id)

VALUES (:ls_bookid,:ls_stuid);

UPDATE fs29_Loan

set

loandate=:ls_loandates,

returndate=NULL,

fine=0,

delflag=1

WHERE bookid=:ls_bookid;

messagebox("提示"," 图书编号为"+string(ls_bookid)+"的图书借出成功!")

else

messagebox("提示"," 该生所借图书数量已达最大(5本) !借阅失败!")

end if

end if

sle_bookid.text=""

sle_bookid.setfocus()

dw_1.visible=false

cb_2.enabled=false

(5.6.6) 还书窗口 w_fs29_huanshu

图6.8 还书窗口

功能介绍:归还图书

操作方法:输入“图书编号”,判断后显示出图书名称、借阅人编号、借阅人姓名。并根据是

否启用了“罚金制度”(在“罚金规则窗口”设置),决定是否计算罚金。

代码分析:

“确定”按钮

long ls_bookid,ls_bookid2,days

date ls_loandates,ls_returndates

dec ls_fine

//验证图书编号是否为空

if sle_1.text=""OR isNULL(sle_1.text) then

messagebox("缺少数据!"," 请输入图书编号!")

sle_1.setfocus()

return

end if

ls_bookid=long(sle_1.text)

//判断图书是否借出

select bookID

into :ls_bookid2

from fs29_Loan

where bookID=:ls_bookid and delflag=1;

if ls_bookid2=0 then

messagebox("系统提示"," 此图书未借出!请验证后重新输入图书编号!")

sle_1.setfocus()

return

end if

select loandate

into :ls_loandates

from fs29_Loan

where bookID=:ls_bookid;

ls_returndates=today()

days=daysafter(ls_loandates,ls_returndates)

sle_2.text=string(ls_loandates)

sle_3.text=string(ls_returndates)

if days>30 then

ls_fine=dec(days - 30) * 0.1

sle_4.text=string(days - 30)

sle_5.text=string(ls_fine)

else

sle_4.text="0"

sle_5.text="0"

end if

cb_2.enabled=true

“返还”按钮

long ls_stuid,ls_bookid,ls_bookid2,day

date ls_loandates,ls_returndates

integer ls_flag//0表示该书未借出

dec ls_fine

int ret

ls_bookid=long(sle_1.text)

//得到还书日期

ls_returndates=today()

//得到借书日期

SELECT loandate

INTO :ls_loandates

FROM fs29_Loan

WHERE bookID=:ls_bookid;

//计算借阅天数

day=daysafter(ls_loandates,ls_returndates)

//大于30天需交罚款

if day>30 then

ls_fine=dec(day - 30) * 0.1

messagebox("提示信息"," 所借书在"+string(ls_returndates)+ " 已超期,罚款"+string(ls_fine)+"元,请交罚款!")

ret=messagebox("询问"," 罚款"+string(ls_fine)+"元是否已交?",Question!,YesNo!,3)

if ret=2 then

return

end if

//DELETE loan where bookid=:ls_bookid;

end if

select bookID

INTO :ls_bookid2

FROM fs29_Loan

WHERE bookID=:ls_bookid and delflag=1;

//当图书成功归还后更新借书表信息

if ls_bookid=ls_bookid2 then

messagebox("提示信息"," 图书编号为"+string(ls_bookid)+"的图书已还借成功!") update fs29_Loan

set returndate=:ls_returndates,fine=:ls_fine,delflag=0

where bookID=:ls_bookid;

else

messagebox("提示信息"," 此书未借出!")

end if

sle_1.text=""

sle_2.text=""

sle_3.text=""

sle_4.text=""

sle_5.text=""

sle_1.setfocus()

cb_2.enabled=false

(5.6.7)新书入库登记 w_fs29_newru

图6.11 新书入库窗口

功能介绍:增加、修改图书信息。

操作方法:a. 增加图书信息:点击“新增”按钮,添加图书信息,完成后点击“保存”按钮 b.修改图书信息:通过“图书编号”检索出图书信息,修改后点击“保存”按钮 代码分析:

“入库”按钮 string ls_ISBN,ls_title,ls_author,ls_abstract,ls_keywords integer ls_words,ls_number

long ls_bookid, ls_bookid2,ls_bookid3,ls_publisherid,ls_price,ls_classid date ls_publishdate

//图书编号,ISBN 编号

if sle_1.text=""OR isNULL(sle_1.text) then

messagebox("缺少数据!"," 请输入图书编号!") sle_1.setfocus() return

elseif sle_2.text=""OR isNULL(sle_2.text) then

messagebox("缺少数据!"," 请输入ISBN 编号!") sle_2.setfocus() return

end if

//图书名称, 图书出版日期

if sle_3.text=""OR isNULL(sle_3.text) then

messagebox("缺少数据!"," 请输入图书名称!") sle_3.setfocus() return

elseif sle_4.text=""OR isNULL(sle_4.text) then

messagebox("数据错误!"," 请输入' 年-月-日' 格式的出版日期!") sle_4.setfocus() return

end if

//日期格式的验证

if sle_4.text""and not isnull(sle_4.text) then

if isDate(sle_4.text) then ls_publishdate=date(sle_4.text) else messagebox("数据错误!"," 请输入' 年-月-日' 格式的出版日期!") sle_4.setfocus()

return

end if

end if

//作者和出版社ID 的验证

if sle_5.text=""OR isNULL(sle_5.text) then

messagebox("缺少数据!"," 请输入作者名字!") sle_5.setfocus() return

elseif ddlb_1.text=""OR isNULL(ddlb_1.text) then

messagebox("缺少数据!"," 请输入出版社ID !") ddlb_1.setfocus() return

end if

//印刷册数和图书分类的验证

if sle_8.text=""OR isNULL(sle_8.text) then

messagebox("缺少数据!"," 请输入印刷册数!") sle_8.setfocus() return

elseif ddlb_2.text=""OR isNULL(ddlb_2.text) then

messagebox("缺少数据!"," 请输入图书分类!") ddlb_2.setfocus() return

end if

ls_bookid=long(sle_1.text)

ls_ISBN=trim(sle_2.text)

ls_title=trim(sle_3.text)

ls_publishdate=date(sle_4.text)

ls_author=trim(sle_5.text)

if not sle_6.text="" then

ls_words=integer(sle_6.text)

end if

ls_publisherid=long(ddlb_1.text)

ls_number=integer(sle_8.text)

ls_price=long(sle_9.text)

ls_keywords=trim(sle_10.text)

if not ddlb_2.text="" then

ls_classid=long(ddlb_2.text)

end if

ls_abstract=trim(mle_1.text)

select fs29_BookInfo.bookID

into :ls_bookid2

from fs29_BookInfo

where fs29_BookInfo.bookID=:ls_bookID; if ls_bookid20 then

messagebox("出错信息"," 图书编号第"+string(ls_bookid2)+"号重号!请改正!") sle_1.setfocus() return

end if

insert into "fs29_BookInfo"

("bookID",

"ISBN",

"title",

"publishdate",

"author",

"words",

"publisherID",

"number",

"price",

"keywords",

"abstract",

"classID")

values

(:ls_bookID,

:ls_ISBN,

:ls_title,

:ls_publishdate,

:ls_author,

:ls_words,

:ls_publisherid,

:ls_number,

:ls_price,

:ls_keywords,

:ls_abstract,

:ls_classID);

//判断是否添加成功

select fs29_BookInfo.bookID

into :ls_bookid3

from fs29_BookInfo

where fs29_BookInfo.bookID=:ls_bookID; if ls_bookid30 then

messagebox("提示"," 图书信息添加成功!") sle_1.setfocus()

sle_1.text=""

sle_2.text=""

sle_3.text=""

sle_4.text=""

sle_5.text=""

sle_6.text=""

ddlb_1.text=""

sle_8.text=""

sle_9.text=""

sle_10.text=""

mle_1.text=""

ddlb_2.text=""

sle_1.setfocus()

else

messagebox("提示"," 添加失败!")

end if

(5.6.8) 新书预览

w_fs29_newbook

图 6.12 新书预览窗口

功能介绍:查询新入库图书信息

操作方法:输入“借阅人编号”与“图书编号”后,借阅人姓名与图书编号将显示出来,然

后点击“确定”按钮即可。

代码分析:

“确定”按钮 long ln_bookid,ln_bookid2

ln_bookid=long(sle_1.text)

if not sle_1.text="" then

select bookid

into :ln_bookid2

from fs29_BookInfo

where bookid=:ln_bookid;

if ln_bookid2=0 then

messagebox("系统提示"," 没有此图书信息!请验证后重新输入图书编号!") sle_1.setfocus()

return

end if

dw_1.settransobject(sqlca)

cb_2.enabled=true

dw_1.retrieve(ln_bookid)

else

messageBox("数据不全"," 请输入图书编号")

end if

(5.6.9) 销毁旧图书

w_fs29_oldbook

图 6.13 销毁旧书窗口

功能介绍:删除图书信息。

操作方法:首先通过图书编号检索出图书信息,然后点击“删除”按钮注销图书。 代码分析:

long ls_bookid

ls_bookid=long(sle_1.text)

delete

from fs29_BookInfo

where fs29_bookinfo.BookID=:ls_bookid;

messagebox("提示"," 删除信息成功!")

sle_1.text=""

sle_1.setfocus()

dw_1.visible=false

cb_2.enabled=false

(5.6.10)出版社信息管理窗口

w_fs29_publisher

图 6.14 出版社信息管理窗口

功能介绍:出版社信息的添加、删除与修改。

操作方法:在对话框中依次输入相应的出版社信息,如出版社名称、地址等信息,然后按要求点击“添加”、“确定”、“删除”、“确定”按钮。

代码分析:

“添加:按钮long Is_publisherid,Is_postcode,Il_i

String Is_publisher,Is_address,Is_tel,Is_fax, Is_http,ll

if sle_1.text=""or iSNull(sle_1.text)then

messagebox("缺少数据"," 请输入出版社ID")

sle_1.setfocus()

return

end if

Is_publisherid=long(sle_1.text)

Is_publisher=trim(sle_2.text)

Is_address=trim(sle_3.text)

Is_tel=trim(sle_4.text)

Is_fax=trim(sle_5.text)

ll=trim(sle_6.text)

if not ll="" then

Is_postcode=long(sle_6.text)

end if

Is_http=trim(sle_7.text)

select fs29_PublisherInfo.publisherID

into:Il_i

from fs29_PublisherInfo

where fs29_PublisherInfo.publisherID=:Is_publisherid;

if Il_i0 then

messagebox("信息错误"," 出版社ID 第"+string(Il_i)+"号重号! 请改正!") sle_1.setfocus()

return

end if

insert into fs29_PublisherInfo

values(:Is_publisherid,

:Is_publisher,

:Is_address,

:Is_tel,

:Is_fax,

:Is_postcode,

:Is_http);

messagebox("提示"," 信息添加成功!")

sle_1.text=""

sle_2.text=""

sle_3.text=""

sle_4.text=""

sle_5.text=""

sle_6.text=""

sle_7.text=""

sle_1.setfocus()

“确定”按钮 long Is_publisherid,Is_publisherid2

Is_publisherid=long(sle_8.text)

if not sle_8.text="" then

select publisherid

into :Is_publisherid2

from fs29_PublisherInfo

where publisherid=:Is_publisherid;

if Is_publisherid2=0 then

messagebox("系统提示"," 没有此出版社信息!请验证后重新输入出版社编号!") sle_8.setfocus()

return

end if

dw_1.retrieve(Is_publisherid)

else

messageBox("数据不全"," 请输入出版社ID")

end if

tab_1.tabpage_2.cb_del.visible=true

tab_1.tabpage_2.dw_1.visible=true

(5.6.11)统计窗口 w_fs29_graph

各类图书比例窗口w_count_booktype、库存/借出比例窗口w_count_loan

说明:由于这两个窗口大同小异,所以仅对w_count_booktype进行说明。

图6.15 统计窗口

功能介绍:统计现有各类图书比例,并以饼型图显示出来。

代码分析:

long ll_sum,ll_i,ll_id,ll_j=1

string ls_name=""

dec i

SELECT Count(*)

INTO :ll_sum

FROM fs29_BookInfo;

DECLARE book CURSOR FOR

SELECT fs29_bookclass.classname,fs29_bookclass.classid

FROM fs29_bookclass;

open book;

if SQLCA.SQLCode = -1 then

MessageBox("数据库错误"," 请重新打开!")

else

do

if ls_name "" then

gr_1.addseries(ls_name)

SELECT Count(*)

INTO :ll_i

FROM fs29_bookinfo

WHERE fs29_Bookinfo.classid = :ll_id;

i = dec(ll_i)

i = i / ll_sum

gr_1.adddata(ll_j,i,1)

ll_j++

end if

FETCH book INTO :ls_name,:ll_id;

loop WHILE SQLCA.SQLCode = 0

end if

close book;

六 结束语

在对管理信息系统的开发过程有了基本了解后,本人使用PowerBuilder 8.0开发了这个“图书管理系统”。系统基本实现了内部图书借阅管理的系统化、规范化和自动化。例如对图书进行登记,对旧书进行销毁。添加借阅人以及注销借阅人。图书的借阅、归还。可以按作者、出版社、出版时间等信息对图书进行查询,并能反映出图书的借阅情况。实现了简单的统计分析功能,可以展示出库存图书与借出图书的比例、馆藏图书种类的情况。并能对借阅规则进行设置。还能够对使用该管理系统的用户进行管理,按照不同的工作职能提供不同的功能授权。

通过对该系统的设计、开发和调试,一方面让我了解了MIS 系统的开发过程与方法,另一方面,让我初步掌握了PowerBuilder 开发工具的使用方法,熟悉了窗口、菜单以及一些可视化控件的使用方法。通过使用还了解到窗口对象、数据窗口对象、各类控件的属性与方法。同时,在制作过程中遇到了不少问题和困难,通过查阅书籍及互连网得到了不小的帮助。

因为条件的限制,该管理系统还存在不少的缺点和漏洞,只能尽量改正与完善。不足之处,还请多多指教。

参 考 文 献

[1].罗超理,李万红.管理信息系统原理与应用.清华大学出版社,2002

[2].艾德才.计算机信息管理基础.中国水利水电出版社,2001

[3].Jeff Robin.Management of Information System.机械工业出版社,2002

[4].Tim F Lee.Implement MIS.北京出版社,2001

[5].萨师煊,王珊.数据库系统概论.高等教育出版社,2000

[6].Efrem G.Mallach.Decision Support and Data Warehouse Systems.电子工业出版社,2001

[7].Michael J.Hernandez.Database Design for Mere Mortals.中国电力出版社,2003

[8].Abraham Silberchatz.Database System Concepts.机械工业出版社,2003

[9].Graeme Malcolm.SQL Server 2000 with XML.清华大学出版社,2003

[10].李晓喆,张晓辉.SQL Server 2000管理及应用系统开发.人民邮电出版社,2002

[11].徐松林,路斌,王冬春.PowerBuilder 数据库应用开发教程.清华大学出版社,2003

[12].东方人华,仝丽娟.PowerBuilder 8.0 入门与提高.清华大学出版社,2003

[13].郭兴成.PowerBuilder 8 教程.北京希望电子出版社,2002

[14].王志勇,阮坚,王鹏.用PowerBuilder 开发小型数据库.人民邮电出版社,2002

[15].周刚,赵永军,方小伟.PowerBuilder 项目开发实践.中国铁道出版社,2003

致 谢

本次设计能得以顺利完成,首先感谢寝室好友的帮助和指导,从设计最初的需求分析到设计的最终实现,在这整个过程中,同学刘华众一直给以无微不至的帮助。其次感谢指导教师张立群,在整个设计过程中对本人的督促和指导,使得设计能按期完成。


相关内容

  • 网络信息资源管理的标准化体系研究
  • 躺擎搭 t懂寓资褥整理t 情报科学 器等,!:0 网络信息资源管理的标准化体系研究 吴慰慈张久珍 (北京太学信息管理系,北京l00871) 摘要 本文从研究网络信息资源管理标准化体系的必要性出发.明确指出我国网络信息资源管理的首要 任务应该是对网络信息资源建设的标准化体系作深入分析:阐述丁进行网络信 ...

  • 郑州大学信息管理学院硕士学位论文参考文献分析
  • 摘要:论文对郑州大学信息管理学院硕士学位论文的"参考文献"进行统计,从参考文献类型.来源期刊.高被引图书及学位论文所属机构等内容进行分析,旨在了解郑州大学信息管理学院历届硕士的学术旨趣和对本领域国内外期刊及重要信息源的了解程度,以期为提高我院研究生乃至国内图书馆学.情报学及档案学 ...

  • 特色馆藏与特色图书馆建设
  • 2005年2月图书馆论坛 Feb,2005第25卷第1期 "bmryTribune V01.25 No.1 特色馆藏与特色图书馆建设 袁琳 (安阳师范学院图书馆,河南安阳455000) [摘要]传统图书馆存在许多弊端,特色图书馆则是现代图书馆发展的方向.在特色图书馆建设中,特色馆藏是其中最 ...

  • 吉首大学信息检索大赛复习题
  • 吉首大学信息检索大赛复习题 1.吉首大学图书馆网址是 (D ) A.http://www.jsu.edu.cn/ B.http://www.book. jsu.edu.cn/ C.http://www.lib.jsu.edu.cn/ D.http://lib.jsu.edu.cn/ 2.在维普数据库 ...

  • 医学高校图书馆要全面介入医学生毕业论文的写作
  • 医学高校图书馆要全面介入医学生毕业论文的写作 摘要:分析了医学生毕业论文写作中存在的一些问题及其原因,阐明了医学高校图书馆文献信息服务在其中的作用,并提出了医学高校图书馆为之开展文献信息服务的应对措施. 关键词:毕业论文;医学生;医学高校图书馆;信息服务毕业论文的撰写是高校本科教育的重要环节. 学生 ...

  • 关于总分馆制在国内图书馆的实现
  • 摘要 总分馆制越来越受到图书馆界的关注,通过介绍国内三大图书馆系统中具有代表性的图书馆:中山大学图书馆.广东东莞城市图书馆公共服务体系和中国科学院国家科学图书馆的组织结构,分析总分馆制具备的特点和现存的问题,以期对国内其它图书馆采用总分馆制提供借鉴. 总分馆制源于西方国家,其中,美国是总分馆制实行比 ...

  • Cjbjuxa_a毕业论文答辩发言稿
  • .| !_ 一个人总要走陌生的路,看陌生的风景,听陌生的歌,然后在某个不经意的瞬间,你会发现,原本费尽心机想要忘记的事情真的就这么忘记了.. 亲爱的各位老师, 您们好!我叫xxx,我的毕业论文题目是<数字图书馆资源共 享中云计算的现状.颈瓶与对策研究>.首先,感谢我的论文指导老师龚蛟腾老 ...

  • 图书馆学情报学刊物投稿经验
  • 图书馆学情报学刊物投稿经验 -------------------------------------------------------------------------------- (信息来源:http://slyang2005.bokee.com/ 图情小生的博客) 关键词: 图书馆 情报 ...

  • 图书管理信息系统设计--毕业论文最终版
  • 毕业设计(论文) 题目 图书管理管理信息系统设计 学生姓名 黄小凯 学号 专业 物联网 班级 指导教师评阅教师 2015年 完成日期 4月 25日 毕业设计(论文)课题任务书 ( 2014----2015学年) 学位论文原创性声明 本人郑重声明:所呈交的论文是本人在导师的指导下独立进行研究所取得的研 ...

  • 文献检索打印
  • 1.绪论复习 1 下列哪个数据库能检索到核心期刊的全文?维普中文科技期刊数据库 书生之家中经网维普中文科技期刊数据库国研网 2 百科全书属于三次文献 零次文献一次文献二次文献三次文献 3 文献中,ISBN是指国际标准书号 国际标准书号图书编号国际连续出版物号中国连续出版物号 4 下列选项中属于连续出 ...