在学习和使用PB时候所进行的知识总结

更新时间:2024-06-29 15:10:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

在学习和使用PB时候所进行的知识总结

****************** dw1.processing:

0:-group or form or tabular 1:-grid 2:-label 3:-graph 4:-crosstab

*******************************8

oracle9i和以上版本才支持case()用法,一般建议使用更方便的等效函数decode(); 1. case

SELECT UserID,( case

when OperateType = 0 then '新增'

when OperateType=1 then '修改' else '删除' end ) FROM LOG

2.DECODE的写法:

SELECT UserID,decode(OperateType,0,'新增',1,'修改','删除') OperationName FROM LOG ************************ //==PB获取主板BIOS ID信息 //==适用系统: Win 9x //==作者Kila 2003.1.14 string ls_mbid

//==说明1043569即16进制FEC71,就是主板BIOS ID 开始地址。前11为是主板BIOS的日期信息。

ls_mbid = String(1043569 + 11, \把字符指针 1043569 + 11,转成字符串。@#我可是第一次用哦。

//==ls_mbid中存的就是主板BIOS ID信息了。 messagebox(\

****************************************************888888888888888888888888888888888888

在使用describe()计算数据窗口表达式时语法

为:dw1.describe(\ 其中,expression:是我们要计算的数据窗口表达式,rownumber:行号,它指明针对哪一行计算表达的值。 在这个表达式中,我们可以使用不能直接在脚本中调用的数据窗口画笔函数。

如:string ls_modstring,ls_rownum ls_rownum=string(dw_1.getrow())

ls_modstring=\

parent.title=\该程序是为了在数据窗口的标题栏中显示当前行所在页码。

如:dw1.describe(\/////返回dept_id列当前行数据的显示值。(*如果要计算表达式所有行的时,使rownumber=0即可)

tv_New.Label=ds_yzzl.Describe(\string(i)+\

如:dw1.describe(\计算了dw_1中salary列所有数据值的和,如果表达式无效则返回! 如:if (isrownew(),0,1) //在emp_id 列的值的protect 属性中加上此句,则使得对于新插入的行可以修改此字段,对于已有的行则不可能修改。

is_sql = dw_3.describe(\返回数据窗口控件的指定信息的SQL语句。

如: if(isnull(A), 0,A) + if(isnull(B), 0,B) + if(isnull(C), 0,C) //原: A + B + C

/*dw1.describe(\程序要查看第2列属性 /dw_1.Describe(\+string(i)+\返回第i 列的列名

/this.describe(this.getcolumnname()+\此代码放在数据窗口的某事件下将得到该列的数据类型。 /////////////////////////////

//如果符合条件,则显示灰色的背景,否则白色;

本方法同样可以设置该列的字体颜色:其中“column_name”为列名。

dw_1.object.column_name.background.color = \'string', rgb(192,192,192), rgb(255,255,255))\也可以是一行都变色:

dw_1.object.Datawindow.detail.color = \( fromid = 'string', rgb(192,192,192), rgb(255,255,255))\

///////////////////////////////////////////////////// string ls_columnarr[],text[] long ll_columcount integer li_i

ll_columcount=long(dw1.describe(\ for li_i=1 to ll_columcount

ls_columnarr[li_i]=dw_1.describe(\

if ls_columnarr[li_i]='!' or ls_columnarr[li_i]='?' then continue messagebox(\

text[li_i]=dw1.describe(ls_columnarr[li_i]+\ if text[li_i]='!' or ls_columnarr[li_i]='?' then continue messagebox(\

next

////////////////////////////////以上程序用来显示数据窗口中的字段名和其字段相对应的text文本。 ***************** SQL的应用

1.Datawindow.table.Select

//此属性是定义数据窗口的数据源时生成的sql select 语句的字符串,用户可以用此属性来改变数据窗口的数据源。

如:ls_sql_old=dw_1.object.datawindow.table.select dw_1.object.datawindow.table.select=ls_sql_old+ls_sql dw_1.retrieve()

dw_1.object.datawindow.table.select=ls_sql_old 2.Datawindow.Table.select.attribute //此属性和describe函数一起使用,返回包含数据窗口的pbselect语句字符串,由选中的表名、字段名、where子句及排序标准组成。

*******************************************************************************************************8888888888888

****************************************************************************************8

color1=255 //红色 color2=16711680 //蓝色 color3=65280 //绿色 color=1677215//白色

******************************************************************************************** 请教用oracle备份功能用法

有没有办法只用oracle的sql命令实现如下功能:

按给定条件导出数据库中部分表的部分记录(同时删除所导出的记录)为文件,将来仍可导入进数据库

USERID 用户名/口令 FULL 导出整个文件 (N) BUFFER 数据缓冲区大小 OWNER 所有者用户名列表 FILE 输出文件 (EXPDAT.DMP) TABLES 表名称列表 COMPRESS 导入到一个区 (Y) RECORDLENGTH IO 记录的长度 GRANTS 导出权限 (Y) INCTYPE 增量导出类型

INDEXES 导出索引 (Y) RECORD 跟踪增量导出 (Y) DIRECT 直接路径 (N) TRIGGERS 导出触发器 (Y) LOG 屏幕输出的日志文件 STATISTICS 分析对象 (ESTIMATE) ROWS 导出数据行 (Y) PARFILE 参数文件名

CONSISTENT 交叉表的一致性 (N) CONSTRAINTS 导出的约束条件 (Y) OBJECT_CONSISTENT 只在对象导出期间设置为读的事务处理 (N) FEEDBACK 每 x 行的显示进度 (0) FILESIZE 每个转储文件的最大大小

FLASHBACK_SCN 用于将会话快照设置回以前状态的 SCN FLASHBACK_TIME 用于获取最接近指定时间的 SCN 的时间

QUERY 用于导出表的子集的 select 子句 RESUMABLE 遇到与空格相关的错误时挂起 (N) RESUMABLE_NAME 用于标识可恢复语句的文本字符串 RESUMABLE_TIMEOUT RESUMABLE 的等待时间

TTS_FULL_CHECK 对 TTS 执行完整的或部分相关性检查 TABLESPACES 要导出的表空间列表

TRANSPORT_TABLESPACE 导出可传输的表空间元数据 (N) TEMPLATE 调用 iAS 模式导出的模板名

********************************************************************************************************* sql server 备份

str1=\数据库名+\地址+\sqlcamaster.autocommit=true

execute immediate :str1 using sqlcamaster

*******************************************************************************

****************************************************************************

SetTrans()函数:当对某个数据窗口控件执行SetTrans()函数后,应用程序不需要使用嵌入式SQL语句比如(CONNECT/COMMIT和DISCONNECT)与数据库打交道,每当执行Retrieve()或Update()函数时,数据窗口控件与数据库建立连接和断开连接。

SetTransObject()函数:每次执行Retrieve()或Update()函数时,数据窗口控件不需要与数据库建立连接,完成操作后也不会断开与数据库的连

************************************************************************************ 清园答:

如果要禁止使用中键,则在dw中的other事件里写: if message.number = 522 then return 1 LeonShao答:

顺便和大家说说windows的鼠标系统消息 WM_MOUSEMOVE = 512;鼠标移动 WM_LBUTTONDOWN = 513;左键按下 WM_LBUTTONUP = 514;左键释放

WM_LBUTTONDBLCLK = 515;左键双击 WM_RBUTTONDOWN = 516;右键按下 WM_RBUTTONUP = 517;右键释放

WM_RBUTTONDBLCLK = 518;右键双击

WM_MBUTTONDOWN = 519;中键按下(3键鼠标 Only) WM_MBUTTONUP = 520;中键释放(3键鼠标 Only)

WM_MBUTTONDBLCLK = 521;中键双击(3键鼠标 Only) WM_MOUSEWHEEL = 522;中键滚轮滚动 (3键鼠标 Only) 0))))))))00000000000000))))**************

parent.triggerevent(\**********************************

CAE:计算机辅助设计 CAPP:计算机工艺设计 CAM:计算机自动化制造 PDM:产品数据管理

********************************************************* 如何从客户端获得服务器的时间。

答:ORACLE:select sysdate from sys.dual;

SQLServer、Sybase:select getdate() from tablename; ********************************* lookupdisplay(列名)

//功能:用于显示该列名下的数据的值。 注:不能直接在代码中调用,可以与evaluate()相互配合使用。

如:dw1.describe(\/////返回dept_id列当前行数据的显示值。(*如果要计算表达式所有行的时,使rownumber=0即可)

********************************************

winname.setmicrohelp(string) //指定MDI框架窗口中显示在微帮助栏上和微帮助内容

各种控件的TAG属性都可以用来保存该控件微帮助内容。当这个控件得到焦点时,应用程序可以在该控件的

getfocus事件处理程序中使用setmicrohelp(string)函数显示该控件的微帮助。

********************

window.settoolbar(toolbarindex,visible,alignment,floatingtitle) 功能:设置工具条的特性

window:要设置特性工具条所在 的MDI框架窗口名或工作表名

toolbarindex:int 类型,工具条索引,指定要设置哪个工具条的特性。 ***************************

关于树状视图控件 -----tree view

其中的每一个组成项目称为树状视图列表项目(treeviewitem)简称树状视图或列表项。每个树状视图项由

主题文本和相应的图标构成。只能在程序中为其创建和添加列表项。当打开包含树状视图控件的窗口时,

通常是先生成根级项目(第一层)。然后,当用用户需要查看其下的分支时,通过触发控件的itempopulate

事件向相应的父列表添加下一层的列表项。 1.treeviewitem object (树状视图对象)是构成树状视图控件的主体。其属性: bold: boolean 类型。

childern:boolean 类型,指明该列表项是否有子节点。

classdefinition:poweroject 类型,包含对象的类定义信息。

cuthighlighted:boolean 类型,指明该列表是否是切(CUT)操作的对象 data:any 类型,开发人员希望与列表项一起保存的任何数据。

drophighlighted:boolean 类型,指明该列表是否是拖放(dragdrop)操作的对象

expanded:boolean 类型,指明该列表项是否已经被展开。 expandedonce:boolean 类型,指明该列表项是否是至少已经展开过了一次。(可用于判断该列表项是

否已经填充了子节点项目)

hasfocus:boolean 类型,指明列表项是否能够得到控制焦点。 itemhandle: long 类型,标示该列表项的句柄。 label: string类型,列表项的题文本。

level:integer 类型,指明该节点在树状视图控件中的层次。

overlaypictureindex:integer 类型,指定该列表项所使用的覆盖图标的索引号。该图标显示在列表项图标 的上面,取0时不显示覆盖图标

pictureindex:integer 类型,指明列表项所使用的图图标索引号。相应的图片显示在列表的左边。取0时,不显示

selectpicutureindex:integer 类型,指明该列表项选中时所使用的图标索引号。取0,则该列表被选中时不显示图标图片

selected:boolean 类型,指明相应列表项是否外于被选中状态

statepictureindex:integer类型,指明列表项所使用的状态图标的索引号。 2.几个经常用到的函数 (***注: ItemPopulate 事 件: 该 事 件 在 某TreeViewItem 项 第 一次 展 开 时 触 发, 触 发 的 同 时 系 统 会 将 该TreeViewItem 项 的句 柄 通 过 参 数handle 传 递 过 来。

SelectionChanged 事 件: 该 事 件 在 每 次 变 更 选 择 项 后 触发, 触 发 的 同 时 系 统 会 将 变 更 前 后 选 择 项 的 句 柄 通 过参 数oldhandle、newhandle 传 递 过 来。

treeviewname. getitem(itemhandle,item)//获取句柄为itemhandle的列表项的完整信息

Treeviewname.setitem(itemhandle,item) //设置指定列表的项的数据。

itemhandle:要设置数据的列表项的句柄,item:TReeview 对象,指定新的数据值

一般说来,应用程序使用GETitem()得到某个列表项的数据,修改得到的列表项数据后,使用SETitem()将数据修改反映到树形视图控件中。 如:在树形视图iTEmexpanding 事件中加入:

treeviewitem l_tvi long ll_tvi

ll_tvi=tv_list.finditem(currenttreeitem!,0) //得到当前列表项的句柄

tv_list.getitem(ll_tvi,l_tvi) //得到当前列表项的数据 l_tvi.pictureindex=5 //修改图片索引

l_tvi.selectpictureindex=5

tv_list.setitem(ll_tvi,l_tvi) //更改当前列表项数据

*************************************

treeviewname.selectitem(itemhandle)//选中并加亮显示句柄为itemhandle的列表项的有关数据 (注:itemhandle 为有关列表项的句柄,

item为一个treeviewitem类型的变量。执行成功进返回1,不成功为-1/ treeviewname.collapseitem(itemhandle)//折叠句柄为itemhandle的列表项节点

treeviewname.expanditem(itemhandle) //展开句柄为itemhandle的列表项节点

treeviewname.expandall(itemhandle) //展开itemhandle列表项节点的各级所有子节点项

treeviewname.sort(itemhandle,sorttype)对itemhandle列表项下的子列表进行排序。

treeviewname.sortall(itemhandle,sorttype)对itemhandle列表项下的各级子列表进行排序。

****************8888 1.插入树状视图的项

treeviewname.insertitem(handleparent,handleafter,item)//在指定层次的指定位置插入

treeviewname.insertitemfirst(handleparent,item)//在指定层次的的第一个位置插入

treeviewname.insertitemlast(handleparent,item)//在指定层次的最后一个位置插入

treeviewname.insertitemsort(handleparent,item)//在指定层次插入后进行排序

(explain: handleparent 为所要插入列表项的父节点的句柄(此句柄由相应的itemhandle属性值来确定,对于根节点来说,为0)

handleafter用于指出在同一层次中句柄为handleafter的列表项的后面插入一个新的列表项,item为所要插入的treeviewitem对象)

***特注:使用上格式,要求提供所要插入列表项的完整信息,即:必须先声明一个列表项,然后在指定的层次的适当位置进行插入操作。 ex: treeviewitem tv1

tv1.label=\v1.statepictureindex=0 tv1.overlaypictureindex=1 或者:

treeviewname.insertitem(handleparent,handleafter,lable,pictureindex)//在指定层次的指定位置插入

treeviewname.insertitemfirst(handleparent,lable,pictureindex)//在指定层次的的第一个位置插入

treeviewname.insertitemlast(handleparent,lable,pictureindex)//在指定层次的最后一个位置插入

treeviewname.insertitemsort(handleparent,lable,pictureindex)//在指定

层次插入后进行排序

2.在运行程序中,若要向各图标列表中添加图片文件,可以选择下面函数: treeviewname.addpicture(picturename) //添加列表项图标所对应的图片 treeviewname.addstatepicture(picturename) //添加列表项状态图标所对应的图片(*若成功,返回所加图片的索引号,不成功,返加-1)

(注:在使用上函数之前,可利用控件的picturewidth 和pictureheight 来设置图片的大小

3.查找有关列表项羡并获取其句柄:

treeviewname.finditem(navigationcode,itemhandle) //navigationcoed: treenavigation 枚举类型:

roottreeitem! 查找第一层列表项中的第一个列表项的句柄,如果树形视图中还没有列表项,那么finditem()返回-1

nexttreeitem! 查找与itemhandle列表项同一个父节点中同一层下一个列表项,如还没有下一个列表项,那么finditem()返回-1

previoustreeitem! 查找与itemhandle列表项同一个父节点中同一层上一个列表项,如还没有上一个列表项,那么finditem()返回-1

parenttreeitem! 查找itemhandle列表的父节点,如果itemhandle 列表是第一层的列表项,那么finditem()返回-1

childtreeitem! 查找itemhandle列表的第一个子列表项,如果该列表项被折叠,那么用childtreeitem!参数调用finditem()后,该列表项被展 开,如果没有子列表项,该函数返回-1

firstvisibletreeitem! 找出树形视图控件当前可视区中显示的第一个列表项,而不管该列表项位于哪一层上。树形视图控件上滚动条的位置决 定了哪 一个列表项是第一个可视列表项。

nextvisibletreeitem! 找到itemhandle之后的下一个已展开的列表项,而不考虑层次,当已经达到树形控件的最后一个已展开列表项时,返回-1

previousvisibletreeitem! 找到itemhandle之后的前一个已展开的列表项,而不考虑层次,当已经达到树形控件的第一个已展开列表项时,返回-1

currenttreeitem! 找到当前所选列表项,如果没有当前列表项,则返回-1

drophighlighttreeitem! 找出drophighted属性最近被设置为true的列表项。如果该属性从未被设置过true 或设置true后由于某些操作又将 该属性设为false时,该函数返回-1

//itemhandle: 基准列表的句柄。如果navigationcode 指定关系为roottreeitem!,firstvisibletreeitem! currenttreeitem! 和drophighttreeitem!

那么表项的句柄itemhandle 设置为0

//函数返回值为:long ,如果成功,则返回指定列表表项的名柄

****特注:除了以childtreeitem!调用finditem()函数外,finditem()不查找折叠的列表项。故需要使用其它参数值在所有列表中查找某列表项句柄, 需要使用expanditem() 和expanditemall() *************************************88

*******************************************************

在数据窗口的itemchanged(当数据窗口某一区域内的数据被修改并且失去输入焦点后就会触此事件上),itemerro(数据窗口某一区域内的数据被修改并且失去输入焦点后,数据没有通过该列的合法性校验时)事件中:

三个参数:row:long类型,用来表示用户修改的行号;dwo:dwobject类型,用来表示用户修改过的对象;data:string类型,用来表示用户修改后的数据。 其中itemchanged的返回值为long类型: 0 接受修改后的数据,继续操作,默认值。1:拒绝修改后的数据,不允许切换输入焦点。 2:拒绝修改后的数据,但允许切换输入焦点。

itemerro的返回值为long类型: 0:拒绝修改后的数据,并且显示一个错误错误信息框。 1:拒绝修改后的数据,但不显示一个错误错误信息框。 2:接受修改后的数据。 3:拒绝修改后的数据,但允许输入焦点的切换。

dberror事件(当一个数据库操作发生错误时,触发此事件)有五个参数: sqldbcode:long类型,用来表示错误代码。当数据库系统中返回时,其返回值有:-1:由于在事务对象中所需的值不存在,从而无法连接数据库。 -2 :无法连接数据库。 -3:在提取数据库后,其它用户更改了数据库的数据,从而使保存操作失败。 -4:在向数据库中写入一个blob类型变量时失败。

sqlerrtext:string类型,数据库 管理系统返回一段错误信息描述。 sqlsynax:string类型,提交数据库管理系统的完整的sql语句。 buffer:dwbuffer类型,用来指明发生错误的行所在缓冲区。(delete! 数据窗口中所有已经被删除的行。filter!,primary!) row:long 类型,表示数据库中发生错误的行号。

返回值: 0 :显示错误信息 1:不显示错误信息。 (**注:默认情况下,如果发生错误,PB会显示一个英文提示,如果提示为汉字则可如: string ls_output

rollback using sqlca;

ls_output=\在当前表第\行下执行sql语句时发生编号为\的错误:\返回的错误解释:\

messagebox(\错误\ return 1

rowfocuschanged事件中的参数:currentrow:long类型,用来表示新的当前的行号。返回值:0表示继续操作。(注:setrow()也会触发此事件。)

*********************************************** dwo: 说明:有若干个数据窗口却传递一个参数时

如:可以找出数据窗口中对象的类型 ls_type = dwo.Type ls_type可能:bitmap (for Picture) button column

compute (for Computed Field) graph groupbox line ole

ellipse (for Oval) rectangle

roundrectangle report tableblob text

datawindow (when the user doesn't click a specific control) 也可得到数据窗口中的列字段名:ls_name = dwo.Name 也可得到具体的数据:ls_data = dwo.Primary[row]

*************************************************8 dwcontrol.setsort(format) //对数据窗口排序 format: string 类型,可以用列号(列号前加#)或列名 如果,不输入条件,则PB提示用户 输入 。 如: string newsort

newsort=\ dw_emp.setredraw()

dw_emp.setsort(newsort) dw_emp.sort()

dw_emp.setredraw(true)

dw_emp.groupcalc()//保持正确的数据分组 *********************************************8 dw1.getitemstatus()

//返回指定缓冲区中指定行,列数据项的修改状态,有效值为:DataModified!,new!,newmodified!,notmodified! datamodified! 自数据检索后,指定列或指定行中包含了某些列的数据已被修改 new! 指定的行是新插入的行,但还没有为其任意一列设置值。只能适用于行,而不适用于单独的列。

newmodified! 指定行是新插入的行,并且其中的某些列已经被设置了新值。除了用户输入和程序中使用SETITEM()修改数据后得到该状态外, 当行中某列有缺省时,新插入的行也将得到NEWMODIFIED!状态。该只能适用于行,而不适用于单独的列。

对于主缓冲区或者过滤缓冲区,若其状态为newmodified!的行的UPDATE()执行INSERT,而对于DataModified!则UPDATE()执行UPDATE()

对于删除缓冲区来说,new!,newmodified!状态执行UPDATE()不运行UPDATE()或DELETE()

如:dw_1.GetItemStatus ( dw_1.GetRow () , 0, Primary! ) //0表示所有列 **************************** dw_1.resetupdate()

//清除数据窗口控件主缓冲区、过滤缓冲区的更新标志并清空删除缓冲区。 如果想在一个事务中更新多个数据窗口时,那么应用程序可以在更新每个数据窗口时都不清除更新标志。当所有的数据窗口都成功完成后,对

每一个数据窗口调用RESETUPDATE()来清除更新标志。如果某个数据窗口的更新失败时,应用程序可以保留更新状态,提示用户更正错误后,

重新来更新数据窗口。 如:更新两个数据窗口对象 int li_rt

dw1.settrans(sqlca) dw2.settrans(sqlca)

li_rt=dw1.update(true,false) if li_rt=1 then

li_rt=dw2.update(ture,false)

if li_rt=1 then //两个数据窗口都更新成功后清除更新标志并提交修改。

dw1.resetupdate() dw2.resetupdate() commit;

else //第二个数据窗口更新失败回滚事务 rollback; end if end if

dw1.find()

//用法一:当数据窗口不是RICHTEXT风格时,在数据窗口控件中找满足条件的值。

dw1.find(expression,start,end)

expression:一个字符串,用于指定查找的条件。start:开始行,end :结束行

返回值:long :返回指定范围内满足条件的第一个数据行的行号。如果找到则返回行号。(注:要防止死循环了) 如: long ll_find=1,ll_end

ll_end=dw1.rowcount() ll_find=dw1.find(searchstr,ll_find,ll_end)

do while ll_find>0

//***********处理找到的行 ll_find++

if ll_find>ll_end then exit //防止死循环。 ll_find=dw1.find(searchstr,ll_find,ll_end) loop

********************************************* treeview.getitem(itemhandle,item)

//itemhandle:要得到完整信息的列表项的句柄。 item: 用于保存指定列表项的完整信息。

成功时,返回 1,错误时,返回 -1

用此函数可以得到指定列表项的完整信息,如标题,句柄,使用图片索引等。这样,应用程序可使用setitem()函数来完成列表项的修改与更新。 ******************************************************

dw_1.rowsmove(startrow,endrow,buffer,targetdw,beforerow,targetbuffer)

//将一个数据窗口控件中指定的行移动到指定的另一个数据窗口,或者将同一个数据窗口的控件中一个缓冲区的指定行移动到另一个缓冲区 startrow:long 类型,指定要移动的一组数据行的第一行 endrow: long 型 ,指定要移动的一组数据的最后一行

buffer: dwbuffer 型 ,指定从哪个缓冲区中移动行。其值为: priamry!,delete! filter!

targetdw:要把数据移动到的目的数据窗口名称。

beforerow:long 类型,指定移动的数据行插入到目的数据窗口的哪一行前面。

targetbuffer:指定移动的数据放置到目的数据窗口控件的哪个缓冲区中。 返回正确时为1,错误 为-1。 该函数通常用于:

(1):从数据窗口的主缓冲区中移动多行数据到删除缓冲区,以此代替一次删除一行数据。

(2):把删除缓冲区中的数据移动到主缓冲区中,这样就可以在应用程序中实现 恢复功能(UNDO)

如:dw_1.rowsmove(1,dw_1.deletedcount(),delete!,dw_1,1,primary!) *********************************************** relativedate(date,n)

功能得到指定日期前多少天或后多少天的日期。

参数date:Date类型,指定基准日期n:integer类型,指定天数返回值Date。当n的值大于0时返回参数date指定日期后第n天的日期;

当n的值小于0时返回参数date指定日期前第n天的日期。如果任何参数的值为NULL,则RelativeDate()函数返回NULL。

************************************************** 获得数据窗口的所有行:dwcontrol.Object.Data {.Primary } {.datasource }.Selected

datasource(optional) Current 或Original 如:dw_1.Object.Data.Selected

dw_1.Object.Data.Primary.Selected dw_1.Object.Data.Current.Selected

dw_1.Object.Data.Primary.Current.Selected ********************************

DW1.SETdetailheight(startrow,endrow,height) //设置指定范围内每行的高度.

如:dw1.setdetailheight(2,3,0) //将数据窗口中的第2,3行的高度设为0,这样用户就看不见了。

******************************************* dw1.settext(text)

//将“漂浮”在数据窗口控件当前行,当前列上的编辑框上的内容换为指定文本。text:希望放到编辑 框中的文本。

成功时返回1,失败时返回-1 如:string ls_item_no

if dwo.name='p_2' then open(w_gycx)

ls_item_no=message.stringparm

if ls_item_no=\ this.setcolumn(\ this.settext(ls_item_no) this.accepttext() end if

***********************************8 dw1.isselected(row)

eg: integer currow boolean result currow=dw1.getrow()

dw1.selectrow(currow,not dw1.isselected(currow))

*********************************************************

函数DirList以满足条件的文件名填充列表框的列表项,其使用方法如下: listboxname.DirList(文件模式,文件类型{,statitext})

文件模式:STRING 类型,通常使用掩码表示(比如:*.INI、*.text) 其中文件类型的值如下所示:

0 可读/可写文件; 2 隐含文件; 16 子目录 ;16384 驱动器

1 只读文件; 4 系统文件; 32 归档文件; 32768 除可读/可写外所有类型. 如果想在列表框中同时列出几种类型的文件,那么通过把代表各类型的数值相加来指定。如0+16+16384时,下拉列表框列出可读/可写文件、子目录以及驱动器

statictext:可选项,指定要显示当前驱动器的静态文本(statictext)控件名。 返回值:BOOLEAN,如果指定的搜索路径有效,并用指定项填充了列表框后,返回TRUE。 如:lb_1.dirlist(\在下拉列表框中填充可读/可写类型文件的文件名(文件名须与C:EMPLOYEE*.TEX\匹配)

******************************************************** listboxname.dirselect(seletion)

//当列表框用DIRLIST()填充后,该函数得到用户的选择并将其放入指定的变量中

参数:selection:string类型,用于保存用户选择的带路径的文件名。 返回值 :boolean.当用户的当前选择是驱动器字符或目录时,该函数返回TRUE,当用户的当前选择是个文件时,返回FALSE。

如:下面代码是列表框SELETIONCHANGED事件处理程序的一部分,它使用DIRSELECT()来检测用户选择了是否一个文件。如果不是的话, 代码就

把目录名与文件模式拼接起来,之后调用DIRLIST()使用满足条件的文件名填充列表框,并把当前驱动器和目录显示在静态文本控件ST_FILEPATH中: string ls_filename,ls_filespec=\if lb_1.dirselect(ls_filename)then //如果ls_filename不是文件,那么将目录与文件模式拼接起来

ls_filename=ls_filename+ls_filespec

lb_1.dirlist(ls_filename,16400,st_filepath)

end if

***************************************************************************

listviewname.finditem(startindex,label,partial,wrap) //查找满足指定条件下的一个列表项。

startindex:列表项索引号,指定从哪个列表项开始查找。 label:string 类型,指定查找目标。 PARTIAL:BOOLEAN类型,当设为TRUE时,使用部分匹配

查找。 wrap:boolean类型,当为TRUE时,查找到最后一个列表项后,将从头开始继续查找。

返回 INTEGER。返回与LABEL参数匹配的列表项的索引号,不成功则返回-1。

要想使从头开始查找,那么STARTINDEX 的值为0。 如:listviewitem l_lvi long ll_find

ll_find=lv_1.finditem(0,\你好\ if ll_find=-1 then

messagebox(\出错\未找到指定的列表项\ else

lv_1.getitem(ll_find,l_lvi) l_lvi.hasfocus=true l_lvi.selected=true

lv_1.setitem(l_find,l_lvi) end if 语法二:

lv.finditem(startindex,direction,focused,selected,cuthighlighted,drophighlighted)

direction: 指定查找方向。有效值: directionall! 全部查找;

directionup! 向上查找,directondown! 向下查找;directionleft!向左,directonright! 向右

focused:boolean ,当为TURE时,查找下一个具有焦点的列表项。 selected:为ture时,查找下一个选中列表项。

cuthighlighted:为ture时,查找下剪切操作对象的下一个列表项 drophightlighted;为true时,查找被拖曳对象的下一 个列表项。 ____________________________________________________________________ listviewname.getitem(index,item)

//index:列表项索引,指定要得到其状态信息的列表项

item:listviewitem类型,用于保存指定列表项的状态信息。 成功时,返回1;不成功为-1 如:listviewitem lvi_1

lv_list.getitem(lv_list.selectedindex(),lvi_1) lvi_1.statepictureindex=2

lv_list.setitem(lv_list.selectdindex(),lvi_1) ***********************************************888

Send(handel,messageno,word,long)

//向窗口发送指定的消息并立即执行相应的事件处理程序

handle:long类型,指定窗口的系统句柄,将向该窗口发送消息。messageno:unsignedinteger类型,指定要

发送的消息号。 word:long 类型,指定与消息一起发送的word类参数值。如果Messageno参数指的消息不使

用该参数,那就将其设为0。long:long/string类型,指定与消息一起发送的LONG型参数值或字符串返回值long.

在函数执行成功 时返回WINDOWS系统的SENDNESSAGE()的返回值 ,发生错误时返回-1。

用法:Send()函数用于向窗口发送非PowerBuilder预定义事件的消息,这个窗口可以是PowerBuilder应用的窗口,也可以是其它应用的窗口。 Send()函数直接触发指定窗口相应的事件,执行事件处理程序后返回到调用应用中,这一点与Post()函数不同,Post()函数把发送的消息放置

在指定窗口消息队列的尾部,然后返回到应用程序中,它并不等待相应事件事件处理程序的执行。因此,我们说Post()函数采用的是异步方式,

Send()函数采用的是同步方式。Send()函数的参数handle指定接收消息的窗口句柄,对PowerBuilder窗口来说,使用Handle()函数可以得到该句柄。 对其它应用程序的窗口来说,可以调用系统API函数查找窗口并得到相应窗口的句柄。实际上,Send()函数把它的各个参数直接传送给Windows的系统

调用SendMessage()。在各种C++开发工具的WINDOWS.H文件中可以查到各消息编号。如果应用程序要发送PowerBuilder定义事件(包括预定义事件和用户定义事件),

那么使用TriggerEvent()函数既简单有方便。当应用程序在long参数位置指定一个字符串时,Send()函数复制一个该字符串的副本,然后将副本的地址传送给指定窗口。

如:Send(Handle(lv_1), 277, 0 ,0)//向上滚动 ************************

registryset(key,valuename,valuetype,value) //在系统注册库中设置或创建指定键。

key:指定键名。valuename:string 类型,指定要访问值的名称。每个键可以有一个未命名的值和多个命名的值。要访问未命名的值,把该参数指定为空字符串。

如果注册库中不存在指定值名,该函数将创建新的值名.

valuetype:可能值为:regstring!以字符结束的字符串。regeexpandstring!以空字符结束的字符串,其中包括了对环境变量的非扩展应用。RegBinary!二进制数据

ReguLong!32位数据,ReguLongBigEndian!32位大数据,RegLink!Unicode符号链,RegMultiString!动态字符串数组,为了唯一地标识某个键,在key参数中,可以从根键开始依次指定各级父键,各键之间使用反斜杠()分隔。 value:要设置的值,其数据类型应该与valuetype参数指定的类型相匹配。

********************************************************************************************** 使用存储过程有以下的优点:

* 存储过程的能力大大增强了SQL语言的功能和灵活性。存储过程可

以用流控制语句编写,有很强的灵活性,可以完成复杂的判断和较复杂的 运算。

* 可保证数据的安全性和完整性。

# 通过存储过程可以使没有权限的用户在控制之下间接地存取数据 库,从而保证数据的安全。

# 通过存储过程可以使相关的动作在一起发生,从而可以维护数据 库的完整性。

* 再运行存储过程前,数据库已对其进行了语法和句法分析,并给出

了优化执行方案。这种已经编译好的过程可极大地改善SQL语句的性能。 由于执行SQL语句的大部分工作已经完成,所以存储过程能以极快的速度执 行。

* 可以降低网络的通信量。

* 使体现企业规则的运算程序放入数据库服务器中,以便: # 集中控制。

# 当企业规则发生变化时在服务器中改变存储过程即可,无须修改

任何应用程序。企业规则的特点是要经常变化,如果把体现企业规则的运 算程序放入应用程序中,则当企业规则发生变化时,就需要修改应用程序 工作量非常之大(修改、发行和安装应用程序)。如果把体现企业规则的 运算放入存储过程中,则当企业规则发生变化时,只要修改存储过程就可 以了,应用程序无须任何变化。

***************************************************** **************

如何带参数执行SQL的系统储存过程?

问:我想在script中执行Sp_DropUser系统存储过程删除MS SQL Server 7某用户。我是这样写的:execute Sp_DropUser(Sp_DropUser语法),编译提示Sp_DropUser为未定义的系统存储过程。 答:string ls_name ls_name = 'username'

dECLARE dropUser_proc PROCEDURE FOR Sp_DropUser @name_in_db =:ls_name; SQLca.AutoCommit = TRUE EXECUTE dropUser_proc ; SQLca.AutoCommit = false

*************************************************** ORACLE 创建存储过程的语法为:

create [or replace] procedure 过程名

参数1 [in|out|in out] 数据类型

[,参数2 [in|out|in out] 数据类型]... {is|as} pl/sql 语句

create procedure update_log is begin

insert into update_tab(use_name,update_date,operation) values(user,sysdate,'update') end;

然后可在恰当的位置调用这个存储过程来记录用户对表的修改.如在在表SAL_comm上建立一个解发器,

每当用户修改数据库的重要数据时,即把用户的用户名和日期和操作类型记录在表update_tab中

create trigger audit_update after update on sal_comm for each row begin

update_log is end

**************************************** Sybase的存储过程

SYBASE可以用CREATE PROCedure命令生成存储过程: CREATE PROCedure 存储过程名 [;number]

[[(] @parameter_name datatype [=default] [OUTput]

[, @parameter_name datatype [=default] [OUTput]]...[)]] [WITH RECOMPILE] AS SQL_statements

//下面是一个查询作者编码,名称,生日的在、存储过程: create proc p_auths@author_code varchar(10) as

select author,name,birthdate from auths

where author_code=@author_code 下面执行过程

p_auths @author_code=A00001

在CREATE PROC语句中,可以为参数赋缺省值,该值可以是任何常量。 当用户不提供参数值时,该值便作为参数值提供给过程。 *************** pb中使用存储过程:

a.在 DECLARE LOCAL External functions 中声明

<1>.语法一: FUNCTION rtndatype functionname({{REF}datatype1 arg1,......}) RPCFUNC {ALLIAS FOR \<2>.语法二: SUBROUTINE function({{REF}datatype1 arg1,................}} RPCFUNC {ALIAS FOR \

//rtndatatype:说明存储过程的返回值类型; REF:关键字,指明参数以引用方式传递。若少了此字,则以值传递。

RPCFUNC: 关键字,指明该说明是数据库的存储说明,而不是动态链接库的说明。ALIAS FOR \可选项,spname是开发人员为该存储过程起的别名,代码中可以使用。 如:*********声明

FUNCTION double GIVE_RAISE(REF double salary) RPCFUNC ALIAS FOR \

*******************代码中调用 double val=2000 double rv

rv=SQLCA.give_raise_proc(val) b.调用

************************* 在PB中调用存储过程例子

1.在SQL SEVER 数据库后定义存储过程 CREATE PROCEDURE p_cw_hktotal_byclient --按客户统计提货单

@a_com_id char(4),

@a_st_date varchar(256), @a_en_date varchar(256) as begin

select @a_st_date=convert(datetime,@a_st_date) select @a_st_date=convert(datetime,@a_st_date)

--创建统计临时表 create table #salt_total(com_id varchar(4) NOT NULL,client_id varchar(7) NOT NULL,

sl decimal(14,3) NULL,my decimal(14,3) NULL,sy decimal(14,3) NULL,

PRIMARY KEY NONCLUSTERED (com_id,client_id))

--结清

insert into #salt_total select

com_id ,client_id,sum(ord_q),sum(ord_std_mny),sum(ord_real_mny) from salt05

where com_id=@a_com_id and set_date between @a_st_date and @a_en_date

and (bill_typ in('FXTD','FXTH','HZTD')) and upper(ord_stu) = 'Q' group by com_id,client_id

--输出

select com_id,client_id,

sl=case when (sl is null) then 0.00 else sl end,my=case when (my is null) then 0.00 else my end,sy=case when (sy is null) then 0.00 else sy end

from #salt_total

order by com_id,client_id

end GO

2.在PB数据窗口中定义执行语句如下:

execute dbo.p_cw_hktotal_byclient;1 @a_com_id = :a_com_id, @a_st_date = :a_st_date, @a_en_date = :a_en_date

(其中:a_com_id,a_st_date,a_en_date为数据窗口中的参数)

******************************************************************** ORACLE产生数据库触发器的语法为:

create [or replace]trigger 触发器名 触发时间 触发事件 on 表名

[for each row] pl/sql语句

触发器名:触发器对象的名称。由于触发器是数据库自动执行 的,因此该名称只是一个名称,没有实质的用途。 触发时间:指明触发器何时执行,该值可取: before---表示在数据库动作之前触发器执行; after---表示在数据库动作之后出发器执行。

触发事件:指明哪些数据库动作会触发此触发器: insert:数据库插入会触发此触发器; update:数据库修改会触发此触发器; delete:数据库删除会触发此触发器。 表 名:数据库触发器所在的表。

for each row:对表的每一行触发器执行一次。如果没有这一 选项,则只对整个表执行一次。

如下:下面触发器在更新表auths之前触发,目的是不允许在周未修改表 create trigger auth_secure

before insert or update or delete //对整个表更新前触发 on auths begin

if (char(sysdate,'dy')='sun'

raise_applicton_error(-20600,'不能在周未修改表auths\

end if end

******************************************* SYBASE数据库触发器

SYBASE产生触发器的语法为: CREATE TRIGGER 触发器名 ON 表名

FOR INSERT,UPDATE,DELETE AS

SQL_statement | FOR INSERT,UPDATE AS

IF UPDATE(column_name) [AND|OR UPDATE(column_name)]... SQL_statements

上面OR子名用来指定在触发器上的哪些数据更新命令可激活该

触发器。IF UPDATE子句检查对指定列的操作类型,在IF UPDATE子句 中可指定多个列。

与ORACLE不同,对于每条SQL语句,触发器只执行一次。触发器 在数据更新语句完成以后立即执行。触发器和启动它的语句被当作一 个事务处理,事务可以在触发器中回退。 如:create trigger forinsert_books on books for insert as

if (select count(*) from auths,inserted

where auths.author_code=insert.author_code)!=@@rowcount begin

rollback transaction

print \表中 author_code 列的值在auths 表中不存在。\ end

@@@@@@@@@@@@@@@

在PB中调用屏蔽/恢复触发器方式如下: EXECUTE IMMEDIATE \TableName ENABLE TRIGGER\DISABLE TRIGGER\

************************************************************* dw.update({accept{,resetflag}})

//accept:boolean类型,指定数据窗口控件在更新数据库之前是否自动执行accepttext()的功能,并把编辑框中的内容放置到缓冲区中(缺省为true) resetflag:boolean类型,指明更新数据库后是否自动复位更新标志(缺省为true)

******************************************************* relativedate(date,n)

//得到指定日期前多少天或后多少天。

n:integer类型,指定天数返回值Date。当n的值大于0时返回参数date

指定日期后第n天的日期;当n的值小于0时返回参数date指定日期前第n天的日期。如果任何参数的值为NULL,则RelativeDate()函数返回NULL。

**********************************************************************************88 keydown(keycode)

//决定用户是否按了相应键。

如:KeyDown(keya!)//用来判断用户是否了按了a(A)

********************************************************************* dwprimary.sharedata(dwsecondary)

//功能:在主数据窗口和从数据窗口之间共享数据。 dwprimary:用于主数据窗口的数据窗口控件名。dwsecondary:从数据窗口控件名,该数据窗口控件与主数据窗口控件共享数据。

用法:使用此函数此,要求主数据窗口控件与从数据窗口控件中的数据窗口对象列必须相同,但各自使用的SELECT语句可以不一样。由于数据窗口并不检索数据,因此,两个数据窗口中的数据均由主数据窗口的WHERE子句来实现。 另注:要终止数据窗口的数据共享,调用sharedataoff()。

**************************************************************

dw1.rowscopy(startrow,endrow,copybuffer,targetdw,beforerow,targerbuffer)

//功能:将一个数据窗口控件中指定的行复制到另外一个数据窗口,或将数据窗口控件中一个缓冲区的指定行复制到另外一个缓冲区

copybuffer:dwbuffer类型,指定从哪个缓冲区复制行。其取值为:primary!,delete!,filter!

targetdw:dwbuffer类型,指定复制的数据放置到目的数据窗口控件的哪个缓冲区中。有效取值为:同上

beforerow:long 类型,指定复制的数据插入到哪一行前面。 返回: 1 success,-1 fail

用法:使用些函数把某些复制到目的数据窗口控件后这些行行的修改状态为:newmodified!(注:使此函数复制数据时,对于目的数据窗口控件来说,下拉数据窗口风格的列中的数据并不会自动检索出来,应用程序必须对目的数据 窗口中这些列明确执行retrieve() 例:

dw_1.rowscopy(dw_1.getrow(),dw_1.rowcount(),primary!,dw_2,1,primary!) //把数据窗口dw_1中当前行之后的所有行复制到第二个数据窗口dw_2的主缓冲区中。

********************************************************************************************

****************************************** 使用windows系统对话框

1.GetFileopenname(title,pathname,filename{,extension{,filter}})

//功能:显示打开文件对话框,允许用户选择文件,并可以设置文件名的过滤方式。

title:string类型,表示对话框的名字。pathname:string类型,用来保存用户选择文件的和文件名。extension:string类型,可选项,使用1到3个字符

指定缺省的扩展文件名,filter:string类型,可选项,其值为文件名掩码,指定显示在该对话框的列表框中供用户选择的文件名满足的条件。 返回值:1 成功,-1错误,0 用户没选择任何文件。 如:string docname,named integer value

value=getfileopenname(\选择文件\files(*.txt),*.txt,doc files(*.doc),*.doc\ if value=1 then

fileopen(docname) end if

2.GetFileSaveName(title,pathname,filename{,extension{,filter}}) // 功能:显示保存文件对话框,让用户选择要保存到的文件。 title:string类型,指定对话框的标题. pathname:string类型变量,用于保存该对话框返回的文件路径及文件名.filename:string类型变量,用于保存该对话框返回的文件名.

extension:string类型,可选项,使用1到3个字符指定缺省的扩展文件名,filter:string类型,可选项,其值为文件名掩码,指定显示在该对话框的列表框中供用户选择的文件名满足的条件

(比如*.*,*.TXT,*.EXE等)返回值Integer。函数执行成功时返回1;当用户单击了对话框上的“Cancel”按钮时函数返回0;发生错误时返回-1。如果任何参数的值为NULL,那么GetFileSaveName()函数返回NULL。

如:if GetFileSaveName(\保存文件\文件,*.xls\将dw_1保存到filname中 dw_1.saveas (FileName,excel!,false) end if

**********************************************************************************************

dw_1.saveas({filename,saveasytpe,colheading})

//功能:将数据窗口控件的内容保存到指定格式的文件中

filename:string类型,其值是用来保存数据窗口内容的文件的文件名。 savaastype:其值可为:clipboard! (剪贴板),excel! ,excel5!,html table!,text!,dbase2!等。

colheading:boolean类型,指示是否在文件的开头加上数据窗口的标题,默认值为:true

返回:1 成功,-1 失败

****************************

FileOpen(filename{,filemode{,fileaccess{,filelock{,writemode,{creator,filetype}}}}})

//功能:以指定的读写方式打开指定的文件,同时返回该文件的句柄。

filename:string类型,指定要打开文件的名称,其中可以包含路径;filemode:FileMode枚举类型,可选项,指定文件打开方式.LineMode! - 缺省值,行模式 ,StreamMode! - 流模式;fileaccess:FileAccess枚举类型,可选项,指定文件访问方式。有效取值为:Read! - 缺省值,只读方式,这样打开的文件只能进行读操作;Write! - 只写方式,这样打开的文件只能进行写操作.

filelock:FileLock枚举类型,可选项,指定文件加锁方式。有效取值为:n LockReadWrite! - 缺省值,只有打开该文件的用户能够访问该文件,其它用户对该文件的访问均被拒绝;n LockRead! - 只有打开该文件的用户能够读该文件,但其它任何用户均可写该文件;n LockWrite! - 只有打开该文件的用户能够写该文件,但其它任何用户均可读该文件;n Shared! - 所有用户均可读写该文件writemode:WriteMode枚举类型,可选项,当fileaccess参数指定为Write!时,该参数指定在指定文件已经存在时数据的添加方式。有效取值为:?Append! - 缺省值,将数据添加到原文件尾部;?Replace! - 覆盖原有数据creator:可选项,用于Macintosh机,使用四个字符的字符串指定文件的创建者。指定该参数后,必须同时指定filetype参数filetype:可选项,用于Macintosh机,使用四个字符的字符串指定文件类型返回值 返回值为:integer类型,成功时,返回打开文件的句柄。

***************************************************************************

filerwrite(fileno,variable) //向指定文件中写数据

fileno:integer类型,指定文件句柄(由FileOpen()函数得到)。variable:string或blob类型,其值将写入fileno参数指定的文件.

返回值 :integer类型,。函数执行成功时返回写入文件的字符或字节数,发生错误时返回-1。

*****************************************************************************

在数据窗口中的某个对象中的Expression中加入: if (boolean,truevalue,falsevalue)

其中:boolean:为逻辑表达式,如:salary>1000 truevalue:为string类型,其值表示为当前面的逻辑表达为true时返回的值。falsevalue:为string类型,其值表示为当前面的逻辑表达为false时返回的值。 例如:if (salary>1000,\雇主\服务员\ 如果工资salary>1000时,返回雇主,否则为服务员。

另外:if (salary>1000,\大老板\中老板\小老板\:如果工资大于1000返回大老板,在800~1000为中老板,小于800为小老板

例二:if (sex=\男\将此语句放到(人名列)下border属性中的expresion下,将使所有性别是男的人名显示出边框为5的效果。

例三:IF(MOD(GETROW(),2)=0,RGB(230, 240, 240), RGB(255, 255, 255)) 此语语句放到数据窗口的属性中(datawindow.detail.color)将单数行的数据窗口颜色设为RGB(255, 255, 255),偶数行的设为:RGB(230, 240, 240) ************************************************************** 有关数据窗口对象的访问:

1.使用列名或计算域的名称访问一个数据或者所有数据时的语法:dw1.object.列名.{.buffer}{.datasource}{[rownum]}

buffer:primary(default),delete,filter datasource://可选项,指定数据来源。取值:current:(default)数据窗口控件占的当前值;original:从数据库中最初检索到的数据值。对于计算域来说,必须指定为此参数。

rownum:为optial项,要访问的数据所在的行号。如果要访问某一列的所有数据,可省略此参数。但是必须指定datasourc和buffer中的一个。 如:string

ls_namearray[] ls_namearray=dw_1.object.emp_name.current //得到数据窗口主缓冲区中emp_name列所有的当前值,并存于数组中。

ls_namearrary=dw_1.object.emp_name.original //得到数据窗口主缓冲区中emp_name列中的原始值(从数据库中提取到的值,用户未作修改)存于数组。

(*注:dw_1.object.emp_name 却不是数据,而为dwobject类型,引用了数据窗口dw_1中的列对象。

2.访问列名指定列中用户选中的数据的语法:dw_1.object.列名{.primary}{.datasource}.selected

primary:可以不写。datasourc: 指定数据来源。有取值为:取值:

current:(default)数据窗口控件占的当前值;original:从数据库中最初检索到的数据值。对于计算域来说,必须指定为此参数。

selected:必须写,说胆要得到指定列所选行的数据。 返回值:返回一个数组,该数组中的每一个值的类型都与列的数据类型相同。 如:dw_1.object.emp_name.selected 与

dw_1.object.emp_name.primary.selected ,dw_1.object.emp_name.current.selected,dw_1.object.emp_name.priamry.current.selected 都等价 //都访问emp_name列所行选行的当前数据。

如:string ls_emp_name[] ls_emp_name[1]=\张三\

dw_1.obect.emp_name.selected=ls_emp_name // 将所选行第一行的emp_name 列设置为“张三”,其它行的emp_name不变。 如:string

ls_emp_name[] ls_emp_name=dw_1.object.emp_name.original.selected //得到所选行emp_name列的值,并将其保存到一个字符串数据中。

3.访问列名指定列中的某个范围的数据:. 要访问的由列名指定的列在某些连续行中的数据格式:dw_1.object.列

名.{.buffer}{.datasource}[startrownum,endrownum] 如:

dw_1.object.emp_name.primary.current[1,dw_1.rowcount()] //返回emp_name列所有在主缓冲区的当前值。 .使用列号访问单个数据:

dw1.object.data{.buffer}{.datasourc}[rownum,colnum]

如:dw1.object.data.primary.current[1,2] //访问数据窗口在主缓冲区的第一行每二列单元的当前值。

. 使用列号和行号访问一组数据:

dw1.object.data{.buffer}{.datasource}[startrownum,starcolumn,endrownum,endcolnum]

如:dw_1.object.data[1,1,20,5] //访问数据窗口当前缓冲区 如:integer li_filenum long

ll_deleterows str_namelist lstr_naemlist[] //结构数组,存储人员编号和姓名

ll_deletedrows=dw_1.deletedcount() lstr_namelist=dw_

1.object.data.delete[1,1,ll_deletedrows,2] //得到删除缓冲区中所有数据

li_filenum=fileopen(\

for ll_count=1 to upperbound(llstr_namelist) filewrite(li_filenum,string(lstr_namelist.id)+\ next

fileclose(li_filenum)

//////////////假设人员编号和人员姓名是数据窗口中的前两列,其功能是得到删除缓冲区中所有的人员编号和姓名,并把它们保存到文本文件deleted.txt中。

.访问一行或所有行数据:

dw1.object.data{.buffer}{.datasource}{[rownum]}

指定行号时,行号要放置在方括号内。此时上表达式返回一个结构,结构中每个元素对应于数据窗口中的每个列,其数据类型必须相同。

如:dw1.object.data[5] //得到数据窗口主缓冲区中第五行数据的当前值

4.访问所选行的数据:dw1.object.data{.primary}{.datasource}.selected 如:dw1.object.data.selected //访问数据窗口主缓冲区中选中行数据的当前值。

*************************************************************************

******************************************************************** 数据窗口对象属性的取值、类型和访问技巧

1.数据窗口画笔表达式 (数据窗口表达式可以是:运算符、数据窗口中控件的名称、数据窗口表达式函数、用户自定义函数。 格式:default~t 数据窗口表达式 //~t 是tab字符,起分隔作用。

如:dw_1.object.emp_name.backgroup.color=\if(address='北京',15790320,1677215)\等价于:在emp_name 列的backgroup.color中设置了:if(address='北京',15790320,1677215) 2.数据窗口属性表达式的基本语法:

dw1.object.dwcontrolname{.property}.property{=value} 其中:dwcontrolname:数据窗口对象中控件的名称。取值为:datawindow、列名、计算域名、gragh,line,oval,picture,rectangle,roundrectangle,report(报表),talbeblod,text控件的名称。

(*注:当dwcontrolname是下拉数据窗口或是报表或是ole对象时,可使用另外一个object关键字和dwobjectname来进一步引用更深层次 嵌套对象属性的要求。

value:当属性要求yes或no这样的值时,value可以是字字符串\

也可是true或false,但属性值总是以\或\来保存。

如:if dw1.object.datawindow.readonly='yes' then ********** //不能写成if dw1.object.datawindow.readonly=true then

*************************************************************************************************************************

******************************************************************* 存储对象的使用:

如: datastore ids_dept

ids_dept=create datastore ids_dept.dataobject=\

ids_dept.settransobject(sqlca) ids_dept.retrieve()

ids_dept.object.data.dept_id[ids_dept.insertrow(0)]='001' ids_dept.setsort(\ ids_dept.sort() destory ids_dept

*******************************************************************************************************

**********8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888 **************8 关于对象的知识:

1.对象的使用:A:声明,B:创建C:释放 如: transacton newtrans 声明

newtrans=create transacton 创建 newtrans.autocommit=true destory newtrans 释放

(注:PB中还提供了废品对象收集功能:基本原理:给对象一个引用计数,当程序代码的运行超出了

对象的某个引用的活动范围时,减少对象的引用计数量;当引用计数量为0时,即表示这些对象和类不再使用。

可以用 garbagecollectgettimelimit()

garbagecollectsettimelimit(),garbagecollect() ) 2.在程序中访问对象的函数和事件的格式:

{objectname}.{type}{ calltype}{ when} function({argumetlist})

当派生对象中的函数和事件覆盖了祖先的函数和事件时,如不做别说明,将执行派生对对象的函数代码。

访问祖先对象中函数和事件的格式:

{objectname}.ancestorclass:{type} {when} function({argumetlist}) 如:w_demo::enent ue_process()

***************************************************************************************************

*******************88888888888888888888888888888888888888888888888 **********************************

********

8888888888888888888888888888888888888888888888888888888888888888888888

动态SQL

类型一://既无输入参参数、也无结果集

语法格式: EXECUTE IMMEDIATE SQLStatement {using transaction object}; 其中:sqlstatement是个字符串,其内容是有效的Sql语句;(这种类型的动态sql通常用于执行数据操作语句(如:定义表、删除表等)以及某数据库特有的Sql语句。

例:string mysql

mysql=\integer notnull,\char(10) not null,\char(20) not null)\

execute immediate :mysql using sqlca; 类型二://有输入参数,但没有结果集

语法格式:prepare dynamicstagingarea from sqlstatement {using transactionobject}; execute dynamicstagingarea using {parameterlist};

其中 dynamicstagingarea 是个动态策略变量(类型为:dynamicstagingarea),通常使用sqlsa; sqlstatement 是个字符串(可以是常量也可以是变量),其内容是有效的sql语句,sql语句中使用(?)代表所需参数;

parameterlist 是参数列表,各参数对应于sqlstatement中的问号。 动态策略区用于准备sql语句及所需参数个数,它的属性在运行时应用程序不能访问,sqlsa是缺省的动态策略区变量。 如: int emp_id_var=56 prepare sqlsa

from \ execute sqlsa using :emp_id_var; 类型三://编译时已经知道参数和结果集的列 a.使用游标格式:

declare cursor //说明动态游标 dynamic cursor

for dynamicstatingarea;

prepare dynamicstagingarea from slqstatement //准备动态策略区 {using transactionobject}; open dynamic cursor //打开语句 {using parameterlist};

fetch cursor into {using Hostvariablelist}; //读取一行数据 close cursor; //关闭

b.使用存储过程(和使用游标格式类似,只是使用execute语句来代替上面的open语句)格式: declare Procedure

dynamic Procedure

for dynamicstatingarea;

prepare dynamicstagingarea from slqstatement {using transactionobject}; open dynamic Procedure

{using parameterlist};

EXECUTE Procedure into {using Hostvariablelist}; close Procedure;

////其中cursor 和procedure 是游标和过程名; dynamicstagingarea是动态策略变量,通常用SQLSA; SQLSatement是字符串(常量或变量均可,变量时变量名前加上冒号(:),其内容是sql语句,并使用问号代表参数;Parameterlist是对应于sqlstatement中问号的参数列表;

hostvariblelist 是powerscript主变量(即在其前面加上冒号的powerscript变量); transactionobject是事务对象名,缺省时用:sqlca 如:

DECLARE my_cursor DYNAMIC CURSOR FOR SQLSA; //1 int emp_id_var

string emp_state_var='MA' STRING Sqlstatement

sqlstatement=\ prepare SQLSA FROM : Sqlstatement; //2

OPEN DYNAMIC my_cursor using :emp_state_var; //3 FETCH my_cursor INTO :EMP_id_var; //4

(示例中略了必要的sql语句执行状态检查工作,应在除了DECLARE语句外,执行了SQL语句后,都应检查sqlcode属性,以判断是否成功 CLOSE my_cursor; //5

类型四://开发程序时不知道参数和结果集 格式:DECLARE CUrsor/Procedure DYNAMIC CURSOR/PROCEDURE FOR DynamicStaginArea;

PREPARE DynamicstagingArea FROM SQLStatement {USING Transactionobject}; DESCRIBE DYnamicstagingArea

INTO DynamicDescriptionArea; OPEN DYNAMIC Cursor

USING DESCRIPTOR Dynamicdescriptionarea}; EXECUTE DYNAMIC Procedure

USING descriptor DynamicDescriptionArea; FETCH Cursor/Procedure

using descriptor Dynamicdescriptionarea; close cursor/procedure;

//DynamicStaginArea:动态策略区变量,通常用SQLSA;SQLStatement:字符串的Sql语句。DynamicDescriptionArea:动态描述区变量,类型

为:DynamicDescriptionArea,通常用SQLDA;Transactionobject:通常用SQLCA;

此动态sql使用了动态描述区对象变量,通过该对象变量的四个属性,

Numinputs,Inparmtype,Numoutputs,outparmtype 我们能够得到输入参数个数,输入参数类型,输出参数个数,输出参数类型信息。其中,inparmtype是个数组,每个元素对应SQL中的一个问号;

可以利用setdynamicparm()具体设置输入的参数值。

(**注:在此语法中,除了declare 语句外,都要检查事务对象的SQLCODE属性,以判断当前sql语句的执行是否成功。**通过多次调用fetch语句,能够读取多条数据,每读出一条数据后,通常在循环语句中使用choose case 确定输出参数的类型后再用相应的函数得到其值。

如:String stringvar,sqlstatement int intvar sqlstatement=\ PREPARE SQLSA FROM :sqlstatement; DESCIRBE SQLSA TNTO SQLDA;

DECLARE my_cursor DYNAMIC CURSOR FOR SQLSA; OPEN DYNAMIC my_cursor DESCRIPTOR SQLDA; FETCH my_cursor USING DESCRIPTOR SQLDA;

//当FETCH语句执行成功时,动态描述区sqlda 中包含了结果集的第一行数据,反复执行fetch可得其它数据。

//SQLDA.NUMoutputs中包含了输出参数的个数。 sqlda.outparmtype数据中包含了各个参数的数据类型。

choose case sqlda.outparmtype[1] case typestring!

stringvar=getdynamicstring(sqlda,1)

case typedecimal!,typedoble!,typeinteger!,typelong!,typereal!,typeboolean!

doublevar=sqlda.getdynamicnumber(1) case typedate!

datevar=sqlda.getdynamicdate(1) case typetime!

timevar=sqlda.getdynamictime(1) end choose

CLOSE my_cursor;

*************************************************************

动态描述区(DynamicDescriptionArea) //在动态SQL语句的第四种语法格式中,PB使用此类型的变量存储有关的输入和输入出的参数的信息。

//对于每一个应有程序来说,PB都提供了一个dynamicdescriptionarea类型的全局变量,名称为:SQLDA

属性: 类型 意义描述

Numinputs INTeger 输入参数的个数。输入参数在动态sql prepare 语句中说明。当执行了descibe 语句后,pb将填充该属性的值。 numoutputs integer 输出参数的个数。输出参数在动态sql prepare 语句中说明。如果数据库管理系统支持输出参数,则执行了descibe 语句后,pb将填充该属性的值。否则,在执行了fetch语句后填充。

inparmtype[] parmtype 一个数组,指示每个输入参数的类型。有效值为:

TypeBollean!,typedata!,typedatetime!,typedatedecimal!,typedouble!,typeinteger!,typelong!,typereal!,typestring!,typetime!,typeuint!,typeulong!,typeunknown.

outparmtype[] parmtype 一个数组,指示每个输出参数的类型,同上。

*********

事件:constructor //在创建该对象时触发 destructor //在删除时触发 ***********函数

1.Dynamicdescriptionarea.getdynamicdate(index) //功能:在应用程序执行了动态sql语句后,使用该函数得到data类型输出参数的数据值。

dynamicdescrptionarea:动态描述区对象名,通常用sqlda index:int类型,指明要得到第几个输出参数的值。(其值不能超过动态描述区对象numoutputs属性的值)

返回值:date.成功时返回index参数指示的输出参数的数据值。错误时返回:1900-01-01

如: for n=1 to sqlda.numoutputs

choose case slqca.outparmtype[n]

stringvar=sqlda.getdynamicstring(n)

case typedecimal!,typedoble!,typeinteger!,typelong!,typereal!,typeboolean!

doublevar=sqlda.getdynamicnumber(n) case typedate!

datevar=sqlda.getdynamicdate(n) case typetime!

timevar=sqlda.getdynamictime(n) case else

messagebox(\不知道是什么数据类型呀\ end choose next

2.sqlda.setdynamicparm(index,value)

//功能:设置动态描述区对象输入参数的值,这些参数将在sql open或sql execute语句中使用。

index:int类型,指明要设置第几个输入参数的值,(其值不能超过动态描述区对象numinputs属性的值) Value:要设置的输入参数的值 返回值: 成功时,1 失败为:-1 如: sqlda.setdynamicparm(1,\北京\将sqlda的第一个参数设置为\北京\

********************************************************************************************8

********************************************************************************************************

libarayexport(librayname,objectname,objecttype)

//功能:从指定应用库中以对象对象的语法定义格式卸出对象。 librayname:string 类型,指定要移出对象的应用库的名称。

objectname:string 类型,指定要移出对象的名称。 objecttype:枚举型。有:exportapplication!,exportdatawindow!,exportfunction!,exportmenu!,exportpipeline!,exportquery!,exportstructure!,exportuserobject!,exportwindow!

返回值:string,发生错误返回\如: string ls_dwsyn,ls_errors

ls_dwsyn=libraryexport(\ dw_1.create(ls_dwsn,ls_errors) //移出d_emp数据窗口的定义,然后在数据窗口控件中创建数据窗口对象。 ***********************

libraryimport(libraryname,objectname,objecttype,syntax,errors{,comments})

//功能:将以语法格式表示的数据数据窗口对象装入到指定的应用库。 librayname:string 类型,指定要移出对象的应用库的名称。objectname:string类型,指定要移入的数据窗口的名称。

objecttype:Importdatawindow!。syntax:string类型,指定要移入数据窗口对象的语法。

errors:string类型,用于在发生错误时保存出错信息。comments:string类型,用于指定移入库的注解。

返回值:int, 成功 为1,错误时为-1。

(*当应用程序在运行过程中动态创建数据窗口对象后,可能使用

liabrayimport()把动态数据窗口的定义保存到应用库中。以后可直接使用该对象了。

如:string dwsysntax,errorbuffer integer rtncode

dwsyntax=dw_1.describe(\

rtncode=librayimport(\wsyntax,errorbuffer)

*************************************************************************

*8888888888888888888888888888888888888888888888888888888888888888888888888

动态创建数据窗口

dw1.create(syntax,{errorbuffer})

//功能:用于动态地创建一个数据窗口。

dw1:表示要放入的数据窗口控件的名字。syntax:是一个字符串类型的变量,表示用来创建数据窗口对象源代码语法。errobuffer:string类型,用来表示错误信息存储的字符串变量名。 返回值:1 成功, -1 失败。

transaction.syntaxfromsql(sqlselect,presentation,err)

//功能:从一个sql select语句和指定数据窗口表现风格来生成数据窗口语法

transaction表示当前连接使用的事务对象名,一般为:SQLCA; sqlselect:string类型,用来生成数据窗口语法的sql select语句;presentation:string类型,用来指定数据窗口的表现风格。err:string类型,用来指定当前出错时错误信息的存放处。

如:string ls_sql,ls_syntax,ls_error_syntaxfromsql,ls_error_create ls_sql=\address.salary>4500\

ls_syntax=sqlca.syntaxfromsql(ls_sql,\_syntaxfromsql)

if len(ls_error_syntaxfromsql)>0 then

messagebox(\ else

dw_1.create(ls_syntax,ls_error_create) if len(ls_error_create)>0 then

messagebox(\ end if end if

dw_1.settransobject(sqlca) dw_1.retrieve()

*********************************************************************

******************************************* dw1.setvalidate(column,text)

///修改数据窗口控件指定列的有效性规则。

column:可为列名,也可用列号。 rule:string类型,其值是评价数据是否有效的有效性规则。

返回值:1 成功,-1 错误。(*当用户输入的值不满足该列的有效性规则时,将触发itemerror事件。如果有效规则中包含了数值,那么数据窗口要求这些数值使用美国格式。

如果要得到当前列的使用的有效规则,可使用:getvalidate(),如得到用户刚刚输入的值,可用gettext().

如:dw1.setvalidate(dw1.getcolumn(),\//把数据窗口的当前列的值限制到必须>0

如:dw1.setvalidate(dw1.getcolumn(),\把保障了用户输入的值<同一行上full_price列的值。 如:string

rule1,rule2=\w1.setvalidate(6,rule2) ************************* dw1.getvalue(column,index)

//功能:得到数据窗口指定列的值表或代码表中指定项的值。

column:得到所需值的列。 index:值表或代码表中数据项的索引号。

返回值:string,成功时返回dw1中column列的值表或代码中索引号为index的数据项的值。如果指定的数据项有个不是实际值的显示值,那么将返回由~t分隔的字符串,~t的左边是

显示值,右边是实际的数据值。(*使用此函数得到下述数据窗口对象列编辑风格的值或代码表指定项的值:

checkbox,radiobutton,dropdownlistbox,editmask,edit。如果

列编辑风格的代码包含了显示值和数据值,那么用此函数可以同时得到这两个值。

如:string status status=dw1.getvalue(7,3) //得到dw1第7列中第三个数据项的值。

****************************

dw1.setvalue(column,index,value)

//功能:设置数据窗口控件指定列的值列表或代码表中指定项的值。

column:指定包含值列表或代码表的列。该列的编辑风格应该是下拉列表框风格(dropdownlistbox),编辑(edit)风格或单选钮(radiobutton)风格。对于editmask和dddw的列的风格,此函数不起作用。

value:string类型,其值是指定列表项的新值。对于代码表来说,使用(~t)来分隔显示和数据值如:\北京~tBJ\

如:dw1.setvalue(\北京市~tBJ\把dw1中emp_state列的第三个数据项的显示值设为'北京市',其数据值高为“BJ”

如: ////// 把数据窗口dw1的列product_col填充数据,此列为dropdownlistbox

integer prod_code,i=1 string pro_name declare prodcur cursor for

select product.name,product.code from product using sqlca; connect using sqlca; if sqlca.sqlcode<>0 then

messagebox(\状态信息\连接失败,出错原因:\ return end if

open procur;

if sqlca.sqlcode<>0 then

messagebox(\状态信息\不能打开游标,出错原因:\ return end if

fetch prodcur into :pro_code,:pro_code; do while sqlca.sqlcode=0

dw1.setvalue(\ i=i+1

fetch prodcur into :prod_name,:prod_code; loop

close prodcur;

disconnect using sqlca;

(graphicobject是所有控件的祖先对象)

**************************** dw1.settext(text)

//功能:将“漂浮”在数据窗口控件当前行、当前列上的编辑框上的内容替换为指定文本。

text:string类型,希望放到编辑框中的文本,其值必须与当前列的数据类型兼容。

(*在执行此函数后,数据窗口将执行itemchanged或者itemerror事件。 如:dw1.settext(\北京\********************************** relativedate(date,n)

//功能:得到指定日期前多少天或后多少天的日期。 data:date类型,指定基准日期,n:integer类型,指定天数返回值date。当n>0时,指定日期后的第N天的日期;当n<0时,返回前第n天的日期。 ****************************** dw1.replacetext(string)

//功能:用指定字符串代替“漂浮”在当前行/列上的编辑框中所选内容。 string:string类型,要取代所选文本的字符串。

返回值:integer类型,成功时,返回string参数的字符个数。错误时为:-1 如果没有文本被选中,replacetext将string参数的内容插入到插入点所在位置。要插入剪贴板的内容,可以用past(). ******************************* dw1.reselectrow(row)

//功能:对指定的行访问数据库,重新提取所有可更新列的值,并刷新新数据窗口控件中所有时间戳列。

row:指定要重新检索数据的行。 如: if dw_1.update()<0 then

dw_1.reselectrow(dw_1.getclickedrow())

end if //在更新数据库失败时,重新选择用户单击行的数据。

***********************************************

function ulong setcapture(ulong a) library \function boolean releasecapture() library\boolean rtn

ulong l_loop,u_test,u_long u_test=handle(parent)

u_long=setcapture(u_test) setpointer(sizenwse!) for l_loop=1 to 150000 next

rtn=releasecapture()

******************************** setcurrentdirectorya() //设置当前目录

function boolean setcurrentdirectorya(ref string cdir)library\boolean rtn string l_dir

l_dir=\

rtn=setcurrentdirectorya(l_dir)

messagebox(\************************************ 在run语句之后判断该程序是否执行完毕 蔡毅答:

在run语句之后判断该程序是否执行完毕。

定义外部函数:

Function long FindWindowA (String lpClassName , String lpWindowName ) Library \

Function boolean IsWindow (Long hwnd ) Library \

脚本:

run(\c:gzhz.prg\

ll_handle = 0 //循环至窗口打开

Do While ll_handle = 0

ll_handle = FindWindowA(\应用的窗口名\yield() // loop

//等待窗口关闭

Do While isWindow(ll_handle) Yield() Loop

(继续下面的语句)

))))))))))))))))))))))))))000000))))))))000 如何关闭打开的dos窗口?

问:如何关闭打开的dos窗口?如:调用run(*.bat)函数,该函数运行完毕后有一个打开的dos窗口,如何关闭???

本文来源:https://www.bwwdw.com/article/5463.html

Top