PB实用技巧

如何在PB5中自动生成行号 
delelte数据窗口中若干行,然后update,出现: “rows changed between retrieve and update No changes made to database… Delete from table where ….” 请教是何缘故,该数据窗口是updatable 的,未设置关键字。 
如何能够作到,在打印一个DataWindows后不自动换页,而继续打印下一个DataWindows? 
我在table中改了一个字段的类型,回来一看,相应的datawindow字段在运行时再 
也无法输入东西了?. 
我没安装watercom C++,连用模板生成的PBL都不能正确编成EXE运行,生成的EXE在 
windows95 中远行时报程序启动错误,怎么办? 
我刚安装好nt40中文版 及sybase system 11.0.1无任何错误提示,启动SSM时给提示:无法找到DNETW.DLL于指定路径 C:\SYBASE\BIN C:\WINNT\SYSTEM32…..但还能启动SSM。 打开SERVER时提示:NO LANGUAGE HANDLER INSTALL这与NT有关吗?如何解决?

  1. 如何在PB5中自动生成行号 
    自动生成行号的方法很多,你可以看看PB的例子就知道了。目前我用的方法是,先用SQL语句统计表中最大的行号,把结果保存到一个变量中去,然后再对此变量进行加1不就可以了吗?但这种做法只是从最大的行号开始产生行号,产生最小的行号也是类似的。

  2. delelte数据窗口中若干行,然后update,出现: “rows changed between retrieve and update No changes made to database… Delete from table where ….” 请问为什么? 
    试试更改数据窗口的Update Properties中的 ‘Where Clause for Update/Delete’中的选项。

  3. 如何能够作到在打印一个DataWindows后不自动换页,而继续打印下一个DataWindows? 
    在PrintPage事件中返回0

  4. 在table中改了一个字段的类型,回来一看,相应的datawindow字段在运行时再也无法输入东西了,为什么? 
    datawindow具有自己的SQL语法,该语法和数据库后台中的变化不能时时响应,因此,当后台的数据库发生修改后,应该手工修改datawindow中的列定义,如:将变化的列删除,再次添加就可以了。

  5. 没安装watercom C++,连用模板生成的PBL都不能正确编成EXE运行,生成的EXE在windows95 中远行时报程序启动错误,怎么办? 
      不用安装Watcom C++,编译器内置于pb6文件中,估计你和我以前的错误一样,在win98中编译后在win95中运行报启动错,解决方法:
    1.在本站点下载pb6.5 patch,它可使你的pb6升级到pb6.5,可解决win98下很多问题. 
    2.在win95下编译. 
      原因是PB在执行时找不到运行库必须将\powersoft\shared加入路径或将它的内容拷入运行目录

  6. 安装好nt40中文版 及sybase system 11.0.1无任何错误提示,启动SSM时给提示,这与NT有关吗?如何解决? 
    first:you must restart your system 
    second:perhaps you need running SQLEDIT.

  7. 缩小含较少数据的Sybase数据库的规模,如2G的数据库,其中含200M的数据,如何将其转换为500M左右的数据库? 
    高级方法:不用BCP,使用修改系统表SYSUSAGES的方法。详细方法在SYSBASE NEWSGROUP 有。你可以在www.sybase.com找到administrator 论坛。

  8. 请教两个sybase sql server 之间复制数据的方法 
    SYBASE有一个东东叫Replication Server,专用来复制Sybase SQL Server,不过就是对维护人员要求高(没有sybase帮你,我看你日子不好过)

  9. 如何将Excle文件中的数据倒入PB5.0的Database

回答1:将该xls文件建立ODBC数据源,在PB里打开,存成sql文件,在打开sqlanywhere的库,运行此sql文件即可。

扫描二维码关注公众号,回复: 4042602 查看本文章

回答2:采用DDE或OLE编程。将PB置成DDE server 或ole server.在EXCEL中进行VBA编程,可实现对特定数据的处理和传送。

  1. 问题: Pb5.0应用程序编译后,运行时出现非法页面操作:(发生在datawindow Itemchanged 事件脚本)

回答1:检查你的DATAWINDOW是否与TABLE 相符。最好此DATAWINDOW重新生成。


  1. 问题:我手中的PB是6.0企业版(试用),Sql AnyWhere 5.0.03,问题是:1、PB调试器Debug经常出现非法操作(无效页面)错!2、Sybase Central带有Sql AnyWhere 5.0.03的Plug-in,运行某些功能和退出时,出现非法操作(无效页面)错! 
    回答1:第一个问题现已出现不多,可能是书写程序不规范所致。第二个问题是Sybase Central 在中文环境下的问题,如果你用西文Win95, 外挂的汉字系统,并且将区域设置(regional setting) 设成英语国家,就可以了。回答2:PB出现无效页面错,是和某些软件的冲突,如运行cstar 2.97则Sybase Central退出时出错,若在纯净的英文win95,win98下PB6.5很稳定,说明PB在中文下测试不够,本身抗干扰能力差,至少出错信息少,特别程序本身的底层出错检验差.

回答2:我同意您的观点。但我的情况是刚刚装完Win95后立即装PB,同样出问题。友人建议我使用PB5.0不要追求高版本。但Sybase中国可能已不出售这个版本的PB了。


  1. 问题: 怎么将NT上的SYBASE SQL SERVE10数据转入小型机上的SYBASE SQLSERVER11!!!(不要告诉我用pipeline!)

回答1:1,在SSM里生成DDL 
2,把所有数据BCP出来(提示,可以先生成一个BAT文件,不用我说了吧?) 
3,在小型机的SQL Server里运行DDL 
4,把所有数据BCP进去(提示,可以先生成一个BAT文件)


  1. 问题: 我们用VC编写一动态连接库,函数形式为 int ecrtx(string cmd,word i,string retval),在Delphi中正常调用,但在PB6中就是出错提示,怎么办?

