本溪市2003-2004学年度上学期网上作品展--教师论文

图书馆查询系统

作者:溪湖区后石小学 刘希 李忠凯

  
  引 言
  当今数据库技术已成为计算机应用的核心技术,可以认为当今任何计算机信息系统和计算机应用系统都与数据库的应用分不开,数据库已成为其核心和基础。建立数据库应用系统是要充分利用数据库中的数据。对数据库中的数据进行的操作除增加(insert)、更改(update)和删除(delete)外,最常用,也是重要的是查询操作。即便是最简单的数据库应用系统,也离不开查询功能,查询可以说是进行数据管理的重要手段,不过也是数据库应用系统开发过程中较困难、花时间、有一定难度的部分。
  美国微软公司的visual foxproj foxpro 3.0版本之后的称谓(包括visual foxpro 5.0、6.0、7.0等),visual 即“可视”之意。它是fox数据库管理系统以其强大的功能、最快的运行速度和极好的兼容性取代了dbase的地位,成为xbase类数据库的工业标准之后又一上台阶的革命性产品,受到广大用户的青睐。
  可视化编程是visual foxpro的最大特点,它改善了dbase在编程过程中无法看到界面这个缺点,它使得编程人员所编的程序更为直观,编程人员可以通过视图、界面来修正自己程序中存在的不足,使自己的程序更加完美。
  本文正是依据visual foxpro可视化编程这一特点,根据本校图书馆的实际情况,编写了图书馆查寻系统这一程序。改善原有图书查寻系统的不足,使图书馆理人员的工作更为简洁、直观;读者查寻图书更加方便、快捷。
  本文也可以做为小型图书馆建立自己的查寻系统的参考用书。因本人学识不足,如有缺点还请见谅!
  项目说明:
  为方便对图书馆书籍,读者资料,借还书等进行高效的管理,特编写该程序以提高图书馆的管理效率。使用该程序之后,管理人员可以查询某位读者、某种图书的借阅情况,还可以对当前图书借阅情况进行一些统计,给出参考资料。
  系统环境:
  windows 95系统或windows nt工作站;
  内存 12mb以上;
  硬盘 190mb以上;
  cd-rom驱动器;
  super vga;
  关键词:
  控件:工具箱中的每一个图标。
  事件:由系统事先设置好的、某一对象可以识别的动作。
  方法:特殊子程序用来完成一定的操作。
  对象;控件和窗体的总称。
  属性:对象的一些特征。
  表单:据有自己的事件和方法的对象。
  显示格式:表、视图、表与表之间的关系。
  查寻:可通过查寻设计器、查寻向导、交叉表向导、本地视图向导、远程视图向导建立。
  设计思路
  建立图书信息表,每一类图书拥有唯一的图书编码和唯一的条形码。再建立一个图书库表,每一本书拥有唯一的序列号,每一个图书编码对应一个或多个图书序列号。新建读者级别表,该表中定义了该级别的基本信息(最多可借本数,可保存多长时间,超期每日罚金)。新建一个读者表,每位读者拥有唯一的读者号,每个读者级别对应一位或多位读者。新建图书借还明细表,每一次借书的操作,都会向该表中插入一条信息。每一次还书操作会更新对应的借书记录,同时更必“最后修改日期”为当天的日期。
  程序说明
  在基本信息维护窗口中,添加三个单选钮,分别用来操作图书状态信息维护,图书类型信息维护,读者级别信息维护。它们是写在程序中的,不能随着用户对信息的修改跟着改变。读者级别维护信息包括:最多可借本数,可保存天数,超期罚金数(以天计)等信息。在读者信息维护窗口中可添加、删除读者信息,只有拥有读者号的用户才可以借书。图书的具体维护包括:图书入库,图书出库,图书外借归还处理。在图书入库窗口中可以生成新的图书信息,也可以追加库中已有的某类图书(可以通过条形码或图书编码检索出读书的基本信息)。图书借还处理窗口用于记录每一次图书序列号的有效性,同时会关联到该书的状态和该读者已借的书,可以看到当天的所有借还操作。
  制作步骤

  一、新建表

  新建图书信息维护表、图书编码表,图书类型表、图书状态表、读者信息表、读者级别表、图书借还明细表。分别如表1、2、3、4、5、6和7所示。

