Datawindow常使用的内容

一、数据窗口中的每一个字段有一个序号,该序号是数据窗口的data   source中排列的序号,在程序中可用序号来对字段进行访问。如:dw_1.Modify( "#3.width   =   10 "),  
二、控制数据窗口的某个字段在可修改状态和不可修改状态之间转换,有以下几种方法来实现:
A:   taborder属性
     dw_1.SetTabOrder(4,   0) 第四个字段不能修改
                                        dw_1.SetTabOrder(“emp_id”,   0) emp_id字段不能修改

B:     protect属性
              dw_1.Modify( "#2.Protect=1 ")      第二字段不可修改
        dw_1.Object.emp_stat.Protect=1      emp_stat字段不可修改
              dw_1.Modify( "emp_stat.Protect=1 ")     emp_stat字段不可修改
 
           下面还有复杂一点的表示方法:
              dw_1.Modify( "emp_stat.Protect= '1~tIf(IsRowNew(),0,1) ' ")
              ~t表示要将其后翻译成表达式值

C:     edit的displayonly   属性
     dw_1.object.#2.edit.displayonly=true   第二个字段不能修改 
     dw_1.modify( "#2.edit.displayonly=true ")    第二个字段不能修改

                      用A、B两项控制字段不可修改时,字段不可得到编辑焦点,用C来控制时,字段可得到编辑焦点。

   D:datawindow的readonly属性
                                        dw_1.object.datawindow.readonly=’yes’  数据窗口的所有字段不可获                         得焦点
     dw_1.object.datawindow.readonly=true
     dw_1.modify( "datawindow.readonly=true ")

4.3.4     有效性校验的流程图:

 

一、更改datawindow检索出来的数据:
1.1通过getsqlselected()、setsqlselected()改变data   source来实现:
string ls_oldsql,ls_newsql
ls_oldsql=dw_1.getsqlselected()
ls_newsql=ls_oldsql+‘     where   customer.id> 5’
dw_1.setsqlselected(ls_newsql)
dw_1.retrieve()


1.2   通过object改变data   source来实现
string ls_oldsql,ls_newsql
ls_oldsql=   dw_1.object.datawindow.table.select  
ls_newsql=ls_oldsql+‘     where   customer.id> 5’
dw_1.   object.datawindow.table.select   =ls_newsql
dw_1.retrieve()


1.3   通过更改dataobject来实现
                      dw_1.dataobject=“d_test”
   dw_1.settransobject(sqlca)
                        dw_1.retrieve()


1.4   采用importfile()、importstring()或ImportClipboard导入,新导入的行状态为newmodified!,对数据窗口进行update()操作时将生成   insert   into语句


1.5   通过缓冲区处理函数来改变各缓冲区的数据:如rowscopy(),rowsmove()等。


二、数据窗口的检索参数:
2.1     数据窗口根据源定义,可以带有不同个数,不同类型的检索参数
dw_1.retrieve(int     arg1,string   arg2)

2.2   数据窗口的检索参数可以是数组:
如下所示:
string ls_name[]
ls_name[1]=‘test1’
ls_name[2]=‘test2’
dw_1.Retrieve(ls_name[])     (或     dw_1.Retrieve(ls_name)       )


数据窗口的data   source   定义为   select   id,name   from   customer   where   name   in   (:as_name)
as_name在数据窗口retrieval   arguments中定义为字符串数组

 

三、数据窗口的数据源:
3.1   直接由sql语句生成的data   source


3.2外部数据源(不从数据库中检索),其字段在定义数据窗口时进行定义。


3.3存储过程用作数据源,并且存储过程可带运行参数,要由datawindow   retreive()时将参数传入,此种情况在报表中比较常用,    


四、数据窗口的排序:通过setsort()和sort()来实现


4.1   数据窗口定义时通过specify   sort   columns弹出窗口可定义排序方式,此定义在retrieve()时生效


