如何在PowerBuilder 12.5调试器中查看数据缓冲区?

时间:2012-09-20 10:22:08

标签: .net debugging powerbuilder datastore watch

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

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

3 个答案:

答案 0 :(得分:0)

我的建议是对您的DataWindows进行单元测试。您可以在DataWindow Painter中手动测试它们,也可以在PowerUnit中编写单元测试。 当你在调试器时,你不应该想知道DataWindow中的数据。如果您正在调试的代码正在访问数据,您将看到它获取的值,检索参数等。如果代码不访问数据,您为什么要关心它是什么?实际上,由于模式的改变,我在大约30个DataWindows中修改了SELECT,并且我有一个很棒的时间单元测试它们,因为之前没有人为它们编写测试。另外,编写代码以便更容易调试。例如,将返回值转换为变量而不是直接使用它们。

答案 1 :(得分:0)

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

我经常使用的一种解决方法是将代码添加到数据窗口控件的单击事件(祖先更好)并使用keydown函数来确定pre已经按下了定义和模糊的组合键。如果有,则数据应保存到文件

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

对于Excel,

ctl + alt + e

ctl + alt + t for Text!

CSV的

ctl + alt + c

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

因此,如果用户持有 ctrl + alt + e 点击数据对象上的任何位置,将触发以下代码,从而将数据写入Excel,并且excel文件自动打开。我经常将此功能留在生产应用程序中(有时我根据数据的敏感程度过滤我的用户ID),因为它是 GREAT生产支持工具。我们的 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"

这不是你想要的但是它有效!

HTH

答案 2 :(得分:0)

当你说这个功能在PB12.5中可用时,你让我很好奇,因为我觉得不可能。

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

enter image description here

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