PB教程第九章 数据窗口与数据库

合集下载

PowerBuilder第9讲 数据窗口应用

PowerBuilder第9讲 数据窗口应用




2、建立共享函数 格式: Integer dw_primary.ShareData(dw_secondary) 参数:①dw_primary:主数据窗口的数据窗口控件名。 ②dw_secondary:从数据窗口的数据窗口控件名。 返回值:函数执行成功时返回1,发生错误时函数返回-1。 如果任何参数的值为NULL,则ShareData()函数返回 NULL。 功能:从数据窗口共享主数据窗口中的数据。 说明:
演示一个主从关系数据窗口的实现
添加dw_1和dw_2, 分别连接d_sellerp和d_sellers; 在open事件中添加以下代码 dw_1.setTransObject(SQLCA) dw_2.setTransObject(SQLCA) dw_1.retrieve() dw_2.retrieve() dw_1.setRowFocusIndicator(hand!)


添加删除按钮,其代码如下: long rsm, row row = dw_2.GetRow() rsm = dw_2.RowCount() if row>0 and row<=rsm then dw_2.DeleteRow(row) end if



数据存储用毕之后,需要使用Destroy语 句删除该对象, 例如:DESTROY ids_stock

9.2 主从数据窗口



使用数据窗口技术操作数据库表中数据的常 用方法 回顾几种检索、修改表中数据的方法 数据库信息管理系统中一个很重要的工作就 是检索、修改数据,为了实现这些功能,我 们曾经学习过以下一些方法。
数据存储通常使用在下述四个方面:

PB数据窗口教程

PB数据窗口教程

PB数据窗口教程数据窗口是PowerBuilder中最常用的控件之一、它用于显示数据库查询结果,并提供了对此结果进行浏览、修改和删除等操作的功能。

本教程将为您介绍如何在PowerBuilder中使用数据窗口控件。

第一步是创建一个数据窗口。

在PowerBuilder的“对象”菜单下,选择“新建”>“数据窗口”。

在弹出的对话框中,选择所需的数据源和表格,并点击“确定”按钮。

此时,将会出现一个空白的数据窗口设计器。

接下来,将需要显示在数据窗口中的列添加到数据窗口中。

您可以通过拖拽数据库字段或手动添加列的方式进行操作。

在设计器的左侧,您将看到一个“对象树”面板,在这里选择数据窗口对象,并右键单击以添加列。

完成列的设置后,您可以在设计器的页面中放置其他控件,以增强用户界面。

一些常用的控件包括文本框、复选框、下拉列表框等。

您可以通过拖拽控件到数据窗口设计器的页面中进行操作,并根据需要设置其属性。

下一步是设置数据窗口的数据源。

在数据窗口设计器的菜单栏中,选择“数据”>“设置数据源”选项。

在弹出的对话框中,选择所需的数据源和表格,并点击“确定”按钮。

此时,数据窗口将会显示数据源中的数据。

现在,您可以运行应用程序,并查看输出窗口中的结果。

您可以通过点击数据窗口中的列标题对数据进行排序,通过点击数据行进行选择,并通过单击“查阅”按钮在查询结果中进行导航。

如果需要,您还可以在数据窗口中进行增加、修改和删除操作。

通过本教程,您应该已经了解了如何在PowerBuilder中创建和使用数据窗口控件。

数据窗口是PowerBuilder开发中非常重要的一部分,掌握了数据窗口的使用方法,可以提升开发效率,并为用户提供更好的用户界面和交互体验。

希望本教程能对您有所帮助!。

pb中数据窗口的应用

pb中数据窗口的应用

Pb中数据窗口的应用在通常的Server/Client方式MIS开发中,总是有没完没了的报表需要制作,调试报表花费的时间也是最多而且乏味,还常常不能满足客户的要求。

要是能够让用户自己调整报表的格式和内容,然后将它保存下来,程序下次启动时它自动调用保存了的报表格式那有多好。

本人通过如下方法最终实现了用的要求。

PB(PowerBuilder)有一种以PSR结尾的特殊的保存报表的文件格式(本文简称作PSR文件)。

根据数据窗口可以直接读取PSR文件生成报表的原理,程序通过生成PSR文件,实现动态报表格式的保存。

一、实现原理:PB中的报表其实就相当于是数据窗口。

第一步,动态报表的实现。

通过设置数据窗口对象(dataobject)中文本、列等的Resizeable 和moveable属性为1来实现对象位置的拖动控制,通过数据窗口的Modify函数实现对象值的更改(包括增加和删除)。

第二步,报表格式的保存。

在一个应用当中,数据窗口对象的名称总是唯一的,将每一个数据窗口对象转化成PSR文件存于数据库表中。

在窗口打开时,程序先校验报表格式是否存在。

如果存在,先将报表格式读取出来放在一个临时文件当中,然后设置数据窗口(datawindow)的数据对象(dataobject)为这个报表文件,然后提取数据;如果不存在,直接提取数据即可。

二、实现过程:1、建立一个数据库表用以保存报表格式文件。

表名:dyn_reportDwobjectVarchar2(20)数据窗口对象名称Primary keyRptitleVarchar2(80)报表的标题名称MemoLong raw 报表格式2、建立一个窗口w_temp。

定义实例变量如下:string is_dwtype,is_dwobject //保存报表中对象的类型及名称控件名称控件含义Dw_print数据窗口对象Cb_exit退出按钮Cb_savereport 报表格式保存按钮3、在窗口的OPEN事件中加入如下代码, 校验报表格式是否存在,如果存在读取定义好的报表格式到数据窗口。

PB的数据窗口操作

PB的数据窗口操作

PB的数据窗口操作PB(PowerBuilder)是一种基于面向对象的集成开发环境(IDE),主要用于构建企业级应用程序。

在PB中,数据窗口是一项非常重要的功能,可以用于对数据的处理、展示和修改。

下面将从数据窗口的基本操作、高级特性和数据窗口设计原则等方面,详细介绍PB的数据窗口操作。

一、数据窗口的基本操作1. 创建数据窗口:在PB中,可以通过向导或手动创建数据窗口。

创建数据窗口是通过选择数据源(数据库表、视图或存储过程)、选择数据窗口类型(Grid、Tabular等)和设置窗口布局等步骤完成的。

2.数据绑定:在数据窗口中,可以通过数据绑定将数据源与数据窗口中的控件关联起来。

通过设置数据绑定属性,可以实现数据的读取、展示和修改等功能。

3.数据检索:使用数据窗口可以方便地进行数据检索。

通过设置查询条件、排序方式和数据过滤等属性,可以按照需求从数据库中检索数据,并在数据窗口中显示出来。

4.数据更新:除了展示数据,数据窗口还可以用于数据的更新。

通过设置数据窗口的更新属性,可以实现数据的插入、修改和删除等操作。

同时,PB还提供了事务管理和数据验证等功能,确保数据的完整性和一致性。

5.数据导航:在数据窗口中,可以轻松地实现数据的导航功能。

通过设置数据窗口的导航属性,可以方便地浏览数据,并进行上一条、下一条、第一页和最后一页等操作。

6.数据格式化:PB提供了丰富的数据格式化选项,可以对数据窗口中的数据进行格式化和显示。

例如,可以设置日期格式、货币格式和数值格式等,以便更好地展示和分析数据。

二、数据窗口的高级特性1.动态数据窗口:PB允许动态创建和操作数据窗口。

通过使用动态数据窗口,可以在运行时动态改变数据窗口的结构和属性。

这对于动态查询和灵活的数据展示非常有用。

2.嵌套数据窗口:PB支持嵌套数据窗口的使用。

通过将一个数据窗口嵌套在另一个数据窗口内部,可以实现复杂的数据关联和显示。

例如,可以在父数据窗口中显示子数据窗口的数据。

PB的数据窗口操作

PB的数据窗口操作

Composite 复合报表型的.就是可以由几个DW组合成的Crosstab 交叉报表型. 这个很少用.Freeform 自由风格,就是里面的列可以自已改变的. 常用Graph 统计图,你知道的Grid 网格,类似EXCEL的最常用Group 分组的.有分组小计要用的那种常用Label 标签的就是一个大格子一个大格子排列显示的那种N-Up 分栏显示的.这个少用.Tabular 列表的,这个列表不是太好用.这个也少用★SetTransObject语法:dwcontrol.SetTransObject ( transaction )功能:给数据窗口或者datastore控件dwcontrol设置事务对象transaction,缺省事务对象是SQLCA。

返回值:成功设置事务对象则返回1,执行过程中发生了错误则返回-1,有任意参数为Null时返回Null。

★Retrieve语法:dwcontrol.Retrieve ( {, argument, argument . . . } )功能:使用数据窗口控件的当前事务对象检索数据库中的数据。

如果数据窗口控件对应的数据窗口对象定义了检索参数,则应该在该函数中指定检索参数,参数的个数和数据窗口对象的检索变量个数相等,对应的数据类型相兼容。

返回值:返回数据窗口控件主缓存区(PrimaryBuffer)中的记录数,如果检索数据时发生错误则返回-1,如果任意参数为Null则返回Null*该函数的参数和数据窗口对象定义的参数的顺序要相同,类型要兼容。