4.2   Setsort(),Sort()起作用的过程和setfilter(),filter()有类似之处。当datawindow进行retrieve()操作时,根据setsort()的设定值进行排序而不需再使用sort()函数。当用setsort()修改了排序条件后,可采用sort()函数再次进行排序。


4.3   值得注意的时,sort()排序是在数据窗口字段的现有值上进行而不是在原始值上进行。


4.4   Setsort()的参数可以是字符串变量。


4.5   setfilter()和setsort()中采用的字段都是指数据窗口中的字段名

4.6     用setsort()设定排序条件,有以下几种方式:
dw_1.setsort( "id   a ")  按ID字段增序排列
dw_1.setsort( "#1d ")                 按第一个字段降序排列
dw_1.SetSort( "emp_status   A,   emp_salary   D ")
dw_1.setSort( "#1   A,   #5   D ");       按第一个字段升序,第5个字段降序排列
dw_1.setSort   ( "#2+#1   a ")                 按第二个字段和第一个字段相加进行排序(在setfilter()中也可以使用类似表达式)

还有一种方式弹出系统默认的排序窗口进行排序设置,此种方式较为复杂,留待以后版本处理(脚本如下所示)。
string   ls_null
setnull(ls_null)
dw_1.setSort(ls_null);
dw_1.sort(   );

五、利用同一个数据窗口对多表进行更新
5.1当一个数据窗口的数据源是从多表中取得时,可以利用同一个数据窗口对多表进行更新。


5.2数据窗口中可更新的表和字段可以通过modify()函数来更改,如下所示:
            dw_1.Modify( "department_dept_name.Update   =   No ") //指定该字段不能更新
            dw_1.Modify( "department_dept_id.Key   =   No ") //更新时不采用该主键
            dw_1.Modify(   "DataWindow.Table.UpdateTable   =   ~ "employee~ " ")   //指定更新表
在用update()对数据窗口进行修改保存时,数据窗口要根据指定的可更新表和可更新字段生成sql语句。
所以,在js中,要对数据窗口中哪些表是更新表,哪些字段是可更新字段,哪些主键值是更新时依赖的主键值做保存。

六、数据窗口数据的共享:
6.1   采用sharedata()和sharedataoff()来实现
          dw_1.sharedata(dw_2)
6.2   一个主数据窗口可共享多个从数据窗口
dw_1.sharedata(dw_2)
dw_1.sharedata(dw_3)
6.3   所有共享的数据窗口,其中任何一个数据窗口的数据发生变动,都会即时影响其余数据窗口数据的变动。
6.4   对共享数据窗口产生影响的函数:
DeleteRow
Filter
GetSQLSelect
ImportFile
ImportString
ImportClipboard
InsertRow
ReselectRow
Reset
Retrieve
SetFilter
SetSort
SetSQLSelect
Sort
Update

七、数据窗口行状态的改变:
7.1    数据窗口有四种行状态:NotModified!、DataModified、New!、NewModified!
7.2           数据窗口进行update()操作时,根据行状态及其对应的缓冲区生成sql语句。
7.3         数据窗口行状态的改变方式有许多种:
7.1     直接从表中检索出来的数据行其状态为NotModified!
7.2       用importfile()、importstring()或ImportClipboard()函数导入的行其状态为  newmodified!
7.3采用insertrow()   、importfile()、rowscopy、产生的新行用deleterow()时会直接删除。只有状态值为datamodified!和notmodified!的才会被移入delete   buffer。

找两个表中主键相同的记录:
select   *   from   orders   join   order_details   on   orders.orderid   =   order_details.orderid   and   orders.CustomerID   =   order_details.CustomerID


1.2 使用datawindow的object属性(primary   buffer和current是默认取值,可省略)
                各关键字排列顺序为   :
1.2.1     datawindow   name+object+data+buffer+(original   or   current)   或 datawindow   name+object+column   name+data+buffer+(original   or   current)

