pb 基础

 

//PB中标准调用sql语句
ls_sql = "select road_name from bb_data_wide_bus_temp_t where register_number = '" + ls_register_number + "'"
declare cur_get dynamic cursor for sqlsa ;
prepare sqlsa from :ls_sql ;
open dynamic cur_get;
fetch cur_get into :ls_value;
          if sqlca.sqlcode <> 0 then
                  messagebox('操作信息','提取失败!',exclamation!)
          end if
close cur_get;


//PB中标准循环调用sql语句
DECLARE cur_sql DYNAMIC CURSOR FOR SQLSA;
PREPARE SQLSA FROM :ls_sql;
OPEN DYNAMIC cur_sql;
do while sqlca.sqlcode = 0
          FETCH cur_sql INTO :ls_register_number,:ls_complete_note;
          ll_sqlcode = sqlca.sqlcode
          if ll_sqlcode < 0 then
                  CLOSE cur_sql;
                  af_disconnect()
                  messagebox('错误提示','检索受理编号错误!',StopSign!)
                  return
          elseif ll_sqlcode = 100 then
                  exit
          end if
          ddlb_register_number.additem(trim(ls_register_number + '|' + ls_complete_note))
loop
CLOSE cur_sql;


//窗口open事件通用脚本
//置窗口居中
af_center_window(this)
//连接数据库
af_connect()
//定义变量
dataWindowChild dwc
//获取城市代码下拉列表并取值
dw_city_code.getChild('city_code',dwc)
dwc.setTransObject(sqlca)
dwc.Retrieve(gs_citycode,gi_citylevel)
dw_city_code.setTransObject(sqlca)
dw_city_code.Retrieve()
dw_city_code.setItem(1,'city_code',dwc.getItemString(1,'city_code'))
is_city_code = dw_city_code.getItemString(dw_city_code.getRow(),'city_code')
//获取业务类型下拉列表并取值
dw_service_kind.getChild('service_kind',dwc)
dwc.setTransObject(sqlca)
dwc.Retrieve()
dw_service_kind.setTransObject(sqlca)
dw_service_kind.Retrieve()
dw_service_kind.setItem(1,'service_kind',10)
ii_service_kind = dw_service_kind.getItemNumber(dw_service_kind.getRow(),'service_kind')
//获取申请事项下拉列表并取值
dw_apply_event.getChild('apply_event',dwc)
dwc.setTransObject(sqlca)
dwc.Retrieve(ii_service_kind)
dw_apply_event.setTransObject(sqlca)
dw_apply_event.Retrieve()
dw_apply_event.setItem(1,'apply_event',dwc.getItemNumber(1,'apply_event'))
ii_apply_event = dw_apply_event.getItemNumber(dw_apply_event.getRow(),'apply_event')
//激发查询事件
cb_query.TriggerEvent(clicked!)
//断开数据库
af_disconnect()


//查询按钮通用脚本
//连接数据库
af_connect()
//定义变量
dataWindowChild dwc
//dw_1检索数据
dw_1.setTransObject(sqlca)
dw_1.Retrieve(ii_service_kind)
//dw_2检索数据
int li_row,li_row_temp
dw_2.getChild('action',dwc)
dwc.setTransObject(sqlca)
dwc.Retrieve(ii_service_kind)
dw_2.setRowFocusIndicator(hand!)
dw_2.setTransObject(sqlca)
li_row_temp = dw_2.Retrieve(ii_apply_event,ii_service_kind,is_city_code)
dw_2.scrollToRow(li_row_temp)
//如果未检索到数据插入一空行,有数据就过滤
string ls_filter
int li_action
if li_row_temp = 0 then
          dw_2.insertRow(0)
else
          for li_row = 1 to dw_2.rowCount()
                  li_action = dw_2.getItemNumber(li_row,'action')
                  ls_filter = ' action <> ' + string(li_action)
                  dw_1.setFilter(ls_filter)
                  dw_1.filter()
          next
end if
//断开数据库
af_disconnect()


//增加按钮通用脚本
//变量定义
int li_step,li_action,li_auto_status,li_row
//确认选择要增加的记录
if dw_1.getSelectedRow(0) = 0 then
          MessageBox('提示信息','请选择要添加的记录!',exclamation!)
          return
end if
//取出要增加的信息
li_step = dw_2.getItemNumber(dw_2.getRow(),'step')
li_action = dw_1.getItemNumber(dw_1.getSelectedRow(0),'action')
li_auto_status = dw_1.getItemNumber(dw_1.getSelectedRow(0),'auto_status')
//添加信息
li_row = dw_2.insertRow(0)
dw_2.setItem(li_row,'step',li_step)
dw_2.setItem(li_row,'action',li_action)
dw_2.setItem(li_row,'auto_status',li_auto_status)
dw_2.scrollToRow(li_row)


