0

由于此选项应该是 PowerBuilder 12.5 .NET 中的新功能,但在 Debugger 中我看不到 DataStore 对象中的任何数据。Debugger中显示的对象信息只有“base”、“DataObject”和“FlowDirection”,仅此而已。调试时如何查看 DataStore 对象中的数据?

在以前的 PowerBuilder 版本中,我可以通过调用 Watch 中的 SaveAs() 方法来做到这一点,并且 DataStore 数据保存在本地文件中。但是现在,此选项不起作用(仅在源代码中)它返回“)预期”。

4

3 回答 3

0

当您说 PB12.5 中提供该功能时,您让我对此感到好奇,因为我认为这是不可能的。

经过反复试验,我了解到新的数据窗口功能仅在某些 PowerBuilder 12.5 目标中可用。简而言之,该功能仅限于新设计的 WPF 数据窗口。下图显示了新功能的外观。您可以展开每个缓冲区部分以查看该缓冲区中的行,您可以展开一行以查看该行的所有列。

在此处输入图像描述

我创建了一篇博文,展示了使用新功能的示例,包括在主缓冲区和过滤缓冲区中显示数据。可以通过此链接找到博客文章:新的 PowerBuilder 12.5.NET DataWindow 缓冲区调试功能

于 2012-11-03T01:10:49.380 回答
0

我的建议是对您的 DataWindows 进行单元测试。您可以在 DataWindow Painter 中手动测试它们,也可以在 PowerUnit 中编写单元测试。当您在 Debugger 中时,您不应该对 DataWindow 中的数据感到疑惑。如果您正在调试的代码正在访问数据,您将看到它正在获取的值、检索参数等。如果代码不访问数据,您为什么要关心它是什么?碰巧的是,由于架构更改,我刚刚在大约 30 个 DataWindows 中修改了 SELECT,并且我正在对它们进行单元测试,因为之前没有人为它们编写过测试。此外,编写代码以便更容易调试。例如,将返回值放入变量中,而不是直接使用它们。

于 2012-09-28T16:53:56.697 回答
0

在 2012 年 11 月 2 日添加了附加段落 - 我在调试时遇到了一种非常酷的方式来查看缓冲区数据,这对数据存储最有用,但对数据窗口应该可以正常工作。查看此站点部分Save DataStore from Debugger

我通常使用的一种解决方法是将代码添加到数据窗口控件的单击事件(祖先甚至更好),并使用keydown 函数来确定是否按下了预定义且晦涩的组合键。如果有,则应将数据保存到文件中。

我喜欢为最常见的类型创建隐藏的复活节彩蛋功能,包括一种提示用户输入文件类型和名称的通用类型。

ctl+alt+ e for Excel!

ctl+alt+ t表示文本!

用于 CSV 的ctl+alt+ c !

ctrl+alt+ a for Any(使用 SaveAs 对话框提示)

因此,如果用户按住ctrl+alt+e单击数据对象上的任意位置,则会触发以下代码,导致数据写入 excel,并自动打开 excel 文件。我经常将此功能保留在生产应用程序中(有时我会根据数据的敏感程度过滤我的用户 ID),因为它是一个很棒的生产支持工具。我们的QA 部门也喜欢该功能,因为他们可以轻松记录数据,并且可以查看所有列,即使是未显示的列。

long ll_handle
string ls_filename, ls_null, ls_dir

if keydown(KeyControl!) and keydown(KeyAlt!) then

    // set work variables to be used in save 
    SetNull(ls_null)

    // grab handle to MDI frame window for the ShellExecute function
    ll_handle = Handle(gwMdi)

    // construct the filename using dataobject and datetime  
    ls_dir = "c:\temp"
    ls_filename = ls_dir + '\debug_dataobject_' + this.dataobject + '_date_' + string(Today(),'mmddyyhhmmss') 

    // determine if we are saving excel, text, csv, or prompting for filetype
    if keydown(keye!) then
       ls_filename =+ '.xls'
       dw_1.SaveAs(ls_filename, Excel!,True!)
    elseif keydown(keyt!) then
       ls_filename =+ '.txt'
       dw_1.SaveAs(ls_filename, Text!,True!)
    elseif keydown(keyc!) then
       ls_filename =+ '.txt'
       dw_1.SaveAs(ls_filename, Csv!,True!)
    elseif keydown(keya!) then
       ls_filename =+ ''
       // empty string forces dialog open
       dw_1.SaveAs(ls_filename)
    end if

   // now automatically open the file using default program 
   // for the file type via Windows API function
   if fileexists(ls_filename) then
      gwMdi.ShellExecute(ll_handle, 'open', ls_filename, ls_null, ls_dir, 3)
   end if
end if


// Define ShellExcecute as Local External Function 
// somewhere in your application or as Global External Function:
Function Long ShellExecute (Long hWnd, String lpOperation, String lpFile, String lpParameters, String lpDirectory, Long nShowCmd) Library "shell32.dll" Alias For "ShellExecuteA"

这不是您想要的,但它确实有效!

高温高压

于 2012-10-27T04:20:33.440 回答