回答1:在VC中, int 是32位. 而在PowerBuilder 中int 是16位, long则是32位.


  1. 问题: PB6程序编译为EXE时,菜单和对话框会出乱字符,该怎么办

回答1:编译时不要选编为本机代码。 
回答2:下载补丁版

  1. 问题: 我使用Infomaker 5.0.0.01 转换Foxpro25 DBF文件到MS SQL SERVER6.5时,发现转入不能成功,怎么办?

回答1:不要使用PB的ODBC驱动,用MS的 
回答2:将SQL SERVER的CHAR类型改成VARCHAR类型

  1. 在用 PB 6.5 研究 PB 的三层结构开发方式,在开发中运行该应用运行到 connect using transaction; 时, 系统就会PB60.EXE 运行错误,然后就关闭 PB 开发环境,为什么?

回答1:我没有出现这种情况啊?不过在PBCGI60正在运行时,即网页正在刷新时,如果关闭服务器应用会产生这种情况(100%)。我认为这是PB的BUG,可能是PBCGI与应用通迅时是通过共享内存来实现的,而内存是由应用分配而来,当应用关闭时,所分配的内存也就释放了,这时PBCGI60。EXE还是去这块内存取数据的话,操作系统就会认为非法操作(因为这块内存已经归还给操作系统了,PBCGI60。EXE没有操作的权限)

  1. 有四个问题:(1)当数据窗口是由两个表的不同字段组成,两者通过一个相关字段进行关联,当改变某一个表的字段(此字段为关联字段)值时,如何使另一个表的其他字段值进行刷新 ?(2)能否使计算域的值由两条以上记录的某字段值计算而得?(3)在程序中如何获得某计算域的值?(4)在数据窗口中,能否使两个字段间建立对应关系:一个字段的值随着另一字段的值发生变化

回答1:1,在DW的ItemChanged写Script实现 
2,computedField本来就可以由两条以上记录的某字段值计算而得,例如sum,count等。如果你想指定某几条记录来作计算,可以用IF,例如要统计第一个记录和第二个记录的值:sum(if(getrow()=1 or getrow()=2),字段名,0) 
3,给ComputedField一个名字,然后用getitemXXX(1,名字) 
4,要在ItemChanged里写Script

  1. 所用的Sybase数据库的一张表已输入大量数据,现遇到一个字段的宽度不能够满足一个记录的宽度,请问如何处理

回答1:BCP is another way. 
回答2:不能修改,可以另外建一个表,用PIPELINE将数据倒过去。

  1. 一个系统用PFC 5.0.4书写,Full Complile无问题,但编译成机器码时失败,原因不明.从Log中自得到如下信息:CGEN: Compiling ‘C:\DOS\main.c’CGEN: Linking…__imp__VirtualQuery@12 偼枹掕媊嶲徠偱偡,怎么办?

回答1:在Infobase里按出错的关键字查一下,应该可以找到原因。 
回答2:按PBD编译吧!

  1. 问题: PB6如何显示JPG?

回答1:在win95 osr2版里选装附件中的‘映像’,即可得到WANG系列的image控件,非常好用,请试一试。

  1. 问题: 请问各位大虾有没有办法将对Sybase或MSSQL中某表查询后显示的记录在表中的记录号显示出来?

回答1:没有纪录号的概念啦!

  1. 问题: pb分布式计算求助 ,在三层c/s结构下,APPLICATION SERVER 端使用DATASTORE封装了对数据库的访问,如何将RETRIEVE的结果返回CLIENT?

回答1:这要看你是使用同步还是异步调用,同步你可以传递一个REF STRING 参数、然后用 IMPORTSTRING 函数引入数据,如果是异步调用你需要使用 SERVER PUSH 技术返回一个STRING,然后在用IMPORTSTRING。详细处理看 PB ONLINEBOOKS

回答2:用 datastore.object.datawindow.syntax 得到语法,用 datastore.object.datawindow.data 得到数据

  1. 问题: (1)如何在PB状态下查看数据库的触发器程序。(2)如何改写系统日期和时间

回答1:1.具体与你使用的数据库有关,在SQL Server及SQL Anywhere中trigger 语法存放在syscomments表中,直接select出来就可怜看到。 
2.调用windows API.具体function我记不清了,查一下visual c++帮助,不难。

  1. 问题:使用PB5.0中带的SQL ANYWHERE 5.0,在一个表中设置了一个列 user char(10 ) 其default value 设为current user用于记录谁向该表中加入了新行,但什么也记不下来,另外有无简单的手段记录,谁最后修改了行?

回答1:SQL AnyWhere default value=当前用户 的语法用user char ( 10 ) default user,而不是 default current user,再试试!

回答2:在此表上ADD一个TRIGGER。在INSERT 和UPDATE时出发。TRIGGER启动后SELECT USER INTO VAR1 NEW。USER := USER;我也是虾血,你可以试试。


  1. 问题:在PB中使用大文本时碰上字符集不能转换的错误,如何处理?

回答1:用 Image 类型 的列试试。

  1. 问题:连接到adaptive server anywhere6.0 network database server ,客户端怎么设置?

回答1:客户端配置 ODBC 时注意以下几点: 
1)Server Name 项写 ASA 的 Server Name 
2) Database Starup 项内选中 Network radio button.

  1. 问题:在PB中同时连接两个Informix数据库服务器,怎么配置第二个数据库服务器的Transaction变量。请指教!

