APP下载

管理信息系统数据查询与修改模块的设计与实现

2009-09-21秦鸿霞

中国管理信息化 2009年13期
关键词:管理信息系统会计科目

秦鸿霞

[收稿日期]2008-12-20

[摘 要]本文以会计科目的查询与修改操作为例,详细分析与探讨了利用Visual FoxPro设计与实施管理信息系统数据查询与修改模块的基本原理、方法和步骤,并提供了相应的程序代码。

[关键词]管理信息系统;会计科目;数据查询;数据修改;Visual FoxPro程序设计

doi:10.3969/j.issn.1673-0194.2009.13.001

[中图分类号]F232[文献标识码]A[文章编号]1673-0194(2009)13-0004-04

数据查询与修改操作是管理信息系统必不可少的基本操作,查询与修改模块则是管理信息系统中极其重要的功能模块。数据查询与修改处理的基本原理是:先提供查询条件,然后在数据表中查询符合条件的记录,再以只读方式显示出查询结果。如果只进行查询操作,则不允许对查询结果进行修改;如果要在所显示的查询结果中修改数据,则需要先将显示结果变为非只读方式,然后进行修改,待相关数据修改完毕后,仍需将显示结果再变为只读方式。本文以Visual FoxPro为关系数据库管理系统,以会计科目的查询与修改为例,分析与探讨管理信息系统数据查询与修改模块的实现方法。本文所提供的程序代码已通过上机验证。

1 数据表的结构

由于查询与修改操作是对相应数据表中的相关数据进行查询与修改处理,所以,必须首先弄清楚相应数据表的结构。假设会计科目相关信息保存在会计科目表中,会计科目表的数据结构如表1所示,其文件名为kjkm.dbf,存储在默认目录下。可以将会计科目表文件kjkm.dbf添加到相应的账务处理数据库中加以管理。

2 查询与修改表单界面的设计

根据表1所示的会计科目表的结构,在Visual FoxPro的表单设计器中设计如图1所示的查询与修改表单。其中,矩形对应于一个容器控件,该容器控件之上放置有标签、组合框、文本框等对象,“查询条件”、“待选项目:”、“比较符:”、“值:”是为各标签设置的Caption属性,Combo 1、Combo 2是各组合框的默认的Name属性,Text 1、Text 2是各文本框的默认的Name属性。而“查询”、“修改”、“退出”是为各命令按钮控件设置的Caption属性。另外,“查询与修改项目”是为表单设置的Caption属性。以上控件或对象都是借助“表单控件”工具栏画出的,各控件的Caption属性通过相应的“属性”对话框进行设置。

需要说明的是,Text 1和Text 2文本框实际是重叠在一起的,并与Combo 1及Combo 2组合框水平对齐,运行时同一时刻只能显示其中一个文本框,感觉上就像只有一个文本框一样。这里只是为了方便描述和便于理解,才以图1中所示的呈现形式进行布局。

表单的下方是一个表格控件,设计该表格控件的步骤和方法是:①在“表单控件”工具栏选中“表格”控件,再在表单上适当的位置画一个大小适中的表格,其Name属性默认为Grid 1;②用鼠标右键单击Grid 1表格,再在弹出的快捷菜单中选择“生成器”,则出现表格生成器对话框,可在其“表格项”选项卡选择或设置此表格关联的数据表kjkm(或选择文件kjkm.dbf),并选定该表格关联的全部字段,再在“布局”选项卡将表格各栏对应的标题设定为图1中表格的标题,最后单击表格生成器的“确定”按钮即可。这样设置后,就为表单建立了数据环境,且数据环境设计器中对应的数据表就是kjkm,数据环境和kjkm数据表的Name属性分别为Dataenvironment和Cursor1。

3 查询与修改模块的功能目标

数据库或数据表中的数据量一般都比较大,无论是进行数据查询还是进行数据修改,都需要指定相应的查询或修改条件,再进行相应的操作。因此,要实现查询与修改功能,应能通过其表单界面指定查询条件,并执行相应的查询或修改操作,操作完毕后应使表单能够退出内存。具体来说,查询与与修改模块就是要实现以下功能目标:

(1)指定查询条件。图1所示的表单运行后,组合框Combo 1是一个下拉列表框,可以从其下拉列表项“科目编号”、“科目名称”、“借贷方向”、“期初余额”中任意选择其中一项,默认的选项为“科目名称”。同样,Combo 2也是一个下拉列表框,可以在其下拉列表中分别选择以下比较运算符:<、<=、=、==、>=、>、<>,默认的比较符选项为=。当从Combo 1下拉列表中选择“科目编号”、“科目名称”或“借贷方向”时,Text 2文本框隐藏,而Text 1文本框显示并获得焦点,对应的字符型数据可在Text 1文本框内输入;否则,当从Combo 1下拉列表中选择“期初余额”时,Text 1文本框隐藏,同时Text 2文本框显示并获得焦点,可将对应的数值型数据输入到Text 2文本框。这样,由Combo 1、Combo 2中选择的内容与Text 1或Text 2中指定的内容就构成了一个条件。

(2)进行查询或修改操作。表单运行后,表格Grid 1中起初并不显示任何数据,只有单击“查询”按钮时,才将满足查询条件的全部记录显示在表格中,显示结果不允许修改,只有单击“修改”按钮后才能修改表格中显示的数据。焦点离开表格至再次单击“修改”按钮前,表格中的数据禁止被修改。

(3)退出。单击“退出”按钮,表单退出内存。

4 查询与修改模块功能的实现

4.1 “指定查询条件”功能的实现

4.1.1 定义表单的Load事件与Unload事件

表单的Load事件是表单对象建立之前引发的事件,而Unload事件则是表单对象释放时最后一个要引发的事件。可在表单的Load事件中使用Public声明含4个元素的数组xiangmu和含7个元素的数组bijiao,其中数组xiangmu各元素分别保存Combo 1下拉列表框中的待选项目,包括科目编号、科目名称、借贷方向、期初余额;数组bijiao各元素分别保存比较运算符,包括小于(<)、小于或等于(<=)、等于(=)、全等于(==)、大于或等于(>=)、大于(>)、不等于(<>)。另外,为使表单运行后能采用精确匹配方式进行字符串比较,还应在Load事件的开始添加set exact on语句。表单的Load事件的程序代码对应如下:

set exact on

public xiangmu(4),bijiao(7)

xiangmu(1)="科目编号"

xiangmu(2)="科目名称"

xiangmu(3)="借贷方向"

xiangmu(4)="期初余额"

bijiao(1)="<"

bijiao(2)="<="

bijiao(3)="="

bijiao(4)="=="

bijiao(5)=">="

bijiao(6)=">"

bijiao(7)="<>"

由于在Load事件中使用了set exact on语句,因而需要定义表单的Unload事件,并将其Unload事件的程序代码设置为set exact off,以便退出表单时将Visual FoxPro设置为默认的字符串比较方式。

如果在表单的Load事件中不包含set exact on语句,就表明程序中采用默认的set exact off方式进行字符串的比较,此时便不需要专门为表单的Unload事件设置相应的程序代码。但在采用set exact off方式进行字符串的比较运算时,只要关系表达式中比较运算符“=”、“<=”或“>=”右边的字符串与其左边字符串前面的部分内容相匹配,即可得到逻辑真•T•的结果。

4.1.2 指定Combo 1和Combo 2关联的数据源

由于Combo 1是一种下拉列表框形式的组合框,其下拉列表项分别为科目编号、科目名称、借贷方向和期初余额,对应于数组xiangmu中各元素的值,因此可依次将Combo 1组合框的RowSourceTye、RowSource和Style属性分别设定为5-数组、xiangmu、2-下拉列表框,这样就分别设定了该组合框控件中数据值的源的类型、数据值的源及组合框的类型。同样,可将〤ombo 2的RowSourceTye、RowSource和Style属性分别设定为5-数组、bijiao、2-下拉列表框。