//删除按钮通用脚本
//删除前先确认
IF dw_2.GetRow() = 0 THEN
          MessageBox('提示信息','请选择要删除的记录!',exclamation!)
          Return
ELSE
          IF MessageBox("提示信息","确实要删除指定的记录?",Question!,YesNo!,2) = 2 THEN Return
          dw_2.DeleteRow(dw_2.getRow())
END IF


//保存按钮通用脚本
//连接数据库
af_connect()
//定义变量
string ls_city_code,ls_error
int li_service_kind,li_apply_event,li_row,li_step
dataWindowChild dwc
//检测数据是否发生变化
dw_2.AcceptText()
IF dw_2.ModifiedCount() + dw_2.DeletedCount() = 0 THEN
          MessageBox("操作提示","数据未发生变化,无需保存!",exclamation!)
          return
END IF
//检测是否为空或零
dw_2.setSort('step a')
dw_2.sort()
FOR li_row = 1 TO dw_2.RowCount()
          li_step = dw_2.GetItemNumber(li_row,'step')
          IF IsNull(li_step) OR li_step = 0 THEN
                  MessageBox('操作提示','步骤不能为空或零,请重新输入!',exclamation!)
                  dw_2.setRow(li_row)
                  Return
          END IF
NEXT
//保存
dw_2.SetTransObject(sqlca)        
if dw_2.update() = 1 then
          commit;
          messagebox("提示信息","保存成功!")
          dw_2.ScrollToRow(dw_2.RowCount())
else
          ls_error = sqlca.sqlErrText
          rollback;
          messagebox("提示信息","保存失败!" + char(13) + ls_error,stopSign!)
          return
end if
//断开数据库
af_disconnect()


//打印按钮通用脚本
if dw_1.rowCount() > 0 then
          if PrintSetup() = -1 then
          messagebox('提示信息','打印机设置出错!',Exclamation!)
          return
      else
                  if dw_1.print(true) = 1 then          //显示可以取消打印的对话框
                          Messagebox('提示信息',"打印成功!")
                  else
                          Messagebox('提示信息',"打印失败!",stopSign!)
                  end if
          end if
else
          Messagebox('提示信息',"没有数据可以打印,请先查询数据!",exclamation!)
          return
end if


//导出按钮通用脚本
if dw_1.rowcount() <= 0 then
          messageBox('提示信息','没有数据可以导出,请先查询!',exclamation!)
          return
end if
if dw_1.SaveAS('',text!,true) = 1 then
          messageBox('提示信息','导出成功!')
end if


//导入按钮通用脚本
//变量定义
string ls_pathfile,ls_file,ls_title,ls_ext,ls_filter
int      li_pos,li_fileid
long     ll_buffer
//变量赋值
ls_title = "请选择数据文件"
ls_ext = "txt"
ls_filter = "文本文件(*.txt),*.txt,全部文件(*.*),*.*"
li_fileid = GetFileOpenName(ls_title,ls_pathfile,ls_file,ls_ext,ls_filter)
if(li_fileid = 0 or ls_file = "") then
          return
end if
sle_file_name.text = ls_pathfile
cb_ok.enabled = true


//退出按钮通用脚本
close(parent) 或 closeWithReturn(parent,returnvalue)


//调用过程通用脚本
if dw_wp.rowcount() <= 0 then return
//变量定义
string           ls_sql,ls_err_info
string          ls_register_number,ls_accept_city,ls_department,ls_oper_person
integer          li_err_code,li_apply_event
//变量赋值
ls_register_number = dw_wp.getitemstring(1,'register_number')
ls_accept_city = gs_citycode
li_apply_event = dw_wp.getitemnumber(1,'apply_event')
ls_department = gl_dealerid
ls_oper_person = gs_workerid
//连接数据库
af_connect()
//调用配号撤单过程
ls_sql = "execute bb_pstn_assign_no_repeal_p(?,?,?,?,?)"
declare proc_assign_no_repeal dynamic cursor for sqlsa ;
prepare sqlsa from :ls_sql ;
open dynamic proc_assign_no_repeal using :ls_register_number,:ls_accept_city,:li_apply_event,:ls_department,:ls_oper_person;
if sqlca.sqlcode = -1 then        
          ls_err_info = sqlca.sqlErrText
          close proc_assign_no_repeal ;
          Rollback;        
          Messagebox("错误信息1","执行异常!" + ls_err_info,stopSign!)
          af_disconnect()
          return
End if
fetch proc_assign_no_repeal into :li_err_code,:ls_err_info;
if li_err_code < 0 then
          close proc_assign_no_repeal ;
          Rollback;        
          Messagebox("错误信息2","执行异常!" + ls_err_info,stopSign!)
          af_disconnect()
          return