回答1:第二个 Transaction 的属性配置和第一个类似,只是在用的时候 SQL 语句后要加 using …; ,并且用完后要用 Destroy 命令删掉。

  1. 问题: 我在窗口中使用了 vb 所带的一个ocx 控件,用install builder 制成安装盘并在另一机器上安装后,ocx 控件调用不正确。该机器没有安装vb,我该怎样在安装时注册 ocx 的相关信息呢???

回答1:听说是用windows\system里的REGSVR32命令

  1. 问题:我准备用VB中的MSCOMM32.OCX在PB中做串口通信,我在OLE中插入时,提示“Insert of OLE failed,license file required”,这是什么原因,我拷的文件还缺吗?

回答1:是否缺少.lic文件?

  1. 问题: PB中如何创建SQL ANYWHERE的数据库?

回答1:打开Database Painter, 在 File 菜单项下有Create Database,如果没有,那么可能你装PB的时候没装 SQL Anywhere.

  1. 问题: PB中鼠标从控件上离开的事件是那个?

回答1:移入、移出控件我都是用的 mousemove, 可以在 Script中进行区分。

  1. 问题:ORACLE数据库的Client/Server连接成功,且Delphi能够连接到ORACLE 7.3.4 For NT,但是,PB连接ORACLE时,出现如下错误:没连接接口驱动程序—功能未执行?

回答1:sqlca.servername = ‘@’ + ORACLE数据库别名 
sqlca.dbms=’o72’ 
sqlca.login = ‘SYSTEM’ 
sqlca.loginpass = ‘MANAGER’

  1. 问题:PB5,PB6中DataBase中Table的column Name等属性不能修改,ataBase中Table不能删除,提示错误”The following DDL command is no supported:Droptable”,为什么?

回答1:droptable不对, 应该是drop table,PB对sybase自身的数据库产品的支持应该是没有问题的,连接oracle或者db2等一般不能直接修改列名或者列类型,另外, 对于大型数据库而言, 一般不允许将列长度变小, 如: 
col1 numeric(8,2) –> col numeric(10, 2) ok, 
col1 numeric(8,2) –> col numeric(8, 0) no

R回答1:我的数 据 库 是SYBASE SQL Anywhere,开始在PB5.0下建的表,而且能修改Column Name等属性.后来因其它原因重装后便不可以了.硬盘格式化后重装也不行.便安装了PB6.0,刚用时是正常的.过了几天再用便又不行了.

    AR回答1:实在不行的话, 如果你用sql anywhere, 使用Sybase sql Central 也可以修改列名等, 规则和我上次谈的一样 
  • 1
  • 2
  • 3
  1. 问题: 由于服务器没正常关机,导致数据库脱机,用sp_helpdb命令得到“cinms”数据库被标记为”offline”,请问如何去掉这个标记,使得数据库能工作?

回答1:不妨试试如下命令(在交互式环境下) 
online database cinms 
go 
看看是否可以解决问题!!!

回答2:手工更改master库中的sysdatabases表,它有两个状态栏status,status2,可以去掉SUSPECT位,具体数值意义可以看SYBASE的参考资料.

  1. 问题:我在一台Dec alpha 1200上的Digital Unix 4.0D平台上安装Sybase Server(安装文件是从原盘上tar下来的),结果每次输入CAS后提示:Please confirm that you have selected the NON-rewinding tape device if applicable. If you have done so, inform Sybase Technical Support that there is a problem with this tape and cite error condition 803.然后退出,不知是什么原因?另外Sybase非得在光碟上或磁带上安装吗?如何备份原盘?

回答1:你的sybload后没加-D的参数或CAS不对。

  1. 问题: 我正做一应用程序,需动态计算数据窗口不同列的数据值,不但有数值计算,而且有条件语句,我试图用DW表达式及俄EVALUTE函数解决,没有成功,请赐教!!!

回答1: 可考虑自己在程序中计算,最后insertrow(0),并Setiem.

  1. 问题: 在对有Identity字段的table进行数据import时,identity字段数据不能导入,用set identity-insert 属性也没用,怎么办?

回答1:用 set identity_insert on 改变设定后,insert 语句中 identity 列的值是显式指定 identity 列将从这个值开始递增,或用这个值填充 identity 列值中的空隙。如果不影响逻辑的话,能不能drop再create?

  1. 问题: 我用的是PB5.0,源程序在开发环境中运行,正常无比,但编译后执行EXE文件却发现:程序实现的功能莫名其妙的不行了.现象:源程序中有一句dw_userquery.DataObject =”d_pacuser2”,在EXE文件执行时好象根本不显示数据窗口对象d_pacuser2的内容.而在开发环境中却是好好的!请问为何?

回答1:是这样,当你用到一个对象是动态加入的,如你程序中的类似 dw_userquery.DataObject = “d_pacuser2” 的情况,编译是PB 不会将 数据窗口 d_pacuser2 自动编译到 EXE 文件中去,解决办法有两个: 
1)将此数据窗口所在的PBL 文件编译成 DLL 或 PBD,(即 编译时选中此 PBL文件后面的 DLL 多选框) 
2)创建资源文件(以PBR结尾) 
例如: 
创建文件 dw_list.pbr 
内容如下: 
c:\sample\myapp.pbl(d_pacuser2) 
将此文件写在 Resource File 处。

  1. 问题: 最近搞个统计表,录入浮点数时的问题已在另外一篇帖说了,打印时更麻烦,几个浮点数一合计,最后一位小数后又多出几位,这是不是一个BUG,有PATCH吗?

回答1:这是PB的问题,如果要求严格的话,请不要使用转换函数.解决的办法只有用两个整数来代替一个浮点数的整数及小数部份,在有关处理中,只能人工解决

  1. 问题: 在PB6下的DW输入浮点数9.112,光标离开输入框后,数字就变成9.1120005,在UPDATE保存后也是9.1120005。怎么会这样?

