PB基础知识
1、Datawindow object(数据窗口库对象)

  数据源决定了数据窗口对象获取数据的方式。PowerBuild支持五种数据源:
A、 快速选择(Quik Select)能够创建简单的SQL Select语句,主要用于从一个表或由外键连接的多个表中选择数据列,不能生成Sql计算列,
B、 SQL选择(SQL Selcet)以可视化的方式建立SQL Select语句,SQL Select语句的所有细节均能通过该界面定义,从一个或多个表中建立复杂的SQL Select语句,能生成各种的sql 计算列。
C、 查询(Qurey) 数据源将以前创建的Qurey对象作为数据窗口的数据来源。
D、 外部(External)数据源用于让数据窗口访问数据库以外的数据,直接定义Sql计算列,一般用于接收用户输入(可能使用子数据窗口,选择来自数据库的数据)或显示计算结果。
E、 存储过程(Stored Procedure)则直接利用保存在数据库中的存储过程作为数据源,此数据源只有当前连接的数据库支持存储过程时才有效,否则系统将自动隐藏此选项。
数据窗口对象有十一种显示风格为:列表(Tabular)、表格(Grid)、自由格式(FreeForm)、标签(Lable)、分栏(N-Up)、分组(Group)、交叉列表(Crosstab)、统计图(Graph)、OLE2.0超文本(RichText)、复合(Composite)。
改变数据窗口更新特性的方法
打开一数据窗口,从Rows菜单中选择的"Update Properties…"系统显示"Specify Update Prorerties"对话框:
A、 如果不允许数据窗口更新数据库,那么就不要选中复选框"Allow Updates",单击"OK"按钮关闭对话框。如果要禁止用户修改数据窗口的某列,那么在数据窗口画笔中将此列的TabOrder值设为0。
B、 如果允许数据窗口更新数据库,选中复选框"Allow Updates"。
C、 在"Table To Update"下拉列表框中选择要更新的表
D、 在"Where Clause For Update/Delete"中选则更新方式。
E、 在"Updatesble Cloumns"通过单击选择可更新的列,被选中的列将加亮显示。
F、 选择了要更新的列后,在"Unique Key Column(s)"列表框中定义唯一键,这个唯一键必须能够在表中唯一的标识一条记录。
G、 在"Key Modification"组框中选择当唯一键列更新时数据行的更新方式。
H、 如果当前表中包括了自动增长序号的列(称做标识列,并非所有的数据库都具备此特性),那么在"Indentity Column"下拉列表框中指定该列。
I、 单击"OK"关闭对话框。
注意事项:如果在"Indentity Column"下拉列表框中指定某列为标识列,那么就不要把该列选择为可更新列。否则,如果把该列选择为可更新列,那么数据窗口产生的任何更新数据库的Update语句都将失败。
关于"Specify Update Prorerties"对话框中的"Key Modification"组框的详细意义。"Key Modification"组框中两个选项指定当唯一键列被更新时的数据行的更新方式。
A、 选中"Use Delete Then Insert"单选钮,在唯一键列被更新的情况下,PoweBuild将首先删除原来的行,然后使用新的键值插入新行。(这种方法减少了数据库重新组织数据的次数,但也存在一些潜在的问题,当某个表的主键是另一个表的外键并在定义外部键时将删除方式定义同时删除(级联删除)时,应用程序可能并不想使用"Use Delete Then Insert"选项。)
B、 选中"Use Update"单选钮,在唯一键列被更新的情况下,PoweBuild修改行的键值(并非所有的数据库都支持主键更新,也就是说,如果您使用的数据库管理系统不支持主键更新,在这里您就不能选择"Use Update"选项)。这种方法避免了与外部键相关的级联删除问题。
  关于"Specify Update Prorerties"对话框中的"Where Clause For Update/Delete"的三个选项的具体含义:
A、 Key Columns
当选中"Key Columns"单选钮时,数据窗口只使用"Unique Key Columns"列表框中选择主键来构造Where子句,该选项经常在单用户应用程序环境中使用,当PowerBuild生成Update或 Delete语句时,它比较某行键值列的原始值与数据库相应行键值列的值,如果两者相等,则更新操作或删除操作被成功的执行。
B、 Key and Updateable Columns
当选中"Key and Updateable Columns"单选钮时,PowerBuild在创建的Update或Delete语句中将键值列的原始值与可更改列的原始值与数据库的相应值进行比较。当这些值相等时,修改或删除相应的行(即Update或Delete语句成功执行)。
C、 Key and Modified Columns
当选中"Key and Modified Columns"单选钮时,PowerBuild在创建的Update或Delete语句中将键值列的原始值和已修改可更改列的原始值与数据库的相应值进行比较。当这些值相等时,修改或删除相应的行,该选项是对数据完整性的保护和操作并发性的折中。

