//exit,continue,return
1.exit(退出循环):
DO...LOOP和FOR...NEXT语句的循环体中,当我们想在中途退出循环时,EXIT语句后,程序的控制权
转至循环语句后的语句,在嵌套循环的情况下,EXIT语句退出当前层循环,而不是所有循环.
2.CONTINUE(继续循环):
在DO...LOOP和FOR...NEXT语句的循环体中,遇到CONTINUE语句后,将不执行CONTINUE语句后与循环结束
前的所有语句,而开始新一轮循环.
3.RETURN 语句:
返回控制给用户或调用函数的地方.(当希望终止应用程序的运行时,使用HALT语句),立即终止事件处理
程序或函数的执行,把控制返回到调用程序.当RETURN语句位于事件处理程序中且用户操作触发了该事件
处理程序后,执行到RETURN语句时,该语句立即终止事件处理程序的执行并等待用户的下次操作.当程序
中调用函数或事件处理程序时,执行到RETURN语句后,该语句立即终止事件处理程序或函数的执行,并把
控制返回到调用程序.
4.HALT {CLOSE} 语句:
HALT语句用于终止应用程序的运行.当HALT语句不带CLOSE选项时,该语句立即终止应用程序的运行;
当HALT语句带CLOSE选项时,执行到该语句后,应用程序先执行应用对象的Close事件处理程序,之后再
终止应用程序的运行.
//缓冲区 primary buffer,filter buffer,delete buffer,original buffer 当我们从数据库中读取数据时,所有数据会放在主要缓冲区(primary buffer),并且会复制一份放到原始 缓冲区(original buffer)内.在数据窗口中我们只能看到主要缓冲区(primary buffer)内的数据,任何 数据的处理也都是针对主要缓冲区的数据做处理.但是要记住,不管我们对缓冲区内的数据做任何处理, 除非我们运行update()这个函数,否则缓冲区内任何数据的改变,对于后端数据库是没有任何影响的.
//如何生成固定长度的前面加零的数字编号,例如:12生成"00012",1234生成"01234"。方法很简单: String(ll_number, "00000")
//row表示行数,col表示字段名,val表示值 dw_1.setItem(row,'col',val) dw_1.getItemX(row,'col') //读取单笔数据比点状表示法更快 dw_1.object.data //读取多笔数据函数表示法更快 dw_1.object.data[1] dw_1.object.data[1,2] dwc.object.data[1,1] dw_1.object.data[1,1,2,2] dw_1.object.col[1] dw_1.object.col.current dw_2.object.data = dw_1.object.data dw_2.object.data = dw_1.object.data.select //例子1(只用执行一次) string ls_name[] ls_name = dw_1.object.col.current //读取列col所有数据 //例子2(得执行dw_1.rowCount()次) string ls_name[] for li_row = dw_1.rowCount() to 1 step -1 ls_name[li_row] = dw_1.getItemString(li_row,'col') next
//读取数据 retrieve() >= 1 //实际从数据库中所读取的数据数目 = 0 //找不到任何符合条件的数据 = -1 //读取数据失败 //增加数据 dw_1.insertRow(row) dw_1.insertRow(0) //增加到最后一笔 //删除数据:primary! => delete! dw_1.deleteRow(row) dw_1.deleteRow(0) //删除当前所有行数数据 //过滤数据:primary! => filter! dw_1.setFilter('kind < 1000') dw_1.filter() //数据排序 dw_1.setSort('kind d') dw_1.sort() //数据清除 dw_1.reset() //将数据从所有的缓冲区中清除,但是对于数据库中的数据并不会有任何影响 //数据计算 dw_1.rowCount() dw_1.filteredCount() dw_1.deletedCount() dw_1.modifiedCount() //计算所有行数状态为DataModified!或是NewModified!的总和 //数据状态 notModified! dataModified! new! //rows only newModified! //rows only //数据拷贝 dw_1.rowsCopy(startRow,endRow,sourceBuffer!,destDW,beforeRow,destBuffer!) dw_1.RowsCopy(dw_1.GetRow(),dw_1.RowCount(),Primary!,dw_2,1,Primary!) //数据移动 dw_1.rowsMove(startRow,endRow,sourceBuffer!,destDW,beforeRow,destBuffer!) dw_1.RowsMove(1,dw_1.DeletedCount(),Delete!,dw_1,1,Primary!) //数据滚动 dw_1.scrollToRow(row) //dw参数 dwo.name //describe()函数 ll_color = dw_1.describe('dataWindow.color') //ll_color = dw_1.dataWindow.color ll_color = dw_1.describe('kind_t.color') //ll_color = dw_1.kind_t.color //modify()函数 dw_1.modify("dataWindow.color='255'") dw_1.modify("kind_t.color='255'") dw_1.modify("kind_t.color='0~tif(kind>1000,255,0)'") //~t前面的0为默认值 //操作外部数据 fileExists() fileRead() fileLength() fileClose() fileSeek() fileOpen() fileWrite() //将dbf格式的文件,或是以tab键区隔字段的文字文件,直接引入放在数据窗口缓冲区中 importFile(fileName,startRow,endRow,startCol,endCol,dwStartCol)
//如何将Grid型的datawindow改成Tabular型的 导出数据窗成 .srd 文件, 用记事本打开把 processing=1 改成 processing=0
//Yield()函数的作用 Yield()是一个不常用到的PowerBuilder函数。可是,在一个大的循环过程中,如果用户想在执行到一半时 通过单击按钮或菜单来退出的话,就一定要用到Yield()函数了,否则程序只会在执行完成整个循环后才会 响应按钮或菜单的Click事件。将Yield()函数放在循环体的中间。那么在循环执行的过程中发现有新的事 件消息在消息队列中就回立即去响应。
//sqlca.SQLCode 在利用Embedded SQL 的时候,每运行一次SQL指令就应该检查一次交易对象中的属性SQLCode,而不是等到 所有的SQL指令运行完毕后再去运行检查交易对象中的SQLCode属性.当我们使用数据窗口所提供的函数时, 要记住不要检查SQLCode来判断是否运行成功.而是要依照每一个函数运行后所返回的值来判断是否运行 成功. update tab_test set col1 = 'test' if sqlca.sqlCode = -1 then rollback using sqlca; if sqlca.sqlCode = -1 then messageBox('错误','连接失败!') end if messageBox('错误','连接失败!') else commit using sqlca; end if
//确保数据保存的成功 if dw_1.update() = -1 then RollBack Using SQLCA; MessageBox("警告!","数据保存失败!") else Commit Using SQLCA; End if
//在PB中如何打开一个文件(如.txt,.doc),就像在资源管理器中双击打开文件一样? 答:可以通过API函数来实现。 在应用程序的Global External Functions中定义: Function long ShellExecuteA(ulong hwnd, string lpOperation, string lpFile, & string lpParameters, string lpDirectory, long nShowCmd) library "shell32.dll” 调用如下: String ls_null SetNull(ls_null) ShellExecuteA(Handle(Parent), ls_null, "c:dochello.txt”, ls_null, ls_null, 1)
//插入一行后给了默认值但又没有对默认值进行修改时,CloseQuery事件不激发方法 long 1_Row 1_Row = dw_1,InsertRow(dw_1,GetRow()) dw_1.SetItem(1_Row,"discount_pct",0,10) dw_1.SetItemStatus(1_Row,0,Primary!,New!)
//同一个数据窗口某列的值是根据另一列的值进行检索(放在DW的itemchanged事件中) dataWindowChild dwc if dwo.name = "vw_type_type1" then //省的字段名 s_type1 = data this.getChild("vw_type_type2",dwc) //县的字段名 this.setItem(this.getRow(),"vw_type_type2","") this.setItem(this.getRow(),"vw_type_type3","") this.setItem(this.getRow(),"type",i_null) s_sql = "Select distinct type2 From vw_type Where type1_code = " + "'" + s_type1 + "'" //动态生成SQL语句 dwc.setTransObject(sqlca) dwc.SetSQLSelect(s_sql) dwc.retrieve() end if
//DW的DBError事件 string error_text CHOOSE CASE sqlDBCode case 1 error_text = '违反唯一索引!' case 1400 error_text = '字段不能为空!' case 1407 error_text = '字段不能为空!' case 1401 error_text = '字段太长!' case 1438 error_text = '数值大于列允许的最大精度!' case 2291 error_text = '出现非法字段!' case 1031 error_text = '权限不足!' case 911 error_text = '注册名无效!' //权限专用 case 922 error_text = '特殊字符无效!' //权限专用 CASE 1017 error_text = '非法的用户名或口令,拒绝登录!' CASE 12154 error_text = '不能分解服务名称!' CASE 01005 error_text = '未给出口令或口令错误,拒绝登录!' CASE 01935 error_text = '注册名项输入的名称为系统关键字,禁止作为注册名使用!' CASE 540 error_text = '数据表或视图不存在!' CASE 942 error_text = '数据表或视图不存在!' CASE 903 error_text = '非法列名!' CASE 1403 error_text = '未查找到符合条件的数据!' CASE -3 error_text = '在您读入数据和存盘操作过程中,服务器中的数据已被别的用户或窗口改变,请重新读取数据后再试!' CASE 6 error_text = '网络同数据库服务器的连接已经中断,请关闭应用程序然后重新打开.' CASE 50 error_text = '网络同数据库服务器的连接已经中断,请关闭应用程序然后重新打开.' case 1920 error_text = '用户名称与另外的用户或角色名称冲突' case 988 error_text = '缺少口令或其非法!' case 1918 error_text = '该ORACLE用户不存在!' case 1940 error_text = '不能放弃一个当前被连接的操作员,即当前删除的操作员正在使用!' CASE ELSE if isnull(sqlca.sqlErrText) or sqlca.sqlErrText = '' then error_text = '数据操作失败!' else error_text = sqlca.sqlErrText end if END CHOOSE return MessageBox('错误',error_text,RetrYCancel!,1) //DBError参数 Buffer 发生错误所在的缓冲区 Row 发生第一笔错误的行数 SqlDBCode 数据库错误代码 SqlErrText 数据库错误信息
//MessageBox(title,text,icon,button,default) icon参数: information! 提示(缺省) stopSign! 中止 exclamation! 警告 question! 询问 none! 没有 button参数: ok! 确定(缺省) okCancel! 确定,取消 yesNo! 是,否 yesNoCancel! 是,否,取消 retryCancel! 重试,取消 abortRetryIgnore! 终止,重试,忽略
//如何在DBError event中处理多笔数据的错误 Rollback Using SQLCA; If buffer = primary! Then Messagebox("error in row:" + string(row),"Code:" + string(sqldbcode) + "," + sqlerrtext) This.scrollToRow(row) return 1 //避免显示PB缺省的错误信息 end if
//数据窗口的规则检查 当用户在编辑控件中输入数据时,数据并不会立即写入数据窗口的缓冲区中,直到发生下面任何一种情况, PowerBuilder才会把数据从编辑控件写入数据窗口的缓冲区中. 1.用户按下Enter键 2.用户按下Tab键跳到下一个字段 3.用户按下鼠标键跳到其它字段 4.运行AcceptText()函数 在完全通过4个步骤的规则检查后,才会真正把数据从编辑控件写入数据窗口缓冲区.任何一个步骤的错误 都会产生数据窗口的ItemError Event.数据窗口的数据规则检查步骤如下: 1.数据是否改变? 2.数据类型是否符合? 3.是否符合用户自定字段规则? 4.是否符合ItemChanged Event的程序?
//编辑控件函数 AcceptText():将编辑控件中的数据写入数据窗口缓冲区中. 不要在Itemchanged或ItemError event中编写Acceptext()函数,因为Acceptext()函数有可能驱动 ItemChanged或ItemError event,这将造成死循环的出现. GetText():读取编辑控件的文字.
//每一个事件event和函数Function类似,会有参数argument和返回值return value. ItemChanged Event返回值: 0.接受数据的值(缺省) 1.拒绝数据的值 2.拒绝数据的值并改变焦点 ItemError Event返回值: 0.拒绝数据的值,并且显示系统错误信息(缺省) 1.拒绝数据的值,但是不显示系统错误信息 2.接受数据的值 3.拒绝数据的值并改变焦点
|