表1、         图书信息维护表

colum-name
type/length
null
tag
bid
varchar(2)
not null
编码(每类书唯一)
bar-code
numeric(15,0)
not null
条形码
name
varchar(60)
null
书名
auther
varchar(40)
null
作者
pub-name

varchar(60)
null
出版社
pub-date
date
null
出版日期
brief
varchar(200)
null
内容简介
price
numberic(8,2)
null
单价
book-type
varchar(4)
not null
类型

 

注:bid字段为该表的主键。

表2          图书编码表 
           

colum-name
type/length
null
tag
bseq
numerric(10,0)
not null
图书序列号(每本书唯一)
bid
varchar(12)
not null
图书编码
colum-name
type/length
null
tag
in-date
date
null
入库日期
colum-name
type/length
null
tag
book-sts
varchar(4)
not null
状态

注:bseq字段为该表的主键。
表3          图书类型表

colum-name
type/length
null
tag
book-type
varchar(4)
not null
类型编号
name
varchar(20)
not null
类型描述

注:book-type字段为该表的主键。

表4          图书状态表

colum-name
type/length
null
tag
book-sts
varchar(4)
not null
状态编码
name
varchar(20)
not null
状态描述:'01'库中'09'借出

注:book-sts字段为该表的主键。

表5          读者信息表

colum-name
type/length
null
tag
rid
numeric(10,0)
not null
读者证编码
name
varchar(60)
null
读者姓名
idno
varchar(18)
null
身份证号
level
numeric(2,0)
null
级别
address
varchar(100)
null
住址
colum-name
type/length
null
tag
colum-name
type/length
null
tag
telephone
varchar(12)
null
联系电话
brief
varchar(1000)
null
简介

注:rid字段为该表主键。

表6          读者级别表

colum-name
type/length
null
tag
level
numer(2,0)
null
级别
name
varchar(2,0)
null
名称
bor-days
number(3,0)
null
可以保存天数
fine
number(5,3)
null
超期后每天的罚金
bor-cnt
number(2,0)
null
最多可以借几本书

注:level字段为该表的主键。

表7          图书借还明细表

colum-name
type/length
null
tag
seq
number(2,0)
not null
流水号
bseq
numerric(10,0)
not null
图书序列号
bid
varchar(12)
null
图书编码
rid
numeric(10,0)
null
读者证编码
out-date
date
null
借入日期
due-date
date
null
应还日肴
in-date
date
null
归还日期
fee
numberic(8,2)
null
罚金
icd
date
null
最后修改日期

注;seq字段为该表的主键。

   二、新建应用
  1、  单击菜单"file/new"项,在弹出的对话框中选取"workspace"标签下的"workspace",填入路径保存;然后单击菜单"file/new"项,选取"target"标签下的"application",建立a-sample 94应用。在该应用的open事件中添加如下脚本,用于连接数据库,打开运行主窗口。
   profile konglong
sqlca.dbms="odbc"
sqlca.autovommit=false
sqlca.dbparm=coonnectstring=dsn=konglong; uid=kl;pwd=klol
    connect using sqlca;