1.2.2   取得字段id第一行的现有值:(id为第一个字段)
dw_1.object.id[1]  
dw_1.object.id.primary[1]
dw_1.object.id.primary.current[1]
dw_1.object.data[1,1]
dw_1.object.data.primary[1,1]
dw_1.object.data.primary.current[1,1]
上面六式结果是相等的,当id为字符型时,等价于
getitemstring(1,’id’)、 getitemstring(1,’id’,primary!,false)、getitemstring(1,1)、 

getitemstring(1,1,primary!,false)

1.2.3取得字段id第一行的原始值:(id为第一个字段)
dw_1.object.id.original[1]
dw_1.object.id.primary.original[1]      
dw_1.object.data.original[1,1]          
dw_1.object.data.primary.original[1,1]

等价于getitemstring(1,’id’,primary!,true)、getitemstring(1,1,primary!,true)

1.3   缓冲区记录数统计函数:
函数 说明
Rowcount() Obtains   the   number   of   rows   that   are   currently   available   in   the   primary   buffer.


Filtercount() Reports   the   number   of   rows   that   are   not   displayed   in   the   DataWindow   because   of   the   current   filter   criteria.


Deletecount() Reports   the   number   of   rows   that   have   been   marked   for   deletion   in   the   database.


modifiedcount() Reports   the   number   of   rows   that   have   been   modified   but   not   updated   in   a   DataWindow   or   DataStore.


实际上:这样来理解更准确,rowcount()是指primary   buffer中的总行数,filtercount()是过滤缓冲区的总行数,deletecount()是delete   buffer中的总行数,而modifiedcount()要理解成在primary   buffer   and   filter   buffer中行状态为datamodified!   or     newmodified!的总行数。

二、如何修改缓冲区的数据
2.1   采用setitem()函数,setitem()函数只能修改主缓冲区内容
2.2 采用datawindow的object属性,采用object可修改3个缓冲区的内容。和1.2的内容相对应:例如:dw_1.object.data[1,1]=“test”

三、如果操作缓冲区的记录:
3.1 单行处理函数insertrow(),deleterow():只对primary   buffer起作用


3.2 多行处理函数rowscopy(),rowsmove(),rowsdiscard()


3.3 reset()清除所有缓冲区记录


3.4 importstring(),importfile(),importclipboard()导入记录到primary   buffer


3.5 filter()函数跟据setfilet()设定的条件在primary   buffer   and     filter   buffer之间移动数据


3.6 retrieve()从数据表中检索行到数据窗口


3.7 由sharedata()可共享数据行,由sharedataoff()取消共享的数据行。

四、缓冲区行状态的初始值
4.1   由insertrow()产生的新行其行状态为new!


4.2   由rowcopy(),importstring(),importfile(),importclipboard()产生的新行状态为 newmodified!


4.3   由retrieve()产生的行其行状态为notmodified!


4.4   filter(),sharedata()产生的行其行状态维持原来不变。


4.5   由rowsmove()产生的行状态:

If   you   move   rows   between   buffers   in   a   single   DataWindow   control   or   DataStore,   PowerBuilder   retains   knowledge   of   where   the   rows   came   from   and   their   status   is   changed   accordingly. 

      For   example,   if   you   move   unmodified   rows   from   the   primary   buffer   to   the   delete   buffer,   they   are   marked   for   deletion.   If   you   move   the   rows   back   to   the   primary   buffer,   their   status   returns   to   NotModified!.   Note,   however,   that   if   you   move   rows   from   one   DataWindow   control   (or   DataStore)   to   another   and   back   again,   the   rows '   status   is   NewModified!   because   they   came   from   a   different   DataWindow.

五、如何取得缓冲区的行状态
4.1     用getitemstatus()可取得缓冲区的行状态  

4.1.1   示例:dw_1.getitemstatus(1,0,delete!)   取得delete   buffer第一行的行状态