2、窗口中最常用的事件:Open、Resize、CloseQuery、Close。

①、Open事件:在窗口显示之前系统触发Open(打开)事件。此时系统已将构造好了窗口的所有属性以及其上的所有控件,下述函数触发窗口的Open事件:Open、OpenWithParm、OpenSheet、OpenSheetWithParm。
②、Resize事件:当窗口大小发生变化时发生,窗口被打开时也发生此事件,参数SizeType指明改变窗口大小的类型(最大化、最小化、恢复等);newwidth指明窗口的新宽度;newheight指明窗口的新高度。
③、CloseQuery事件:在开始关闭窗口时,发生该事件,该事件返回一个0或1的返回值,如果返回1,窗口不被关闭,通常情况下紧随其后发生的Close事件不被发生;如果返回0,则窗口被关闭。利用该事件的这种特性,程序能够根据当前状态提醒用户是否保存改变的数据、检验用户输入的数据的有效性、询问用户是否真的要关闭窗口。窗口被关闭时,同时关闭所有与之相关的子窗口和弹出窗口。
④、Close事件:窗口被关闭时发生。触发该事件后,没有办法阻止窗口关闭的操作。
3、数据窗口中最常用的事件:ButtonClicked、Clicked、Constructor、Dberror、DoubleClicked、DragDrop、Editchanged、ItemError、Itemchanged、Rowfocuschanged、Rowfocuschanging。
①、BottonClicked事件:当数据窗口对象上的按钮对象的SuppressEventProcessing属性设置为no (缺省为no)后,用户单击该按钮时触发。该事件在系统处理完按钮的缺省动作后触发。
参数:◆Row--Long类型,用户单击的时第几行。(与按钮所放的位置有关)
◆Actionreturncode--返回命令按钮的操作码,Long类型。
◆Dwo--DWObject类型,单击命令按钮时,数据窗口的当前对象。
②、Clicked事件:当用户点击数据窗口控件的任何位置时触发。返回值:1(缺省返回值)继续处理;0停止处理,不改变输入焦点。此事件将会触发Rowfocuschanged、ItemFocuschanged。
参数:◆xpos、ypos--用户在数据窗口中单击的具体位置。
◆Row--用户单击的记录号,如果没有单击在行上,则该值为0。
◆Dwo--DWObject类型的值,存放单击的数据窗口内部对象名称。
注意:
如果在此事件中用到了取数的函数例如:getitemstring(row,column);selectrow的函数等只要用到的函数与行有关,必需设置 if row=0 then return 。
如果为打印报表中的数据窗口控件,则不能继承Clicked事件(因为在模板中的Clicked事件中编写了点击列的标签排序,如果此报表有合计数或分组等,则得不到正确的报表。),应该屏蔽掉祖先代码,具体实现为进入Clicked的Scrip中选择菜单Design Override Ancestor Scrip后,在Clicked事件中随便加点注释即可,例如""。
③、Constructor事件:在窗口的Open事件发生之前触发。
④、Dberror事件:在数据窗口控件访问数据库过程中发生数据库错误时触发。返回值:0-缺省值,系统显示出错信息;1-系统不显示出错信息。
⑤、 DoubleClicked事件:当用户双击数据窗口控件时触发。在触发双击事件前,首先触发Clicked单击事件。我们可以在双击中打开一窗口。
⑥、DragDrop事件:当某个被拖曳控件放置到数据窗口控件上时触发。如在一数据窗口中拖曳排序;从一个数据窗口拖曳数据放到另一个数据窗口中,此时则用到DragDrop事件,拖曳结束需要写this.Drag(end!),取消拖曳写this.Drag(Cancel!)。
⑦、 Editchanged事件:当用户在数据窗口控件的编辑控件中按任何按键时触发。
⑧、ItemError事件:当用户修改了字段、然后移走焦点、但数据未能通过该列的有效性检查时触发。该事件返回值得意义为:
0--(缺省值),拒绝输入值并显示有效性检查出错信息,同时不允许移走焦点。
1--拒绝输入值,但不显示出错信息,同时不允许移走焦点。
2--接收输入值。
3--拒绝输入值,但允许移走焦点。
参数:◆Row--用户单击的记录行号,如果没有单击在行上,则该值为0。
◆Dwo--DWObject类型的值,存放单击的数据窗口内部对象的名称。
◆Data--string...