个数不能少于数据窗口对象定义的参数,即可以等于和多于数据窗口对象定义的参数,多的参数忽略。

★DeleteRow语法:dwcontrol.DeleteRow ( row )功能:删除数据窗口dwcontrol中的第row行数据,如果row为0则表示删除当前行的数据。

返回值:执行成功则返回1,执行错误则返回-1,如果任意参数为Null则返回Null。

PB数据窗口教程

PB数据窗口教程

PB数据窗口教程PowerBuilder是一种流行的集成开发环境,用于快速构建企业级应用程序。

在PowerBuilder中,数据窗口是其中最重要的部分之一、数据窗口提供了一个可视化的界面,用于显示和操作数据库中的数据。

本教程将详细介绍PowerBuilder数据窗口的使用方法。

一、什么是数据窗口数据窗口是PowerBuilder的核心组件之一、它提供了一种直观的方式来显示数据库中的数据,并允许用户进行增删改查等操作。

数据窗口可以与各种类型的数据库进行交互,包括关系型数据库(如Oracle、SQL Server等)和非关系型数据库(如NoSQL数据库等)。

数据窗口具有以下特点:1.可以显示单行或多行数据2.可以进行数据排序和过滤4.可以处理数据库事务5.可以显示图表、嵌入其他控件等二、数据窗口的基本操作要创建一个数据窗口,首先需要打开PowerBuilder开发环境并创建一个新的PowerBuilder项目。

然后,右键单击项目资源树中的“数据窗口”节点,并选择“新建数据窗口”。

在数据窗口设计器中,可以通过添加列、设置数据源、定义布局等来定义数据窗口的外观和功能。

可以使用“数据窗口”菜单上的各种选项来完成这些操作。

接下来,可以将数据窗口添加到应用程序的窗口中。

在窗口设计器中,可以从工具箱中拖动数据窗口控件到窗口中,并调整位置和大小。

三、使用数据窗口实现增删改查操作PowerBuilder的数据窗口提供了一套强大的功能来实现数据的增删改查操作。

下面是一些常用的操作方法:1.查询数据:在数据窗口设计器中,可以设置数据窗口的数据源,包括选择数据库表、指定查询条件等。

在运行时,数据窗口将自动执行查询操作,并将结果显示在界面上。

2.添加数据:可以使用数据窗口的插入按钮或右键菜单来添加新的数据行。

在添加数据时,可以直接在数据窗口中输入数据,或者通过调用数据窗口的弹出窗口来输入数据。

4.删除数据:可以使用数据窗口的删除按钮或右键菜单来删除选中的数据行。

PB数据窗口教程

PB数据窗口教程

Powerbuilder创建数据窗口规范与注意事项导言:数据窗口是powerbuilder中一个最重要的控件,且是powerbuilder独有的一个控件,他存在于用户与数据库之间,能够方便的帮助用户进行sql语句对数据库进行操作,使开发人员能够节约大量时间与精力,然而相对数据窗口的强大,powerbuilder软件本身就显得略有不足,相对其他开发软件而言会有更多的bug。

下面就数据窗口的创建与标准布局做一些讲解。

1.新建数据窗口时常见的处理流程a)新建数据窗口1)选择表和要编辑、要显示的字段。