回答1: 这种现象我也遇到过,可以采用设置EDITMASK来解决 将mask设为###.##而不是000.00

  1. 问题: 如何动态修改DATAWINDOWS的SQL?

回答1: 1>dw_1.setSqlSelect 或 
2>dw_1.object.datawindow.table.select=…

  1. 问题:在PB中生成的动态SQL的运行速度很慢,有没有药救?

回答1:如果多次调用,则最好Prepare一次,再在循环中Open,不要每次都Prepare.

  1. 问题: composite型datawindow有一报表rep,rep的datasource有参数,如何在程序中传递参数,用retrieve(value)不行。请高手指教!

回答1:在COMPOSITE REPORT 设计过程中,双击COMPOSITE 报表的空白处,设置composite report的检索参数(value),然后双击rep,把刚才设置的参数赋于rep,最后用 dw_composite_report.RETRIEVE(VALUE)

  1. 问题: 请教高手一个问题:composite型的datawindow dw_1中有个报表rep1,rep1中有个statictext型对象st_1,如何在程序中给st_1附值?我用dw_1.object.rep1.st_1.text=value,运行时出错。这么做?

回答1:试试这样:dw_1.object.rep1.object.st_1.text=value

  1. 问题:怎样屏蔽PB6,datawindow中操作错误时产生的英文信息

回答1:通过判断默认事务对象sqlca的属性sqlcode来决定. 
if slqca.sqlcode=** then 
messagebox(”,’中文提示’) 
end if 
当然要了解pb的错误级别.

  1. 问题: 我在TreeView的constructor事件中声明并使用dataStore的实例,通过该实例检索data window object得到数据后使用TreeView的InsertItem()可在控件加入根一级的数据显示项,在加入下一级数据项时,我使用了TreeView的Itempoplate事件,声明另一个datastore检索另一个数据窗口对象,得到数据并加入下一级item,在脚本中我使用了for next 循环以得到同一级的多个数据项.现在需要在这一级下面再加入子项,该怎样做?如果在for next 循环中嵌套一个for next循环,回出现很奇怪的现象,请参考PB5 的online books的Application technique中的chapter 12 using Lists in a window 关于treeview的部分.多谢指点!

回答1:完全可用多重循环来实现。插入可用函数insertitemlast()来完成,注意其语法为: 
treeviewname.InsertItemLast(handleparent, item ) 
其中handleparent为要插入Item其父项的句柄(第插入一项都返回一个句柄,long型),item为treeviewitem。 
for example: 
for i = 1 to row1 step 1 
name = dept_datastore.getitemstring(i,”dept_name”) 
code = dept_datastore.getitemnumber(i,”dept_code”) 
xt_tvitem.label = name 
xt_tvitem.data = dept_datastore.getitemnumber(i,”dept_code”) 
xt_tvitem.pictureindex = 2 
xt_tvitem.selectedpictureindex = 2 
ll_newitem = tv_1.insertitemlast(ll_rootitem,xt_tvitem)//返回一个句柄ll_newitem ,作其子项父句柄。ll_rootitem为根句柄 
for j = 1 to row2 step 1 
xt_tvitem.label = emp_datastore.getitemstring(j,”name”) 
xt_tvitem.data = emp_datastore.getitemnumber(j,”em_code”) 
xt_tvitem.pictureindex = 3 
xt_tvitem.selectedpictureindex = 3 
tv_1.insertitemlast(ll_newitem,xt_tvitem)//用到父句柄 
next 
next


  1. 问题: 我用的是ORACLE数据库,PB中想动态修改DW的select语句的条件部分:string newwhere newwhere = ‘where ("table1“."field1” = ’ + ’ ~’Y~’)’是正确的.如果想把常量’Y’改为一个变量该怎么办? 
    回答1:可以这样写: 
    string ls_Y 
    ls_Y = ‘Y’ 
    newwhere = “where (table1.~~field1~~ = ‘” + ls_Y + “’)”

回答2:pb倒是没有提供标准的modify接口,可能要用死办法直接修改syntax的table区,具体格式可以看 SRD

  1. 问题:请问PFC是什么?

回答1: PFC是一些基本类库,PFC功能强大,使用PFC开发程序,需要写的代码很少,时间可以大大减少,界面也比较好。

回答2: PowerBuilder Fundamental Classes, 是这个意思吧,就是和微软的MFC差不多的东东。

  1. 问题:SYBASE_SQL_SERVER 11.2的sa口令忘记了怎么办?

回答1:好像在RUN_SYBASE文件内加一个 -m 然后,重新启动,会自动产生一个新的SA口令。一定要用笔记住。再用sp_password改成自己的口令。的自己加的-m去掉,重启动就可以了。

回答2:为了安全,SYBASE 确认了你的身份后才能帮你解决。有时需要正式介绍信。


  1. 问题: 是关于修改显示器分辩率的ChangeDisplaySetting的问题。

回答1:The first function returns the color of a specific pixel(像素;显示器的最小分辨单元). The SetPixel function changes the targeted pixel to the color sent. There is no PowerBuilder equivalent. 
Global External Function: 
FUNCTION ulong GetPixel(ulong hwnd, long xpos, long ypos) LIBRARY “Gdi32.dll” 
FUNCTION ulong SetPixel(ulong hwnd, long xpos, long ypos, ulong pcol) LIBRARY “Gdi32.dll”

Script: 
long lx, ly 
ulong rtn 
ulong l_handle, l_device 
lx = 100 
ly = 100 
l_handle = handle(w_main) 
l_device = GetDC(l_handle) 
rtn = GetPixel(l_device, 100, 100) 
MessageBox(“Position ” + string(lx) + “,” + string(ly),”Color = ” + string(rtn)) 
SetPixel(l_device, lx, ly, 0) // This call will set the pixel at lx, ly to black.

  1. Q :请问在PB中如何利用PBCATTBL,PBCATCOL,PBCATFMT,PBCATEDT,PBCATVLD五个系统表?请说明各字段的中主含义。