这样设置并运行后,Combo 1下拉列表框中就会包含科目编号、科目名称、借贷方向和期初余额等列表项,而Combo 2下拉列表框中包含<、<=、=、==、>=、>、<>等列表项,可供选择。

4.1.3 定义表单的Init事件

Init事件是在对象建立时引发的事件。要使表单启动后,Combo 1默认选择为“科目名称”,Combo 2默认选择为等号“=”,可在表单的Init事件中分别使Combo 1、Combo 2的listindex属性设置为2和3,其中2对应于4.1.1节中定义的数组xiangmu第二个元素xiangmu(2)的值,3对应于数组bijiao的第三个元素bijiao(3)的值。为确保显示在表格中的数据不能被随意修改(除非单击“修改”按钮),可使表格Grid 1的ReadOnly属性设置为•t•以使表格只读。另外,当Combo 1中选择“期初余额”时,应将Text 1的visible属性设置为•f•,以使Text 1隐藏;同时将Text 2的visible属性设置为•t•,以使Text 2显式显示,应利用setfocus方法使Text 2获得焦点,以便于数值型数据的输入。否则,当Combo 1中选择了“科目编号”、“科目名称”或“借贷方向”时,应使采用同样的方法使Text 2隐藏,使Text 1可见并获得焦点,以便于字符型数据的输入。表单的Init事件的程序代码对应如下:

thisform.Combo 1.listindex=2

thisform.Combo 2.listindex=3

thisform.grid1.readonly=•t•

if thisform.Combo 1.value="期初余额"

thisform.Text 1.visible=•f•

thisform.Text 2.visible=•t•

thisform.Text 2.setfocus

else

thisform.Text 2.visible=•f•

thisform.Text 1.visible=•t•

thisform.Text 1.setfocus

endif

4.1.4 定义Combo 1的InteractiveChange事件

表单运行后,经常在Combo 1和Combo 2中选择下拉列表项,根据Combo 1中选择的内容是否为“期初余额”,需要确定是在Text 2中还是在Text 1中输入数据。当Combo 1中选择的内容改变时,如果变为“期初余额”,则应使Text 1隐藏,Text 2可见并获得焦点,以便于输入数值型数据;否则,如果Combo 1中的内容变为其他项(科目编号、科目名称、借贷方向),则Text 2不可见,Text 1可见并获得焦点,以便于输入字符型数据。可在Combo 1的InteractiveChange事件中设置相关代码,当用户使用键盘或鼠标更改此控件的值时,其InteractiveChange事件中的代码被立即执行。Combo 1的InteractiveChange事件的程序代码对应如下:

if this.value="期初余额"

thisform.Text 1.visible=•f•

thisform.Text 2.visible=•t•

thisform.Text 2.setfocus

else

thisform.Text 2.visible=•f•

thisform.Text 1.visible=•t•

thisform.Text 1.setfocus

endif

同样,Combo 2中选择的比较符发生改变时,如果Combo 1中选择的是“期初余额”,则使Text 2获得焦点;否则,如果Combo 1中选择的是“科目编号”、“科目名称”或“借贷方向”,则使Text 1获得焦点,以便于在对应的文本框内输入对应待选项目的相关数据。可在Combo 2的InteractiveChange事件中设置相关代码,Combo 2的InteractiveChange事件的程序代码对应如下:

if thisform.Combo 1.value="期初余额"

thisform.Text 2.setfocus

else

thisform.Text 1.setfocus

endif

4.1.5 设置Text 2的数据类型和输入掩码

由于Text 2文本框用于输入期初余额,对应于数值型数据,所以应将其数据类型设置为数值型,并且最好指定其输入掩码,使输入的数值型数据符合表1中qcye字段(即期初余额字段)的宽度与小数位数。设置方法是:在表单设计器,用鼠标右键单击Text 2控件,在弹出的快捷菜单中选择“生成器”选项,则出现“文本框生成器”对话框,可在“格式”选项卡将数值类型设定为“数值型”,并将输入掩码设置为999999999.99,再单击“文本框生成器”对话框中的“确定”按钮即可。