2)设置检索参数3)设置where条件b)显示处理(不分先后)1)去掉无需编辑、无需显示的,但要存储、处理数据的字段2)调整Header、Detail区域字体大小3)设置显示格式format掩码1.直接掩码写死2.根据条件设置掩码c)输入控制1)设置字段是否可以编辑1.去掉无需编辑、需要显示的字段的焦点2.根据条件设置字段是否可以编辑2)设置字段的编辑风格1.edit标签页下style typea)editb)editmaskc)radiobuttonsd)checkboxe)dropdowndwf)dropdownlistbox3)设置字段掩码(如果无显示掩码,则以编辑掩码显示)1.数值(“0.00”、“###0.00”)2.日期(“yyyy-mm-dd”、“yyyy-mm-dd hh:mm:ss”)d)设置数据窗口的更新属性一、创建powerbuilder数据窗口时的注意事项1.简化数据窗口输出列在powerbuilder中,数据传输的流量问题是值得注意的一个问题,每一个数据从数据库到数据窗口都是需要流量作为代价的。

因此,在创建数据库的时候,能够尽可能的少引入列是一个应当遵守的原则。

理论上,能够不读取的字段就不要将其加入数据窗口中,以减少网络传输。

2.列visible属性设为false后改回自动移动到最后的处理方法。

PB动态创建数据窗口

PB动态创建数据窗口

PB动态创建数据窗口动态创建数据窗口在实际应用中,经常需要根据用户需求来动态创建数据窗,一般方法是这样的。

在一个window中加入一个数据窗控件,如dw_new,但是该数据窗没有dataobject,(空白的)就可以用以下语法来创建:dw_new.create(ls_syntax,ls_error)//创建语法,错误信息ls_syntax可以用以下三种方法来形成:一、动态由sql语法创建://连接到pb的example数据库stringls_sql,ls_syntax,ls_errorls_syntax=''selectfromdepartment''ls_syntax=sqlca.SyntaxFromSQL(ls_sql,''style(type=grid)'',ls_ error)iflen(ls_error)>0thenmessagebox(''Error'',''SyntaxFromSQLError:~r''+ls_error) elsedw_new.create(ls_syntax,ls_error)iflen(ls_error)>0thenMessageBox("Error","Createhavetheseerrors:~r"+ls_error) elsedw_new.settransobject(sqlca)dw_new.retrieve()endifendif二、由另一个数据窗的syntax来创建stringls_syntax,ls_errorls_syntax=dw_test.describe(''datawindow.syntax'')dw_new.create(ls_syntax,ls_error)ifls_error''''thenmessagebox(''CreateError'',ls_error)elsedw_new.settransobject(sqlca)dw_new.retrieve()endif三、读取psr文件来创建stringls_syntax,ls_error,ls_retls_ret=char(13)+char(10)//回车键intli_fileNumlongli_lengthli_FileNum=FileOpen("efef.psr",Streammode!,read!,shared!,R eplace!)ifli_filenum>0thenFileSeek(li_FileNum,158,FromBeginning!)li_length=fileRead(li_filenum,ls_syntax)endiffileclose(li_filenum)ifli_length=0thenreturnls_syntax="release5;"+ls_ret+ls_syntax//截掉ls_syntax中的数据部分, 5.0以"sparse(names="dept_name?)"作为参考位置//6.0以html(作为参考位置longpos1,pos2pos1=pos(ls_syntax,''sparse(names="'',1)pos2=pos(ls_syntax,''"'',pos1+16)ls_syntax=left(ls_syntax,pos1)+mid(ls_syntax,pos1+1,pos2-pos1+1)dw_New.create(ls_syntax,ls_error)ifls_error''''thenmessagebox(''CreateError'',ls_error)elsedw_new.settransobject(sqlca)dw_new.retrieve()endif//pb6,pb7的代码可以参照pb5自己写,只是文件头和数据窗结束标记不同而已。

PB实验报告09

PB实验报告09

PowerBuilder课程实验报告实验名称实验九数据窗口的编程实验目的1.熟悉数据窗口画板的使用方法2.学会创建数据窗口,能够根据需求设置数据窗口的属性3.能够建立数据窗口控件数据窗口对象的关联,以及数据窗口对象与数据库表的关联4.掌握数据窗口提供的常用控件的使用方法实验题目创建一个简单的数据库连接到窗口结果图片:实验步骤(1)创建数据库单击new/datawindow/freeform/quick select/next/finish (2)新建数据库表起名为d_shiyan9对象对象名称属性属性值窗口w_shiyan1 title PB学习静态文本框1 St_stu text 学生基本情况图片按钮Pb_1 text exit数据库窗口Dw_stu text(3)编写程序代码○1应用对象shiyan9的open事件代码为:SQLCA.DBMS = "ODBC"SQLCA.AutoCommit = FalseSQLCA.DBParm = "ConnectString='UID=;PWD=;'"connect;if sqlca.sqlcode<0 thenmessagebox("连接失败", sqlca.sqlerrtext, exclamation!) returnend ifopen(w_shiyan9)○2窗口对象w_shiyan9的命令按钮的Clicked事件代码为:Close(parent)(3)单击工具栏上的save按钮保存,然后单击Run按钮,运行应用程序。

实验小结:通过这次试验我掌握了数据库表和数据窗口的链接。

实验人签名:努尔艾力江.热合曼2014年5月15日信息系统开发工具课程实验(9)学院:统计与信息学院专业:信息管理与信息系统班级:信息2010-2班姓名:阿依努尔.阿布力米提学号:2010100572。

pb数据窗口[精彩]

pb数据窗口[精彩]

PB数据窗口1.如何让存储文件目录的列,显示图片? 答:选择对应的column的display as picture属性为true2、如何复制grid类型的所选择的行的数据到系统剪切板?答:string ls_selectedls_selected=dw_1.Object.DataWindow.Selected.Dataclipboard(ls_selected)3、如何复制graph风格的datawindow中的图形到剪切板?答:dw_1.clipbord("gr_1")4、如何设置的DW底色?在DW的editsource中改变color的值5、如何将Grid风格改成自由格式?在DW的editsource中将processing=1的1改为06、要新建一个表A但风格和现有表格B风格一样,怎么将A表快速设置成表B风格?复制B表C,在C表的DW中的editsource中将表名和字段名改成A 表的,即可7、如何实现gird风格的datawindow的多栏表头?答:添加 text到header带区,并设置band属性为foreground保存,edit source 修改text的x和width属性表达式如下:x="100~t integer(describe('firstcol.x')"width="100~tinteger(describe('lastcol.x')) -integer(describe('firstcol.x'))+integer(describe('lastcol.width'))8、如何过滤dddw编辑风格的显示值为指定值的记录?答:dw_1.setfilter("lookupdisplay('column_name')='"+ls_display_ value_your+"'")dw_1.filter()9、如何设置datawindow的某一列为空?答:string ls_temp[]setnull(ls_temp)dw_1. O B J E CT.columnname.primary.current=ls_temp10、如何设置datawindow的单双行不同颜色间隔?答:在detail带区的color属性表达式中写上if(mod(getrow(),2)=1 ,rgb(255,0,0),rgb(0,255,0)),如果是当前行以第三种颜色表示,表达式如下:if(getrow()=current(),rgb(255,0,0),if(mod(getrow(),2)=1 ,rg b(0,0,255),rgb(0,255,0)))11、如何获取指定名称的datawindow O B J E C T?答:DWObject ldwo_use,ldwo_abcldwo_use = dw_1.Objectldwo_abc =ldwo_use.__get_attribute("t_1",FALSE)//t_1为datawindow中text对象的名称12、如何使用datawindow的查询模式?答:dw_1.Object.DataWindow.QueryMode='yes'将datawindow改变为查询模式后,接收用户的输入,再使用一下代码获取结果:dw_1.accepttext()dw_1.retrieve()13、如何缩放datawindow的打印大小?答:dw_1. O B J E C T.datawindow.zoom=150 or dw_1. O B J E C T.datawindow.zoom=7514、如何在已过滤后的数据基础上对datawindow进行过滤?答:dw_1.setfilter(dw_1.describe("datawindow.table.filter")+you r_join+your_new_filter)dw_1.filter()15、如何在datawindow中显示动态时间?答:建立一个计算域,表达式为string(datetime(today(),now()),'yyyy年mm月dd日 hh点mm分ss秒'),同时设置datawindow的属性dw_1.Object.DataWindow.Timer_Interval=50016、如何让带用title bar的datawindow控件的标题栏诚活动窗口的颜色?答:外部函数定义:funcation logn SetActiveWindow(long hwnd ) Library "user32.dll"datawindow控件的clicked事件代码:setactivewindow(handle(this))17、如何设置datawindow的当前行指示图标?答:在datawindow中建立一个计算列,expression为'',并将该计算列移动为datawindow的第一个列,在datawindow控件的rowfocuschanged事件中写入代码:SetRowFocusIndicator(hand!)或setrowfucsindicator(p_1)//p_1为窗口上的picture控件名18、如何通过代码打开dddw?答:定义外部函数引用声明SUBROUTINE keybd_event( int bVk, int bScan, int dwFlags, int dwExtraInfo) LIBRARY "user32.dll"代码如下:[constant integer VK_F4 = 115dw_1.SetFocus()dw_1.SetColumn( "dept_head_id" ) //设置当前dddwkeybd_event( VK_F4,0,0,0 ) // 按下F4键keybd_event( VK_F4,0,2,0 ) // 释放F4键19、如何打印datawindow的内容到文件中?答: dw_1. O B J E C T.datawindow.print.fileName ="c:\temp.prn"dw_1.print()20、如何设置dddw的初始值?答:dw_1. O B J E C T.columnname.Initial="your_initial_value"21、如何只显示不同的数据?答:dw_1.filter("isnull(columnname[-1]) andcolumnname<>columnname[-1]")dw_1.filter()22、如何让带有title bar的datawindow不可以移动?答:在datawindow的自定义事件ue_nchittest(pbm_nchittest)中写入如下代码:return 123、如何在N-UP显示风格中建立基于第N栏中的列的计算列?答:如column有两列,number和price ,并显示为两栏,则第一栏的cost计算列的expression为number*price,第二栏的cost_1计算列的expression为number[1]*price[1]24、如何清空ddlb或edit.codetable中项目?答:dw_1.Object.columnname.Values=""25、如何实现指定的column的字体旋转90度?答:dw_1. O B J E C T.columnname.font.Escapement ="900" 26、如何获取datawindow的sql代码?答:可以通过以下四种方法获取sql代码:string szselectszselect=dw_1.describe("datawindow.table.select")szselect=dw_1.describe("datawindow.table.sqlselect") szselect=dw_1.describe("datawindow.table.select.attribute")szselect=dw_1.getsqlselect()27、如何获取datawindow对象占有的虚拟存储的容量?答:使用datawindow.storage属性举例:在datawindow控件的retrieverow事件中,写如如下代码:long lstoragelstorage=long(dw_1. O B J E C T.datawindow.storage)if lstorage>50000 then dbcancel()28、如何控制打印横向:dw_control. O B J E C T.datawindow.print.orientation= 129、如何进行预览:dw_control. O B J E C T.datawindow.print.preview = "yes" 30、如何连续在同一张纸打印两个数据窗口?答:dw_1. O B J E C T.datawindow.print.filename="temp.prn"dw_2. O B J E CT.datawindow.print.filename="temp.prn"dw_1.print()dw_2.print()31、如何将pb9.0 的datawindow转化为pb 8.0版本的datawindow?答:edit source 将release 9;改为release 8;并删除以下内容:print.printername=""print.canusedefaultprinter=yesprint.cliptext=noprint.overrideprintjob=nohidegrayline=noencodeselflinkargs="1"export.xml(headgroups="1" includewhitespace="0" metadatatype=0 savemetadata=0 )import.xml()export.pdf(method=0distill.custompostscript="0" xslfop.print="0" )32、如何设置datawindow分组后每个分组中的记录号?答:建立一个计算列,expression为 getrow() - first(getrow() for group 1)+133、如何实现在datawindow中只有新增的行,才可以编辑?答:在所有的column的protect属性表达式中写入以下表达式:if(isrownew(),'0','1')34、保存datawindow数据到excel中// ... Init docname// ... GetFileOpenName or any other methodif dw_1.SaveAs(docname, HTMLTable!, True) = -1 thenMessageBox("Warning", "Unable to export data. Error writing to file!", Exclamation!)returnend if// Convert HTML file to Excel native formatOLEObject excelexcel = CREATE OLEObjectif excel.ConnectToObject(docname) = 0 thenexcel.application.DisplayAlerts = FALSEexcel.application.workbooks(1).Parent.Windows(excel.applica tion.workbooks(1).Name).Visible = Trueexcel.application.workbooks(1).saveas(docname, 39)excel.application.workbooks(1).close()DESTROY excel// done35、除了循环以外,有没有更好的方法统计数据窗口中处于选中状态的行数?一般习惯于使用循环来统计数据窗口中处于选中状态的行数,有没有更好的方法?其实此问题在应用上用处不大,讨论一下,活跃一下思维还是有好处的。

PB关于数据窗口的使用

PB关于数据窗口的使用

实验五数据窗口的使用一、实验目的1、进一步加深对数据窗口的了解,熟悉数据窗口画板的使用和数据窗口对象属性的调整方法。

2、掌握数据窗口对象的标签和字段的属性的调整方法。

3、了解数据窗口对象的各种编辑样式的特点、编程和使用方法。

4、掌握数据窗口各种常用操作(插入、删除、更新等)的程序设计方法。

二、实验环境1.PowerBuilder9.0/10.0,Windows 98/2000,Microsoft SQLSERVER2000。

2.在实验之前先建立一个PBDW文件夹(例如:d:\ PBDW)用来存放本次实验所建立的设计文件与文档。

三、实验内容1、使用PowerBuilder创建Access或SQL Server2000数据库,数据库名称为pb_dw。

2、制作一个学科管理的数据窗口,如图1所示。

该窗口中有一个反映学科信息的数据窗口,有2个前后查看记录的按钮,以及对数据库进行更新、插入、删除和退出的4个图片按钮。

在“学科类型”或“学科名称”字段上单击鼠标,会弹出如图2所示的下拉列表框,提供数据的选择,避免了每次输入字符串,使用十分方便。

四、实验预习与准备1、创建一个新的工作空间。

2、创建一个新的目标、应用库和应用对象。

3、本例中需要创建2个数据窗口对象,一个为窗口上见到的学科信息数据窗口对象d_subjectinfo,另一个为学科名称下拉列表框中引用的学科名称数据窗口对象d_subtitle。

首先创建d_subtitle,步骤如下。

(1)单击“New”图标按钮,弹出“New”对话框。

(2)选择DataWindow选项页,双击"Tabular”图标,弹出“Choose Data Source for Tabular DataWindow”对话框。

(3)选择“Quick Select”数据源方式,单击“Next”按钮,弹出“Quick Select”对话框。

(4)在Table列表框中选择subtitle表,这时在其右边的Columns列表框中列出了subtitle 表的2个字段的名称,单击“Add All”按钮,就将这2个字段加到了下面的区域中。

pb9中数据窗口的XML特性

pb9中数据窗口的XML特性

pb9中数据窗口的XML特性一、原理从pb9开始,DataWindow开始支持直接从XML文档中导入数据,将检索到的数据保存为XML文档,以及使用XSL格式对象(XSL-FO) 的新功能。

本文根据XML Features in PowerBuilder® 9.0相关内容节选翻译。

这是第一部分。

1、数据窗口导出引擎(DataWindow Export Engine)它是数据窗口新增的组件,主要利用导出模板(Export Templates)作为基础结构来转换行数据到XML格式数据。

引擎通过分析模板内容格式化数据,然后输出到XML形式。

因为模板本身也是XML文档,所以它首先也需要被解析。

导出引擎通过XML解析器(XML Parser)的服务来分析模板文件。

在低层,XML解析通过C++和Apache Xerces实现,利用一个适配器接口(pbxerces90.dll)来访问Xerces解析器。

2、导出模板(Export Templates)一个导出模板定义了数据窗口元素(DataWindow elements)和XML对应关系。

下面的数据窗口对象可以使用在导出模板:• 列(Column)• 计算列(Computed Column)• 文本(Text Control)• 计算域(Computed Field)• 内嵌报表(Nested Report)上面的数据窗口对象可以被映射到以下的XML构造• 元素(Element)• 属性(Attribute)注意:注释(comments)和处理指令(processing instructions)可以被添加到模板的任意部分,但是不能和其建立映射。

CDATA可以被添加到任何元素之内,但是也不能被映射。

内嵌报表(Nested Report)只能和元素建立映射,不能是属性。

当导出引擎分析XML模板内容时,根据模板中已经定义的映射关系,将元素映射到实际的数据窗口控件和它们的文本内容。

数据库应用系统开发工具PB

数据库应用系统开发工具PB
控件按是否响应用户操作可分为两类:一类能够响 应用户操作,它们具有事件,如命令按钮等;另一类不 响应用户操作,它们没有事件,如绘图控件。
16
第9章 数据库应用系统开发工具——PB
控件按功能可分为4类: (1)激活动作类型。包括命令按钮(CommandButton)和 图片按钮(PictureButton)等。 (2)选择类型。包括单选按钮(RadioButton)、复选框 (CheckBox),还可以用选项组控件(GroupBox)对这些 选择项控件对行分组。
(4)修饰类型。为绘图对象,如直线(Line)、矩形 (Rectangle)、椭圆(Oval)等。
窗口上控件的使用请参阅帮助文件。
18
第9章 数据库应用系统开发工具——PB
3. 窗口的设计 设计窗口的过程如下:
(1)建立窗口 使用工具框的New按钮或菜单File中的New菜单项,
打开New对话框,选择PB Object标签页,双击其中 Window图标,进入窗口编辑状态。 (2)设置窗口属性
(8)单击PowerBar中的Return,连续单击两次Next按钮, 再单击Finish按钮,此时一个初步的数据窗口已经建立。
(9)对初步形成的数据窗口的属性和特征进行修饰后, 点击Powerbar上的Save图标,按提示输入数据窗口名, 在此取名为DW_WZLK,如图9.2所示:
12
第9章 数据库应用系统开发工具——PB
第9章 数据库应用系统开发工具——PB
在窗口中常用事件主要为Open、Close、CloseQuery、 Timer等。Open事件在窗口打开之后、显示之前执行, Close事件在关闭窗口时执行,CloseQuery事件在关闭窗口 前执行,Timer事件在调用Timer()函数启动定时器、设定 时间之后触发执行,它可用于定时操作。

pb数据窗口设置操作

pb数据窗口设置操作

pb数据窗⼝设置操作1 使DataWindow列只能追加不能修改如何使DataWindow中的数据只能追加新记录⽽不能修改,利⽤ Column 的 Protect 属性可以很⽅便的做到这⼀点,⽅法如下:将每⼀列的 Protect 属性设置为:If( IsRowNew(), 0, 1) )在 PowerScript 中可以动态修改 Protect 属性:dw_1.Modify("column_name_here.Protect='1~tIf(IsRowNew(),0,1)'")这样,DataWindow 中只有新追加的记录可修改,⽽其他记录是只读的。