回答1:There five table is used to loaded “Lable”,”validation”,”head” and “tablename” and others table information whose in PB.We can used to show “table name” in our application and delete “died tabled ” in Database’

  1. 问题: 如何播放动画G胛试赑B中除了用RUN或外部函数SHELLEXECUTEA播放外,有没有其他方法?

回答1:使用VB5.0所带ActiveX control.安装vb后在pb OLE control中即可见.

  1. Q : 如果做个窗口放报表,显示多行时好象不舒服。请高手指点,谢谢。

回答1:使用如下语句显示DW dw1.object.datawindow.print.prview = True

  1. Q :用DataWindow增加一笔记录时,出现Can’t allocate space for object ‘Syslogs’ in database ‘bkacedb’ because the logsegment’ segment is full. If you ran out of space in Syslogs, dump the transaction log. Otherwise, use ALTER DATABASE or sp_extendsegment to increase the size of the segment.No changes made to database.如何从dump the transaction log下手?

回答1:很简单,你在Sql Enterprise Manager中对你的数据库右击,再点edit,再点Truncate,就可以将数据库中已完成的事务清掉.或者用DUMP TRANSACTION … WITH TRUNCATE就可以了

回答2: 您的DATAWINDOW是不是有很多个TABLE的复杂关连?它将导致临时表空间不够,若是,那你就要改变DATAWINDOW的做法了,例如,你可以在VIEW或者STORE PROCEDURE中将多个TABLE关联起来,然和建立一个用VIEW或者STORE PROCEDURE作为数据源的DATAWINDOW.


  1. 问题:在PB中如何实现音乐的播放?

方法一

1、声明外部函数 
FUNCTION boolean sndPlaySoundA (string SoundName, uint Flags) LIBRARY “WINMM.DLL” 
Function Uint LoadLibraryA(String As_Library) Library “kernel32.dll” 
Subroutine FreeLibrary (Uint Hinstance) Library “kernel32.dll” 
2、程序如下: 
Uint Lu_instance 
Lu_instance = LoadLibraryA(“winmm.dll”) 
if Lu_instance = 0 then 
SndPlaySoundA(“c:\windows\media\chimes.wav”,1) 
FreeLibrary(Lu_instance) 
end if 
3、存在问题: 
如何播放格式的音乐?

方法二:

1、声明外部函数 
Function Uint ShellExecuteA (Uint hwndId,ref string op,ref string file,ref string parms,ref string dir,Uint show) library “shell32.dll” 
Function Uint LoadLibraryA (String As_Library) Library “kernel32.dll” 
Subroutine FreeLibrary (Uint Hinstance) Library “kernel32.dll” 
2、程序如下: 
String Ls_path,ls_file,ls_parms,ls_dir,ls_command 
Uint lu_return,lu_instance 
SetNull(ls_parms) 
//check to see if the dll is available.Return number < 32 if not Lu_Instance = LoadLibraryA(“shell32.dll”) 
if Lu_Instance <> 0 then 
MessageBox(“操作提示”,”SHELL32.DLL动态库不存在!”) 
else 
//Shell32.dll is here.Get a filename from the user 
GetFileOpenName(“打开文件”,ls_path,ls_file,”“,”All Files (.),.*”) 
if ls_path <> “” then 
SetPointer(HourGlass!) 
//Examine the checkbox for open or print configuration 
if cbx_print.checked then 
ls_command = “print” 
else 
ls_command = “open” 
end if 
//call the function.pass the parent as the ower.run normal. 
Lu_return = ShellExecuteA(Handle(parent),ls_command,ls_path,ls_parms,ls_path,1) 
//check for errors from function 
if lu_return < 32 then 
MessageBox(“操作提示”,”程序执行非法操作! ~r~n” + ls_path) 
end if 
end if 
//free the resources from the dll since it was loaded with the loadlibrary call 
FreeLibrary(lu_instance) 
end if 
注:本方法可运行任何文件,当然可以播放音乐文件 和动画文件。在sndPlaySoundA() 的函数定义中,把 string SoundName 定义成 ref string SoundName,再试试,反正这个函数的原型就是有 ref 的。

  1. 问题: 如何让数据窗口只显示表的最后几条记录?

回答1: 加 filter ;根据索引加 where 条件;或者干脆用 rowsmove 把其他记录移到 filter buffer 中。

  1. Q : 我本人最近遇到了这么一个问题!pb6.0在win95中文环境下一切正常,但是移植到win98时汉字出现的却全都是乱码,请问如何解决这个问题?谢谢!!!

回答1:请您使用黑体或楷体,否则在无盘工作站和WIN98中都会出现字体显示不出来的情况.

  1. 问题: 我如何能动态地在一个grid风格的datawindow中加一个标题行,该datawindow也是动态创建的。多谢!

回答1:用grid风格的datawindow想加标题行比较麻烦,因为grid风格中的标题band中也会显示网格线,而且要将text控件的band属性设为Foreground.你可以用Create语句创建一个text控件,然后指定它的位置和band属性.create的语法如下: 
dw_1.Modify(‘create text(band=foreground alignment=”2” name=datetext text=”text” border=”0” color=”0” x=”0” y=”0” height=”69” width=”650” font.face=”Arial” font.height=”-9” font.weight=”400” font.family=”2” font.pitch=”2” font.charset=”0” background.mode=”1” background.color=”16777215” )’) 
其中text的属性大部分为必需的,如果不完整的话,该text可能不能显示.据我所知,用grid风格的datawindow时要想加上标题,而且要显示得比较好看,只能用text控件将显示出的多余的网格线给盖住,这样做语法上比较麻烦,因为你要得到这个datawindow中最后一个列的y值和width,以控制text的width,特别是你这个datawindow和text是动态创建的.当然这些都是可以实现的,多多钻研吧!

  1. 问题:程序在PB5中运行的好好的.但是编译好的.EXE文件运行时却提示缺少settransobject or settrans fuction.请问这是怎么回事?