if sqlca,sqlcode<>0 then
//出错处理
message (box"提示!","连接数据库失败 原因:"+sqlca,sqlerrtext)
return
end if
opencw_main
2、 在应用的close脚本中,添加如下脚本,用于断开与数据加的连接。
disconnect unsing sqlca;
  三、 新建立主窗口
  窗口的属性高为dihelp!,在程序运行过程中,该窗口作为主窗口。该窗口不需任何脚本。
  四、 定义数据窗口
  1、 新建用于维护图书状态的数据窗口d_book_sts。
  选freedom显示格式。quick select数据源,选择book_sts表的book_sts、name列。
  2、 新建用于维护图书类型的数据窗口d_book_type。

  选择freedom显示格式。quick select数据源,选择book_type,name列。
  3、 新建用于维护读者级别信息的数据窗口d_reader_level。
  选择freedom显示格式。quick select数据源,选择book_reader_level表的    level,name,bor_date,bor_cnt,finei列。
  4、 新建成用于维护读者信息的数据窗口d_reader_info.
  选择freedom显示格式。quick select数据源,选择book_reader表的id , name , level , telephone , address , brief , st_dateidon列。
  5、 新建用于维护图书出库,入库的数据窗口d_book_lib。
  选择grid显示格式,sql slecte数据源,选择book_info表的bar_code,name,auther,pub_name,pub_date,price,book_type,列和book_seq表的bseq,bid,in_date,book_sts列。两表通过bid字段关联。
  6、 新建用于维护借还图书明细的数据窗口d_book_io_detail。
  选择grid显示格式,sql select数据源,选择book_info表的bar- code,name,author,pub_name,pub_date列book_io_detail表的seq,bseq,bid,out_date,due_date,in_date,fee列。
  五、 新建用于维护基本信息的窗口w_base-info。
  1、 在三个单选按钮的clicked事件中添加脚本,用于选中该项时,动态修改数据窗口的内容。例如,在"读者级别信息维护按钮的clicked事件中添加如下脚本:
  if this checked = true then
  dw_1.dataobject = 'd_reader_level'
  cb_del.enabled = true
  cb_rtv.trlggererent(clicked!)
  end if
  2、 在"检索"按钮中的clicked事件中添加脚本,用于检索选项的数据窗口的信息。
  dw-l.seltransobject(sqlca)
  dw_l.retrieve()
  3、 在"增加"按钮的事件中添加脚本,用于添加选定信息。
  longllw_row
  ii_row_dw_l.inserlrow(0)
  dw_l.scrolltorow(ll_row)
  4、 在"删除"按钮的事件中添加脚本,用于删除选定信息。
  dw_l.deleterow(dw_l.getselectedrow(0))
  5、 在"保存"按钮的事件中添加脚本,用于保存选定信息。
  int ret
  dw_l.accepttext()
  ret_dw_l.uppdate()
  if ret = 1 then
  commnit using sqlca;
  eles
  rollback using salca;
  end if
  六、 新建用于维护读者信息的窗口。
  1、 在窗口的open事件中添加如下脚本,用于检索出已定义的读者级别信息。
  str iogls_nm,ls_tmp
  int li_l
  declare cur_bt cursorfor
  //定义游标,检索读者级别和姓名
  select level.name from book_reader_level;
  open cur_bt; //打开游标
  fetch cur_bt into:li-l;ls_nm;
  do while salca.sqlcode = 0
  1s_tup = string(li_l)+""+ls_nm
  ddlb_reader_level.additem(ls_tmp)
  //动态添加到下拉列表框中
  fetch cur_bt into;li_l;ls_nm;
  loop
  dose cur_bt;
  ddlb_reader_level.sorted = true
  //对下拉列表框排序
  ddlb_reader_level.selectitem(1)
  2、 在检索按钮的clicked事件中添加如下脚本,用于检索。
  string ls_d_st , ls_d_nd . ls_tmp
  string ls_select
  int li_st , ld_nd
  dw_l.settrun subject(sqlca)
  dw_l.rest()
  //数据窗口初始化
  li_flag = 0
  is_select = "select rid , name , idno , level , st_sate , telephone ,   address , bridf from book_reader"
  //设置动态检索语句头部
  is _tmp = trim(sle_id_text)
  if len (ls_tmp)>0 then
  ii-flag = 1
  is_select + "where"
  if rb_rid . checked = true then
  //输入参数为:读者编码
  is_select + "rid="+ls_tmp+"
  else if rb_rnm.checked = true then
  //输入参数为:读者姓名(可模糊检索)
  is_select +=" name like% "+ls_tmp+" % "
  //输参数为:读者身份证号
  else
  is _select +="idno="+ls_tmp+""
  end if
  end if
  if cbx_in_date.checked = true then
  //需要添加"加入时间"检索参数
  is _d_st = em_d_st.text
  is_d_nd = em_d_nd.text
  if li_flag = 1 then
  is_select + ="and"
  else
  is_select + ="where"
  end if
  is_select + = " st_date > = " + ls_s_st + " " + & " and st_date<="ls_d_nd + " "
  ii_flag = 1
  end if
  if cbx_reader_level.checked = true then
  //需要添加"读者级别"检索参数
  if li_flag = 1 then
  is_select + ="and"
  else
  is_select + ="where"
  end if
  ii_rl=imteger(mid(ddlb_reader_level.text,(pos(ddlb_reader_level. text,")-1)))
  is_select + ="level="+string(li_rl)
  end if
  dw_l.setsqlselect(ls_select)
  //设置检索语句
  dw-l.retriore()
  //检索数据
  3、 在"增加"按钮的clicked事件中添加脚本,用于删除选定信息。
  lon ll_row
  ii_row = dw_l.instertrow(0)
  dw_i.scrolltorrow(ll_row)
  4、 在"删除"按钮的clicked事件中添加脚本,用于删除选定信息。
  dw_l.deleterow(dw_l.getselected row(10))
  5、 在"保存"按钮的clidcked事件中添加脚本,用于保存对数据的修改。
  int ret
  dw_l.accpettext()
  ret = dw_l.updte()
  if ret = 1 then
  commit using sqglca;
  else
  rollback using sqlca;
  end if
  6、 在"退出"按钮的clicked事件中添加如下脚本,用于退出该窗口。
  close (parent)
  七、 新建图书入库的操作窗口w_i_lib
  1、 在窗口的open事件中添加如下的脚本,用于检索出已定义的图书类型信息,并设置控件的妆始状态。
  string is_bt , is_bnm , is_tmp
  declare cur_bt cursor for
  select book_type , name from book_type
  open cur_bt;
  fetch our_bt into : is_bt , is_bnm;
  do while squa . squode = 0
  is tmp = is_bt +""+is_bnm
  ddlb_bt . additem(is_tmp)
  fetch cur_bt into : is_bt , :is_bnm;
  loop
  close cur_bt;
  ddlb_bt . sorted = true
  ddlb_bt . selectitem(1)
  this . triggerevent("ue_init")
  2、 在"检查"按钮的clicked事件中,添加如下脚本,根据输入的图书编码或条形码检索库中已有的该类图书的信息。
  string is_bc , is_bid , is_pub , is_cut , is_bt , is_brief , is_bnm
  date id_pub
  real_ir_price
  is_bc = trim(sle_bur_code . text)
  //得到条形码
  is_bid = trim(sle_bid . text)
  //得到图书编码
  if len(is_bc) < 1 and len(is_bid) < 1 then
  return
  dw_1.settrcnsobject(sqlca)
  dw_1.veset()
  dw_1.veerieve(is_bid , is_bc)
  //数据窗口初始化
  if dw_1.rowcoano() < 1 then
  return //检索数据
  is_bid = dw_1.getitemstring (1,2)
  //得到图书编码
  select bar_code , name , author , pub_name , pub_date , brief , price ,    book_type
  into : is_bc , : is_bnm, : is_aut , :is_pub, : is_brief, :is_price , : is_bt
  //检索指定图书的基本信息
  from book_info
  where bid = : is_bid
  sle_bar_code . text = is_bc
  sle_bum . text = is_bnm
  sle_author . text = is_aut
  sle_publish . text = is_pub
  sle_brief . text = is_brief
  sle_price . text = string(ir_price ,'####### . ## ')
  em_pub_date . text = string(ld_pub,'yyyy_mm_dd')
  ddlb_bt . selectitem(ddlb_bt . finditem(is_bt))
  3、 在入库按钮的clicked事件中添加如下脚本,用于对录入的图书信息时行入库操作.
  string is_bc , is_bt , is_aut , is_pub , is_pub_date , is_in_date
  string is_bn , is_brief , is_id , is_tmp
  real ir_price
  int li_price
  long ii_tmp
  is_bc = trtm(sle_bar_code . text)
  //条形码
  is_bt = mtd(ddlb_bt . text . l.poscddlb_bt . text,'',( )_1)
  //图书类型
  is_aut = trim(sle_author . text)
  //作者
  is_pub = trim(sle_publish . text)
  //出版社
  is_pub_date = trim(em_pub_date . text)
  //出版时间
  is_in_date = trim(em_in_date . text)
  //入库时间
  is_bn = trim(sle_bnm . text)
  //图书名字
  ir_price = real(trim(sle_price . text))
  //身份
  it_num = integer(trim(sle_amt . text))
  //入库数量
  if len(is_be) < 1 then
  messagebox("入库错误!" "书名不能为空!")
  return
  end if
  if li_num < 1 then
  message box("入库错误!","入库数量不能为空!")
  return
  end if
  注:检索该图书的最大编码,用来生成该类书的图书编码。
  select max(bid) into : is_tmp from book_info where book_type = : is_bt
  if is null(is_tmp) then
  is_id = is_bt + fill('0' , 7) + '1'
  else
  il_tmp = long(mid(is_tmp , len(is_tmp)) + is_tmp
  end if

  注:把该类图书信息插入到图书信息库中。
  inset into book_info(bid , bar_code , name , auther , pub_name , pub_date ,   book_type , brief )
  values ( : is_id , : is_bc , : is_bn , : is_aut , : is_pub)
  date( : is_pub_date ( ) , : is_bt , : is_brief )
  using sqlca;
  if sqlca , sqlcode < > 0 then
  message box("插入数据错误(insert into book_info)!" , sqlca ,   dqlerrtext)
  rolback using sqlca;
  return
  else
  commit using sqlca;
  end if
  注:检索最大的图书序列号,准备生成每本书的入库信息。
  select max (bseq) into : ll_tmp from book_seq;
  if is null ( : ll_tmp )then ll_tmp = 1001
  for i = 1 to li_num
  ll_tmp + = 1
  insere into book_seq(bseq , bid , book_sts)
  valuse ( : ll_tmp , : is_id , '01')
  using sqlca;
  if sqlca , dqlcode < > 0 then
  message box("插入数据错误(insert into book_info)!", sqlca,salerrtext)
  rollback using sqlca;
  return
  end if
  next
  commit using sqlca;
  cb_rtv , triggerevent ( clicked!)
  //重新检索数据
  messae box("成功入库","已生成"+ string(li_num) +"本图书记录,请根据系统生成的图书序列号绘图书编号!")
  八、 新建用于图书出库的窗口w_o_lib
  窗口的控件设置见下所示
  1、 定义实例变量long it_bseq,用于标识得出库的图书的序列号。
  2、 在窗口open事件中,添加如下脚本,用于初始化实例变量。
  it_bseq = 0
  3、 在clicked事件中添加如下脚本,用于选定单击的行,并设置实例变量。
  if row < 1 then
  return
  this . selectrow (0 , false )
  this . selectrow (row , true )
  il_bseq = this . get (te mnumber(row , 1)
  4、 在"检索"按钮的clicked事件中添加如下脚本,用于根据输入的参数,检索图书信息。
  string ls_tmp
  long ll_tmp
  is_tmp = trim (sle_id . text )
  if len (ls_tmp) < 1 then
  return
  dw_1 . settrandobject (sqlca )
  dw_1 . reset ( )
  if rb_bid . checked = true then
  ll_tmp = long (ts_tmp)
  dw_1 . retrieve (ll_tmp , '')
  else if rb_bc . checked = true then
  dw_1 . retrieve ('',ts_tmp)
  end if
  5、 在"出库"按钮的clicked事件中添加如下脚本,用于对选定的图书做出库处理。
  if il_bseq < 1 then
  return
  int ret
  ret = message box("出库确认!","是否出库: book_seq : " + stringlil_bseq), question! , yes no ! , ( )
  if ret = 1 then
  delete from book_seq where bseq = : il_bseq using sqlca;
  if sqlca , sqlcode < >0 then
  message box("删除数据错误(delete book_lib)?" , sqlca , sqlen . text)
  rollback using sqlca;
  return
  else
  commit using sqlca;
  end if
  end if
  cb_rtv . tringgerevevent (clicked!)
  6、 在"借书"按钮的clicked事件中,添加如下脚本,用于借书操作(图书序列号和读者编码均不能为空)。
  string ls_bseq , ls_rid , ls_seq , ls_bsts , ls_tmp , ls_bid
  long ll_bsea , ll_tmp , ll_rid
  date ld_out , ld_dise
  int li_bdays , lt_days , lt_cnt , lt_max__cnt , ret
  real lr_fee , lr_fine , lr_tmp
  ll_bseq = long (trim(sle_bseq . text))
  //图书序列号
  ll_rid = long (trim(sle_rid . text))
  //读者编号
  if ll_bseq < 1 or ll_rid < 1 then
  return
  ls_seq = string(today ( ) , 'yyyy _m m _ dd ' ) + string ( now )1 ,' hhmmss')
  //操作流水号
  select book-sts , btd into : ls_bsts , : ls_bid_from book_seq where bseq = : ll_bseq
  注:检索该书的状态和图书编码信息

  using sqlca;
  if sqlca , sqlcode < > 0 then
  if sqlca . sqlcoke = 100 then
  //未找到
  message box("未找到数据","请核实图书序列号")
  return
  else
  message box("检索数据错误(retricve book_sts from book_sea err!",sqlca , sqlerr . text)
  end if
  else
  if ls_bsts . < > '01' then
  //图书状态错误
  message box("数据错误!","该书不在库中")
  return
  注:检索该类读者的借书期限和本书限制等信息
  else
  select bor_days , bor_cnt into : li_bdays , :li_max_cnt from book-reader_level where =(select level from book_reader where rid = : ll_rid;
  if is null (li_bdays) then
  li_bdays = 0
  ld_due = relativedate(today( ) , lt_bdays)
  select count (*)into : li_cnt from book_to_detcil where rid = : ll_rid and   in_date is null;
  if li_cnt >= li_max_cnt then
  //借书数目已到上限
  message box("借书已满","该读者已借:" +string(li_cnt) +"本书不能再借")
  return
  end if
  注:把借书信息插入到图书借还明细表中
  insert into book_to_detail (seq , bseq , bid , rid , out_date , due_date , tcd)
  valucs( :ls_seq ,: ll_bseq ,: ls_bud ,: ll_rid , today( ) , :ld_due)today( ))
  注:更新图书库中该本图书的信息
  update book seq set book_sts = '0 9' where bseq = : ll_bseq
  if sqlca . sqlcode < > 0 or is null (ll_tmp) then
  message box ("数据更新失败!",sqlca . sq(errtext)
  rollback using sqlca;
  return
  else
  commit using sqlca;
  end if
  end if
  end if
  dw_1.settransobject (sqlca)
  dw_1.veset( )
  //数据窗口初始化
  dw_1.vetrieve( )
  //重新检索数据
  7、 在"还书"按钮的clicked事件中,添加如下脚本,用于还书操作(图书序列号不能为空)。
  string ls-bsea . is_rid , ls_seq , ls_bsts , ls_tmp
  long ll_bseq , ll_tmp
  date ld_out
  int li_bdays , li_bdays , ret
  real lr_fee , lr_fine , lr_tmp
  ll_bseq = long (trim(sle_bseq . text)
  //图书序列号
  ll_bseq < 1 then
  return
  select book_sts into : ls_bsts from book_seq where bsea = : ll_bseq
  using sqlca ;
  if sqlca . sqlcode < > 0 then
  if sqlca . sqlcode = 100 then
  //未找到记录
  message box("未找到数据","请核实图书序列号")
  return
  else
  message box("检查数据错误(retrieve book_sts from book_seq err)! ",sqlca.sqlerr . text)
  return
  end if
  else
  if ls_bsts < > '0 9' then
  //图书状态不对
  message box ("数据错误!","该书非借出状态")
  return
  注:检查出指定图书的最大的流水号(上次的借书记录)
  else
  select max (seq) into : ls_tmp from book_to_detakl_where bseq . = :ll_bseq)
  if sqlca . sqlcode < > 0 or is null (ll_tmp) then
message box("数据错误!","未找到该书的借出信息!")
  return
  end if
  注:检索出该书借出的日期等信息。
  select out_date , rid , bseq into : ld_out ; ls_rid , :ll_bseq from   book_io_detail where seq =:ls_temp;
  注:检索出该类读者的借书期限和本书限制等信息。
  select bor_days , fine into ; li_bdays , lr_fine from book_reader_level  where level = (select level from book__reader where rid = : ls_rid);
  li_days = days after (ld_out , today ( ) )_li_bdays
  if li_days < 1 then
  li_days = 0
  lr_tmp = li_days * lr_fine
  //计算罚金
  if lr_tmp > 0 . 1 then
  re = message box ("增收罚金提示!","该用户借书超期,需收罚金"+strin(lr_tmp , '###### . ##) + , question! , yse no ! , 1)+"是否收取?",question ?,yes no !,1)
  if ret < >1 then
  lr_tmp = 0 . 0
  //免收罚金
  end if
  update book_to_detail
  //更新图书借还明细表中该书的记录
  set in_date = today ( ) ,
  fee = : lr-tmp,
  lcd = today ( )
  where seq = : ls_tmp;
  update book_seq
  set book_sts = '0 1' where bseq = : ll-bseq
  注:更新书库中该书的状态
  if sqlca . sqlcode < > o or is null (ll_tmp) then
  message box ,sqlca , sq(err . text)
  rollback using sqlca;
  return
  else
  commit using sqlca;
  end if
  end if
  end if
  dw_1 . set tran sobject (sqlca)
  dw_1 . reset ( )
  //数据窗口初始化
  dw_1 . retrieve ( )
  //重新检索数据

  结论
  当今数据库技术已成为计算机应用的核心技术,可以认为当今任何计算机信息系统和计算机应用系统都与数据库的应用分不开,数据库已成为其核心和基础。建立数据库应用系统是要充分利用数据库中的数据。对数据库中的数据进行的操作除增加(insert)、更改(update)和删除(delete)外,最常用,也是重要的是查询操作。即便是最简单的数据库应用系统,也离不开查询功能,查询可以说是进行数据管理的重要手段,不过也是数据库应用系统开发过程中较困难、花时间、有一定难度的部分。
  可视化编程是visual foxpro的最大特点,它改善了dbase在编程过程中无法看到界面这个缺点,它使得编程人员所编的程序更为直观,编程人员可以通过视图、界面来修正自己程序中存在的不足,使自己的程序更加完美。
  本文正是依据visual foxpro可视化编程这一特点。就学校图书馆的具体环境,利用学过的visual foxpro的编程知识,以面向对象为理念,实现对图书馆的书籍进行查寻这一功能。帮助图书管理员更好的管理图书。
  根据本校图书馆的实际情况,编写了图书馆查寻系统这一程序。改善原有图书查寻系统的不足,使图书馆理人员的工作更为简洁、直观;读者查寻图书更加方便、快捷。
  为方便对图书馆书籍,读者资料,借还书等进行高效的管理,特编写该程序以提高图书馆的管理效率。使用该程序之后,管理人员可以查询某位读者、某种图书的借阅情况,还可以对当前图书借阅情况进行一些统计,给出参考资料。
  再在新兴起许多可视化编程的软件,像vb,vc,与它们相比,vf 在视觉效果上可能有些单一,但对于图书馆查寻系统这样比较实用的程序来说用vf来编写程序无疑是个更好的选择。
  本文不仅可以为各学校建立自己的图书查寻系统做参考,也可成为各中小型图书馆的示范。
  编写图书查寻系统的过程是一个很大的工程,如有不足还请谅解!
  希望读者多提出宝贵意见!
  也希望有人能喜欢这一程序,并对您的需要的一定的帮助!

 

 

                      

                         2003-11-18