2 如何在DataWindow中实现列的⾃动折⾏我们在PowerBuilder应⽤程序的开发过程中, 使⽤DataWindow时, 经常会遇到某列的数据太长, 不能同时全部显⽰的情况. 若采⽤⾃动⽔平滚动, 操作起来⼜不够简便. 下⾯介绍⼀种⽅法, 实现列数据多⾏显⽰, 即实现列数据的⾃动折⾏.具体步骤如下:1) 在DataWindow Painter中打开此DataWindow.2) 在需设定⾃动折⾏的列上双击⿏标, 弹开此列的属性窗⼝.3) 选择Position标签, 选中Autosize Height 多选框.4) 选择Edit标签, 不选中Auto Horz Scroll多选框.5) 单击OK按钮, 保存所做的修改.6) 点中Detail Band (即写有Detail的灰⾊长带), 单击⿏标右键, 选择Properties... 菜单项.7) 选中Autosize Height多选框.8) 单击OK按钮, 保存所做的修改.9) 保存此DataWindow.注意:连在⼀起的汉字(中间没有标点或空格分隔), 系统将认为是⼀个单词, 不会⾃动进⾏折⾏.3 在数据窗⼝中实现动画要实现动画,必须要有定时器,在数据窗⼝中已经有了⼀个定时器,双击数据窗⼝将弹出的对话框,在Timer Interval中定义⼤于零的值就有定时器(可以精确到毫秒),有了这个定时器就可以实现动画了。

深入了解PB的数据窗口

深入了解PB的数据窗口

深入了解PB的数据窗口数据窗口的处理机制首先是根据所需的显示方式将数据源表中的域设计好,在运行时将所要的数据从数据库服务器上下载到客户机上处理,然后将更改后的数据进行提交(Commit)或回滚(Rollback)。

这种处理机制大大降低了数据的传输量,减轻了网络的负担,也提高了数据的处理速度。

充分利用数据窗口的特点,可达到事半功倍的效果,但是如果有些问题不加注意就会出现意想不到的错误。

几个函数1. AcceptText()AcceptText()函数的功能是将数据窗口当前编辑的数据转移到数据窗口的缓冲区中。

程序通常在关闭窗口及其他情况下判断是否改变了当前数据。

如果已改变数据,应提示用户保存。

这就杜绝了用户在偶然的情况下丢失更改数据的现象。

一般用ModifiedCount和DeletedCount函数判断数据是否改变。

PB在处理数据窗口时,对应开辟了四个数据缓冲区,分别为Primary Buffer、Deleted Buffer、Filter Buffer、SortBuffer,其中Deleted Buffer存放被删除的记录,Filter Buffer存放被过滤的记录,Sort Buffer存放排序的记录,Primary Buffer存放其他记录。

函数ModifiedCount从Primary and Filter Buffers中取数据进行判断,DeletedCount则从Deleted Buffer中取数据进行判断。

PB在接受用户输入时设置了一个浮动编辑框,用户输入或更改的内容并不直接进入Primary Buffer,而是在用户输入完后进入下一个域时,PB首先对它进行有效性检测,通过后转入Primary Buffer。

如果只改变一项数据就关闭窗口则相关数据并没有进入Primary Buffer,系统判断ModifiedCount()为0,所以不会提示保存数据。

用AcceptText()函数就可以将浮动编辑框中的数据转入缓冲区中,在相应的程序段前加上Accepttext(),问题就解决了。

PB9应用开发步骤

PB9应用开发步骤