另外,由于Text 1文本框用于输入科目编号、科目名称或借贷方向等字符型数据,而Text 1默认的数据类型正好为字符型,所以不需专门对Text 1控件的数据类型进行设置。

4.1.6 定义Text 1和Text 2的Click事件

由于多次操作,Text 1及Text 2中可能保留有上次输入的内容。如果单击Text 1时,能使Text 1中的字符型数据自动被清空,或者单击Text 2时,能使Text 2中的数值型数据自动置零,则输入操作将变得更加方便。可以分别在Text 1和Text 2的Click事件中将其Value属性值对应设置为space(0)和0.00,其中space(0)表示由0个空格组成的空字符串。这样,Text 1的Click事件的程序代码为:this.value=space(0);而Text 2的Click事件的程序代码为:this.value=0.00。

4.2 “查询与修改”功能的实现

4.2.1 设置Cursor 1的Filter属性与Combo 2的ControlSource属性

Cursor 1是数据环境Dataenvironment中对应于会计科目表kjkm的游标的默认Name属性(参见第2节所做的设置),它与表单上的Grid 1表格控件相互关联。为了使表单初始运行后,表格Grid 1中不显示任何初始数据,可在属性窗口将Cursor 1的Filter属性设置为.F.,Filter属性的功能就是使对应于Cursor 1的表格显示Filter属性值为真的记录,当设置为逻辑假值时,所关联的表格就不会显示任何数据了。

Combo 2下拉列表框的可选项是比较运算符对应的字符串,如“<”、“<=”等,为了使在Combo 2中选择的列表项对应于真正意义的比较运算符,而不是字符串,就需要首先设置其ControlSource属性,以便与某个字符型变量绑定,然后再用宏替换函数表示该字符型变量对应的比较运算符。假设在表单设计器的属性窗口将Combo 2的ControlSource属性设置为bj,则可以用&bj.表示从Combo 2中选择的列表项对应的比较运行符,其中&表示宏替换函数。例如,从Combo 2中选择<,则bj的值为字符串“<”,而&bj.则表示小于号<,而不是字符串“<”。这样设置,主要是为了缩短查询程序代码的长度。

4.2.2 定义“查询”按钮的Click事件

当在Combo 1、Combo 2下拉列表框中选择待查询项目和比较运算符,且在Text 1或Text 2输入对应的数据后,如果单击“查询”按钮,则查询结果应能够以只读方式显示在表格Grid 1中。因此,“查询”按钮的Click事件的程序代码应依次执行以下功能:①使表格〨rid 1只读;②表示出从Combo 1下拉列表中选择不同项时对应的查询条件;③将数据环境Dataenvironment中对应于会计科目表kjkm的游标Cursor1的Filter属性设置为对应的查询条件;④根据Combo 1中选择的项是否“期初余额”来决定是Text 2还是Text 1获得焦点;⑤刷新表单。这样,“查询”按钮的Click事件的程序代码对应如下:

thisform.grid1.readonly=.t.

do case

case thisform.Combo 1.value="科目编号"

tj="allt(kmbh)&bj.'"+allt(thisform.Text 1.value) + "'"

case thisform.Combo 1.value="科目名称"

tj="allt(kmmc)&bj.'"+allt(thisform.Text 1.value)+"'"

case thisform.Combo 1.value="借贷方向"

tj="allt(jdfx)&bj.'"+allt(thisform.Text 1.value)+"'"

case thisform.Combo 1.value="期初余额"

tj="qcye&bj.thisform.Text 2.value"

endcase

thisform.dataenvironment.cursor1.filter=tj

if thisform.Combo 1.value="期初余额"

thisform.Text 2.setfocus

else

thisform.Text 1.setfocus

endif

thisform.refresh

上述代码的相关说明对应如下:

(1)thisform.grid1.readonly=•t•是将表格Grid 1的只读属性设置为逻辑真值,使表格中的数据不允许被修改。

