Powerbuilder 12.1和DataWindow在设计与调试和可执行/运行时

时间:2014-07-27 22:33:08

标签: powerbuilder datawindow

我对Powerbuilder 12.1有一个非常奇怪的情况。我有两个可能相关的问题 - 主要是因为它是完全相同的数据窗口报告。

问题#1:不知何故,某些地方,在调试和运行时期间显示DataWindow内容的功能已丢失。在调试和运行时期间,您无法再看到数据窗口的内容。

但是当您在设计模式下进入数据窗口时,它会提示您输入所需参数的值,内容显示得很好。

编辑:已解决。这是因为Powerbuilder使用整数而不是长变量。数据库中的标识ID超出了PowerBuilder 16位整数(32,767)的上限。我更新了逻辑以使用long,这解决了这个问题#1。

问题#2:

当我在调试模式下使用上面问题#1中提到的相同数据窗口运行报告代码以生成新的报告文件时,它只能在DEBUG模式下工作。运行时失败 - 我在运行期间因完全相同的调用而得到-1错误。

这是使用DATASTORE的代码片段(我已经尝试过DataWindow只是为了看到它而且也失败了):

  datastore lds_blarney_report
  lds_blarney_report = CREATE datastore

  iw_main_sheet.wf_write_log("Retrieving report data")

  lds_blarney_report.dataobject = as_datawindow
  lds_blarney_report.SetTransObject(sqlca)
  ll_ret = lds_blarney_report.retrieve(al_file_no, "%")

在DEBUG模式下:最后一行返回一些正的非零值,并生成一个报告 在RUNTIME模式下:最后一行返回-1(根据Sybase,Retrieve返回显示的行数(即主缓冲区中的行)如果成功则返回-1,如果失败则返回-1。如果没有指定DataWindow对象在DataWindow控件或DataStore中,此方法返回-1。)

那么为什么检索在创建新报告文件时在调试时工作,但在运行时失败?

2 个答案:

答案 0 :(得分:1)

听起来你在运行时试图加载的DW并没有被编译到应用程序中。

关于如何发生这种情况有几种可能性:

  1. 您的PBR文件不再包含运行时引用的数据窗口对象。它需要重新添加。
  2. PBR文件从未有过对DW的引用,但是某处有一个绝对引用导致它被包含在内。该引用现已消失,EXE不再包含DW。
  3. 包含DW的PBL曾经是PBD,但现在正被编译到应用程序中。这意味着没有对该PBD中的数据窗口进行运行时分配,而不包含在APP PBR文件中或显式分配给画家。
  4. 希望这有帮助。

答案 1 :(得分:0)

我能够解决这个问题,但解决方案没有回答这个紧迫的问题"为什么以前的代码很好用多年,决定停止工作?"

以前,代码传递了一个字符串参数,用于将数据存储区标识为本地数据存储区的dataobject参数。这足以使用数据存储区中包含的SQL查询来提取所需数据以生成报告(通过SaveAs)。这是原始代码:

datastore lds_blarney_report
lds_blarney_report = CREATE datastore

iw_main_sheet.wf_write_log("Retrieving report data")

lds_blarney_report.dataobject = as_datawindow
lds_blarney_report.SetTransObject(sqlca)
ll_ret = lds_blarney_report.retrieve(al_file_no)

不知何故,在某个地方,代码被破坏,只能在IDE / Debug中运行,但在运行时(编译后的可执行文件)失败并返回-1错误。

我能够通过在PBL项目中创建数据存储对象(n_ds_ * )来解决这个问题(数据窗口在另一个PBL中),然后继续使用它。这是更新后的代码...

NOTE:  n_ds_no_load_blarney was created in the project with a 
       dataWindow reference to d_blarney in a different library.

n_ds_no_load_blarney lds_no_load_blarney

iw_main_sheet.wf_write_log("Retrieving report data") 

lds_no_load_blarney = CREATE n_ds_no_load_blarney
lds_no_load_blarney.setTransObject(SQLCA)
ll_ret = lds_no_load_blarney.retrieve(al_file_no)

正如您所看到的,虽然存在差异,但代码看起来几乎相同。也就是说,我仍然不知道为什么第二个代码片段有效,而不是第一个。经过多年的工作,为什么它现在停止工作?也许它是如此明显,以至于它的时代在我脑海中徘徊。 :)

感谢您的帮助。

编辑:编辑:

我是一个愚蠢的铜头,值得Dan Aykroyd的Conehead角色。所有这些粪便击中风扇的原因是因为我们将Powerbuilder开发机器移动到一个新工作站(新操作系统,新的一切)。由于这一举动,Powerbuilder开发地点改变了驱动器号。

这意味着我们忘记更新每个Powerbuilder项目的PBR文件,以指向新驱动器上的更新位置。一旦我这样做,这里报告的所有这些问题就消失了。有趣。