回答1:该错误大多是由于Transaction没有正确的Connect,你Connect后,应检查sqlcode的值Put transaxtion parameters in scripts .or copy pb.ini to the directory of the *.exe file.

回答2:应用在pb开发环境中运行时,系统会自动去找需要的库,但编译成.exe文件后运行就需要手工设置路径或copy这些库到当前目录。一般这些库都能在pb的shared目录下找到。具体可参看“可执行文件调用动态链接库问题”一帖的答复。已有几位高手详细解释。

A3:可能全局变量与局部变量,事例变量冲突

  1. 问题:请问:因为要用连续纸打印发票和报表,打印机自动切纸以后,再打第二张发票时,继续重新打在第一张发票的位置上,不知如何是好?是否要在PB中用调用外部函数设置自定义纸张大小,才起作用?

回答1: I had a solution, like follows, 
void WINAPI PrintSet(LPCTSTR PrinterName, DWORD PaperSize, DWORD Height, DWORD Width, LPDWORD ret_code, LPTSTR errortext) 

DEVMODE* lv_devmode; 
DEVMODE* lv_devmode_2; 
PRINTER_INFO_2* lv_printer_info; 
LPTSTR lv_str, pDeviceName; 
HANDLE phPrinter; 
DWORD pcbNeeded, lv_dword; 
lv_printer_info = malloc( 500 ); 
if (!OpenPrinter(PrinterName, &phPrinter, NULL)) 

free(lv_printer_info); 
*ret_code = GetLastError(); 
lv_str = “打开打印机失败 !”; 
strcpy(errortext, lv_str); 
return; 

if (!GetPrinter(phPrinter, 2, lv_printer_info, 500, &pcbNeeded )) 

free(lv_printer_info); 
*ret_code = GetLastError(); 
ClosePrinter(phPrinter); 
lv_str = “无法得到打印机参数 !”; 
strcpy(errortext, lv_str); 
return; 

lv_devmode = lv_printer_info->pDevMode; 
pDeviceName = lv_devmode->dmDeviceName; 
lv_dword = DocumentProperties(0, phPrinter, pDeviceName, lv_devmode, 0, DM_OUT_BUFFER); 
if (lv_dword<0) 

free(lv_printer_info); 
*ret_code = GetLastError(); 
ClosePrinter(phPrinter); 
lv_str = “无法取得打印机参数 !”; 
strcpy(errortext, lv_str); 
return; 

// 修改DEVMODE结构, 设置纸张大小及其高度和宽度 
lv_devmode->dmFields = lv_devmode->dmFields|DM_ORIENTATION|DM_PAPERLENGTH|DM_PAPERWIDTH|DM_PAPERSIZE; 
lv_devmode->dmOrientation = DMORIENT_PORTRAIT ; 
lv_devmode->dmPaperSize = PaperSize ; 
lv_devmode->dmPaperLength = Height; 
lv_devmode->dmPaperWidth = Width; 
// 通过调用DOCUMENTPROPERTIES函数传会修改的DEVMODE结构, 
// 在调用时指定DM_IN_BUFFER|DM_OUT_BUFFER 
lv_devmode_2 = malloc(500); 
lv_dword = DocumentProperties(0, phPrinter, pDeviceName, lv_devmode_2, lv_devmode, DM_IN_BUFFER|DM_OUT_BUFFER); 
if (lv_dword<0) 

free(lv_devmode_2); 
free(lv_printer_info); 
*ret_code = GetLastError(); 
ClosePrinter(phPrinter); 
lv_str = “无法设置打印机参数 !”; 
strcpy(errortext, lv_str); 
return; 

if (!SetPrinter(phPrinter, 2, lv_printer_info, NULL)) 

free(lv_printer_info); 
*ret_code = GetLastError(); 
ClosePrinter(phPrinter); 
lv_str = “无法设置打印机参数 !”; 
strcpy(errortext, lv_str); 
return; 

free(lv_devmode_2); 
free(lv_printer_info); 
ClosePrinter(phPrinter); 
lv_str = “设置打印机参数成功 !”; 
strcpy(errortext, lv_str); 
*ret_code = 1; 
return ; 
}

  1. 问题:如何动态创建控件 ,虽然能够用CREATE来创建构件, 但无法在窗口中显示。

回答1:原因是你创建控件的语法不完整,一些必须的属性没有说明,如X,Y,band.你可以先将控件的语法先输出到文本里,再替换为你的控件的属性.以下为一个text控件的最基本的语法. 
create text(band=detail alignment=”0” text=”aaaa:” x=”691” y=”52” height=”77” width=”426” name=aaaa font.face=”Arial” font.height=”-12” font.family=”2” font.charset=”0” background.mode=”1” )

回答2: 我又看了看帮助,找到了答案:现在公布: 
window.openUserObject () 
参数请查看帮助

  1. 问题:PB做报表时,如何使表格线连续 不同记录之间的表格线总是断的!

回答1:请将竖线画长点!

回答2:在报表的属性中设置Units项为1/1000cm或Pixels,这样报表的上下线就可以连续了。

  1. 问题:如何取出DDDW中的Display Column的内容。