《PowerBuilder 9.0 数据库应用程序开发》㈠新建工作空间①【开始】→【程序】→ <Sybase> →启动【PowerBuilder9.0】②【文件】→ <new> →[Workspace]选项卡→【Workspace】图标→【OK】③设置路径[C:\temp] →输入文件名:student →【保存】㈡创建目标和应用对象①【new】按钮→[Target]选项卡→【Application】图标→【OK】②输入应用程序名:Student →设置“Library”路径[C:\temp] →【保存】→【Finish】㈢建立数据库 newdb,并自动连接数据库①启动【PowerBuilder9.0】②【Database】按钮→展开<ODB ODBC> →展开<Utilities> →双击<Create ASA Database>④User ID:DBA → Password: sql → Database Name:C:\temp\newdb.db→【OK】㈣在数据库中建立数据表(S、C、SC)和视图①建立数据表(S、C、SC)【Database】按钮→右击【Tables】文件夹→选择<New Table> →→定义表的字段(...) →单击【Exit】→【是】存盘→→输入表名(S、C、SC) →【OK】②为数据表(S、C、SC)指定主键展开【Tables】→右击表名(S) →左击<Add to Layout> →→右击表的标题栏→ <New> →<Primary Key> →选择“Column”:中主键字段(sno) →【Exit】→【是】③为数据表指定外键(sno 和 cno)●右击表SC的标题栏→ <New> →<Foreign Key> →<General>选项卡→→输入Foreign Key:aaaa →选择“Columns:”右边<sno>字段作外键●单击<Primary Key>选项卡→选择<Table:>(下拉表)中的<S>作参照表→【Exit】→【是】(保存)●同样,为表 SC指定另一个外键 cno (参照表为 C)④在表中输入数据●右击表S →选择<Edit Data> →选择 <Grid>●右击输入窗口→选择<Insert Row> →输入记录数据●为表SC输入数据●为表C输入数据⑤创建视图●右击数据库newdb下<Views>文件夹→选择<New View>●同时选择表 <S>和<SC> →【Open】●选择<Group>选项卡→在表S中选择 sno 和 sname →→将字段<s.sno>和<s.snane>拖至右边窗口●选择<Compute>选项卡→输入聚合操作: avg(score)→起别名:avg_score●选择<Syntax>选项卡→核对语句:CREATE VIEW …GROUP BY …●单击菜单行【Exit】→【是】(保存) →输入视图名:S_SC →【Create】㈤创建数据窗口(d_s, d_sc, d_c, d_s_sc, d_s_sc_c )① (PowerBar)【New】→[DataWindow]选项卡→【Grid】图标→【OK】②选择【Quick Select】数据源→【Next】③选择表<S> →【Add All】→【OK】④选择默认字体和颜色→【Next】→【Finish】⑤【Exit】→【是】→命名:d_s →【OK】⑥为d_sc, d_c, d_s_sc, d_s_sc_c创建数据窗口⑦创建d_s_sc_c数据窗口:... 选择【Quick Select】数据源→【Next】→选择S、C、SC三个表→【Open】→选择sno、sname、cno、cname、tname字段→【Exit】→(字体)【Next】→【Finish】→【Exit】→→【是】→命名:d_s_sc_c㈥创建应用程序用户界面窗口(w_main,w_manipulation,w_course_query,. . .)⑴创建主窗口 w_main① (PowerBar)【New】→[PB Object]选项卡→【Window】图标→【OK】②右击工具栏→分别打开<PainterBar1>、<PainterBar2>、<PainterBar3>画板工具栏③单击<PainterBar1>中下拉按钮→(展开控件窗口)④选择静态文本框控件【A】→单击主窗口→调整文本框位置和大小→→在文本框属性窗口输入Text:<学生选课系统> →设置字体和颜色⑤选择命令按钮控件【OK】→单击主窗口→调整命令按钮位置和大小→→在命令按钮属性窗口输入Text:<数据操作> →设置字体大小→分别创建其它控件. . .⑥单击主菜单行退出按钮【Exit】→选【是】→输入窗口对象名:w_main→【OK】⑵创建“数据操作”窗口 w_manipulation①创建一个静态文本框控件:<请输入数据:>②创建一个单行编辑框控件: (输入数据)③创建三个数据窗口控件: <学生表>、 <选课表>、 <课程表>④创建 8个命令按钮控件: [BROWSE] 、 [INSERT_SC] 、 [DELETE_SC] [UPDATE_SC] 、 [RESET] 、[QUERY_SNO] 、 [OK] 、 [EXIT]⑤为窗口命名:w_ manipulation⑥→【OK】⑶创建“课程查询”窗口 w_course_query①创建2个静态文本框控件:<请输入数据:>、<查询字段:>②创建1个单行编辑框控件: (输入数据)③创建1个下拉式列表框控件: (选择查询字段)④创建1个数据窗口控件: <课程表>⑤创建 2个命令按钮控件: [查询] 、 [返回主窗口]⑥创建含2个单选按钮的分组框: <查询方式>⑦为窗口命名:w_ course_query →【OK】⑷创建“学生选课”窗口 w_select_course⑸创建“课程更新”窗口 w_course_update⑹创建“查询学生平均成绩”窗口 w_query_s_avg㈦编写脚本(事件驱动程序)⒈启动应用程序(student.pbl)的open事件脚本【操作步骤】① (PowerBar)【Open】按钮 (打开<Open>对话框)②选择“Objects of Type :” 为 [Application]③选择“Objects Name :” 为 [Student]④单击【OK】 (打开应用程序“Open”事件编辑窗口)⑤在编辑窗口输入如下“脚本” :SQLCA.DBMS = “ODBC“ // 数据库厂商名称SQLCA.AutoCommit = False // 定义程序为手工提交事务SQLCA.DBParm = "Connectstring='DSN=newdb_01'"connect; // 连接数据源newdb_01open(w_main) // 打开主窗口⒉在主窗口为各个控件编写驱动程序(1) 命令按钮【数据操作】的 clicked 事件【操作步骤】①展开【student.pbl】→双击【w_main】 (打开主窗口)②单击【数据操作】按钮③单击 [Event List] 选项卡→双击 <clicked( )>④在“script for clicked”(单击脚本)编辑窗口输入如下语句:open(w_manipulation) // 打开“数据操作窗口”close(parent) // 关闭主窗口⑤单击【保存】按钮(2) 命令按钮【课程查询】的 clicked 事件【操作步骤】①展开【student.pbl】→双击【w_main】 (打开主窗口)②单击【课程查询】按钮③单击 [Event List] 选项卡→双击 <clicked( )>④在“script for clicked”(单击脚本)编辑窗口输入如下语句:open(w_course_query) // 打开“课程查询”窗口close(parent) // 关闭主窗口⑤单击【保存】按钮(3) 命令按钮【学生选课】的 clicked 事件【操作步骤】①展开【student.pbl】→双击【w_main】 (打开主窗口)②单击【学生选课】按钮③单击 [Event List] 选项卡→双击 <clicked( )>④在“script for clicked”(单击脚本)编辑窗口输入如下语句:open(w_select_course) // 打开“学生选课”窗口close(parent) // 关闭主窗口⑤单击【保存】按钮(4) 命令按钮【课程更新】的 clicked 事件【操作步骤】①展开【student.pbl】→双击【w_main】 (打开主窗口)②单击【课程更新】按钮③单击 [Event List] 选项卡→双击 <clicked( )>④在“script for clicked”(单击脚本)编辑窗口输入如下语句:open(w_course_update) // 打开“课程更新”窗口close(parent) // 关闭主窗口⑤单击【保存】按钮(5) 命令按钮【查询学生平均成绩】的 clicked 事件【操作步骤】①展开【student.pbl】→双击【w_main】 (打开主窗口)②单击【平均成绩】按钮③单击 [Event List] 选项卡→双击 <clicked( )>④在“script for clicked”(单击脚本)编辑窗口输入如下语句:open(w_query_s_avg) // 打开“查询学生平均成绩”窗口close(parent) // 关闭主窗口⑤单击【保存】按钮(6) 命令按钮【退出】的 clicked 事件【操作步骤】①展开【student.pbl】→双击【w_main】 (打开主窗口)②单击【退出】按钮③单击 [Event List] 选项卡→双击 <clicked( )>④在“script for clicked”(单击脚本)编辑窗口输入如下语句:close(parent) // 关闭主窗口⑤单击【保存】按钮⒊在“数据操作”窗口为各个控件编写驱动程序(脚本)(1) 在窗口的Open事件中编写脚本【操作步骤】①展开【student.pbl】②双击【 w_manipulation 】窗口图标 (打开“数据操作” 窗口)③单击 [Open] 选项卡④在“script for open”(打开脚本)编辑窗口输入如下语句:dw_1.settransobject(sqlca) // 为控件dw_1设置通讯区域 sqlcadw_2.settransobject(sqlca) // 为控件dw_2设置通讯区域 sqlcadw_3.settransobject(sqlca) // 为控件dw_3设置通讯区域 sqlcashl_1.setfocus() // 将焦点设置到控件 sle_1⑤单击【保存】按钮(2) 命令按钮【BROWSE】的 clicked 事件【操作步骤】①展开【student.pbl】→双击【 w_manipulation】②单击【BROWSE】按钮③单击 [Event List] 选项卡→双击 <clicked( )>④在“script for clicked”(单击脚本)编辑窗口输入如下语句:dw_1.retrieve() // 从数据库的S表中检索全部数据dw_2.retrieve() // 从数据库的SC表中检索全部数据dw_3.retrieve() // 从数据库的C表中检索全部数据⑤单击【保存】按钮(3) 命令按钮【RESET】的 clicked 事件【操作步骤】①展开【student.pbl】→双击【 w_manipulation】②单击【RESET】按钮③单击 [Event List] 选项卡→双击 <clicked( )>④在“script for clicked”(单击脚本)编辑窗口输入如下语句:string query , sqldw_1.reset()dw_2.reset()dw_3.reset()query = ""dw_1.setfilter(query)dw_1.filter()dw_2.setfilter(query)dw_2.filter()sql = "select * from c"dw_3.setsqlselect(sql)dw_3.setfilter(query)dw_3.filter()shl_1.text=""shl_1.setfocus()⑤单击【保存】按钮(4) 命令按钮【INSERT_SC】的 clicked 事件【操作步骤】①展开【student.pbl】→双击【 w_manipulation】②单击【 INSERT_SC 】按钮③单击 [Event List] 选项卡→双击 <clicked( )>④在“script for clicked”(单击脚本)编辑窗口输入如下语句:dw_2.insertrow(0)dw_2.scrolltorow(dw_2.rowcount())dw_2.setfocus()⑤单击【保存】按钮(5) 命令按钮【DELETE_SC】的 clicked 事件【操作步骤】①展开【student.pbl】→双击【 w_manipulation】②单击【 DELETE_SC 】按钮③单击 [Event List] 选项卡→双击 <clicked( )>④在“script for clicked”(单击脚本)编辑窗口输入如下语句:dw_2.deleterow(0) // 从SC表中删除当前行:deleterow()⑤单击【保存】按钮(6) 命令按钮【UPDATE_SC】的 clicked 事件 p.243【操作步骤】①展开【student.pbl】→双击【 w_manipulation】②单击【 UPDATE_SC 】按钮③单击 [Event List] 选项卡→双击 <clicked( )>④在“script for clicked” (单击脚本) 编辑窗口输入如下语句:int g1, g2g1 = integer(shl_1.text)g2 = dw_2.GetItemNumber(dw_2.GetRow(), 3)dw_2.SetItem(dw_2.GetRow(), 3, g2+g1)⑤单击【保存】按钮(7) 命令按钮【OK】的 clicked 事件 p.243【操作步骤】①展开【student.pbl】→双击【 w_manipulation】②单击【 OK 】按钮③单击 [Event List] 选项卡→双击 <clicked( )>④在“script for clicked” (单击脚本) 编辑窗口输入如下语句:if dw_2.update() = 1 thencommit;elserollback;end if⑤单击【保存】按钮(8) 命令按钮【QUERY_SNO】的 clicked 事件 p.243【操作步骤】①展开【student.pbl】→双击【 w_manipulation】②单击【 QUERY_SNO 】按钮③单击 [Event List] 选项卡→双击 <clicked( )>④在“script for clicked” (单击脚本) 编辑窗口输入如下语句:string query, sqlquery = "sno='"+shl_1.text+"'"dw_1.setfilter(query)dw_1.filter()dw_1.retrieve()dw_2.setfilter(query)dw_2.filter()dw_2.retrieve()sql = "select c.* from sc, c where o=o andsc.sno='"+shl_1.text+"'"dw_3.setsqlselect(sql)dw_3.retrieve()shl_1.setfocus()⑤单击【保存】按钮(9) 命令按钮【EXIT】的 clicked 事件 p.243【操作步骤】①展开【student.pbl】→双击【 w_manipulation】②单击【 EXIT 】按钮③单击 [Event List] 选项卡→双击 <clicked( )>④在“script for clicked” (单击脚本) 编辑窗口输入如下语句:open(w_main)close(parent)⑤单击【保存】按钮⒋在“课程查询”窗口为各个控件编写驱动程序(脚本)(1) 在窗口的Open事件中编写脚本【操作步骤】①展开【student.pbl】②双击【 w_course_query 】窗口图标 (打开“课程查询” 窗口)③单击 [Open] 选项卡④在“script for open”(打开脚本)编辑窗口输入如下语句:dw_1.settransobject(sqlca)dw_1.retrieve()⑤单击【保存】按钮(2) 命令按钮【查询】的 clicked 事件【操作步骤】①展开【student.pbl】→双击【 w_course_query】②单击【查询】按钮③单击 [Event List] 选项卡→双击 <clicked( )>④在“script for clicked”(单击脚本)编辑窗口输入如下语句:dw_1.setfilter("")if rb_1.checked = true thenchoose case ddlb_1.textcase "课程号"dw_1.setfilter("cno='"+shl_1.text+"'")case "课程名"dw_1.setfilter("cname='"+shl_1.text+"'")case "教师名"dw_1.setfilter("tname='"+shl_1.text+"'")end chooseelsechoose case ddlb_1.textcase "课程号"dw_1.setfilter("cno like" + "'%" +shl_1.text+"%'") case "课程名"dw_1.setfilter("cname like" + "'%" +shl_1.text+"%'") case "教师名"dw_1.setfilter("tname like" + "'%" +shl_1.text+"%'") end chooseend ifdw_1.retrieve()shl_1.setfocus()⑤单击【保存】按钮(3) 命令按钮【返回主窗口】的 clicked 事件p.243【操作步骤】①展开【student.pbl】→双击【 w_ w_course_query】②单击【返回主窗口】按钮③单击 [Event List] 选项卡→双击 <clicked( )>④在“script for clicked” (单击脚本) 编辑窗口输入如下语句:open(w_main)close(parent)⑤单击【保存】按钮⒌在“学生选课”窗口为各个控件编写驱动程序(脚本)(1) 在窗口的Open事件中编写脚本p.245【操作步骤】①展开【student.pbl】②双击【 w_select_course 】窗口图标 (打开“学生选课” 窗口)③单击 [Open] 选项卡④在“script for open”(打开脚本)编辑窗口输入如下语句:dw_1.settransobject(sqlca)dw_1.setfilter("")dw_1.retrieve()int numnum = dw_1.rowcount()st_4.text = string(num)shl_1.setfocus()⑤单击【保存】按钮(2) 命令按钮【按学号查询】的 clicked 事件【操作步骤】①展开【student.pbl】→双击【 w_select_course】②单击【按学号查询】按钮③单击 [Event List] 选项卡→双击 <clicked( )>④在“script for clicked”(单击脚本)编辑窗口输入如下语句:if shl_1.text = "" thendw_1.setfilter("")elsedw_1.setfilter("s_sno='"+shl_1.text+"'")end ifdw_1.retrieve()int numnum = dw_1.rowcount()st_4.text = string(num)shl_1.setfocus()⑤单击【保存】按钮(3) 命令按钮【选课】的 clicked 事件【操作步骤】①展开【student.pbl】→双击【 w_select_course】②单击【选课】按钮③单击 [Event List] 选项卡→双击 <clicked( )>④在“script for clicked”(单击脚本)编辑窗口输入如下语句:if shl_1.text="" or shl_2.text="" thenmessagebox("提示!","输入框不能为空!",exclamation!, ok!, 2) elsestring cnoselect cno into:cno from sc where sno=:shl_1.text and cno=:shl_2.text;if cno=shl_2.text thenmessagebox("提示!","你已经选过该课程!",exclamation!, ok!, 2) elseint numberselect count(*) into: number from c where cno=:shl_2.text;if number=0 thenmessagebox("提示!","该课程不存在!",exclamation!, ok!, 2)elseinsert into sc(sno,cno,score)value(:shl_1.text, : shl_2.text, null);end ifend ifend ifshl_2.setfocus()⑤单击【保存】按钮(4) 命令按钮【退课】的 clicked 事件【操作步骤】①展开【student.pbl】→双击【 w_select_course】②单击【退课】按钮③单击 [Event List] 选项卡→双击 <clicked( )>④在“script for clicked”(单击脚本)编辑窗口输入如下语句:if shl_1.text="" or shl_2.text="" thenmessagebox("提示!","输入框不能为空!",exclamation!, ok!, 2) elseint numberselect count(*) into: number from sc where sno=:shl_1.textand cno=:shl_2.text;if number=0 thenmessagebox("提示!","你未选修过该课程!",exclamation!, ok!, 2)elsedelete from sc where sno=:shl_1.text and cno=:shl_2.text;end ifend ifshl_2.setfocus()⑤单击【保存】按钮(5) 命令按钮【更新选课表】的 clicked 事件【操作步骤】①展开【student.pbl】→双击【 w_select_course】②单击【更新选课表】按钮③单击 [Event List] 选项卡→双击 <clicked( )>④在“script for clicked”(单击脚本)编辑窗口输入如下语句:dw_1.setfilter("s_sno='"+shl_1.text+"'")dw_1.retrieve()int numnum = dw_1.rowcount()st_4.text = string(num)shl_2.setfocus()⑤单击【保存】按钮(6) 命令按钮【返回主窗口】的 clicked 事件 p.243【操作步骤】①展开【student.pbl】→双击【 w_select_course】②单击【返回主窗口】按钮③单击 [Event List] 选项卡→双击 <clicked( )>④在“script for clicked” (单击脚本) 编辑窗口输入如下语句:open(w_main)close(parent)⑤单击【保存】按钮⒍在“课程更新”窗口为各个控件编写驱动程序(脚本) ppt.94(1) 在窗口的Open事件中编写脚本p.245【操作步骤】①展开【student.pbl】②双击【 w_course_update 】窗口图标 (打开“课程更新” 窗口)③单击 [Open] 选项卡④在“script for open”(打开脚本)编辑窗口输入如下语句:int numberdw_1.settransobject(sqlca)dw_1.retrieve()number = dw_1.retrieve()st_1.text = string(number)⑤单击【保存】按钮(2) 命令按钮【新增课程】的 clicked 事件【操作步骤】①展开【student.pbl】→双击【 w_course_update】②单击【新增课程】按钮③单击 [Event List] 选项卡→双击 <clicked( )>④在“script for clicked”(单击脚本)编辑窗口输入如下语句:dw_1.insertrow(0)dw_1.scrolltorow(dw_1.rowcount())dw_1.setfocus()cb_1.enabled = false⑤单击【保存】按钮(3) 命令按钮【保存课程】的 clicked 事件【操作步骤】①展开【student.pbl】→双击【 w_course_update】②单击【保存课程】按钮③单击 [Event List] 选项卡→双击 <clicked( )>④在“script for clicked”(单击脚本)编辑窗口输入如下语句:int numberstring cno, strnumber = dw_1.getrow()cno = dw_1.getitemstring(number,"cno")select cno into:str from c where cno=:cno;if cno=str and cb_1.enabled = false thenmessagebox("提示!","不能增加,此课程已存在!") elsedw_1.update()number = dw_1.retrieve()st_1.text = string(number)cb_1.enabled = trueend if⑤单击【保存】按钮(4) 命令按钮【删除课程】的 clicked 事件【操作步骤】①展开【student.pbl】→双击【 w_course_update】②单击【删除课程】按钮③单击 [Event List] 选项卡→双击 <clicked( )>④在“script for clicked”(单击脚本)编辑窗口输入如下语句:int numberstring cno, strnumber = dw_1.getrow()cno = dw_1.getitemstring(number,"cno")select distinct cno into:str from sc where cno=:cno;if cno=str thenmessagebox("提示!","不能删除,此课程已有学生选修!") elsedw_1.deleterow(number)dw_1.update()number = dw_1.retrieve()st_1.text = string(number)end if⑤单击【保存】按钮(5) 命令按钮【返回主窗口】的 clicked 事件 p.248【操作步骤】①展开【student.pbl】→双击【 w_course_update】②单击【返回主窗口】按钮③单击 [Event List] 选项卡→双击 <clicked( )>④在“script for clicked” (单击脚本) 编辑窗口输入如下语句:open(w_main)close(parent)⑤单击【保存】按钮⒎在“查询学生平均成绩”窗口为各个控件编写驱动程序(脚本) ppt.101(1) 在窗口的Open事件中编写脚本p.248【操作步骤】①展开【student.pbl】②双击【 w_query_s_avg】窗口图标 (打开窗口)③单击 [Open] 选项卡④在“script for open”(打开脚本)编辑窗口输入如下语句:dw_1.settransobject(sqlca)dw_1.retrieve()⑤单击【保存】按钮(2) 命令按钮【查询】的 clicked 事件【操作步骤】①展开【student.pbl】→双击【 w_query_s_avg】②单击【查询】按钮③单击 [Event List] 选项卡→双击 <clicked( )>④在“script for clicked”(单击脚本)编辑窗口输入如下语句:dw_1.setfilter("")if rb_1.checked = true thenchoose case ddlb_1.textcase "学号"dw_1.setfilter("sno='"+shl_1.text+"'")case "姓名"dw_1.setfilter("sname='"+shl_1.text+"'")end chooseelsechoose case ddlb_1.textcase "学号"dw_1.setfilter("sno like"+ "'%" + shl_1.text+"%'") case "姓名"dw_1.setfilter("sname like"+ "'%" + shl_1.text+"%'") end chooseend ifdw_1.retrieve()shl_1.setfocus()⑤单击【保存】按钮(3) 命令按钮【返回主窗口】的 clicked 事件 p.249【操作步骤】①展开【student.pbl】→双击【 w_query_s_avg】②单击【返回主窗口】按钮③单击 [Event List] 选项卡→双击 <clicked( )>④在“script for clicked” (单击脚本) 编辑窗口输入如下语句:open(w_main)close(parent)⑤单击【保存】按钮㈧运行应用程序单击PowerBar【Run】按钮→(显示应用程序主界面)→选择功能按钮********* Finished *********。

