南乐职业中专图书管理系统
摘 要:
为了方便我校图书管理人员的工作,经过调查和研究,根据自已编程经验,编写了“河南南乐职业中专图书管理系统”。作为自己自考学习的毕业论文的主要内容。 以下为系统思路和源程序:
关键词:图书 管理系统 foxpro
一、系统分析及方案设计:
南乐职业中专图书管理系统根据我校的实际情况,在图书管理员的配合下,根据自已编程经验的基础上编写的,此系统主要由以下几个模块构成:
主控模块(TSGL.PRG)
该模块作为主控模块,运行时,首先调用引导模块,然后再调用加密模块,最后运行主菜单程序段。细节实现技术请参阅程序源代码的注释。
主控模块要调用以下各子功能模块:
(1) 系统引导模块(TSYD.PRG)
系统引导模块是一个欢迎界面,显示一个缓慢移动的窗口,窗口中显示欢迎用语,没有更多的作用。细节实现技术请参阅程序源代码的注释。
(2) 系统加密模块(TSJM.PRG)
系统加密模块是为了系统的安全性而设的一个密码程序,初始密码为“123”。操作员必须输入正确的密码后才能运行下一步的程序,如果3次输入错误,则程序中止,退出程序执行。其中还用到回显技术,即每输一个字符,显示掩码“*”。直到按回车为止。细节实现技术请参阅程序源代码的注释。
(3) 借阅图书模块(GYTS.PRG)
本模块主要完成借阅图书手续,运行此模块,系统提示输入借书证号,即借书者的借书证号,输入借书证号后,系统自动打开职工代码数据库,查询是否有此借书证号,如没有,则显示错误信息,提示没有此借书证号,不能借阅图书,此技术主要防止输入数据有误,增强系统严谨性、健壮性。细节实现技术请参阅程序源代码的注释。
(4) 送还图书模块(SHTS.PRG)
本模块主要完成借阅图书手续,运行此模块,系统提示输入借书证号,即还书者的借书证号,输入借书证号后,系统自动打开职工代码
数据库,查询是否有此借书证号,如没有,则显示错误信息,提示没有此借书证号,表示输入有误,此技术主要防止输入数据有误,增强系统严谨性、健壮性。细节实现技术请参阅程序源代码的注释。
(5) 个人查询模块(GRCX.PRG)
本模块主要实现对某个人所借图书情况的查询,输入借书证号或姓名,利用计算机自动找出所查询的姓名(或借书证号)以及其所借图书的信息。具体实现技术请参阅程序源代码及注释。
(6) 按类别查询模块(LBCX.PRG)
本模块主要实现图书查询功能,运行此程序,系统提示输入要查询图书的分类号,计算机自动打开数据库进行查询,如没有此分类号,则显示没有此类书籍,如有,则显示一些图书信息,如书名、登录号,借出否等。具体实现技术请参阅程序源代码及注释。
(7) 按书名查询模块(SMCX.PRG)
此模块与类别查询模块基本相同,只是根据输入的书名对数据库进行查询,而类别查询是根据输入的分类号对数据库进行查询。具体实现技术请参阅程序源代码及注释。
(8) 按著者查询模块(ZZCX.PRG)
此模块与以上两个查询模块基本相同,只是根据输入的著者对数据库进行查询。具体实现技术请参阅程序源代码及注释。
(9) 增加职工模块(ZJZG.PRG)
本模块主要实现增加职工姓名及借书证号。运行此模块后,系统提示输入借书证号及职工姓名,输入结果后,系统会自动判断借书证号是否重复、姓名是否重复。如借书证号重复,则程序不再执行下去,要求重新输入;如姓名重复,提示重名,则要求确认。此举以防一人有多个借书证号,造成管理混乱,但允许重名。具体实现技术请参阅程序源代码及注释。
(10)减少职工模块(JSZG.PRG)
本模块主要实现减少职工的功能处理,主要是当职工调离本单位时处理,运行此模块后,系统提示输入借书证号或姓名,利用计算机自动找出姓名或借书证号来减少职工,该职工必须把所借书都归还以后,才能删除此职工信息,否则程序报错,不予办理减少职工手续。具体实现技术请参阅程序源代码及注释。
(11)输入图书模块(SRTS.PRG)
本模块主要实现登录图书信息的功能,运行此模块后,系统会自动给出一个登录号,此登录号是根据库中已有图书的登录号推断出来的,如不符合要求,还可以手动更改,输入项目中登录号、书名是必须输入。具体实现技术请参阅程序源代码及注释
(12)修改图书模块(XGTS.PRG)
本模块主要实现对原来输入图书信息有误时能够修改图书信息,运行此模块后,系统提示输入要修改图书的登录号。根据所输入的登录号,计算机自动在数据库进行查找,如找到,则显示此书信息,询问是否修改此书项目。如没有找到,则显示没有查到此书,重新输入登录号进行修改。具体实现技术请参阅程序源代码及注释。
(13)备份数据模块(BFSJ.PRG)
本模块主要实现对数据库的备份,以防计算机严重损坏,造成硬盘数据丢失,给管理图书带来巨大的损失和许多麻烦。具体实现技术请参阅程序源代码及注释。
(14)导入数据模块(DRSJ.PRG)
本模块与数据备份模块相对应,当硬盘数据丢失时或其他原因,需要以前的备份数据时,把备份在软盘的数据库重新拷入硬盘。此模块一般不用,因为此举要覆盖硬盘上原来的数据库。具体实现技术请参阅程序源代码及注释
(15)退出系统模块(TCXT.PRG)
本模块主要实现退出本管理系统,并能在星期五下午自动提示让你备份本周数据库,以及删除借还图书库中已还书的记录。具体实现技术请参阅程序源代码及注释。
其系统结构图为:
二、数据库设计及用途
1、图书登录数据库(TSDL.DBF)
序号 字段名 字段类型 宽度 小数位
1 登录号 C 010 000
2 分类号 C 015
000
3 书名 C 080 000
4 作者 C 020 000
5 出版社 C 020 000
6 出版时间 D 008 000
7 单价 N 006 002
8 经手人 C 008 000
9 借出否 L 001 000
10 摘要 M 010 000
图书登录数据库用于存储在图书登录时的一些基本信息。例如: 登录号存储要登录图书的登录号;
借出否存储此图书是否已被借出,登录时统一赋值为假,表示没有借出;
摘要用于存储此书的一些简介或其他需要备注的内容。
2、借还图书数据库(JHTS.DBF)
序号 字段名 字段类型 宽度 小数位
1 借书证号 C 003 000
2 职工姓名 C 008 000
3 登 录 号 C 010 000
4 书 名 C 080 000
5 借书日期 D 008 000
6 还书日期 D 008 000
7 还书期限 D 008 000
8 馆员签收 C 008 000
9 还否 l 001 000
借还图书数据库主要用于记录职工借阅或归还图书时的一些基本情况,例如:
借书证号用于存储借书者的借书证号;
登录号用于存储所借图书的登录号;
借书日期用于存储借书的时间,自动设为当前系统时间。
3、职工代码数据库(ZGDM.DBF)
序号 字段名 字段类型 宽度 小数位
1 借书证号 C 003 000
2 职工姓名 C 008 000
职工代码数据库主要用于存储职工姓名以及所对应的借书证号。
4、备份时间数据库(BFSJ.DBF)
序号 字段名 字段类型 宽度 小数位
1 备份时间 D 008 000
备份时间数据库用于存储每次作数据库备份的时间。
三、使用说明
1、本系统是在FoxPro 2.5b for Windows系统下编写的,在FoxPro 2.5b for Windows中先设置默认路径为本系统所在的目录,并在“command”窗口输入“Do TSGL”即可执行该系统。
2、运行主控模块后,自动运行系统引导模块,此模块是一个欢迎界面,然后运行加密模块,需要管理员输入正确密码才能使用本系统,如三次输入错误密码,则退出系统。
3、当输入正确密码后,会出现主菜单,然后根据菜单进行各种操作。想要退出系统,则选取主菜单中的退出系统选项。
四、各功能模块源代码介绍:
1、 主控模块:
程序源代码为:
CLEA ALL
SET TALK OFF
SET SAFE OFF
SET STATU OFF
SET ESCA ON
SET CENT ON
DO tsyd *调用引导模块
DO tsjm *调用加密模块
DEFINE WINDOW mainwin FROM 0,0 TO 30,100 SYSTEM FLOAT; MINI ZOOM CLOSE TITLE
MOVE WIND mainwin CENT
ZOOM WINDOW mainwin MAX
ACTI WINDOW mainwin
DEFINE MENU mainmenu IN mainwin BAR *在窗口中定义菜单 DEFINE PAD tslt OF mainmenu PROMPT
借阅图书、送还图书、个人查询等
DEFINE PAD tscx OF mainmenu PROMPT
按分类号、书名、著者查询图书情况
DEFINE PAD zggl OF mainmenu PROMPT
增加、减少职工
DEFINE PAD srts OF mainmenu PROMPT
输入新到图书情况
DEFINE PAD xgts OF mainmenu PROMPT
修改已有图书情况
DEFINE PAD sjwh OF mainmenu PROMPT
数据备份、导入备份数据等
DEFINE PAD tcxt OF mainmenu PROMPT
退出本管理系统
ON SELE PAD srts OF mainmenu DO srts
ON SELE PAD xgts OF mainmenu DO xgts
ON PAD tslt OF mainmenu ACTI POPU lt
ON PAD tscx OF mainmenu ACTI POPU cx
ON PAD zggl OF mainmenu ACTI POPU zg
ON PAD sjwh OF mainmenu ACTI POPU wh
ON SELE PAD tcxt OF mainmenu DO tcxt
DEFINE POPU lt MARG
DEFINE BAR 1 OF lt PROM
ON SELE BAR 1 OF lt DO gyts
ON SELE BAR 2 OF lt DO ghts
ON SELE BAR 3 OF lt DO grcx
DEFINE POPUP cx MARG
DEFINE BAR 1 OF cx PROM
DEFINE BAR 2 OF cx PROM
DEFINE BAR 3 OF cx PROM
ON SELE BAR 1 OF cx DO lbcx
ON SELE BAR 2 OF cx DO smcx
ON SELE BAR 3 OF cx DO zzcx
DEFINE POPU zg MARG
DEFINE BAR 1 OF zg PROM
ON SELE BAR 1 OF zg DO zjzg
ON SELE BAR 2 OF zg DO jszg
DEFINE POPU wh MARG
DEFINE BAR 1 of wh PROM
ON SELE BAR 1 OF wh DO bfsj
ON SELE BAR 2 OF wh DO drsj
DO WHILE .T.
ACTI MENU mainmenu *激活菜单
ENDDO
RELE WINDOW mainwin
2、 引导模块:
程序源代码为:
set talk off
set escape off
set devi to scre
clear
clear all
define window winy at 0,17 size 4,22 double;
font
@ 1,4 say
@ 2,1 say
wait
tt=100
for i=1 to 60
j=0
do while j
j=j+1
enddo
move window winy by 0.05,0
endfor *实现窗口缓慢向下滑动 wait
for i=1 to 350
j=0
do while j
j=j+1
enddo
move window winy by 0.05,0
endfor *实现窗口继续向下滑动 release window winy *释放窗口
release i,j
set talk on
set escape on
retu
3、加密模块:
程序源代码:
set talk off
set escape off
clea
k=0
define window winmm at 6,24 size 7,28 double shadow;
color rgb(55,100,225,225,225,200) *定义窗口
move window winmm cent *移动窗口到中间位置 activate window winmm *激活窗口
do while .t.
clear
@ 3,8 say
mmm=
col=19
key=1
do while key!=13 *如果所接收的键不是回车键,则继续循环 key=inkey(0)
mmm=mmm+chr(key)
@3,col say
col=col+1
enddo
k=k+1
if upper(mmm)=
exit *如果密码正确,则退出程序 else
if k=4
clear
@ 2,5 say
@ 3.5,2 say
set cons off
wait timeout 5
set cons on
clear windows
canc *三次输入错误,则中止程序运行 endif
clear
@ 3,5 say
loop
endif
enddo
release window winmm
release k,mmm
set talk on
set escape on
return
4、 借阅图书模块
程序源代码:
SET SAFETY OFF
CLEA
DIME F(8)
DEFI WIND jswin AT 1,0 SIZE 21,50 TITL
ACTI WIND jswin
SELE 1
USE jhts *打开借还图书数据库
SELE 2
USE zgdm *打开职工代码数据库
SELE 3
USE tsdl *打开图书登录数据库
x1=
DO WHILE UPPER(x1)=
CLEAR
no=SPACE(3)
@ 10,15 SAY
READ
IF no=SPACE(3)
EXIT *如果不输入任何字符,则退出循环 ENDIF
CLEAR
SELECT 2
INDEX ON 借书证号 TO jszh *根据借书证号建立索引 LOCA FOR 借书证号=no *查找所输入的借书证号的记录 IF EOF() *如果没有找到,则显示错误信息,并退出循环 @ 10,0
@ 10,12 SAY
@ 12,16 SAY
SET CONS OFF
WAIT
SET CONS ON
EXIT
ENDIF
SELECT 1 *如果找到
F(1)=SPACE(3)
F(2)=SPACE(8)
F(3)=SPACE(10)
F(4)=DATE()
F(5)=DATE()+100
x2=
DO WHILE UPPER(x2)=
CLEAR
ROW=0
GO BOTTOM
@ 0,0 SAY
F(1)=no
@ ROW+4,2 SAY
SELECT 2
LOCAT FOR 借书证号=no
*在职工代码数据库中找出此借书证号对应的职工姓名 F(2)=职工姓名
SELECT 1
@ ROW+4,30 SAY
CLEAR GETS
@ ROW+6,2 SAY
*提示输入所借图书登录号
READ
IF LEN(RTRIM(LTRIM(F(3))))=0
EXIT
*如果没有输入登录号,表示你不想进行此手续,则退出此循环 ENDIF
SELECT 3
LOCA FOR 登录号=F(3) *在图书登录数据库中查找此登录号 IF .not.found()
CLEAR
@ROW+10,7 SAY
WAIT
SET CONS ON
CLEA
F(3)=SPACE(10)
LOOP
*如没有找到,则继续重新执行循环,重新输入登录号 ENDIF
IF 借出否=.T. CLEAR
@ROW+10,7 SAY
*如果标志出此书已借出,则有可能是输入有误,重新输入登录号 LOOP
ENDIF
书名=LTRIM(RTRIM(书名))
IF LEN(书名)>40
*如果书名一行输出不完整,则接着在下一行输出。
@ ROW+8,2 SAY
@ ROW+9,9 SAY SUBSTR(书名,41,LEN(书名))
ROW=ROW+1
ELSE
@ ROW+8,2 SAY
ENDIF
@ ROW+10,2 SAY
@ ROW+10,30 SAY
h1=RTRIM(LTRIM(F(3)))
IF LEN(h1)=0
LOOP
ELSE
x1=
@ ROW+14,12 SAY
pict
*确认输入数据库是否正确,此时键盘只能接受Y或N
READ
IF UPPER(x1)=
SELECT 3
LOCA FOR 登录号=F(3)
REPL 借出否 WITH .T. *把此书借出标志设为真 SELECT 1 *把信息记入借还图书库 APPE BLANK
REPL 借书证号 WITH F(1)
REPL 职工姓名 WITH F(2)
REPL 登录号 WITH F(3)
REPL 书名 WITH tsdl.书名
REPL 借书日期 WITH F(4)
REPL 还书期限 WITH F(5)
ELSE
F(3)=SPACE(10)
LOOP
ENDIF
ENDIF
@ ROW+16,10 SAY TRIM(F(2))+
GET x2 pict
READ
ENDDO
CLEAR
@ ROW+10,14 SAY
ENDDO
CLOSE ALL *关闭文件
RELE WIND jswin *释放窗口
RETURN
5、 归还图书模块
程序源代码:
CLEA
SELEC 1
USE jhts *打开借还图书数据库
SELEC 2
USE zgdm *打开职工代码数据库
SELEC 3
USE tsdl *图书登录数据库
DEFI WIND hswin AT 2,0 SIZE 16,50 TITL
MOVE WIND hswin CENT
ACTI WIND hswin
DIMENSION F(4)
F(1)=SPACE(3)
F(2)=SPACE(8)
F(3)=SPACE(10)
F(4)=SPACE(8)
x1=
DO WHILE UPPER(x1)=
CLEAR
no=SPACE(3)
@ 8,14 SAY
CLEAR
SELEC 2
LOCA FOR 借书证号=no *查找所输入的借书证号 IF EOF()
@ 6,14 SAY
@ 8,16 SAY
SET CONS OFF
WAIT
SET CONS ON
CLEA
EXIT
ELSE
F(1)=no
F(2)=职工姓名
ENDIF
SELEC 1 *选择第1工作区为当前工作区,即选择借还图书库 GO TOP
x2=
DO WHILE UPPER(x2)=
CLEAR
@ 1,5 say
@ 1,20 say
@ 3,6 SAY
READ
IF F(3)=SPACE(10)
EXIT
ENDIF
LOCA FOR 登录号=F(3).and.职工姓名=F(2).and.还否=.F.
*定位所输入的登录号以及职工姓名与借书证号相对应的记录,并*且此书的还否标志为假,表示还没有归还
IF FOUND()
clear
ROW=0
书名=LTRIM(RTRIM(书名))
IF LEN(书名)>40
@ ROW+1,2 SAY
ELSE
@ ROW+1,2 SAY
ENDIF
SELE 3 *选择图书登录数据库 LOCA FOR 登录号=jhts.登录号
@ ROW+2,2 SAY
@ ROW+2,9 SAY 作者 *调用图书登录库中的数据 SELE 1 *重新选择借还图书库 IF DATE()>还书期限
@ROW+4,8SAY
LTRIM(RTRIM(STR(DATE()-还书期限))) +
*如超期,算出超天数并显示
ENDIF
@ ROW+6,2 SAY
READ
IF F(4)=
*如果馆员签收中没有输入,则显示错误信息,提示需要馆*员签收,此手续才有效,中止此轮循环,进行下一轮循环。
@ ROW+8,2 SAY
SET CONS OFF
wait
SET CONS ON
LOOP
ENDIF
REPL 还书日期 WITH DATE() *还书日期设为当前时间 REPL 还否 WITH .T.
*在借还图书库中,把还否标志设为真,表示已还
SELE 3
REPL 借出否 WITH .F.
*在图书登录库中,把借出否设为假,表示还没有借出
SELE 1
REPL 馆员签收 WITH F(4)
ELSE
@ ROW()+2,8 SAY
wait
SET CONS ON
F(3)=SPACE(10)
LOOP
ENDIF
F(3)=SPACE(10)
@ ROW()+2,10 SAY TRIM(F(2))+
GET x2 pict
*询问某某同志是否继续还书,并接收一字符,只能是Y或N。 READ
ENDDO
@ ROW()+2,12 SAY
ENDDO
CLOSE ALL
RELE WIND hswin
RETU
6、 个人查询模块
程序源代码:
DEFI WIND grwin AT 2,0 SIZE 16,50 TITL
MOVE WIND grwin CENT
ACTI WIND grwin
CLEA
DIMENSION F(2)
F(1)=SPACE(3)
F(2)=SPACE(8)
x2=
DO WHILE UPPER(x2)=
SELE 1
USE jhts
SELE 2
USE zgdm
SELE 3
USE tsdl
CLEAR
no=SPACE(8)
@ 6,10 SAY
IF LEN(LTRIM(RTRIM(no)))=0
Exit
*如果字符串长度为零,即没有输入,表示不想查询,则退出循环。 ENDIF
SELECT 2 *选择职工代码数据库
LOCA FOR 职工姓名=no.or.借书证号=LEFT(no,3)
*定位到职工姓名为所输入的字符串或借书证号为所输入的字符 *串的记录。
IF EOF() *如果所输入的字符串与职工姓名和借书证号都不符 CLEAR
@ 10,12 SAY
@ 12,10 SAY
SET CONS OFF
WAIT
SET CONS ON
EXIT
ELSE
F(1)=借书证号 *如果找到记录,则把借书证号赋值给F(1) F(2)=职工姓名 *把职工姓名赋值给F(2)
ENDIF
USE
SELECT 1 *选择借还图书数据库
nn=0 *设置变量,存储没有还的图书的册数 CLEAR
LOCA FOR (借书证号=LEFT(no,3).or.职工姓名=no) .and. jhts.还否;
=.F. *定位到没有归还的图书记录
DO WHILE .NOT. EOF()
djg=MOD(nn,2)
rw=0
@ rw+2,2 SAY
@ rw+2,24 SAY
书名=LTRIM(RTRIM(书名))
IF LEN(书名)>40
@ rw+4,2 SAY
@ rw+5,9 SAY SUBSTR(书名,41,LEN(书名))
rw=rw+1
ELSE
@ rw+4,2 SAY
ENDIF
@ rw+6,2 SAY
@ rw+8,2 SAY
@ rw+10,2 SAY
CONTINUE *继续定位数据库指针
nn=nn+1 *册数加1
IF FOUND()
@14,14 SAY
SET CONS OFF
WAIT
SET CONS ON
CLEAR
ENDIF
ENDDO
IF nn=0 *如果册数为0,表示没有需要的归还的图书 @ 6,8 SAY
@ 7,4 SAY
@ 14,8 SAY
ENDDO
CLOSE ALL
RELE WIND grwin
RETURN
7、 按类别查询模块
程序源代码:
SET SAFE OFF
DEFI WIND lbcxwin AT 2,0 SIZE 11,50 TITL
ACTI WIND lbcxwin
CLEA
x1=
DO WHILE x1=
CLEAR
sm=SPACE(15)
@ 4,10 SAY
READ
IF LEN(LTRIM(RTRIM(sm)))=0
EXIT
ENDIF
SELECT 1
USE tsdl
nn=0
CLEAR
INDEX ON 分类号 TO dlsm
LOCA FOR 分类号=sm
DO WHILE .NOT. EOF()
DO cxjg
CONTINUE
nn=nn+1
@8,10 SAY
SET CONS OFF
WAIT
SET CONS ON
ENDDO
USE
IF nn=0
@ 4,9 SAY
SET CONS OFF
WAIT
SET CONS ON
ENDIF
CLEAR
@ 3,11 SAY
@ 5,13 SAY
ENDDO
CLOSE ALL
RELE WIND lbcxwin
RETURN
8、 按书名查询模块
程序源代码:
SET SAFE OFF
DEAC WIND tscx
DEFI WIND smcxwin AT 1,0 SIZE 16,60 TITL
ACTI WIND smcxwin
CLEA
SELECT 3
USE tsdl
x2=
DO WHILE UPPER(x2)=
CLEAR
sm=SPACE(80)
@ 6,2 SAY
IF LEN(LTRIM(RTRIM(sm)))=0
EXIT
ENDIF
SELECT 3
nn=0
INDEX ON LEFT(书名,40) TO dlsm
LOCA FOR 书名=sm
DO WHILE .NOT. EOF()
DO cxjg
CONTINUE
nn=nn+1
@13,20 SAY
SET CONS OFF
WAIT
SET CONS ON
CLEA
ENDDO
USE
IF nn=0
@ 8,18 SAY
ENDIF
@ 8,14 SAY
@ 10,16 SAY
ENDDO
RELE WIND smcxwin
RETURN
9、 按著者查询模块
程序源代码:
CLEA
DEFI WIND zzcxwin AT 1,0 SIZE 16,60 TITL
ACTI WIND zzcxwin
X2=
DO WHILE UPPER(x2)=
CLEAR
xm=SPACE(30)
@ 6,6 SAY
READ
IF LEN(LTRIM(RTRIM(xm)))=0
LOOP
ENDIF
SELECT 1
USE tsdl
nn=0
CLEAR
INDEX ON 作者 TO dlsm
LOCA FOR 作者=xm
DO WHILE .NOT. EOF()
DO cxjg
CONTINUE
nn=nn+1
@13,20 SAY
SET CONS OFF
WAIT
SET CONS ON
CLEA
ENDDO
USE
IF nn=0
@ 8,18 SAY
ENDIF
@ 8,14 SAY
@ 10,16 SAY
READ
ENDDO
RELE WIND zzcxwin
RETURN
10、 查询结果模块
本模块主要是被以上三个查询模块所调用,显示查询结果。具体实现技术请参阅程序源代码及注释。
程序源代码:
ROW=0
@ ROW+1,2 SAY
@ ROW+1,25 SAY
IF LEN(LTRIM(RTRIM(书名)))>40
@ ROW+2,2 SAY
@ ROW+3,7 SAY SUBSTR(书名,41,LEN(书名))
ROW=ROW+1
ELSE
@ ROW+2,2 SAY
ENDIF
@ ROW+3,2 SAY
@ ROW+3,25 SAY
@ ROW+4,2 SAY
@ ROW+5,2 SAY
@ ROW+5,25 SAY
IF 借出否=.F.
@ ROW+6,2 SAY
ELSE
@ ROW+6,2 SAY
ENDIF
11、 增加职工模块
程序源代码:
DEFI WIND zgwin AT 3,0 SIZE 12,40 SYST TITL
MOVE WIND zgwin CENT
ACTI WIND zgwin
CLEA
USE zgdm
x2=
DIME F(2)
DO WHILE UPPER(x2)=
F(1)=SPACE(3)
F(2)=SPACE(8)
CLEAR
GO BOTTOM
@ 0,2 SAY
@ 2,8 SAY
@ 4,8 SAY
READ
IF LEN(LTRIM(RTRIM(F(1))))=0.or.len(LTRIM(RTRIM(F(2))))=0 EXIT
ENDIF
GO TOP
LOCAT FOR 职工姓名=F(2)
IF FOUND()
@ 6,5 SAY
ENDIF
x1=
@ 8,6 SAY
READ
GO TOP
LOCAT FOR 借书证号=F(1)
IF FOUND()
CLEAR
@ 5,6 SAY
wait
LOOP
ELSE
IF UPPER(x1)=
APPEND BLAN K
GATHER FROM F
ELSE
LOOP
ENDIF
ENDIF
@ 10,6 say
READ
ENDDO
RELE WIND zgwin
CLOSE ALL
RETURN
12、 减少职工模块
程序源代码:
CLEA
DEFI WIND zgwin AT 3,0 SIZE 12,40 TITL
MOVE WIND zgwin CENT
ACTI WIND zgwin
SELE 1
USE jhts
SELE 2
USE zgdm
DIMENSION F(2)
F(1)=SPACE(3)
F(2)=SPACE(8)
x2=
DO WHILE UPPER(x2)=
SELE 1
SET SAFETY OFF
INDEX ON 借书证号 TO jszh
CLEAR
xx=SPACE(8)
@ 2,2 SAY
READ
IF LEN(RTRIM(LTRIM(xx)))=0
EXIT
ENDIF
N=0
LOCAT FOR (借书证号=LEFT(xx,3) .OR. 职工姓名=xx) .AND. 还;
否=.F.
IF .NOT. EOF()
N=1
ENDIF
IF LEN(LTRIM(RTRIM(xx)))>3
F(2)=xx
ELSE
F(1)=RTRIM(LTRIM(xx))
ENDIF
IF N=0
SELE 2
LOCA FOR 借书证号=F(1) .OR. 职工姓名=F(2)
IF .not.eof()
CLEAR
@0,2 SAY
@3,8 SAY
@5,8 SAY
tt=
@ 7,5 SAY
IF UPPER(tt)=
DELE
PACK
SELE 1
GO TOP
LOCAT FOR 借书证号=LEFT(xx,3) .OR. 职工姓名=xx DO WHILE .not.eof()
DELE
PACK
CONT
ENDDO
@8,2 SAY
WAIT
SET CONS ON
ENDIF
ELSE
@ 6,8 SAY
wait
ENDIF
ELSE
@ 6,4 SAY '请还您所借图书,否则不予办理手续!'
wait
ENDIF
@ 10,7 SAY
ENDDO
CLOSE ALL
RELE WIND zgwin
RETU
13、 输入图书模块
程序源代码:
SET SAFE OFF
SET TALK OFF
CLEA
USE tsdl
DIMENSION F(9)
DEFINE WINDOW srwin AT 1,10 SIZE 24,60 TITLE
MOVE WINDOW srwin CENTER
ACTI WINDOWS srwin
x2=
INDEX ON VAL(SUBSTR(登录号,6,LEN(登录号))) TO tsdl_dlh
DO WHILE UPPER(x2)=
GO BOTTOM
dlh=VAL(SUBSTR(登录号,6,LEN(ALLTRIM(登录号)))) dlh=dlh+1
CLEAR
F(1)=SPACE(10)
F(2)=SPACE(15)
F(3)=SPACE(80)
F(4)=SPACE(20)
F(5)=
F(6)=CTOD(
F(7)=0
F(8)=SPACE(8)
F(9)=SPACE(50)
F(1)=SUBSTR(登录号,1,5)+ALLTRIM(STR(INT(dlh)))
@ 0,0 SAY
@ 0,50 SAY DATE()
@ 2,2 SAY
if lastkey()=27
exit
endif
@ 2,30 SAY
@ 4,2 SAY
@ 6,2 SAY
@ 8,2 SAY
@ 10,2 SAY
@ 12,2 SAY
@ 14,2 SAY
@ 16,2 SAY
READ
if lastkey()=27
exit
endif
LOCAT FOR 登录号=F(1)
IF FOUND()
CLEAR
@ 10,14 SAY
wait
CLEAR
LOOP
ENDIF
IF LEN(ALLTRIM(F(1)))=0.or.len(ALLTRIM(F(3)))=0
@ 18,16 say
wait
loop
ENDIF
x1=
@ 20,14 SAY
IF UPPER(x1)=
APPE BLANK
GATHER FROM F
REPL 摘要 WITH F(9)
dlh=dlh+1
ELSE
LOOP
ENDIF
@ 22,14 SAY
ENDDO
RELE WIND srwin
SET SAFE ON
RETURN
14、 修改图书模块
程序源代码:
SET ESCA Off
CLEA
USE tsdl
DEFINE WINDOW xgwin AT 2,5 SIZE 20,60 TITLE
MOVE WINDOWS xgwin CENTER
ACTI WINDOW xgwin
x5=
DO WHILE UPPER(x5)=
CLEAR
dlh=SPACE(10)
@ 10,12 SAY
READ
nn=0
LOCATE FOR 登录号=dlh
DO WHILE .NOT. EOF()
nn=1
CLEAR
DO cxjg
x3=
@ 16,18 SAY
IF UPPER(x3)=
DO WHILE .T.
CLEA
rw=0
@ rw+2,2 SAY
@ rw+2,30 SAY
@ rw+4,2 SAY
@ rw+8,2 SAY
@ rw+10,2 SAY
@ rw+14,2 SAY
READ
IF LEN(ALLTRIM(登录号))=0.or.len(ALLTRIM(书名))=0 @16,6 SAY
WAIT
LOOP
SET CONS OFF
ELSE
@ rw+16,20 say
wait
EXIT
ENDIF
ENDDO
ENDIF
CONTINUE
CLEAR
ENDDO
IF nn=0
@ 14,22 SAY
wait
ENDIF
CLEAR
@ 10,20 SAY
ENDDO
USE
RELE WIND xgwin
RETU
15、 数据备份模块
程序源代码:
set talk off
set safe off
set esca off
DEFINE WINDOW win1 at 0,0 size 11,45 system
MOVE window win1 cent
acti window win1
x1=
@3,6 say
do while upper(x1)=
clear
@5,5 say
temp=dtos(date())
if .not.file(
copy file bfsj.dbf to a:\bfsj.dbf
endif
use a:\bfsj.dbf
if reccount()>=20
clear
@4,6 say
@6,8 say
if lastkey()=27
exit
endif
loop
endif
if .not.file(
! md a:\&temp
! exit
endif
@7,8 say
copy file tsdl.dbf to a:\&temp\tsdl.dbf copy file jhts.dbf to a:\&temp\jhts.dbf copy file zgdm.dbf to a:\&temp\zgdm.dbf copy file tsdl.fpt to a:\&temp\tsdl.fpt loca for 备份时间=date()
if found()
repl 备份时间 with date()
else
appe blank
repl 备份时间 with date()
endif
use
@9,9 say
exit
enddo
rele window win1
set talk on
set safe on
set esca on
16、 导入数据模块
程序源代码:
set talk off
set safe off
set century on
DEFINE WINDOW win1 at 0,0 size 9,45 system MOVE window win1 cent
acti window win1
x1=
@1,5 say
If upper(x1)=
@3,5 say
wait
x2=
do while upper(x2)=
if .not.file(
clear
@4,6 say
x3=
@6,8 say
if upper(x3)=
@6,8 say
loop
else
exit
endif
endif
use a:\bfsj.dbf
go top
dime sj(10)
x=0
@x,0 prompt
scan
temp=dtos(备份时间)
if file(
@x+1,0 prompt
x=x+1
sj(x)=temp
else
dele
pack
endif
endscan
col=12
deac window win1
define window win2 at 0,0 size x+1.2,col double shadow move window win2 cent
acti window win2
ch=1
menu to ch
do case
case ch=1
rele window win1
rele window win2
set talk on
set safe on
return
case ch=2
ml=sj(1)
case ch=3
ml=sj(2)
case ch=4
ml=sj(3)
case ch=5
ml=sj(4)
case ch=6
ml=sj(5)
case ch=7
ml=sj(6)
case ch=8
ml=sj(7)
case ch=9
ml=sj(8)
case ch=10
ml=sj(9)
case ch=11
ml=sj(10)
case ch=12
ml=sj(11)
case ch=13
ml=sj(12)
case ch=14
ml=sj(13)
case ch=15
ml=sj(14)
case ch=16
ml=sj(15)
case ch=17
ml=sj(16)
case ch=18
ml=sj(17)
case ch=19
ml=sj(18)
case ch=20
ml=sj(19)
case ch=21
ml=sj(20)
endcase
copy file a:\&ml\tsdl.dbf to tsdl.dbf
copy file a:\&ml\zgdm.dbf to zgdm.dbf
copy file a:\&ml\jhts.dbf to jhts.dbf
copy file a:\&ml\tsdl.fpt to tsdl.fpt
deac window win2
acti window win1
@4,8 say
wait
exit
enddo
endif
rele window win1
rele window win2
set talk on
set safe on
17、 退出系统模块
程序源代码:
SET TALK OFF
SET ESCAPE Off
DEFINE WINDOW winq AT 18,22 SIZE 8,32 SYSTEM
DEFINE WINDOW win1 at 0,0 size 9,45 system
if dow(date())=6 .and. time()>
MOVE window win1 cent
acti window win1
x1=
@1,4 say
@3,2 say
pict
read
if upper(x1)=
@5,5 say
wait
@7,8 say
temp=dtos(date())
if .not.file(
copy file bfsj.dbf to a:\bfsj.dbf
endif
if .not.file(
! md a:\&temp
! exit
endif
copy file tsdl.dbf to a:\&temp\tsdl.dbf
copy file jhts.dbf to a:\&temp\jhts.dbf
copy file zgdm.dbf to a:\&temp\zgdm.dbf
copy file tsdl.fpt to a:\&temp\tsdl.fpt
use a:\bfsj.dbf
loca for 备份时间=date()
if found()
repl 备份时间 with date()
else
appe blank
repl 备份时间 with date()
endif
use jhts
dele all for 还否=.t.
pack
endif
rele window win1
endif
move window winq cent
ACTIVATE WINDOW winq
@ 1, 4 SAY
@ 2, 4 SAY
@ 3, 4 SAY
@ 4, 4 SAY
@ 6,15 SAY
tt=100
FOR i=1 TO 160
j=0
DO WHILE j
j=j+1
ENDDO
MOVE WINDOW winq BY -0.05,0
ENDFOR
SET CONS OFF
WAIT
SET CONS ON
FOR i=1 TO 180
j=0
DO WHILE j
j=j+1
ENDDO
MOVE WINDOW winq BY -0.1,0
ENDFOR
RELEASE WINDOW winq
RELEASE WINDOW mainwin
CANC
SET TALK ON
SET ESCAPE ON
RETURN
参 考 文 献
[1] 章立民,FoxPro2.5 for Windows程序设计,人民邮电出版社,1994
[2] 周建成,FoxPro2.5命令与函数,人民邮电出版社,1994
[3] 刘宝林 FoxBASE+实用大全,电子工业出版社,1997
[4] 魏茂林 数据库应用技术 FoxBase+,电子工业出版社,2000
南乐职业中专图书管理系统
摘 要:
为了方便我校图书管理人员的工作,经过调查和研究,根据自已编程经验,编写了“河南南乐职业中专图书管理系统”。作为自己自考学习的毕业论文的主要内容。 以下为系统思路和源程序:
关键词:图书 管理系统 foxpro
一、系统分析及方案设计:
南乐职业中专图书管理系统根据我校的实际情况,在图书管理员的配合下,根据自已编程经验的基础上编写的,此系统主要由以下几个模块构成:
主控模块(TSGL.PRG)
该模块作为主控模块,运行时,首先调用引导模块,然后再调用加密模块,最后运行主菜单程序段。细节实现技术请参阅程序源代码的注释。
主控模块要调用以下各子功能模块:
(1) 系统引导模块(TSYD.PRG)
系统引导模块是一个欢迎界面,显示一个缓慢移动的窗口,窗口中显示欢迎用语,没有更多的作用。细节实现技术请参阅程序源代码的注释。
(2) 系统加密模块(TSJM.PRG)
系统加密模块是为了系统的安全性而设的一个密码程序,初始密码为“123”。操作员必须输入正确的密码后才能运行下一步的程序,如果3次输入错误,则程序中止,退出程序执行。其中还用到回显技术,即每输一个字符,显示掩码“*”。直到按回车为止。细节实现技术请参阅程序源代码的注释。
(3) 借阅图书模块(GYTS.PRG)
本模块主要完成借阅图书手续,运行此模块,系统提示输入借书证号,即借书者的借书证号,输入借书证号后,系统自动打开职工代码数据库,查询是否有此借书证号,如没有,则显示错误信息,提示没有此借书证号,不能借阅图书,此技术主要防止输入数据有误,增强系统严谨性、健壮性。细节实现技术请参阅程序源代码的注释。
(4) 送还图书模块(SHTS.PRG)
本模块主要完成借阅图书手续,运行此模块,系统提示输入借书证号,即还书者的借书证号,输入借书证号后,系统自动打开职工代码
数据库,查询是否有此借书证号,如没有,则显示错误信息,提示没有此借书证号,表示输入有误,此技术主要防止输入数据有误,增强系统严谨性、健壮性。细节实现技术请参阅程序源代码的注释。
(5) 个人查询模块(GRCX.PRG)
本模块主要实现对某个人所借图书情况的查询,输入借书证号或姓名,利用计算机自动找出所查询的姓名(或借书证号)以及其所借图书的信息。具体实现技术请参阅程序源代码及注释。
(6) 按类别查询模块(LBCX.PRG)
本模块主要实现图书查询功能,运行此程序,系统提示输入要查询图书的分类号,计算机自动打开数据库进行查询,如没有此分类号,则显示没有此类书籍,如有,则显示一些图书信息,如书名、登录号,借出否等。具体实现技术请参阅程序源代码及注释。
(7) 按书名查询模块(SMCX.PRG)
此模块与类别查询模块基本相同,只是根据输入的书名对数据库进行查询,而类别查询是根据输入的分类号对数据库进行查询。具体实现技术请参阅程序源代码及注释。
(8) 按著者查询模块(ZZCX.PRG)
此模块与以上两个查询模块基本相同,只是根据输入的著者对数据库进行查询。具体实现技术请参阅程序源代码及注释。
(9) 增加职工模块(ZJZG.PRG)
本模块主要实现增加职工姓名及借书证号。运行此模块后,系统提示输入借书证号及职工姓名,输入结果后,系统会自动判断借书证号是否重复、姓名是否重复。如借书证号重复,则程序不再执行下去,要求重新输入;如姓名重复,提示重名,则要求确认。此举以防一人有多个借书证号,造成管理混乱,但允许重名。具体实现技术请参阅程序源代码及注释。
(10)减少职工模块(JSZG.PRG)
本模块主要实现减少职工的功能处理,主要是当职工调离本单位时处理,运行此模块后,系统提示输入借书证号或姓名,利用计算机自动找出姓名或借书证号来减少职工,该职工必须把所借书都归还以后,才能删除此职工信息,否则程序报错,不予办理减少职工手续。具体实现技术请参阅程序源代码及注释。
(11)输入图书模块(SRTS.PRG)
本模块主要实现登录图书信息的功能,运行此模块后,系统会自动给出一个登录号,此登录号是根据库中已有图书的登录号推断出来的,如不符合要求,还可以手动更改,输入项目中登录号、书名是必须输入。具体实现技术请参阅程序源代码及注释
(12)修改图书模块(XGTS.PRG)
本模块主要实现对原来输入图书信息有误时能够修改图书信息,运行此模块后,系统提示输入要修改图书的登录号。根据所输入的登录号,计算机自动在数据库进行查找,如找到,则显示此书信息,询问是否修改此书项目。如没有找到,则显示没有查到此书,重新输入登录号进行修改。具体实现技术请参阅程序源代码及注释。
(13)备份数据模块(BFSJ.PRG)
本模块主要实现对数据库的备份,以防计算机严重损坏,造成硬盘数据丢失,给管理图书带来巨大的损失和许多麻烦。具体实现技术请参阅程序源代码及注释。
(14)导入数据模块(DRSJ.PRG)
本模块与数据备份模块相对应,当硬盘数据丢失时或其他原因,需要以前的备份数据时,把备份在软盘的数据库重新拷入硬盘。此模块一般不用,因为此举要覆盖硬盘上原来的数据库。具体实现技术请参阅程序源代码及注释
(15)退出系统模块(TCXT.PRG)
本模块主要实现退出本管理系统,并能在星期五下午自动提示让你备份本周数据库,以及删除借还图书库中已还书的记录。具体实现技术请参阅程序源代码及注释。
其系统结构图为:
二、数据库设计及用途
1、图书登录数据库(TSDL.DBF)
序号 字段名 字段类型 宽度 小数位
1 登录号 C 010 000
2 分类号 C 015
000
3 书名 C 080 000
4 作者 C 020 000
5 出版社 C 020 000
6 出版时间 D 008 000
7 单价 N 006 002
8 经手人 C 008 000
9 借出否 L 001 000
10 摘要 M 010 000
图书登录数据库用于存储在图书登录时的一些基本信息。例如: 登录号存储要登录图书的登录号;
借出否存储此图书是否已被借出,登录时统一赋值为假,表示没有借出;
摘要用于存储此书的一些简介或其他需要备注的内容。
2、借还图书数据库(JHTS.DBF)
序号 字段名 字段类型 宽度 小数位
1 借书证号 C 003 000
2 职工姓名 C 008 000
3 登 录 号 C 010 000
4 书 名 C 080 000
5 借书日期 D 008 000
6 还书日期 D 008 000
7 还书期限 D 008 000
8 馆员签收 C 008 000
9 还否 l 001 000
借还图书数据库主要用于记录职工借阅或归还图书时的一些基本情况,例如:
借书证号用于存储借书者的借书证号;
登录号用于存储所借图书的登录号;
借书日期用于存储借书的时间,自动设为当前系统时间。
3、职工代码数据库(ZGDM.DBF)
序号 字段名 字段类型 宽度 小数位
1 借书证号 C 003 000
2 职工姓名 C 008 000
职工代码数据库主要用于存储职工姓名以及所对应的借书证号。
4、备份时间数据库(BFSJ.DBF)
序号 字段名 字段类型 宽度 小数位
1 备份时间 D 008 000
备份时间数据库用于存储每次作数据库备份的时间。
三、使用说明
1、本系统是在FoxPro 2.5b for Windows系统下编写的,在FoxPro 2.5b for Windows中先设置默认路径为本系统所在的目录,并在“command”窗口输入“Do TSGL”即可执行该系统。
2、运行主控模块后,自动运行系统引导模块,此模块是一个欢迎界面,然后运行加密模块,需要管理员输入正确密码才能使用本系统,如三次输入错误密码,则退出系统。
3、当输入正确密码后,会出现主菜单,然后根据菜单进行各种操作。想要退出系统,则选取主菜单中的退出系统选项。
四、各功能模块源代码介绍:
1、 主控模块:
程序源代码为:
CLEA ALL
SET TALK OFF
SET SAFE OFF
SET STATU OFF
SET ESCA ON
SET CENT ON
DO tsyd *调用引导模块
DO tsjm *调用加密模块
DEFINE WINDOW mainwin FROM 0,0 TO 30,100 SYSTEM FLOAT; MINI ZOOM CLOSE TITLE
MOVE WIND mainwin CENT
ZOOM WINDOW mainwin MAX
ACTI WINDOW mainwin
DEFINE MENU mainmenu IN mainwin BAR *在窗口中定义菜单 DEFINE PAD tslt OF mainmenu PROMPT
借阅图书、送还图书、个人查询等
DEFINE PAD tscx OF mainmenu PROMPT
按分类号、书名、著者查询图书情况
DEFINE PAD zggl OF mainmenu PROMPT
增加、减少职工
DEFINE PAD srts OF mainmenu PROMPT
输入新到图书情况
DEFINE PAD xgts OF mainmenu PROMPT
修改已有图书情况
DEFINE PAD sjwh OF mainmenu PROMPT
数据备份、导入备份数据等
DEFINE PAD tcxt OF mainmenu PROMPT
退出本管理系统
ON SELE PAD srts OF mainmenu DO srts
ON SELE PAD xgts OF mainmenu DO xgts
ON PAD tslt OF mainmenu ACTI POPU lt
ON PAD tscx OF mainmenu ACTI POPU cx
ON PAD zggl OF mainmenu ACTI POPU zg
ON PAD sjwh OF mainmenu ACTI POPU wh
ON SELE PAD tcxt OF mainmenu DO tcxt
DEFINE POPU lt MARG
DEFINE BAR 1 OF lt PROM
ON SELE BAR 1 OF lt DO gyts
ON SELE BAR 2 OF lt DO ghts
ON SELE BAR 3 OF lt DO grcx
DEFINE POPUP cx MARG
DEFINE BAR 1 OF cx PROM
DEFINE BAR 2 OF cx PROM
DEFINE BAR 3 OF cx PROM
ON SELE BAR 1 OF cx DO lbcx
ON SELE BAR 2 OF cx DO smcx
ON SELE BAR 3 OF cx DO zzcx
DEFINE POPU zg MARG
DEFINE BAR 1 OF zg PROM
ON SELE BAR 1 OF zg DO zjzg
ON SELE BAR 2 OF zg DO jszg
DEFINE POPU wh MARG
DEFINE BAR 1 of wh PROM
ON SELE BAR 1 OF wh DO bfsj
ON SELE BAR 2 OF wh DO drsj
DO WHILE .T.
ACTI MENU mainmenu *激活菜单
ENDDO
RELE WINDOW mainwin
2、 引导模块:
程序源代码为:
set talk off
set escape off
set devi to scre
clear
clear all
define window winy at 0,17 size 4,22 double;
font
@ 1,4 say
@ 2,1 say
wait
tt=100
for i=1 to 60
j=0
do while j
j=j+1
enddo
move window winy by 0.05,0
endfor *实现窗口缓慢向下滑动 wait
for i=1 to 350
j=0
do while j
j=j+1
enddo
move window winy by 0.05,0
endfor *实现窗口继续向下滑动 release window winy *释放窗口
release i,j
set talk on
set escape on
retu
3、加密模块:
程序源代码:
set talk off
set escape off
clea
k=0
define window winmm at 6,24 size 7,28 double shadow;
color rgb(55,100,225,225,225,200) *定义窗口
move window winmm cent *移动窗口到中间位置 activate window winmm *激活窗口
do while .t.
clear
@ 3,8 say
mmm=
col=19
key=1
do while key!=13 *如果所接收的键不是回车键,则继续循环 key=inkey(0)
mmm=mmm+chr(key)
@3,col say
col=col+1
enddo
k=k+1
if upper(mmm)=
exit *如果密码正确,则退出程序 else
if k=4
clear
@ 2,5 say
@ 3.5,2 say
set cons off
wait timeout 5
set cons on
clear windows
canc *三次输入错误,则中止程序运行 endif
clear
@ 3,5 say
loop
endif
enddo
release window winmm
release k,mmm
set talk on
set escape on
return
4、 借阅图书模块
程序源代码:
SET SAFETY OFF
CLEA
DIME F(8)
DEFI WIND jswin AT 1,0 SIZE 21,50 TITL
ACTI WIND jswin
SELE 1
USE jhts *打开借还图书数据库
SELE 2
USE zgdm *打开职工代码数据库
SELE 3
USE tsdl *打开图书登录数据库
x1=
DO WHILE UPPER(x1)=
CLEAR
no=SPACE(3)
@ 10,15 SAY
READ
IF no=SPACE(3)
EXIT *如果不输入任何字符,则退出循环 ENDIF
CLEAR
SELECT 2
INDEX ON 借书证号 TO jszh *根据借书证号建立索引 LOCA FOR 借书证号=no *查找所输入的借书证号的记录 IF EOF() *如果没有找到,则显示错误信息,并退出循环 @ 10,0
@ 10,12 SAY
@ 12,16 SAY
SET CONS OFF
WAIT
SET CONS ON
EXIT
ENDIF
SELECT 1 *如果找到
F(1)=SPACE(3)
F(2)=SPACE(8)
F(3)=SPACE(10)
F(4)=DATE()
F(5)=DATE()+100
x2=
DO WHILE UPPER(x2)=
CLEAR
ROW=0
GO BOTTOM
@ 0,0 SAY
F(1)=no
@ ROW+4,2 SAY
SELECT 2
LOCAT FOR 借书证号=no
*在职工代码数据库中找出此借书证号对应的职工姓名 F(2)=职工姓名
SELECT 1
@ ROW+4,30 SAY
CLEAR GETS
@ ROW+6,2 SAY
*提示输入所借图书登录号
READ
IF LEN(RTRIM(LTRIM(F(3))))=0
EXIT
*如果没有输入登录号,表示你不想进行此手续,则退出此循环 ENDIF
SELECT 3
LOCA FOR 登录号=F(3) *在图书登录数据库中查找此登录号 IF .not.found()
CLEAR
@ROW+10,7 SAY
WAIT
SET CONS ON
CLEA
F(3)=SPACE(10)
LOOP
*如没有找到,则继续重新执行循环,重新输入登录号 ENDIF
IF 借出否=.T. CLEAR
@ROW+10,7 SAY
*如果标志出此书已借出,则有可能是输入有误,重新输入登录号 LOOP
ENDIF
书名=LTRIM(RTRIM(书名))
IF LEN(书名)>40
*如果书名一行输出不完整,则接着在下一行输出。
@ ROW+8,2 SAY
@ ROW+9,9 SAY SUBSTR(书名,41,LEN(书名))
ROW=ROW+1
ELSE
@ ROW+8,2 SAY
ENDIF
@ ROW+10,2 SAY
@ ROW+10,30 SAY
h1=RTRIM(LTRIM(F(3)))
IF LEN(h1)=0
LOOP
ELSE
x1=
@ ROW+14,12 SAY
pict
*确认输入数据库是否正确,此时键盘只能接受Y或N
READ
IF UPPER(x1)=
SELECT 3
LOCA FOR 登录号=F(3)
REPL 借出否 WITH .T. *把此书借出标志设为真 SELECT 1 *把信息记入借还图书库 APPE BLANK
REPL 借书证号 WITH F(1)
REPL 职工姓名 WITH F(2)
REPL 登录号 WITH F(3)
REPL 书名 WITH tsdl.书名
REPL 借书日期 WITH F(4)
REPL 还书期限 WITH F(5)
ELSE
F(3)=SPACE(10)
LOOP
ENDIF
ENDIF
@ ROW+16,10 SAY TRIM(F(2))+
GET x2 pict
READ
ENDDO
CLEAR
@ ROW+10,14 SAY
ENDDO
CLOSE ALL *关闭文件
RELE WIND jswin *释放窗口
RETURN
5、 归还图书模块
程序源代码:
CLEA
SELEC 1
USE jhts *打开借还图书数据库
SELEC 2
USE zgdm *打开职工代码数据库
SELEC 3
USE tsdl *图书登录数据库
DEFI WIND hswin AT 2,0 SIZE 16,50 TITL
MOVE WIND hswin CENT
ACTI WIND hswin
DIMENSION F(4)
F(1)=SPACE(3)
F(2)=SPACE(8)
F(3)=SPACE(10)
F(4)=SPACE(8)
x1=
DO WHILE UPPER(x1)=
CLEAR
no=SPACE(3)
@ 8,14 SAY
CLEAR
SELEC 2
LOCA FOR 借书证号=no *查找所输入的借书证号 IF EOF()
@ 6,14 SAY
@ 8,16 SAY
SET CONS OFF
WAIT
SET CONS ON
CLEA
EXIT
ELSE
F(1)=no
F(2)=职工姓名
ENDIF
SELEC 1 *选择第1工作区为当前工作区,即选择借还图书库 GO TOP
x2=
DO WHILE UPPER(x2)=
CLEAR
@ 1,5 say
@ 1,20 say
@ 3,6 SAY
READ
IF F(3)=SPACE(10)
EXIT
ENDIF
LOCA FOR 登录号=F(3).and.职工姓名=F(2).and.还否=.F.
*定位所输入的登录号以及职工姓名与借书证号相对应的记录,并*且此书的还否标志为假,表示还没有归还
IF FOUND()
clear
ROW=0
书名=LTRIM(RTRIM(书名))
IF LEN(书名)>40
@ ROW+1,2 SAY
ELSE
@ ROW+1,2 SAY
ENDIF
SELE 3 *选择图书登录数据库 LOCA FOR 登录号=jhts.登录号
@ ROW+2,2 SAY
@ ROW+2,9 SAY 作者 *调用图书登录库中的数据 SELE 1 *重新选择借还图书库 IF DATE()>还书期限
@ROW+4,8SAY
LTRIM(RTRIM(STR(DATE()-还书期限))) +
*如超期,算出超天数并显示
ENDIF
@ ROW+6,2 SAY
READ
IF F(4)=
*如果馆员签收中没有输入,则显示错误信息,提示需要馆*员签收,此手续才有效,中止此轮循环,进行下一轮循环。
@ ROW+8,2 SAY
SET CONS OFF
wait
SET CONS ON
LOOP
ENDIF
REPL 还书日期 WITH DATE() *还书日期设为当前时间 REPL 还否 WITH .T.
*在借还图书库中,把还否标志设为真,表示已还
SELE 3
REPL 借出否 WITH .F.
*在图书登录库中,把借出否设为假,表示还没有借出
SELE 1
REPL 馆员签收 WITH F(4)
ELSE
@ ROW()+2,8 SAY
wait
SET CONS ON
F(3)=SPACE(10)
LOOP
ENDIF
F(3)=SPACE(10)
@ ROW()+2,10 SAY TRIM(F(2))+
GET x2 pict
*询问某某同志是否继续还书,并接收一字符,只能是Y或N。 READ
ENDDO
@ ROW()+2,12 SAY
ENDDO
CLOSE ALL
RELE WIND hswin
RETU
6、 个人查询模块
程序源代码:
DEFI WIND grwin AT 2,0 SIZE 16,50 TITL
MOVE WIND grwin CENT
ACTI WIND grwin
CLEA
DIMENSION F(2)
F(1)=SPACE(3)
F(2)=SPACE(8)
x2=
DO WHILE UPPER(x2)=
SELE 1
USE jhts
SELE 2
USE zgdm
SELE 3
USE tsdl
CLEAR
no=SPACE(8)
@ 6,10 SAY
IF LEN(LTRIM(RTRIM(no)))=0
Exit
*如果字符串长度为零,即没有输入,表示不想查询,则退出循环。 ENDIF
SELECT 2 *选择职工代码数据库
LOCA FOR 职工姓名=no.or.借书证号=LEFT(no,3)
*定位到职工姓名为所输入的字符串或借书证号为所输入的字符 *串的记录。
IF EOF() *如果所输入的字符串与职工姓名和借书证号都不符 CLEAR
@ 10,12 SAY
@ 12,10 SAY
SET CONS OFF
WAIT
SET CONS ON
EXIT
ELSE
F(1)=借书证号 *如果找到记录,则把借书证号赋值给F(1) F(2)=职工姓名 *把职工姓名赋值给F(2)
ENDIF
USE
SELECT 1 *选择借还图书数据库
nn=0 *设置变量,存储没有还的图书的册数 CLEAR
LOCA FOR (借书证号=LEFT(no,3).or.职工姓名=no) .and. jhts.还否;
=.F. *定位到没有归还的图书记录
DO WHILE .NOT. EOF()
djg=MOD(nn,2)
rw=0
@ rw+2,2 SAY
@ rw+2,24 SAY
书名=LTRIM(RTRIM(书名))
IF LEN(书名)>40
@ rw+4,2 SAY
@ rw+5,9 SAY SUBSTR(书名,41,LEN(书名))
rw=rw+1
ELSE
@ rw+4,2 SAY
ENDIF
@ rw+6,2 SAY
@ rw+8,2 SAY
@ rw+10,2 SAY
CONTINUE *继续定位数据库指针
nn=nn+1 *册数加1
IF FOUND()
@14,14 SAY
SET CONS OFF
WAIT
SET CONS ON
CLEAR
ENDIF
ENDDO
IF nn=0 *如果册数为0,表示没有需要的归还的图书 @ 6,8 SAY
@ 7,4 SAY
@ 14,8 SAY
ENDDO
CLOSE ALL
RELE WIND grwin
RETURN
7、 按类别查询模块
程序源代码:
SET SAFE OFF
DEFI WIND lbcxwin AT 2,0 SIZE 11,50 TITL
ACTI WIND lbcxwin
CLEA
x1=
DO WHILE x1=
CLEAR
sm=SPACE(15)
@ 4,10 SAY
READ
IF LEN(LTRIM(RTRIM(sm)))=0
EXIT
ENDIF
SELECT 1
USE tsdl
nn=0
CLEAR
INDEX ON 分类号 TO dlsm
LOCA FOR 分类号=sm
DO WHILE .NOT. EOF()
DO cxjg
CONTINUE
nn=nn+1
@8,10 SAY
SET CONS OFF
WAIT
SET CONS ON
ENDDO
USE
IF nn=0
@ 4,9 SAY
SET CONS OFF
WAIT
SET CONS ON
ENDIF
CLEAR
@ 3,11 SAY
@ 5,13 SAY
ENDDO
CLOSE ALL
RELE WIND lbcxwin
RETURN
8、 按书名查询模块
程序源代码:
SET SAFE OFF
DEAC WIND tscx
DEFI WIND smcxwin AT 1,0 SIZE 16,60 TITL
ACTI WIND smcxwin
CLEA
SELECT 3
USE tsdl
x2=
DO WHILE UPPER(x2)=
CLEAR
sm=SPACE(80)
@ 6,2 SAY
IF LEN(LTRIM(RTRIM(sm)))=0
EXIT
ENDIF
SELECT 3
nn=0
INDEX ON LEFT(书名,40) TO dlsm
LOCA FOR 书名=sm
DO WHILE .NOT. EOF()
DO cxjg
CONTINUE
nn=nn+1
@13,20 SAY
SET CONS OFF
WAIT
SET CONS ON
CLEA
ENDDO
USE
IF nn=0
@ 8,18 SAY
ENDIF
@ 8,14 SAY
@ 10,16 SAY
ENDDO
RELE WIND smcxwin
RETURN
9、 按著者查询模块
程序源代码:
CLEA
DEFI WIND zzcxwin AT 1,0 SIZE 16,60 TITL
ACTI WIND zzcxwin
X2=
DO WHILE UPPER(x2)=
CLEAR
xm=SPACE(30)
@ 6,6 SAY
READ
IF LEN(LTRIM(RTRIM(xm)))=0
LOOP
ENDIF
SELECT 1
USE tsdl
nn=0
CLEAR
INDEX ON 作者 TO dlsm
LOCA FOR 作者=xm
DO WHILE .NOT. EOF()
DO cxjg
CONTINUE
nn=nn+1
@13,20 SAY
SET CONS OFF
WAIT
SET CONS ON
CLEA
ENDDO
USE
IF nn=0
@ 8,18 SAY
ENDIF
@ 8,14 SAY
@ 10,16 SAY
READ
ENDDO
RELE WIND zzcxwin
RETURN
10、 查询结果模块
本模块主要是被以上三个查询模块所调用,显示查询结果。具体实现技术请参阅程序源代码及注释。
程序源代码:
ROW=0
@ ROW+1,2 SAY
@ ROW+1,25 SAY
IF LEN(LTRIM(RTRIM(书名)))>40
@ ROW+2,2 SAY
@ ROW+3,7 SAY SUBSTR(书名,41,LEN(书名))
ROW=ROW+1
ELSE
@ ROW+2,2 SAY
ENDIF
@ ROW+3,2 SAY
@ ROW+3,25 SAY
@ ROW+4,2 SAY
@ ROW+5,2 SAY
@ ROW+5,25 SAY
IF 借出否=.F.
@ ROW+6,2 SAY
ELSE
@ ROW+6,2 SAY
ENDIF
11、 增加职工模块
程序源代码:
DEFI WIND zgwin AT 3,0 SIZE 12,40 SYST TITL
MOVE WIND zgwin CENT
ACTI WIND zgwin
CLEA
USE zgdm
x2=
DIME F(2)
DO WHILE UPPER(x2)=
F(1)=SPACE(3)
F(2)=SPACE(8)
CLEAR
GO BOTTOM
@ 0,2 SAY
@ 2,8 SAY
@ 4,8 SAY
READ
IF LEN(LTRIM(RTRIM(F(1))))=0.or.len(LTRIM(RTRIM(F(2))))=0 EXIT
ENDIF
GO TOP
LOCAT FOR 职工姓名=F(2)
IF FOUND()
@ 6,5 SAY
ENDIF
x1=
@ 8,6 SAY
READ
GO TOP
LOCAT FOR 借书证号=F(1)
IF FOUND()
CLEAR
@ 5,6 SAY
wait
LOOP
ELSE
IF UPPER(x1)=
APPEND BLAN K
GATHER FROM F
ELSE
LOOP
ENDIF
ENDIF
@ 10,6 say
READ
ENDDO
RELE WIND zgwin
CLOSE ALL
RETURN
12、 减少职工模块
程序源代码:
CLEA
DEFI WIND zgwin AT 3,0 SIZE 12,40 TITL
MOVE WIND zgwin CENT
ACTI WIND zgwin
SELE 1
USE jhts
SELE 2
USE zgdm
DIMENSION F(2)
F(1)=SPACE(3)
F(2)=SPACE(8)
x2=
DO WHILE UPPER(x2)=
SELE 1
SET SAFETY OFF
INDEX ON 借书证号 TO jszh
CLEAR
xx=SPACE(8)
@ 2,2 SAY
READ
IF LEN(RTRIM(LTRIM(xx)))=0
EXIT
ENDIF
N=0
LOCAT FOR (借书证号=LEFT(xx,3) .OR. 职工姓名=xx) .AND. 还;
否=.F.
IF .NOT. EOF()
N=1
ENDIF
IF LEN(LTRIM(RTRIM(xx)))>3
F(2)=xx
ELSE
F(1)=RTRIM(LTRIM(xx))
ENDIF
IF N=0
SELE 2
LOCA FOR 借书证号=F(1) .OR. 职工姓名=F(2)
IF .not.eof()
CLEAR
@0,2 SAY
@3,8 SAY
@5,8 SAY
tt=
@ 7,5 SAY
IF UPPER(tt)=
DELE
PACK
SELE 1
GO TOP
LOCAT FOR 借书证号=LEFT(xx,3) .OR. 职工姓名=xx DO WHILE .not.eof()
DELE
PACK
CONT
ENDDO
@8,2 SAY
WAIT
SET CONS ON
ENDIF
ELSE
@ 6,8 SAY
wait
ENDIF
ELSE
@ 6,4 SAY '请还您所借图书,否则不予办理手续!'
wait
ENDIF
@ 10,7 SAY
ENDDO
CLOSE ALL
RELE WIND zgwin
RETU
13、 输入图书模块
程序源代码:
SET SAFE OFF
SET TALK OFF
CLEA
USE tsdl
DIMENSION F(9)
DEFINE WINDOW srwin AT 1,10 SIZE 24,60 TITLE
MOVE WINDOW srwin CENTER
ACTI WINDOWS srwin
x2=
INDEX ON VAL(SUBSTR(登录号,6,LEN(登录号))) TO tsdl_dlh
DO WHILE UPPER(x2)=
GO BOTTOM
dlh=VAL(SUBSTR(登录号,6,LEN(ALLTRIM(登录号)))) dlh=dlh+1
CLEAR
F(1)=SPACE(10)
F(2)=SPACE(15)
F(3)=SPACE(80)
F(4)=SPACE(20)
F(5)=
F(6)=CTOD(
F(7)=0
F(8)=SPACE(8)
F(9)=SPACE(50)
F(1)=SUBSTR(登录号,1,5)+ALLTRIM(STR(INT(dlh)))
@ 0,0 SAY
@ 0,50 SAY DATE()
@ 2,2 SAY
if lastkey()=27
exit
endif
@ 2,30 SAY
@ 4,2 SAY
@ 6,2 SAY
@ 8,2 SAY
@ 10,2 SAY
@ 12,2 SAY
@ 14,2 SAY
@ 16,2 SAY
READ
if lastkey()=27
exit
endif
LOCAT FOR 登录号=F(1)
IF FOUND()
CLEAR
@ 10,14 SAY
wait
CLEAR
LOOP
ENDIF
IF LEN(ALLTRIM(F(1)))=0.or.len(ALLTRIM(F(3)))=0
@ 18,16 say
wait
loop
ENDIF
x1=
@ 20,14 SAY
IF UPPER(x1)=
APPE BLANK
GATHER FROM F
REPL 摘要 WITH F(9)
dlh=dlh+1
ELSE
LOOP
ENDIF
@ 22,14 SAY
ENDDO
RELE WIND srwin
SET SAFE ON
RETURN
14、 修改图书模块
程序源代码:
SET ESCA Off
CLEA
USE tsdl
DEFINE WINDOW xgwin AT 2,5 SIZE 20,60 TITLE
MOVE WINDOWS xgwin CENTER
ACTI WINDOW xgwin
x5=
DO WHILE UPPER(x5)=
CLEAR
dlh=SPACE(10)
@ 10,12 SAY
READ
nn=0
LOCATE FOR 登录号=dlh
DO WHILE .NOT. EOF()
nn=1
CLEAR
DO cxjg
x3=
@ 16,18 SAY
IF UPPER(x3)=
DO WHILE .T.
CLEA
rw=0
@ rw+2,2 SAY
@ rw+2,30 SAY
@ rw+4,2 SAY
@ rw+8,2 SAY
@ rw+10,2 SAY
@ rw+14,2 SAY
READ
IF LEN(ALLTRIM(登录号))=0.or.len(ALLTRIM(书名))=0 @16,6 SAY
WAIT
LOOP
SET CONS OFF
ELSE
@ rw+16,20 say
wait
EXIT
ENDIF
ENDDO
ENDIF
CONTINUE
CLEAR
ENDDO
IF nn=0
@ 14,22 SAY
wait
ENDIF
CLEAR
@ 10,20 SAY
ENDDO
USE
RELE WIND xgwin
RETU
15、 数据备份模块
程序源代码:
set talk off
set safe off
set esca off
DEFINE WINDOW win1 at 0,0 size 11,45 system
MOVE window win1 cent
acti window win1
x1=
@3,6 say
do while upper(x1)=
clear
@5,5 say
temp=dtos(date())
if .not.file(
copy file bfsj.dbf to a:\bfsj.dbf
endif
use a:\bfsj.dbf
if reccount()>=20
clear
@4,6 say
@6,8 say
if lastkey()=27
exit
endif
loop
endif
if .not.file(
! md a:\&temp
! exit
endif
@7,8 say
copy file tsdl.dbf to a:\&temp\tsdl.dbf copy file jhts.dbf to a:\&temp\jhts.dbf copy file zgdm.dbf to a:\&temp\zgdm.dbf copy file tsdl.fpt to a:\&temp\tsdl.fpt loca for 备份时间=date()
if found()
repl 备份时间 with date()
else
appe blank
repl 备份时间 with date()
endif
use
@9,9 say
exit
enddo
rele window win1
set talk on
set safe on
set esca on
16、 导入数据模块
程序源代码:
set talk off
set safe off
set century on
DEFINE WINDOW win1 at 0,0 size 9,45 system MOVE window win1 cent
acti window win1
x1=
@1,5 say
If upper(x1)=
@3,5 say
wait
x2=
do while upper(x2)=
if .not.file(
clear
@4,6 say
x3=
@6,8 say
if upper(x3)=
@6,8 say
loop
else
exit
endif
endif
use a:\bfsj.dbf
go top
dime sj(10)
x=0
@x,0 prompt
scan
temp=dtos(备份时间)
if file(
@x+1,0 prompt
x=x+1
sj(x)=temp
else
dele
pack
endif
endscan
col=12
deac window win1
define window win2 at 0,0 size x+1.2,col double shadow move window win2 cent
acti window win2
ch=1
menu to ch
do case
case ch=1
rele window win1
rele window win2
set talk on
set safe on
return
case ch=2
ml=sj(1)
case ch=3
ml=sj(2)
case ch=4
ml=sj(3)
case ch=5
ml=sj(4)
case ch=6
ml=sj(5)
case ch=7
ml=sj(6)
case ch=8
ml=sj(7)
case ch=9
ml=sj(8)
case ch=10
ml=sj(9)
case ch=11
ml=sj(10)
case ch=12
ml=sj(11)
case ch=13
ml=sj(12)
case ch=14
ml=sj(13)
case ch=15
ml=sj(14)
case ch=16
ml=sj(15)
case ch=17
ml=sj(16)
case ch=18
ml=sj(17)
case ch=19
ml=sj(18)
case ch=20
ml=sj(19)
case ch=21
ml=sj(20)
endcase
copy file a:\&ml\tsdl.dbf to tsdl.dbf
copy file a:\&ml\zgdm.dbf to zgdm.dbf
copy file a:\&ml\jhts.dbf to jhts.dbf
copy file a:\&ml\tsdl.fpt to tsdl.fpt
deac window win2
acti window win1
@4,8 say
wait
exit
enddo
endif
rele window win1
rele window win2
set talk on
set safe on
17、 退出系统模块
程序源代码:
SET TALK OFF
SET ESCAPE Off
DEFINE WINDOW winq AT 18,22 SIZE 8,32 SYSTEM
DEFINE WINDOW win1 at 0,0 size 9,45 system
if dow(date())=6 .and. time()>
MOVE window win1 cent
acti window win1
x1=
@1,4 say
@3,2 say
pict
read
if upper(x1)=
@5,5 say
wait
@7,8 say
temp=dtos(date())
if .not.file(
copy file bfsj.dbf to a:\bfsj.dbf
endif
if .not.file(
! md a:\&temp
! exit
endif
copy file tsdl.dbf to a:\&temp\tsdl.dbf
copy file jhts.dbf to a:\&temp\jhts.dbf
copy file zgdm.dbf to a:\&temp\zgdm.dbf
copy file tsdl.fpt to a:\&temp\tsdl.fpt
use a:\bfsj.dbf
loca for 备份时间=date()
if found()
repl 备份时间 with date()
else
appe blank
repl 备份时间 with date()
endif
use jhts
dele all for 还否=.t.
pack
endif
rele window win1
endif
move window winq cent
ACTIVATE WINDOW winq
@ 1, 4 SAY
@ 2, 4 SAY
@ 3, 4 SAY
@ 4, 4 SAY
@ 6,15 SAY
tt=100
FOR i=1 TO 160
j=0
DO WHILE j
j=j+1
ENDDO
MOVE WINDOW winq BY -0.05,0
ENDFOR
SET CONS OFF
WAIT
SET CONS ON
FOR i=1 TO 180
j=0
DO WHILE j
j=j+1
ENDDO
MOVE WINDOW winq BY -0.1,0
ENDFOR
RELEASE WINDOW winq
RELEASE WINDOW mainwin
CANC
SET TALK ON
SET ESCAPE ON
RETURN
参 考 文 献
[1] 章立民,FoxPro2.5 for Windows程序设计,人民邮电出版社,1994
[2] 周建成,FoxPro2.5命令与函数,人民邮电出版社,1994
[3] 刘宝林 FoxBASE+实用大全,电子工业出版社,1997
[4] 魏茂林 数据库应用技术 FoxBase+,电子工业出版社,2000