回答1:string ls_value 
ls_value=dw_1.describe(“Evaluate(‘lookupdisplay(column_name)’,1)”) 
column_name=列名 ,’1’表示第一行;看看Help中的Describe

  1. 问题:变量je 是decimal {2} 型,语句je=real(data)是从一column object 取得数据。此column 是number(8,2),data是事件itemchange的参数,string型。当string data = “212122.26”时,je=212122.27。这么会这样?

回答1:用dec()函数转换

  1. 问题: 如何在PB6.0中实现图形数据窗口的水平,垂直滑杆拖动(有时数据项很多,满屏显示不下!)

回答1: 把图形 datawin object的 border 设为可调大小,即resize。然后把datawindow控件选上水平,垂直 滚动条属性即可。

  1. 问题:在PowerBuilder中如何释放分配给游标的资源。SQL Server中如何计算master和tempdb的大小?

回答1: 用close cursor 可以关闭游标,用deallocate cursor 可以释放分配给游标的资源

  1. Q : 在SCO UNIX OPEN SERVER 3.0 下安装SYBASE10.0.2,当运行SYBINIT到最后要启动SQL SERVER时失败,如何解决?

回答1:看看share memory could not directly allocated在SCO UNIX OPEN SERVER 3.0 下安装SYBASE10.0.2,当运行SYBINIT到最后要: 
1, 增加操作系统的Max Shared Memory 
2,修改SQL Server的配置 
a. Set Total Memeory . ex:32M 
b. Create Cache for Database or append the default data cache 
c. 其它需要根据你的具体情况配置 
3, 增大tempdb的容量 
4, 建立合适的index 根据你的应用建立index,避免大的表扫描。

  1. 问题::我的情况是:安装SYBASE,运行SYBINIT进行各项设置时,当它试图Boot the sql server 时出错,如何解决?

回答 
1,Unix 的IDE H.D.一般应该为Normal. 
2, SYBASE在UNIX下要配置几个参数。前面有过回答。SYBINIT运行到最后,BUILD THE MASTER 成功,当它试图Boot the sql server 时出错,boot fail.这是安装的最后一步却失败了,配置中止,安装失败,而不是使用过程中的问题。设好环境变量后,试试以下几步: 
1, cd /etc/conf/cf.d 用configure 设 16.shared data 为32000000 
2, cd /usr/libvi aiomemlock加sybase=32000000 
3, cd /etc/conf/sdevice.d 改suds 的第二项’N’为’Y’ 
4, cd /etc/conf/cf.d link_unix

  1. 问题:在哪里可以找到该文件中各段作用及意义的详细解释? 2。是否每各application都必须有一个ini文件? 其中哪些内容是必须的?

回答1: 您完全可以不要INI文件,只不过用INI文件方便一些,当与数据库连接的信息或配置信息变化时不用修改程序而已。一般在WIN95中用注册表代替。

  1. 问题:所用的后台是sql server 11.5,对于违反DBMS 数据一致性的错误信息如何用中文错误信息代替?常见的如数据录入时,不能为空的字段没有输入数据,为什么?

回答1:在DW的dberror事件中,用MessageBox写上自己的Error Message,最后,关键的一点, return 1(或>0的数)。

  1. Q : 在PB编程中,可以定制用户事件,请问如果想采用WINSOCK API编程,当网络上数据来时, 哪个WINDOWS消息会被触发?PB中对应的事件ID是什么?

回答1:PowerBuilder does not support Socket programming. You can use VB or Power++ to create an ActiveX which encapsulates all socket methods. Then integrates this ActiveX into PowerBuilder. 
Note: If you call the receive method. The method will block until all data are received

  1. Q : 请问PB5如何连接LAN上另外一台PC上的FOXPRO文件?

回答1:使用ODBC连接当文件名不确定时,可以动态修改注册表中的ODBC信息及OBDC.INI文件中的信息,再用 transaction连接。

  1. 问题: PB5.0中生成*.exe文件后执行时报错:DataWindow Error、Database transaction 、information not available、Call SetTrans or SetTransObject function,为什么?

回答1:在DataWindow Retrieve之前应该用Settransobject函数,即: 
Connect using sqlca; 
dw_1.settransobject(sqlca) 
dw_1.retrieve()

  1. Q : 通过Winsock已实现调用Web页面的功能,但在拨号时win95自动启动的拨号网络程序, 请问Winsock中是否有自动拨号和收线的函数?

回答1:PB原本是不支持WINSOCK编程的,但POWERSOFT提供了pslib5.dll和winsock.pbl两个工具.前者是winsock 2.0的DLL,后者是PB的用户对象集,提供了winsock的所有函数.

  1. 问题:PB6 的应用生成可执行文件后,怎么知道它需要哪些动态连接库?是否所有库都能在shared目录下找到?

回答1:(only for win95) 
一、shared ALL PBVM60.DLL; Datawindow and report PBDWE60.DLL;Richtext PBRTC60.DLL;OLE win95 PBAEN60.TLB 
二、DB interface MS SQL server 6.0 PBMSS60.DLL;PB ODBC PBODB60.DLL;PBODB60.INI;Oracle 7.1 PBO7106.DLL;Oracle 7.2 PBO7206.DLL;Oracle 7.3 PBO7306.DLL;Sybase SQl Server 11.x PBSYC60.DLL 
三、数据库驱动DLL这个太多了,查查相应的HLP文档。 
shared DLL、DB interface、DB driver 三者缺一不可,把所有的这些文件放入\window目录下是可以的,因为该目录是window的缺省目录,