4.1.2参数说明如下:
Argument Description
row A   value   identifying   the   row   for   which   you   want   the   status
column The   column   for   which   you   want   the   status.   Column   can   be   a   column   number   (integer)   or   a   column   name   (string).   Specify   0   to   get   the   status   of   the   whole   row
dwbuffer A   value   of   the   dwBuffer   enumerated   data   type   (PowerBuilder)   or   an   integer   (Web   ActiveX   and   Java)   identifying   the   DataWindow   buffer   containing   the   row   for   which   you   want   status.

4.2   getnextmodified()函数可获得紧接着的修改行。 


4.2.1   Returns   the   number   of   the   first   row   that   was   modified   after   row   in     dwbuffer   in   dwcontrol.


4.2.2   参数说明如下:
Argument Description
row A   value   identifying   the   row   location   after   which   you   want   to   locate   the   modified   row.   To   search   from   the   beginning,   specify   0
dwbuffer A   value   of   the   dwBuffer   enumerated   data   type   (PowerBuilder)   or   an   integer   (Web   ActiveX   or   Java)   identifying   the   DataWindow   buffer   in   which   you   want   to   locate   the   modified   row.


4.2.3注意:是从行号为row+1行开始找,不包括行号为row的行。实际上它是查找行状态为datamodified!   or   newmodified!的行。

 

六、如何修改缓冲区的行状态
6.1行状态影响数据窗口update()时sql语句的生成,参考文档:
<sourcesafe:\document\pbcomp\specs\jsdatawindow   sql   product\How   to   product     SQL   sentence   in   jsdatawindow.doc>

6.2   update()和resetupdate()不影响状态为new!的行,但会将primary   buffer   and   filter   buffer其它行行状态都变为   notmodified!,                               and   empties   the   delete   buffer   of   a   dataWindow   or   DataStore.

6.3   采用setitemstatus()函数:


行状态测试记录:
1、手工修改字段编辑框,字段虽然作了改动,但与原值相等时,数据窗口行状态不变。但用setitem(row,col,value)修改成与原值一模一样时,数据窗口行状态会发生改变,如果原来是nomodified!,行状态会变为datamodified!



2、resetupdate()不会改变行状态为new!的状态。



3、数据窗口update()出错时,不管是不是自动提交,也不管update(true,true)所带参数,都不会改变行状态。


4、primary   buffer行状态为datamodified!,将其删除,在delete   buffer中其行状态仍为datamodified!,
将该行由delete   buffer用rowscopy函数拷贝至primary   buffer,在primary   buffer中其行状态为newmodifed!
将该行由delete   buffer用rowsmove函数移至primary   buffer,在primary   buffer中其行状态仍为datamodifed!


5、filter()函数不会改变行状态,进行filter操作时,状态为new!的行将会被清除。


6、重排序之后,数据窗口行号移到了第一行,而不管排序条件有没有发生变化。


7、对于新插入行,其original值与current值是一致的。dw_1.Object.id.Primary.Original[i]=   dw_1.Object.id.Primary.current[i]


8、用setitemstatus(i,0,primary!,newmodified!)将datamodified!状态变为newmodified!状态时,其原始值origianal和现有值current都不会改变,生成insert   into语句时插入的是现有值。


9、用rowscopy将primary   buffer中的一行(nomodified!)拷贝到delete   buffer中,在delete   buffer中行状态为newmodified!,用update()保存时不会生成delete语句。将delete   buffer中的行状态变为datamodified,则update()保存时将生成delete语句。


10、用rowsmove将primary   buffer中的一行(nomodified!)拷贝到delete   buffer中,行状态不变,则update()保存时将生成delete语句。


11、将datamodified!变为notmodified!时,原始值将转为和现有值一致。


12、用dw_1.setitem(1,0,primary!,notmodified!)将原为newmodified!的行变为new!状态时,其原始值和现有值仍旧存在,但update()时不会生成insert   into语句。


13、resetupdate()不会改变缓冲区的current值,只会改变行状态。

展开阅读全文

没有更多推荐了,返回首页