PB动态数据窗口 下载本文

内容发布更新时间 : 2024/5/12 14:07:26星期一 下面是文章的全部内容请认真阅读。

[PB]-动态数据窗口

〓创建动态数据窗口

若要动态创建数据窗口,需要使用函数Create,该函数的语法如下: dw_1.Create(syntax{,errorbuffer})

其中,dw_1是数据窗口控件的名称,该数据窗口控件要和新创建的数据窗口对象相关联。syntax是用来描述创建数据窗口对象的确切语法的字符串。

errorburrer是可选项,用来保存创建数据窗口对象过程中发生的错误信息。如果不指定该参数,就会在发生错误时显示一个错误信息的提示窗口。如果创建成功该函数返回1,否则返回-1,如果参数为null则函数返回null。 由于Create函数成功创建数据窗口对象后,要改变dw_1数据窗口控件所关联的数据窗口对象,因此,需要重新为数据窗口设置事务对象(使用函数SetTransObject或者SetTrans)。

获取创建数据窗口的语法有多种方法,可以对相关的SQL语句使用SyntaxFromSQL函数,也可以使用对已经创建好的数据窗口对象使用LibraryExport函数。因为创建数据窗口的语法比较复杂,即使使用了

LibraryExport输出已有数据窗口对象的语法,操作起来也相当费劲。所以,更为通用的是前面一种方法。这种方法配合一定的编程技巧,让用户指定要创建 的数据窗口对象的SQL语句,使用户有更多的自由和选择。使用这种方法,肯定用到函数

SyntaxFromSQL,它的语法是:

transaction.SyntaxFromSQL(SQLselect,presetation,err) 其中,transaction是事务对象的名称,该事务对象必须正确地设置了相关参数,并且和数据库建立了联结。SQLselect是用来创建数据窗口的SQL语句,为String类型。presentation是要创建的数据窗口对象的显示风格,为String类型。简单的格式是:

Style(Type=presentationstyle)

其中Style和Type都是保留字,presentationstyle的取值有Tabular,Grid,Form,Graph,Group,Label和Nup,其中Tabular是缺省类型。err是用来保存函数执行时出错信息的string类型的变量。

*关于函数SyntaxFromSQL的参数presentation可以有更复杂的语法。其格式是: \DataWindow ( property=value ... ) Column ( property=value ... )

Group groupby_colnum1 Fby_colnum2 ... property ... ) Text property=value ... ) Title ( 'titlestring' )\

使用这样的格式,可以详细定义要创建的数据窗口对象的外观。

〓在很多情况下都需要一个数据窗口控件和不同的数据窗口对象关联。可以通过修改数据窗口控件的dataobject属性来实现。在修改了这一特性之后,数据窗口控件就不再具有与它相关的事务处理对象了,应该再重新为数据窗口设置事务

对象。*如果为数据窗口设置了行焦点标志,在修改了dataobject属性后应该重新设置行焦点标志。

〓获得数据窗口的SQL语句

有时需要修改数据窗口对应的SQL语句,以便构造查询应用。这时,首先就要读取数据窗口当前的SQL语句,然后再对where子句进行修改。可以有多种方法获取SQL语句。最常用的是使用函数GetSQLSelect,它的语法如下: dw_1.GetSQLSelect()

其中,dw_1是数据窗口控件的名称,可以是子数据窗口或datastore等。函数执行正确则返回对应的SQL语句,否则返回空字符串(\。

另外,还可以使用Describe函数描述数据窗口对象的相关属性来获得。在使用该函数时,如果数据宙口联结到数据库则返回真正的SQL语句,否则返回数据窗口的PBselect语句。PBselect语句是数据窗口的专用语法,和SQL语句有很大的区别,但也是从SQL语句转化而来的。数据窗口对象有三个属性用来保存SQL语句,它们是的table.select、table.SQLselect、table.select.attribute。这些属性获得的SQL语法稍微有区别。下面是获取一个数据窗口SQL语法的不同的语句:

string ls_sql

ls_sql = dw_1.GetSQLSelect()

ls_sql = dw_1.Describe(\ls_sql = dw_1.describe(\

ls_sql = dw_1.describe(\

〓修改数据窗口的SQL语句

使用上面介绍的方法获得SQL后,可以进行修改加工,然后重新应用于数据窗口对象。使用这种方法可以创建功能比较强大的查询程序。 和提取语法一样,也有两种修改SQL的方法:使用函数Modify或者SetSQLSelect。不管使用哪种方法,修改完SQL语句后都要重新设置事务对象。比较常用的是后一种函数,它的语法是:

dw_1.SetSQLSelect(statement)

其中,dw_1是要重新设置SQL语句的数据窗口控件名称,可以是子数据窗口或者datastore。statement是一个包含合法SQL语句的字符串。该函数正确执行返回1,否则返回-1。另外,对于新的SQL语句有很多需要注意的地方: (1)字段的类型和个数必须和原SQL语句相同;

(2)原来的SQL语句中定义了检索变量时,就不能重新设置SQL语句。 如果原来的数据窗口可以修改数据库中的数据表,那么重新设置时,

PowerBuilder把和原来主键位置相同的字段仍然作为新的主键。如果碰到了下面的两种情况,则将使数据窗口无法更新: a)from于句中包含多个数据表名;

b)数据窗口可以更新的是数据库的计算列。

使用相应的Modify函数和相应的语法也可以修改数据窗口的SQL。例如: dw_1.modify(\

where sex='男'~\

也可以直接使用语法来修改数据窗口的SQL语句。例如,上面的语句可以改写成: dw_1.datawindow.table.select=\男'\

然而这种方法无法验证SQL语句是否正确,不如使用Modify函数,但是上面这种方法的执行速度比较快,如果能够确保准确无误,这种方法还是可以考虑的。可以看出它的语法和上面的相同。

这里的技巧是,如果在运行时需要对数据窗口的SQL语句进行修改,创建没有where子句的数据窗口比较好些。因为where子句可以在动态修改时添加,sort可以在运行时使用setsort函数实现。这样,程序运行时处理数据窗口的SQL语句就比较方便。

下面介绍一个在程序运行时动态修改数据窗口的SQL语句的实例。在该例子中,使用数据窗口控件函数ModIfy可以修改数据窗口对象中的控件的属性。脚本如下:

String ls_SQL,ls_where,ls_select

ls_SQL = dw_1.Describe(\//获取数据窗口当前的SQL语句

If Pos(ls_SQL,\如果有where子句(有可能是运行时添加的)

ls_select = Left(ls_SQL,pos(ls_SQL,\取where前面的内容 Else

ls_select = ls_SQL //如果没有where子句则直接赋值 End If

ls_where = \郭%' order by xm\子句。可以设计界面让用户构造

ls_SQL = ls_select + ls_where //添加where子句 If dw_1.SetSQLSelect(ls_SQL) = 1 Then dw_1.Retrieve() End If

在上面的例子中,where条件都是固定的。也可以设计界面,让用户指定条件来查询数据。该脚本可以编写成一个函数,将where子句作为参数,将是否成功设置SQL作为返回值,在用户每次指定查询条件进行检索时调用该函数。

〓其他

*GetFileOpenName(title,pathname,filename{,extension{,filter}}) 功能:Displays the system's Open File dialog and allows the user to select a file or enter a filename.(打开选择文件对话框) --具体请见PB帮助

*LibraryDirectory ( libraryname, objecttype )

功能:Obtains a list of the objects in a PowerBuilder library.(获得PBL中的对象) --具体请见PB帮助