Q回答1:但是不能把所有的应用程序的DLL都放这里吧? 
有两种Solution: 
1>>把工作路径加入Windows注册表中应用程序的PATH中,(V_V); 
2>>把工作路径加入Autoexec.bat中(^_^)。 
这样,这些DLL放在那里都可以了!

  1. 问题:使用PWIN95 OSR2, PB5.0, SQL ANYWHERE本地库.在PB下使用自己的配置文件,可以访问本地库.但是编译生成EXE后,无法访问,为什么?另外APP如果同时访问网络DB和本地DB,程序打包时应该注意什么问题?

回答1: 1》这些库都包括了吗?(PB在windows注册表中包含了DLL的路径,所以他的DLL可以不必放在PB60.EXE下,yours?) 
2》SQLCA直接写吧,不要从PB.ini中读。 
3》一定要找到SQLANY50和oracle 7.3的DB driver,并放置到合适的路径下。SQLANY50 WOD50T.DLL,WL50ENT.DLL,WTR50T.DLL,WODBC.HLP 
4》你的DLL包含了MS的DB driver了吗?DS16GT.DLL,DS32GT.DLL, MSCVRT40.DLL,ODBC32.DLL,ODBC16GT.DLL, ODBC32GT.DLL, ODBCCP32.CPL, ODBCCR32.DLL,ODBCINT.DLL,ODBCINST.CNT,ODBCTRAC.DLL,ODBCAD32.EXE 
5》试试控制面板中的ODBC32,是不是有什么问题。 
6》如还有问题,请再说详细些。

  1. 问题:用PWIN95 OSR2, PB5.0, SQL ANYWHERE本地库.在PB下使用自己的配置文件,可以访问本地库.但是编译生成EXE后,无法访问,为什么?程序打包时应该注意什么问题,?

回答1: 其实,如果编译没有错误,只要在pb目录中shared子目录下,把Pbvm60.dll拷贝到win95的目录下,然后在把pbdwe60.dll、pbodb60.dll、pbrtc60.dll、pbtra60.dll、pbodb050.dll、pbmss60.dll这几个动态连接库,拷贝到你编译后的工作目录下,就可以了。

  1. Q : 请教pb6.0如何调用win95的输入法问题。比如:当光标在编辑框中,系统能自动的显示当前的输入模式,不用Ctrl+space组合键来显示当前的输入法,请问怎么实现这一方法?

回答1:先在Local extenal function定义下列API Function 
function boolean ImmSimulateHotKey (UnsignedLong hWnd,UnsignedLong dwHotKeyID) library “IMM32.dll” 
function unsignedlong GetKeyboardLayout (unsignedlong wLayout)library “user32.dll” 
function boolean ImmIsIME(unsignedLong hklKeyboardLayout)library “IMM32.DLL” 
如果是使用datawindow, 在itemchangedfocus event中: 
ulong hklKeyboardLayout 
Choose Case dwo.name 
Case “chinese_text” 
// 需要中文输入的字段 
hklKeyboardLayout=GetKeyboardLayout(0) 
if not ImmIsIME(hklKeyboardLayout) then 
ImmSimulateHotKey(handle ( parent,112) 
end if 
Case “Englist_text” 
// 英文输入字段 
hklKeyboardLayout=GetKeyboardLayout(0) 
if ImmIsIME(hklKeyboardLayout) then 
ImmSimulateHotKey(handle ( parent ),112) 
end if 
End Choose 
在windows 编辑框中类似。

  1. 问题:DataWindow控件Find函数的查询条件好象只能有一个like,而且有了like就不能和其他条件组合,是这样吗?

回答1: 1》可以用方法POS(str1,str2)>0 and …; 
2》把like子句()。即:(col1 like ‘%ggg%’) and (col2 like ‘___WW’)。

  1. 问题: PB无法调用定义在PACKAGE中的函数或过程,此时这些函数或过程在PB中根本看不到,为什么?

回答1:首先在PACKAGE声明方法(Function,受JAVA的“METHOD”的影响不习惯叫“函数”, HEHE..)这个声明把该方法声明成公共 (Public)方法。然后在PACKAGE BODY中定义该方法。(如果仅在PACKAGE BODY中定义该方法,则被认为是私有(Private)方法,将不能被包外的应用访问,OOP的典型应用)例如:定义包,并声明一个 procedure pro_1: 
Package p_zhhz is procedure pro_1(v1 in number); 
end p_zhhz; 
定义包体,在包体中定义这个 procedure pro_1: 
Package BODY p_zhhz is procedure pro_1(v1 in number) is begin 
delete from a_zhhz_test where zhhz_number = v1; 
end pro_1; 
end p_zhhz; 
在PB中调用: 
int li_v1 
//声明procedure,并且置初值 
li_v1=5 
DECLARE sel_zp_zhhz_1998_9_2 procedure for p_zhhz.pro_1(:li_v1) ; 
EXECUTE sel_zp_zhhz_1998_9_2; 
CLOSE sel_zp_zhhz_1998_9_2; 
// (zhhz 1998-9-2) 
// [email protected] 
回答2: 感谢你的帮助.由于我的存储过程是个函数,所以没采用EXECUTE;在TRANSACTION对象中声明时采用”RFCFUNC”定义为一个函数,加上包名.问题已得到解决.


  1. 问题:为何在一个TabPage上建一个DATA WINDOW 后不能COMMIT?

回答1:commit是嵌入SQL语句,update()函数把对数据库的修改写到日志,commit递交到数据库,因此不存在无法commit的问题。可能您没有把TabPage上的update()函数要写成Tab_?.TabPage_?.dw_?.update()

回答2:能够!可能是你的data window的属性(update)没有设置!


  1. 问题:在pb的Datawindow中遇到了日期格式的困扰,如何处理?

回答1:我用PB的EDITMASK 时,可以直接修改无须用DEL先删除。不知你的属性如何设置

猜你喜欢

转载自blog.csdn.net/ClearLoveQ/article/details/83825877