end if
close proc_assign_no_repeal ;
commit ;
//断开数据库
af_disconnect()
//撤单成功后打印工单
dw_wp.print()


//PB某些控件的中文显示问题
假如 PB 的 ListView 不能正常显示中文,则应该将ListView 的 FontCharSet 属性设置成其他类型。将
ListView 所在的对象 Export 成源码。在源码中找到ListView 定义部分,将 FontCharSet 属性该成
DefaultCharSet! 如果 PB 的其他控件也发生相应的现象时,同样调整一下它的FontCharSet 属性。一般
来说对于简体中文字体,在中文 WINDOWS 环境中应该设置成DefaultCharSet!。对显示中文有问题的控件
将它的 FontChatSet 属性强制设置成 DefaultCharSet! 应该没有问题。或者改变字体!!!


//PB6.5运行时动态连接库(Runtime Library)
PBVM60.DLL(PowerBuilder 虚拟机)(必需)
PBDWE60.DLL(DataWindow 引擎)(可选)
PBRTC60.DLL(Rich Text Control)(可选)
PBTRA60.DLL(DLL used for tracing db calls)(可选)
与所需连接的数据库的直连接口(Native Driver) 或 ODBC接口(ODBC Driver)
PBSYC60.DLL(连接Sybase 的直连接口)
PBO7360.DLL(连接Oracle7.3的直连接口)
所需连接的数据库的Client端(如Sybase的Open Client, Oracle 的SQL Net)
以上是Sybase公司的建议。
我的经验是,编译好的程序必须有pbdwe60.dll和pbvm60.dll才行。
另外,如果使用ODBC联结数据库则还需pbodb60.dll,如果使用的专用接口,则需对应数据库的DLL,
如Oracle7.3用PBO7360.DLL,Sybase用PBSYC60.DLL


//pb6.5升级到6.5.1后exe文件执行可能出现问题
重新拷贝/Sybase/Shared下的pbvm60.dll(3.24M)代替未升级时pbvm60.dll(3.25M)就ok了!


//几个常用颜色
红:rgb(255,0,0)                  醒目或改变作用
蓝:rgb(0,0,255)                  注意作用
深绿:rgb(0,128,0)          提示作用


//SQL AnyWhere安装方法:
在安装PB65时的自定义安装中组件ODBC Databases Drives里的Sybase SQL anywhere 5.5.04 ,这只是
安装了PB组件的ODBC驱动程序,并未安装SQL ANYWHERE,如果你需要使用SQL Anywhere的管理工具,你
还得进行如下的操作:在正版PB6.5的第六张盘里,有一目录名是SQLANY5504,这里面就是SQL ANYWHERE
的安装盘了,运行SETUP即可。如果是盗版,那只好靠你自已去找了。 在安装目录下有一个SETUP.BMP,
上面有SQL ANHWERE字样。


//很多书上讲到FILE菜单中点CREATE DATABASE,怎么能让这个选项出来?
在pb第六张光碟(或使用D版第二张碟/6/sqlany5504),进入sqlany5504目录,安装sql anywhere 5.5,
默认安装路径为: C:/Program Files/Sybase/SQL Anywhere 5.0/win32,安装完成以后,修改
autoexec.bat, 增加一行,用于将sqlanywhere的文件放到系统搜索路径中:
path %PATH%;C:/Progra~1/Sybase/SQLAny~1.0/win32
这样重新启动后,你就可以看到File菜单下多出了Create Database这一项。
特别说明:在.../win32此目录下有一个很重要的文件,dbtl50t.dll,你可以做一个实验,进入
PB DataBase画板(不需要退出),然后切换到文件管理器中将dbtl50t.dll文件给改名,再切换回PB中,
点File菜单,你将会发现Create Database这一项又消失了。将dbtl50t.dll改名回来,回到PB中再点此
File菜单,一切又恢复正常。不过没有Create DataBase这一项都不是很重要,您还可以使用
Sybase Central来管理数据库,它才是Sql anywhere数据库的全面管理工具,可以建存贮过程,触发器。
(在"开始"->"程序"->"Sybase"->"Sql anywhere 5.0"下面,在硬盘中的执行文件名是scview.exe).

//不安装Oracle客户连接Oracle 8的方法
请将以下文件拷贝到运行文件所在目录
一、ODBC动态库 :
ctl3d32.dll msvcrt40.dll odbc16gt.dll odbc32.dll odbc32gt.dll odbccp32.dll odbccr32.dll odbcint.dll
二、建立EXTRA子目录,将MSVCRT.DLL文件拷贝到该子目录下
EXTRA/MSVCRT.DLL
三、ORACLE动态库及配置文件
Tnsnames.ora CORE35O.DLL NASNSNT.DLL NAUNTSNT.DLL NCRNT.DLL Nlnt.dll NLSRTL32.DLL Nnfdnt.dll
NNFNNT.DLL NSNT.DLL NTNT.DLL NTTNT.DLL CIW32.DLL Ora73.dll OTRACE73.DLL Sqlnet.ora
Sqltnsnt.dll CORE35.DLL
四、PB动态库
pbvm70.dll pbdwe70.dll Pbo7370.dll PBO8470.DLL pbodb70.dll libjcc.dll