数据库应用系统开发工具PB

数据库应用系统开发工具PB
9 .9
程序调试与发布
9.9.1 调试应用程序 9.9.2 编译应用程序 9.9.3 发布应用程序
9.9.1 调试应用程序
在开发应用程序时, 在开发应用程序时,可能会发生所写程序代码没有达到所期望 的功能,此时在PB的调试模式下执行应用程序, PB的调试模式下执行应用程序 的功能,此时在PB的调试模式下执行应用程序,可以快捷地发现错 误和改正错误。在调试模式下,用户可以在程序中设置断点、 误和改正错误。在调试模式下,用户可以在程序中设置断点、单步 跟踪执行程序、随时显示变量内容等。 跟踪执行程序、随时显示变量内容等。 调试应用程序的步骤如下: 调试应用程序的步骤如下: (1)打开Debug画板 打开Debug画板 Debug 单击PowerBar上的Debug按钮或菜单Run中的Debug子菜单项。 单击PowerBar上的Debug按钮或菜单Run中的Debug子菜单项。 PowerBar上的Debug按钮或菜单Run中的Debug子菜单项 (2)设置断点 通过菜单View中的Source 通过菜单View中的Source Brower 项来浏览和确定要定位的 View中的 对象,此时选择要调试对象的可能出错或与出错有关的事件脚本, 对象,此时选择要调试对象的可能出错或与出错有关的事件脚本, 在怀疑出错或与出错有关的位置上设置断点( 在怀疑出错或与出错有关的位置上设置断点(即双击要设置断点的 可执行语句)。 可执行语句)。
4
数据库应用系统开发工具——PB 第9章 数据库应用系统开发工具 PB
9.9.2 编译应用程序
当应用程序调试完成后,需要编译成可执行程序。PB通过工程 当应用程序调试完成后,需要编译成可执行程序。PB通过工程 Project)来编译生成最终的可执行程序。 (Pr译 PB工程是将应用程序编译成可执行程序的对象。 PB工程是将应用程序编译成可执行程序的对象。当要编译应用程序 工程是将应用程序编译成可执行程序的对象 先要建立工程对象,其步骤如下: 时,先要建立工程对象,其步骤如下: (1)打开待编译的应用程序的工作区。 打开待编译的应用程序的工作区。 (2)选择File菜单的New菜单项或单击New工具栏按钮,此时系统显 选择File菜单的New菜单项或单击New工具栏按钮, File菜单的New菜单项或单击New工具栏按钮 示建立新对象对话框,选择Project Project标签页中的 Wizard或 示建立新对象对话框,选择Project标签页中的 Application Wizard或 Application,然后单击OK按钮。 OK按钮 Application,然后单击OK按钮。 (3)输入相应项。主要项如下:可执行文件名及其路径、资源文件 输入相应项。主要项如下:可执行文件名及其路径、 是否编译为机器码、优化方式、库文件名、 名、是否编译为机器码、优化方式、库文件名、指定库文件的伪码动态 链接库(PBD)或动态链接库(DLL) 链接库(PBD)或动态链接库(DLL)等。

数据库应用技术PB09

数据库应用技术PB09

数据 有效 成功输 类 型 成功 性验 证 入焦点 转换 失败 ItemError事件
Itemchange 事件
编辑控件的内 容放到主缓冲 区的数据项中 ,焦点移动
编辑控件的工作流程
9.4 数据窗口控件常用方法(函数)
9.4.1 与数据检索有关的函数
1.DBCancel函数


遇到长时间和大量资源的查询时,可用此函数终止检 索 语法格式:dwcontrol.DBCancel ( )
9.1 使用数据窗口控件
2.SetTransObject函数


用来在程序中指定数据窗口控件在进行数据库操作时, 使用指定的事务对象与数据库进行通信。 语法格式:dwcontrol.SetTransObject( transaction ) 使用 SetTransObject 函数设置事务对象后,数据窗口的 事务处理由脚本控制,除非在和数据库建立联接之前 将事务对象的 AutoCommit 属性设置成了 True。进行数 据库操作之前必须确保已经成功将应用程序与目标数 据库连接且保持不断开,所有操作完成后在脚本中通 过disconnect语句断开连接以释放掉占据的系统资源。
9.1 使用数据窗口控件
2.在脚本中动态修改

语法格式为:Dwcontrol.DataObject=Dwobjectname 例如,指定与数据窗口控件dw_1 联系的数据窗口对象 为d_txl,相应的语句为: dw_1.dataobject = “d_txl” 注意:由Dwobjectname指定的数据窗口对象必须已经在 数据窗口画笔中创建好并保存在应用程序可搜索路径 下的应用库中,否则会造成运行时错误( Run_Time Error)。

9.3 缓冲区与编辑控件
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

9.1 简介在前面的内容当中,我们介绍了有关数据窗口的基本概念、功能和方法,下面我们将把使用数据窗口的一些高级技术介绍给大家。

这一章不需读者自己动手,因为需要用到很多的数据表格,这里没法都提供给读者,所以这一章只需要读者看明白就可以了,对于SCRIPT 中的语句,要是看不懂可以跳过,会在后面的章节中进行进一步的解答。

9.2 数据窗口与数据库9.2.1 事务对象我们知道事务对象在POWER BUILDER 当中占有非常重要的地位,POWER BUILDER的应用程序必须通过事务对象来实现与各种数据库的连接,所以在讨论数据窗口和数据库的关系之前,我们首先来介绍有关事物对象的基本内容。

在POWER BUILDER当中,要想对一个数据库进行操作,首先必须建立与这个数据库的连接。

在一个POWER BUILDER数据库连接中,事务对象是一个特殊的不可视的对象,其功能就是为POWER BUILDER程序与数据库之间的通信提供一个通信区。

事务对象当中定义了POWER BUI LDER用来与数据库进行连接的参数。

在访问数据库之前,必须先建立一个事务对象,然后给这个事务对象的属性赋以合适的值,才能通过这个事务对象与数据库连接,完成所需的数据库操作。

当一个应用程序开始运行时,POWER BUILDER 会自动创建一个名为SQLCA的默认全局事务对象。

SQLCA是“SQL COMMUNICATIONS AREA”SQL通信区的缩写。

可以在应用程序中使用这个默认的事务对象,也可以定义自己的事务对象。

POWER BUILDER提供了四条用来进行事务管理的语句CONNECT:成功的CONNECT语句标志着一个事务的开始。

在执行CONNECT语句之前,必须对一个已经存在的事务对象的用以连接DBMS的属性赋以合适的值。

DISCONNECT:这个语句标志着中止一个事务。

COMMIT:执行COMMIT将提交自该事务开始之后当前事务对数据库已做的所有尚未提交的更新操作。

并开始一个新的事务。

ROLLBACK:执行ROLLBACK语句之后,当前事务已做的所有更新操作都将被撤消,并开始一个新的事务。

9.2.2 使用事务对象有两种方法可以为一个数据窗口设置事务对象。

使用SETTRANS函数:SETTRANS函数将一个特定的事务对象拷贝到数据窗口控件的内部事务对象当中。

在程序使用该函数的时候,数据窗口控件使用自己内部的事务对象并且根据需要自动执行连接与断开连接的操作,如果出现错误,则自动撤消已做的所有更新操作,恢复到事务开始时的状态。

当数据窗口要访问数据库的时候,如果执行一个RETRIEVE命令或者UPDATE命令,数据窗口就会发出一个内部CONNECT命令,处理相应的数据访问。

数据处理结束后,还会发出一个内部的DISCONNECT命令,断开与数据库的连接。

所以如果在程序中使用SETTRANS函数,不需要另外书写CONNECT和DISCONNECT命令。

从上面的内容当中,我们可以看出SETTRANS语句的缺陷,那就是,在每次进行数据库访问的时候,都要与数据库建立新的连接,而这种连接会占用相当部分的系统资源。

而且在进行数据库访问的时候,用户不能对这个访问过程进行控制。

如果使用SETTRANS语句,当数据库连接的数目增大的时候,程序的效率就要受到影响了。

使用SETTRANSOBJECT命令:使用这条命令可以为一个数据窗口指定一个事务对象。

我们应该按照下面的顺序编写脚本来进行数据库的访问。

CONNECTSETTRANSOBJECTRETRIEVE或UPDATECOMMIT或ROLLBACKDISCONNECT这里我们看到了两条新的指令:RETRIEVE和UPDATERETRIEVE指令的功能是在使用SETTRANSOBJECT语句把一个数据窗口和一个事务处理对象连接起来之后,把数据库中的内容检索到数据窗口当中去。

它的调用格式是DATAWINDOW.RETR IEVE()如果要访问的数据源是使用SQLSELECT语句产生的,那么在调用RETRIEVE函数的时候必须给出参数值,调用格式如下:DATAWINDOW.RETRIEVE(ARG1,ARG2,RETRIEVE函数中的参数次序要与数据窗口对象中定义的SQL SELECT参数的次序保持一致。

POWER BUILDER允许RE TRIEVE函数带有多于数据窗口对象在SQL SELECT中定义的原有参数数目的参数,多余的参数将被忽略。

利用这个特点,可以设计出能够操作不同数据窗口对象的通用检索。

UPDATE指令的功能是在对数据窗口中的数据进行修改之后,需要使用UPDATE函数将所做的修改写回到数据库中去。

9.3 动态数据窗口9.3.1 简介从前面的内容当中,我们知道一个窗口上的数据窗口控件,必须和一个真正的数据窗口对象配合起来才能进行工作。

数据窗口对象和数据窗口对象所包含的所有的实体(如文本、图形)都有自己的属性。

在程序运行的时候,我们可以通过获取、修改这些属性的方法来对数据窗口对象及其所属实体进行动态的控制,甚至能够动态地建立一个新的数据窗口对象。

下面,我们就来介绍动态的操纵数据窗口对象的方法。

9.3.2 动态创建数据窗口创建数据窗口有两种方法。

一种是在POWER BUILDER 的数据画板中建立,另一种就是在程序运行的过程中通过执行一段脚本来动态地建立数据窗口。

下面我们来介绍这种动态创建的方法。

首先打开一个窗口画板。

我们看到该窗口上面有一个数据窗口控件(图9-1)。

图9-1在该数据窗口上面单击鼠标右键,弹出菜单,选择PROPERTIES 属性命令。

弹出这个数据窗口控件的属性对话框(图9-2)。

图9-2我们可以看到DATA WINDOWS OBJECT NAME 一项的内容为空,这说明DW_1这个数据窗口控件的所连接的数据窗口对象为空。

关掉这个对话框。

单击POWER BAR 上面的 RUN WINDOW 按钮,运行这个程序,我们看到该数据窗口上面并没有任何的显示(图9-3)。

图9-2关闭这个程序,回到POWER BUILDER 的窗口工作区。

在窗口上面单击鼠标右键,弹出菜单。

在菜单上选择SCRIPT命令,为该窗口的打开事件编写程序。

输入这样一段脚本:STRING SYNTAX,SQLSTR,ERRMSGSQLSTR = "SELECT ,SOCCER.AGE,SOCCER.CLUB,SOCCER.NATION"&+" FROM SOCCER"CONNECT USING SQLCA;SYNTAX = SQLCA.SYNTAXFROMSQL(SQLSTR,"STYLE(TYPE=GRID)", ERRMSG)dw_1.CREATE(SYNTAX, ERRMSG)这段程序的意思是把SPSTAR 这个表中的关于足球明星的内容显示在DW_1 这个数据窗口控件上面。

关闭窗口画板工作区。

单击POWER BAR上的运行按钮,执行这个程序。

我们看到数据窗口中显示了我们需要的信息(图9-4)。

图9-49.3.3 动态更新数据窗口数据窗口中的内容可以根据用户的需要动态的修改。

下面,就给您一个例子。

我们在窗口上布置一个新的按钮——“更改”。

在新的按钮上面单击鼠标右键,弹出菜单。

在菜单上选择PROPERTIES 命令,弹出这个按钮的属性定义对话框。

将按钮上面的文本设置为“更改”,单击OK按钮,确认修改。

如图9-5。

图9-5在按钮上面再次单击鼠标右键,弹出菜单,在菜单上面选择SCRIPT命令,开始为这个按钮的CLICKED单击事件编写脚本。

我们输入这样一段脚本。

STRING SYNTAX,SQLSTR,ERRMSGSQLSTR = "SELECT ,TENNIS.AGE,TENNIS.CLUB,TENNIS.NATION"&+" FROM TENNIS"CONNECT USING SQLCA;SYNTAX = SQLCA.SYNTAXFROMSQL(SQLSTR,"STYLE(TYPE=GRID)", ERRMSG)dw_1.CREATE(SYNTAX, ERRMSG)dw_1.SetTransObject(SQLCA)dw_1.RETRIEVE()这段脚本的意思是将DW_1这个数据窗口的显示内容从足球明星更改为网球明星。

请注意最后的这两行脚本。

当我们创建新的数据窗口对象的时候,已经断开了数据窗口控件与事物对象的连接,所以当我们调用CREATE函数之后,还要再次调用SETTRANSOBJECT来重新建立相应的连接。

关闭窗口画板的工作区。

单击POWER BAR 上面的运行按钮,运行这个程序。

现在数据窗口中的内容是足球明星的名字。

如图9-6。

图9-6下面我们单击“更改”按钮,我们看到窗口中的内容已经更改为网球明星的名字了。

如图9 -7。

图9-79.3.4 提供查询模式在很多时候用户都希望能够自己设置检索条件来进行数据库的查询工作,所以为用户提供模式查询功能是一个常见而重要的工作。

下面我们就介绍如何实现这个功能。

我们打开一个预先定制好的窗口。

如图5。

在“查询模式”按钮上面单击鼠标右键,弹出菜单,选择SCRIP T 命令,为这一按钮的单击事件编写程序。

输入下面这段脚本:dw_1.Modify("datawindow.querymode = yes")这行脚本的意思是将数据窗口的查询模式设置为允许。

关闭这个窗口。

在“开始查询” 按钮上面单击鼠标右键,弹出菜单,选择SCRIPT 命令,为这一按钮的单击事件编写程序。

输入下面这段脚本:dw_1.Retrieve()dw_1.Modify("datawindow.querymode = no")这行脚本的意思是命令数据窗口按照用户输入的检索条件进行查询。

并且关闭查询模式。

关闭这个窗口。

关闭窗口画板工作区,然后单击POWER BAR 上面的运行按钮,运行这个程序。

我们看到数据窗口上面显示了数据库中存储的所有足球明星的资料。

如图9-8。

图9-8下面我们单击窗口上的查询模式按钮,数据窗口上面的所有数据被清空。

下面我们就可以进行检索条件的输入工作了。

在窗口中所列出的表列上面输入您要设置的条件。

比方说,在国别一栏当中输入意大利,在年龄一栏当中输入<25,同一行的检索条件是逻辑“与”的关系,这就表示要求检索数据库中含有的所有年龄小于25岁的意大利球星的名字。

我们还可以输入更多的检索条件,比方说,在国别一栏中输入英国,在俱乐部一栏中输入“曼联”,不同的行的检索条件之间是逻辑“或”的关系,所以,前面输入的查询条件的意思就是查询数据库中小于25岁的意大利球星以及曼彻斯特联队的英国球星的资料。

相关文档
最新文档