[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可以有更复杂的语法。其格式是:
"Style ( Type=value property=value ... )
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("datawindow.table.select")
ls_sql = dw_1.describe("datawindow.table.SQLselect")
ls_sql = dw_1.describe("datawindow.table.select.attribute")
〓修改数据窗口的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("datawindow.table.select=~"select name,本人,from address where 本人='男'~"")
也可以直接使用语法来修改数据窗口的SQL语句。例如,上面的语句可以改写成:
dw_1.datawindow.table.select="select name,本人,from address where 本人='男'"
然而这种方法无法验证SQL语句是否正确,不如使用Modify函数,但是上面这种方法的执行速度比较快,如果能够确保准确无误,这种方法还是可以考虑的。可以看出它的语法和上面的相同。
这里的技巧是,如果在运行时需要对数据窗口的SQL语句进行修改,创建没有where子句的数据窗口比较好些。因为where子句可以在动态修改时添加,sort可以在运行时使用setsort函数实现。这样,程序运行时处理数据窗口的SQL语句就比较方便。
下面介绍一个在程序运行时动态修改数据窗口的SQL语句的实例。在该例子中,使用数据窗口控件函数ModIfy可以修改数据窗口对象中的控件的属性。脚本如下:
String ls_SQL,ls_where,ls_select
ls_SQL = dw_1.Describe("DataWindow.table.select") //获取数据窗口当前的SQL语句
If Pos(ls_SQL,"where") > 0 Then //如果有where子句(有可能是运行时添加的)
ls_select = Left(ls_SQL,pos(ls_SQL,"where") - 1) //取where前面的内容
Else
ls_select = ls_SQL //如果没有where子句则直接赋值
End If
ls_where = " where xm like '郭%' order by xm" //where子句。可以设计界面让用户构造
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帮助
*long dwcontrol.ImportString ( string string {, long startrow {, long endrow {,long startcolumn {, long endcolumn {, long dwstartcolumn } } } } } )
功能:Inserts data into a DataWindow control or DataStore from tab-delimited data in a string.(把字符串数据插入到数据窗口中)
--具体请见PB帮助
这篇文章真不错 赞一个,学习了!
页:
[1]