//不安装SQL7客户端,连接SQL7的方法:
只需要将SQL的DBNMPNTW.DLL、NTWDBLIB.DLL以及PB的PBVM60.DLL、PBDWE60.DLL拷贝到EXE文件所在目录
即可!
   
   
//设置对象的缺省属性
在用户界面的设计中,每添加一个对象如按钮,文本框等,PowerBuilder都会用缺省的字体,大小,颜色
等属性来定义对象。如果这不是我们所需要的属性,那么就需要逐个地去修改属性。可以通过将缺省的
属性修改为所需要的来简化这一操作。打开应用画笔,在属性中可以将缺省的字体,大小,颜色等属性
改成所需要的缺省属性。


//数据类型转换
数值类型之间的转换由系统自动完成,通常根据操作符转换到高一级精度参加运算.
数值类型精度优先级自高到低依次为:
double ← real ← decimal ← UnsignedLong,long ← UnsignedInteger
字符串到数值类型的转换函数:
integer(str),long(str),real(str),double(str),dec(str)
数值型到字符串的转换函数为:
string(number,format),number是任意一种数值类型,format指示转换后的格式,通常可以省略.


//代词
this:This代表窗口、用户对象、菜单、应用对象或控件本身,即代表正在为之编写事件处理程序的对象。
parent:Parent指当前控件所在的窗口。
ParentWindow:ParentWindow代表运行时菜单所在的窗口,该代词只能在菜单的事件处理程序中使用。
super:在编写控件或对象的子对象时,子对象中可以调用父对象的事件处理程序,程序中既可直接利用
父对象的名称调用它们,也可以使用Super代词来引用。例如,想调用父对象的Clicked事件处理程序时,
子对象中可以这样写: CALL Super::Clicked


//系统预定义的五个全局变量
sqlca,sqlda,sqlsa,error,message


//PowerBuilder中的颜色值和RGB值之间的关系如下:
color = R*256*256+G*256+B


//标准数据类型共有十四种
blob          二进制大对象,用于存储大量数据,例如图像、大文本等,如: blob{100} ib_test          //长度100
boolean          布尔型,布尔型变量只有两个可能的值:TRUE或FALSE
char          或character,单个ASCII字符
date          日期,包括年(1000-3000)、月(01-12)、日(01-31)
datetime 日期及时间,仅用于访问数据库的DateTime型数据
dec                  或decimal,带符号十进制数,最大18位精度,如: dec{2} ld_test //2位精度
double          带符号浮点数,15位有效数字
int                  或integer,16位带符号整数
long          32位带符号整数
real          带符号浮点数,精度6位
string          字符串类型,用于存储任意的ASCII字符,长度为0到60,000(16位环境中),32位环境中长度
                  只受系统能力的限制。程序中直接写字符串时,用单引号(')或双引号(")将字符串括起来
                  缺省值空串("")
time          24小时制时间,包括小时(00~23)、分(00~59)、秒(00~59)以及秒的小数位(最多六位),
                  范围从00:00:00到23:59:59:999999
uint          或unsignedInteger,unsignedInt,16位无符号整数,范围从0到65535
ulong          或unsignedLong,32位无符号整数,范围从0到4,294,976,295
any                  要想知道Any类型变量中保存数据的类型,可以使用函数ClassName()


//如何将照片存入数据库之中
定义一个Bolb 变量lb_file,将文件读到 lb_file,用 insertblob 或updateblob 就 OK 了


//变量的作用域
全局变量:在整个应用程序中都可访问,它的作用域是整个应用程序
实例变量:与对象相关联,只有在该对象的事件处理程序或函数中才能使用为该对象定义的实例变量。
                   实例变量在它所关联的对象被打开时创建,被关闭时消失
共享变量:是一种静态变量,这不仅意味着它所在的对象关闭后再次打开时共享变量依然保持对象关闭时
                   的值,而且还意味着同一个类多个实例中的同名共享变量保持相同的值
局部变量:在使用它的事件处理程序或函数中说明,其作用域仅限于说明它的程序段,在该程序段的任何
                   地方均可访问局部变量,但其它程序段都不能访问本程序段中的局部变量。运行程序后,进入
                   某个程序段时,系统自动为局部变量分配内存,退出程序段时,局部变量占用的内存被释放。


//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:/doc/hello.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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值