(2)分支语句do case…… endcase用于定义从Combo 1选择不同列表项时对应的查询条件,并用变量tj表示。例如:当从Combo 1选择“科目编号”时,tj="allt(kmbh)&bj.' "+allt(thisform.Text 1.value) + "' ",其中&bj.表示与从Combo 2中选择的项相对应的比较运算符,allt()的作用是将字符串的前导和末尾空格去掉;此时,当从Combo 2中选择<=、在Text 1中输入201时,tj="allt(kmbh)<='201'"。同理,当从Combo 1选择“期初余额”、Combo 2中选择<=、在Text 2中输入1 000时,tj="qcye<=1 000.00"。

(3)语句thisform.dataenvironment.cursor1.filter=tj就是将Cursor1的Filter属性设置为tj对应的查询条件,例如:thisform.dataenvironment.cursor1.filter="allt(kmbh)<=' 201' "。

(4)选择语句if…… else…… endif的作用是,如果Combo 1中选择了“期初余额”,则使Text 2获得焦点以便于输入数值型数据,否则(表示选择了“科目编号”、“科目名称”或“借贷方向”),则使Text 1获得焦点以便于输入字符型数据。由于表单的Init事件和Combo 1的InteractiveChange事件的程序代码规定了,如果在Combo 1中选择列表项“期初余额”,则使Text 1隐藏、Text 2可见;否则,会使Text 2隐藏、Text 1可见,因此,在任何时候,只要Combo 1中选择了“期初余额”,就只可能在可见的Text 2中输入数据,而不能在隐藏的㏕ext 1中输入数据;同样,只要Combo 1中选择的不是“期初余额”,就不能在隐藏的Text 2中输入数据。这样,就不必担心数据输错文本框的问题。

(5)thisform.refresh的功能是刷新表单,以便在表格Grid 1中显示出满足查询条件的记录。

4.2.3 修改功能的实现

单击“修改”按钮时,表格Grid 1控件中显示的数据应能够被修改。因此,可在“修改”按钮的Click事件中将Grid 1的ReadOnly属性设置为•f•,并使Grid 1获得焦点,就允许对表格中显示的数据进行修改了。“修改”按钮的Click事件的程序代码对应如下:

thisform.grid1.readonly=•f•

thisform.grid1.setfocus

当使用鼠标或键盘使焦点移出表格时,表明本次修改操作结束。以后即使由于单击“查询”按钮或直接单击表格,而使表格再次获得焦点,表格中的数据也不允许进行修改,除非再次单击了“修改”按钮。因此,焦点在移出表格Grid 1前,还应将其ReadOnly属性设置为•t•,使得只有再次单击“修改”按钮时,才能去修改表格中的数据。可以利用Grid 1的Valid事件达到此目的,控件的Valid事件中的代码在控件将要失去焦点前被执行。表格Grid 1的Valid事件的程序代码对应为:this.readonly=•t•。

4.3 “退出”功能的实现

退出功能最简单的实现方法就是单击“退出”按钮时立即使表单从内存中释放。因此,可以在“退出”按钮的Click事件中利用表单的release方法实现退出操作。“退出”按钮的Click事件对应的程序代码为:thisform.release。

主要参考文献

[1] 李国红.管理信息系统数据输入模块的设计与实现——兼论会计科目的输入设计[J].中国管理信息化,2006(11).

[2] 王利.全国计算机等级考试二级教程——Visual FoxPro程序设计[M].北京:高等教育出版社,2005.

[3] 陈洛资,陈昭平.数据库系统及应用基础[M].北京:清华大学出版社,北京交通大学出版社,2005.

猜你喜欢

管理信息系统会计科目
用友U8软件预置会计科目的维护
基于会计科目演变的银行同业业务发展模式与风险分析
基于B/S结构的学生公寓管理信息系统的设计与实现
基于“互联网+”的企业管理信息系统优化分析
基于工作流的水运应急信息管理平台设计 
浅谈会计科目扑克在高职会计专业教学中的应用
职称考试会计科目知识点归集(一)