|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
为多种编程语言提供了API。这些编程语言包括C、C++、Python、Java、Perl、PHP、Eiffel、Ruby和Tcl等。会见|剧本|数据在PowerScript剧本中会见数据窗口中的数据
张健姿01-6-22下战书03:50:25
在4.0以前的版本,如果您想在PowerScript脚本中访问数据窗口中的数据,方法只有一种,那就是使用SetItem和GetItem系列的函数,指定您所要访问的某一行列的值,这一方法的局限性在于您一次只能访问到一个数值。而在5.0版中,PowerBuilder拓展了数据窗口的属性,使数据窗口中的数据成为了该对象的一个属性,而使用户可以象访问其它对象属性一样直接访问数据窗口的数据了。这样我们就有了两种会见数据的方法了。1.传统的使用SetItem和GetItem系列函数,如:dw_1.SetItem(1,"empname","Phillips")ls_name=dw_1.GetItemString(1,"empname")2.表达式的方法,这种方法可以指定某一列、某一行、某一块、或是用户选中的行列、甚至整个数据窗口控件的全部数据,如:dw_1.Object.empname[1]="Phillips"dw_1.Object.Data[1,1]="Phillips"这两种方法都可以允许用户指定特定的数据缓冲区,也就是说您采用任何一种方法都可以访问到数据被修改前的原始值、被过滤失落的值、被删往的值及当前值等。在年夜多数情况下,您可以采用这两种方法中的任一种,但这两种方法在使用时也是各有利弊的。如果您只是要访问某行某列的一个数值,两种方法在执行效率上是基本相同的的。如果您打算采用数据窗口的列名而不是数值来暗示某一列,而这一列的列名在运行前又不知道,或是要依据用户的不同输进来决定,那您只能采用函数法,因为这一方法可以动态地改变列名。如果您需要访问的数据不止一列,而是确定范围的多行多列,那您采用表达式法将获得更高的效率。表达式法是PowerBuilder5.0新增加的功能,虽说这种办法可使得数据窗口的面向对象的特性更为明显,语言的表达也更为直不雅,易于使旁不雅者阅读他人的程序时容易看懂,但是这种方法的语法形式却是很复杂多样,使用起来却不太容易。总体上讲,表达式的语法可以分成3组:直接指定列名称法:如果您事先知道您需要访问数据的列名,而且仅访问这一列,可以采用这种方法。选择这一控件中一条记录或多条记录dwcontrol.object.columnname{.buffer}{.datasource}{[startrownum{,endrownum}]}我们在前面的专题中曾经介绍过关于数据窗口的四个缓冲区,在这条命令的语法中buffer选项就可以选择Primary,Filter或Delete这三个缓冲区,缺省为Primary;datasource选项为Current或Original,缺省为Current。如果您选择Original,则系统将到数据窗口的Original缓冲区中往读取数据,显然Original缓冲区是只读的,您不能对其赋值。在后面的方括号中,您能够指定您打算访问的这一列中的起止记录数,如果只是一条记录,您在StartRownum中指定行号就可以了;如果方括号中两个参数全部缺省,则指这一列的全部记录。例如:stringls_namels_name=dw_1.Object.name[1]又如:dw_1.Object.salary[8,12]=id_salaryid_salary是一个数组,如果其中只有四个元素,则第12行salary的值为空。选择这个数据窗口控件中加亮的记录dwcontrol.Object.columnname{.Primary}{.datasource}.Selected在数据窗口中加亮的记录就是您曾经使用过SelectRow函数对其进行加亮表示这一行选中的记录。显然,对这一特性数据的访问只能是Primary缓冲区中的,不过数据源仍旧可以选择是当前还是原始的。如果选择原始,也就是说您得到的数据是从数据库中查到的,修改前的数据。例如:stringls_namels_name=dw_1.Object.name.Selected使用数值来表示列:dwcontrol.Object.Data{.buffer}{.datasource}[startrownum,startcolnum,endrownum,endcolnum]我们知道在SetItem和GetItem系列的函数中,对列的表达既可以用列名也可以采用数值指示,在这里也是同样。如果我们采用数值指代列名的方法,同上一种比较,我们要将列名换成了关键词Data,在后面的方括号中,参数酿成了四个。这一表达式的返回值将是一个结构数组,或是一个用户对象。必须注意,您所定义的结构或用户对象必需与数据窗口的这几列的数据类型相匹配,否则PowerBuilder将出现错误。对整行记录的操纵:dwcontrol.Object.Data{.buffer}{.datasource}{[rownum]}这一种方法是上一种方法的特例,如果rownum中的数值缺省,将表示整个数据窗口的全部数据。例如数据窗口中的列名及数据类型是这样的:ID(number)name(string)retired_status(boolean)birth_date(date)首先我们要在结构画笔中定义一个str_empdata的数据结构。它包括四个元素,类型分别是:integer,string,boolean和date执行下列代码:str_empdatalstr_currdata[]lstr_currdata=dw_1.Object.Data这样lstr_currdata结构中数组的上界将用数据窗口控件中记录的行数相等,并完成了赋值。我们还可以用这种方法指定这一控件中高亮度的行dwcontrol.Object.Data{.Primary}{.datasource}.Selected这三种形式的功能比较如下:访问范围语法访问控件中高亮度的行1一列dwcontrol.object.columnname{.buffer}{.datasource}能2多列dwcontrol.object.data{.buffer}{.datasource}不能3一条记录的全部列dwcontrol.object.data{.buffer}{.datasource}能在使用这些语句时我们要注意以下几点:同使用SetItem和GetItem系列函数一样,在编译时PowerBuilder将不检查您所指示的列的有效性,您必须自行检查并确保引用的有效性。在第一种方法中我们必须注意在列名后面一定要有所后缀,例如:ld_salary[]=dw_1.object.emp_salary.primaryld_salray=dw_1.object.emp_salary[5]上述表达式都是合法的,但是ld_salary[]=dw_1.object.emp_salary就是非法表达了。因为dw_1.object.emp_salary指代的是这个emp_salary列的DWObject对象,而不是在emp_salary列中的数据。我们可以用dw_1.object.emp_salary来指代数据窗口中的对象,如:integerli_dataDWObjectdwo_empsalarydwo_empsalary=dw_1.Object.emp_salaryFORli_cnt=1to100li_data=dwo_empsalary[li_cnt].........NEXT这种表达式法返回的数据类型是ANY型的,PowerBuilder将根据“兼容”原则转换数据库与PowerBuilder的数据类型,因此如果您调用的重载函数要使用表达式法得到数据窗口的数据作为参数,建议您一定使用一个强制转换数据类型的函数。例如:wf_overload(real(dw_1.object.dept_id[1]))
因此,我们的第一个“米”,就是二进制日志binlog必须是rowbased的。在rowbase下,二进制日志binlog同时记录了更新前后的整行记录。 |
|