370 likes | 543 Views
9.5 数据插入、删除、更新设计. 9.5.1 应用对象的建立 9.5.2 数据窗口设计 9.5.3 窗口设计 9.5.4 窗口及其控件事件脚本设计. 9.5.1 应用对象的建立. 1. 建立工作空间 在 PB8 中用工作空间来管理应用程序,一个工作空间中可以建立多个应用程序,可同时开发和管理多个应用程序。利用 PB 开发应用程序的第一步是建立工作空间,其步骤如下: ( 1 )选择 Powerbar 上的 New 按钮(或 File 菜单项中的 New )打开 New 对话框;
E N D
9.5 数据插入、删除、更新设计 • 9.5.1 应用对象的建立 • 9.5.2 数据窗口设计 • 9.5.3 窗口设计 • 9.5.4 窗口及其控件事件脚本设计
9.5.1 应用对象的建立 • 1. 建立工作空间 • 在PB8中用工作空间来管理应用程序,一个工作空间中可以建立多个应用程序,可同时开发和管理多个应用程序。利用PB开发应用程序的第一步是建立工作空间,其步骤如下: • (1)选择Powerbar上的New按钮(或File菜单项中的New)打开New对话框; • (2)选择Workspace标签项中的Workspace,按OK命令按钮打开New Workspace对话框,在对话框中选择保存路径、文件名,例如我们将文件保存在D:\WZGL目录,工作空间的文件名为WZGL,单击SAVE命令按钮。 • 这样一个工作空间已经建立,在D:\WZGL目录下有一个WZGL.PBW的文件。以后我们只需使用Open按钮(或File菜单项中的Open)打开对话框,选择相应路径和文件名即可。
9.5.1 应用对象的建立 • 2. 建立目标和应用对象 • 工作空间管理的是目标,每一目标对应一个应用程序,在建立目标时自动建立一个应用对象,建立目标的步骤为: • (1)选择Powerbar上的New按钮(或File菜单项中的New)打开New对话框; • (2)选择Target标签项中的Application,按OK命令按钮打开Specify New Application and Library对话框,在对话框中选择应用名、库文件名、目标名,如我们输入应用名为WZCK,其它两项自动会加上,单击Finish命令按钮。 • 每一应用程序都有且只有一个应用对象,应用对象是应用程序的入口。以后我们所建立的对象、控件、程序等都存放在Wzck.pbl中,当然一个应用程序也可以有多个库文件,可以根据选择将不同对象放置在不同库文件中。
9.5.2 数据窗口设计 • 数据窗口分为数据窗口对象和数据窗口控件,数据窗口对象主要用于展示数据库中数据并允许用户进行增删改操作,数据窗口控件把数据窗口对象放置在窗口上并呈现在用户面前。在数据窗口对象中可以定义数据的显示格式、显示风格和其它数据属性,使数据对用户更直观。 • 1. 数据窗口显示风格 • 定义数据窗口对象时需要为数据窗口选择显示风格,它用于定义数据窗口的显示格式和外部特征。显示风格有多种:
9.5.2 数据窗口设计 • (1)Grid格式 • (2)Tabular格式 • (3)N-UP格式 • (4)Freeform格式 • (5)Label格式 • (6)Group格式 • (7)Crosstab格式 • (8)Graph格式 • (9)Composit格式 • (10)RichText格式
9.5.2 数据窗口设计 • 2. 数据窗口数据源 • (1) Quick Select数据源 • 该数据源所对应的SELECT语句由PB自动、快速生成,其中的数据可以来自一个表/视图或通过外键关联的多个表。 • (2)SQL Select数据源 • 该数据源可以使用任意复杂的SELECT语句构造数据源。 • (3)Query 数据源 • Query数据源是利用在查询画板(Query Painter)中事先定义的查询对象作为数据源。
9.5.2 数据窗口设计 • (4)Store Procedure数据源 • 该数据源是利用存储在数据库中的存储过程来定义数据源。 • (5)External数据源 • 该数据源中的数据不是来自数据库,而是来自其它文件或应用程序生成的数据。
9.5.2 数据窗口设计 • 3. 数据窗口属性的设置 • 在建立数据窗口对象时,选择了数据窗口的显示风格和数据源后,PB会自动生成一个具有默认属性和特征的数据窗口对象,然后需要对一些属性进行设置。这些属性包括:数据窗口对象的度量单位、内部定时器、背景颜色、标题及标题大小、字体、数据窗口的TAB顺序、数据窗口的更新属性、检索参数等。其基本方法是利用Properties窗口设置所需属性。 • 同时也可以对数据窗口对象中添加控件,其方法为从Insert菜单中的Control菜单中选择所需控件,在适当区域用鼠标可完成控件的初步插入,然后设置其相应属性和特征即可。
9.5.2 数据窗口设计 • 4. 实例在此我们说明数据窗口DW_WZBM和DW_WZLK的建立过程,其它数据窗口只在使用时作简要说明。 • (1)在主菜单的“File”菜单项中选择“New”或在PowerBar中选择图标“New”,打开New对话框,并选择“DataWindow”标签页。 • (2)从“DataWindow”标签页中选择数据窗口风格,在此我们选择“Grid”,单击OK按钮。 • (3)从“Choose Data Source For Grid DataWindow”窗口中选择数据源,我们在此选择“SQL Select”,单击Next按钮。 • (4)从“SELECT Tables”框中选择表或视图,在此选择表WZBMB,单击打开,然后在表中选择要出现在数据窗口中的字段,在此全选。 • (5)单击PowerBar中的Return,连续单击两次Next按钮,再单击Finish按钮,此时一个初步的数据窗口已经建立。 • (6)对初步形成的数据窗口的属性和特征进行修饰后,点击Powerbar上的Save图标,按提示输入数据窗口名,在此取名为DW_WZBM,如图9.1所 • 示:
9.5.2 数据窗口设计 • 4. 实例 • 同样我们建立数据窗口DW_WZLK,它是建立在四个表上的、自由格式且带有参数的数据窗口。其过程如下: • (1)在主菜单的“File”菜单项中选择“New”或在PowerBar中选择图标“New”,打开New对话框,并选择“DataWindow”标签页。 • (2)从“DataWindow”标签页中选择数据窗口风格,在此我们选择“Freeform”,单击OK按钮。 • (3)从“Choose Data Source For Grid DataWindow”窗口中选择数据源,我们在此选择“SQL Select”,单击Next按钮。 • (4)从“SELECT Tables”框中选择表或视图,在此选择表WZLKB、WZBMB、WZCKBMB、DWBMB,单击打开。 • (5)单击PowerBar上的Join,建立WZBMB、WZCKBMB、DWBMB与WZLKB的连接,将wzlkb表的字段wzbm与wzbmb中的字段wzbm建立连接,将wzlkb表的字段dwbm与dwbmb中的字段dwbm建立连接,将wzlkb表的字段wzckbm与wzckbmb中的字段wzckbm建立连接,再单击PowerBar上的Join,然后在表中选择要出现在数据窗口中的字段。
9.5.2 数据窗口设计 • 4. 实例(6)从菜单Design中选择Retrieval arguments,在参数定义窗口中定义两个字符型(String)参数xx、yy,单击OK。 • (7)点击Where标签,在Column中选择字段名rq,在Operator中选择或输入“=”,在Value中输入“:xx”,在Logical中选择“and”,同样使得参数yy与字段lkh对应起来。 • (8)单击PowerBar中的Return,连续单击两次Next按钮,再单击Finish按钮,此时一个初步的数据窗口已经建立。 • (9)对初步形成的数据窗口的属性和特征进行修饰后,点击Powerbar上的Save图标,按提示输入数据窗口名,在此取名为DW_WZLK,如图9.2所示:
9.5.3 窗口设计 • 窗口是PB应用程序的重要组成部分,是用户与PB应用程序之间进行交互的主要界面。窗口是用户操作应用程序、得到用户所需信息的人机交互接口。在窗口中可放置控件,为应用程序和用户提供更强大的功能。 • 1. 窗口的类型 • PB提供了6种窗口类型:Main(主窗口)、Popup(弹出式窗口)、Child(子窗口)、Response(响应窗口)、MDI frame(多文档界面窗口)、MDI frame with Microhelp(带微帮助的多文档界面窗口)。在不同情况下选用不同类型的窗口。
9.5.3 窗口设计 • (1)Main窗口 • (2)Popup窗口 • (3)Child窗口 • (4)Response窗口 • (5)MDI frame窗口 • (6)MDI frame with Microhelp窗口
9.5.3 窗口设计 • 控件是PB应用程序图形界面的重要组成部分,它是系统预先定义好的可视图形对象,开发人员可将控件添加到窗口上而直接使用它们。控件并不单独保存,而是与相应窗口一起保存在PB库文件中。用户通过窗口上的控件完成所需的操作,应用程序通过控件向用户显示信息。 • 控件按是否响应用户操作可分为两类:一类能够响应用户操作,它们具有事件,如命令按钮等;另一类不响应用户操作,它们没有事件,如绘图控件。
9.5.3 窗口设计 • 控件按功能可分为4类: • (1)激活动作类型。包括命令按钮(CommandButton)和图片按钮(PictureButton)等。 • (2)选择类型。包括单选按钮(RadioButton)、复选框(CheckBox),还可以用选项组控件(GroupBox)对这些选择项控件对行分组。
9.5.3 窗口设计 • (3)显示数据类型。包括列表框(ListBox)、图片列表框(PictureListBox)、数据窗口(DataWindow)、下拉列表框(DropDownListBox)、下拉图片列表框(DropDownPictureListBox)、静态文本框(StaticText)、图形(Graph)、列表窗口(ListView)、树状窗口(TreeView)、多格式文本框(RichTextEdit)、进度条(HprogressBar、VprogressBar)、滚动条(HscrollBar、VscrollBar)、单行编辑框(SingleLineEdit)、多行编辑框(MultiLineEdit)、编辑掩码控件(EditMask)、OLE控件等。 • (4)修饰类型。为绘图对象,如直线(Line)、矩形(Rectangle)、椭圆(Oval)等。 • 窗口上控件的使用请参阅帮助文件。
9.5.3 窗口设计 • 3. 窗口的设计 • 设计窗口的过程如下: • (1)建立窗口 • 使用工具框的New按钮或菜单File中的New菜单项,打开New对话框,选择PB Object标签页,双击其中Window图标,进入窗口编辑状态。 • (2)设置窗口属性 • 输入窗口标题、选择窗口类型、调整窗口大小等。
9.5.3 窗口设计 • (3)添加控件 • 通过工具框上的控件图标或菜单Insert中的菜单Control,将所需控件添加到窗口上,并对控件的属性进行调整,在数据窗口控件属性中General标签页的 DataObject编辑框中输入相应数据窗口对象名,以建立与数据窗口对象的联系。 • (4)编写窗口或控件事件的脚本 • (5)保存窗口。 • 如果要对一个已存在的窗口进行修改,只需在(1)中使用工具框的Open按钮或菜单File中的Open菜单项即可。
9.5.3 窗口设计 • 4. 实例 • 按窗口设计方法,在下列两个窗口中添加了4个命令按钮和一个数据窗口控件,在W_WZBM中数据窗口控件的Properties中指定Dataobject 为Dw_wzbm,W_WZLK中数据窗口控件的Properties中指定Dataobject 为Dw_wzlkv。两窗口如下图9.3和9.4所示:
9.5.4 窗口及其控件事件脚本设计 • 在窗口中常用事件主要为Open、Close、CloseQuery、Timer等。Open事件在窗口打开之后、显示之前执行,Close事件在关闭窗口时执行,CloseQuery事件在关闭窗口前执行,Timer事件在调用Timer()函数启动定时器、设定时间之后触发执行,它可用于定时操作。 • 命令按钮常用事件为:Clicked、Getfocus和Losefocus等。Clicked事件在单击该控件时触发,Getfocus在该控件获得焦点前触发,Losefocus事件在在该控件失去输入焦点时触发。 • 数据窗口控件的常用事件有:Clicked、DoubleClicked、 EditChanged、ItemChanged、ItemFocusChanged、RetrieveEnd、 RowFocusChanging、RowFocusChaged、UpdateStart、UpdateEnd等。
9.5.4 窗口及其控件事件脚本设计 • Clicked在用户单击数据窗口时触发,DoubleClicked在用户双击数据窗口时触发,EditChanged在编辑数据窗口的数据时触发,ItemChanged在数据窗口控件的数据项内容改变并且失去焦点时触发,ItemFocusChanged在当前数据项焦点改变时触发,RetrieveEnd在检索完成后触发,RowFocusChanging在焦点行改变时触发,RowFocusChanged在焦点行改变后触发,UpdateStart在Update()函数开始执行前触发,UpdateEnd在Update()函数开始执行后触发。
9.5.4 窗口及其控件事件脚本设计 • 1.物资编码录入窗口脚本设计 • (1)W_WZBM窗口Open 事件脚本 • dw_1.settransobject(sqlca) • dw_1.retrieve() • 其中dw_1为窗口中数据窗口控件名,settransobject(sqlca)设置与数据窗口控件相关联的事务对象SQLCA,retrieve()是在数据窗口中检索数据,该函数可带参数,当建立的数据窗口对象带有参数时(如dw_wzlk),该函数应带有相应参数值。
9.5.4 窗口及其控件事件脚本设计 • (2)“插入”按钮(cb_1)的脚本 • long i,ii • string vwzbm • i=dw_1.rowcount()//得到数据窗口中数据总行数 • ii=i • IF i=0 THEN//如果数据窗口中没有数据,则插入一行 • dw_1.insertrow(0) • ii=ii+1 • ELSE//如果数据窗口中有数据,则判断是否有空行, • //如果有一空行,则光标保持不动,否则,插入一行。
9.5.4 窗口及其控件事件脚本设计 • dw_1.setrow(i) • vwzbm=dw_1.getitemstring(i,'wzbm') • IF isnull(vwzbm) OR vwzbm='' THEN • ii=i • ELSE • dw_1.insertrow(0) • ii=ii+1 • END IF • END IF • dw_1.setrow(ii) • dw_1.setfocus()//设置焦点
9.5.4 窗口及其控件事件脚本设计 • (3)“删除”按钮(cb_2)的脚本 • long i • i=dw_1.getrow() • IF i>0 AND i<=dw_1.rowcount() THEN • dw_1.deleterow(i)//删除第i行 • END IF • (4)“保存”按钮(cb_3)的脚本 • IF dw_1.update()=1 THEN//判断保存是否成功,若成功,则提交,否则,回退到原状态。
9.5.4 窗口及其控件事件脚本设计 • COMMIT; • messagebox('!','保存成功!') • ELSE • ROLLBACK; • messagebox('提示','保存不成功!') • END IF • (5)“退出”按钮(cb_4)的脚本 • close(parent)//关闭当前窗口
9.5.4 窗口及其控件事件脚本设计 • 2. 物资出库单窗口设计(1)W_WZLK窗口Open 事件脚本 • dw_1.settransobject(sqlca) • dw_1.retrieve('99999999','0000')//按参数检索,设置检索参数,使其不能检索出数据。 • (2) 插入、删除、保存和退出的按钮脚本 • 与物资录入编码窗口对应按钮的脚本相同。
9.5.4 窗口及其控件事件脚本设计 • (3)数据窗口对象dw_1的itemchanged的脚本 • //该事件脚本实现当输入编码时,显示与编码有关的项,同时进行一些简单的计算。 • long i • string xx,yy,y1,y2 • double z,z1 • i=dw_1.getrow() • CHOOSE CASE dw_1.getcolumnname()//得到当前列的列名
9.5.4 窗口及其控件事件脚本设计 • CASE 'wzckbm'//如果当前列的列名为wzckbm,则通过SQL语句得到仓库名称, • //并将其写入wzckmc项中。 • xx=data • SELECT wzckmc INTO :yy FROM wzckbmb WHERE wzckbm=:xx; • dw_1.setitem(i,'wzckmc',yy) • CASE 'dwbm'//如果当前列的列名为dmbm,则通过SQL语句得到单位名称, • //并将其写入dwmc项中。
9.5.4 窗口及其控件事件脚本设计 • xx=data • SELECT dwmc INTO :yy FROM dwbmb WHERE dwbm=:xx; • dw_1.setitem(i,'dwmc',yy) • CASE 'wzbm'//如果当前列的列名为wzbm,则通过SQL语句得到物资名称、 • //规格型号、计量单位和价格,并将其写入对应项中。 • xx=data • SELECT wzmc,xhgg,jldw,price INTO :yy ,:y1,:y2,:z FROM wzbmb WHERE wzbm=:xx;
9.5.4 窗口及其控件事件脚本设计 • dw_1.setitem(i,'wzmc',yy) • dw_1.setitem(i,'xhgg',y1) • dw_1.setitem(i,'jldw',y2) • dw_1.setitem(i,'price',z) • CASE 'sfs'//如果当前列的列名为sfs,得到价格price的值, • //并将输入数量与价格的乘积写入总金额项中。 • z=real(data) • z1=dw_1.getitemnumber(i,'price') • dw_1.setitem(i,'sum',z*z1) • END CHOOSE • 在上述脚本中,使用了系统变量data,该变量是字符型,它表示当前项中的输入值。
9.5.4 窗口及其控件事件脚本设计 • (4)数据窗口对象dw_1的rowfocuschanged的脚本 • //该事件自动获得系统日期和数据库中的序号,并显示在相应位置上。 • string vrq,vlkh • long i • SELECT to_char(sysdate,'yyyymmdd') INTO :vrq FROM DUAL;//得到Oracle系统日期 • i=dw_1.getrow() • dw_1.setitem(i,'rq',vrq) • SELECT rl_sequence.nextval INTO :vrq FROM DUAL;//得到下一个序号,
9.5.4 窗口及其控件事件脚本设计 • //rl_sequence是在Oracle中建立的序号 • vlkh=string(long(vrq)+1,'0000') • dw_1.setitem(i,'lkh',vlkh) • 请读者考虑,如果将itemchanged事件中的脚本写到editchanged事件中,有什么不同。如果要使用户对sfs输入时,每输入一个数字,马上将总金额计算出来,事件脚本应作如何调整。