DataWindow spy


Link to this posting

Postby Ursego » 19 Feb 2013, 21:24

Image

It is a utility which gives PowerBuilder programmers a magic ability to quickly and easily see hidden DataWindow information in run-time without using the debugger. The utility increases productivity of developers and production support analysts, adding them speed and comfort: in order to instantly see hidden information, they simply click on appropriate DataWindow's areas while Shift is pressed. And that - instead of boring and time-consuming debugging and exploring the application in the development environment!

The spy shows not only all the hierarchy of the visual objects (from the window and the menu to the DataObject) but also their PBLs - this feature is especially useful for the project's newcomers: now they are exempted from never-ending scrolling in PB's Objects Browser. The displayed info can be copied to the Windows clipboard; for example, you can copy the DW's SQL SELECT, then paste it into a database tool (like TOAD or PB's database painter) and run looking for a retrieval bug.

This utility works only when the application is running from PB, NOT as a standalone executable (we don't want to confuse the users!).

The Spy doesn't require PFC or any other kind of framework: it is easily added to any PB (version 7 or later) project - by inserting a few lines of code!

It's not a commercial product - in fact, I created it for myself many years ago, and it travels with me from project to project, but if somebody wants to use that small helper to facilitate his/her developer's work - please help yourself, it's not copyrighted.

HOW TO ADD THE SPY TO AN APPLICATION?

1. Save the file spy.pbl on your hard disk (in the folder where the PBLs are stored).
2. Add it to your application's library list.
3. Add the following code fragment to Clicked event of your ancestor DW (like u_dw in PFC) (you can change Shift to another key or keys combinations if you wish, or if Shift is already in use in your application):

Code: Select all
//------------------------ Open DW Spy ------------------------ BEGIN
n_parm   lnv_parm

if KeyDown(KeyShift!) then
   if Handle(GetApplication()) = 0 /* running from PB, NOT as a standalone executable */ then
      if IsNull(row) or IsNull(dwo) then
         MessageBox("DW Spy", "To open DW Spy, click the datawindow itself (not an object, placed on top of it).")
      else
         lnv_parm.uf_set(w_spy.PARM_NAME__DW, this)
         lnv_parm.uf_set(w_spy.PARM_NAME__ROW, row)
         lnv_parm.uf_set(w_spy.PARM_NAME__COL, dwo.name)
         OpenWithParm(w_spy, lnv_parm) // >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> http://code.intfast.ca/viewtopic.php?t=3
      end if
   end if
end if
//------------------------ Open DW Spy ------------------------ END

4. Save. That's it!

HOW TO USE THE SPY?

Image

To call the Spy, simply press Shift and click a DataWindow in a running application. If you want to get information about a row or a field then click just on that row/field. That's how the Spy is looking just after calling:

Image

The next paragraphs describe the functionality of the window's buttons.

On-Window Hierarchy

Vertically - hierarchy of displayed objects (from window to DW's DataObject or stored proc).
Horizontally - inheritance chain of each inherited object (including PBLs).

An example of information, displayed for a DW, placed on a tab and having a stored proc as the data source:

Code: Select all
###### WINDOW: ###################################

w_policy (C:\proj\policy.pbl)
    w_modal (C:\proj\lib.pbl)
        w_response (C:\proj\lib.pbl)
            w_base (C:\proj\lib.pbl)

###### TAB: ######################################

tab_policy

###### USEROBJECT: ###############################

tabpage_driver
    u_tab_driver (C:\proj\driver.pbl)
        u_tab (C:\proj\lib.pbl)
            u_custom_visual (C:\proj\lib.pbl)

###### DATAWINDOW: ###############################

dw_driver_claims
    u_dw_list_updatable (C:\proj\lib.pbl)
        u_dw_list (C:\proj\lib.pbl)
            u_dw (C:\proj\lib.pbl)

###### DATAOBJECT: ###############################

d_driver_claims (C:\proj\driver.pbl)

###### STORED PROCEDURE (DW'S DATA SOURCE): ######

s_driver_claims


Window's Menu

The menu attached to the window and its inheritance chain (including PBLs).

Size & Coordinates

Size & Coordinates of the window. Useful to troubleshoot a window whose size and coordinates are set dynamically in a script.

Data Source

DW's Data Source (SQL Select or Stored Procedure). If retrieval arguments exist in the DW then there are the following changes:

1. The button's text becomes "Data Source and Arguments".
2. The displayed message contains the arguments' names, datatypes and the values the last retrieval has been performed by.

Invisible Fields

For each invisible field, the following information is shown:

* Name in the DataWindow.
* Name in the DB (if different from the name in the DataWindow).
* Value (if it has been changed then the both - the Original and the Current).
* Data type.
* For computed fields: the expression and the value evaluated for the clicked row.
* Updatable or Not Updatable.
* DWItemStatus of the field.

If the DW has no rows then only row-independent info is shown.

Sort Expression

Displays the expression the DW is sorted by if a sort is defined. Otherwise the button is disabled and titled "No Sort Applied".

Filter Expression

Displays the expression the DW is filtered by if a filter is defined. Otherwise the button is disabled and titled "No Filter Applied".

Filtered Rows

Displays the data, contained in the Filter! buffer, using the original DataObject of the investigated DW. If the Filter! buffer is empty, then the button is disabled and titled "No Filtered Rows".

The DW can be sorted by one column. To sort in ascending order, double-click on the field (the column's font becomes blue). To change sorting to descending, make one more double-click on the same column (the font becomes red). To restore the original sorting, close and re-open the Spy.

Deleted Rows

Displays the contents of the Delete! buffer using the original DataObject of the investigated DW. If the Delete! buffer is empty then the button is disabled and titled "No Deleted Rows".

Size & Coordinates

Size & Coordinates of the DW. Useful to troubleshoot a DW whose size and coordinates are set dynamically in a script.

Row Status

DWItemStatus of the clicked row.

Updated Fields

Fields (visible and invisible) of the clicked row which have been updated (by the user or programmatically) but not saved yet, with their old and new values.

Field Info

Regular field: name in the DataWindow (and DB name if differs), data type, Updatable/Not Updatable, DWItemStatus, value (useful when the field width is not enough to display the whole text), the expressions for Enabled and Update properties (if exists), the list of the field's attributes and their current values. If the field's value has been changed then both the Original and the Current Values are shown.

Computed field: expression and data type.

Field with DropDownListBox: Code Table (pairs 'Display Value' - 'Data Value')

Field with DropDownDataWindow: values of Display Column - Data Column, DWC's DataObject and Data Source, retrieval arguments etc.

DDDW's Data

Displays the data, contained in the DropDownDataWindow of the clicked field (using the original DataObject of the investigated DDDW).

The Spy displays the contents of the DataWindowChild's Primary! buffer only. If the DDDW contains filtered or deleted rows then a message box pops up suggesting to open an additional instance of the DW Spy (by clicking the DW on the first instance) and then to click on "Filtered Rows" / "Deleted Rows" button on that additional instance. A similar message is also shown if there are invisible fields in the DDDW (in this case the suggestion is to click the "Invisible Fields" button on the additional Spy's instance).

Image
User avatar
Ursego
Site Admin
 
Posts: 143
Joined: 19 Feb 2013, 20:33

Link to this posting

Postby Ursego » 27 Feb 2013, 10:44

RUSSIAN TRANSLATION

DataWindow spy

Image

Перед Вами утилита, позволяющая программистам PowerBuilder быстро и легко увидеть скрытую информацию DataWindow в runtime без использования дебаггера. Утилита повышает производительность разработчиков и аналистов по поддержке аппликации, добавляя скорость и комфорт: чтобы мгновенно увидеть скрытую от глаз информацию, им надо просто нажать Shift и кликнуть на соответствующем участке DataWindow. И это - вместо скучного и долгого дебаггирования и исследования аппликации в среде разработки!

Шпион показывает не только всю иерархию видимых на экране объектов (от окна и меню до DataObject-а), но также их PBL-и, что особенно полезно для новичков проекта, которые отныне избавлены от бесконечных поисков в Objects Browser-е. Показанное сообщение может быть скопировано в Windows clipboard чтоб быть использованным в дальнейшем; например, Вы можете скопировать SQL SELECT, затем вставить его (Ctrl+V) в редактор SQL (TOAD или пауэрбилдеровский database painter) и запустить в поисках проблемы извлечения данных.

Шпион не требует PFC или какую-то другую библиотеку классов: он просто (вставкой нескольких строк кода!) добавляется в любой проект на PB версии 7 и выше.

Утилита работает только когда аппликация запущена из ПауэрБилдера, и не работает в EXE дабы не пугать юзеров.

Это не коммерческий продукт - фактически, я создал его много лет назад для себя, любимого, будучи направляемым Великой Силой Программерской Лени, и он путешествует со мной из проекта в проект, но если кто-то хочет использовать этого маленького помощника для облегчения своей тяжкой программистской доли - пожалуйста, нет проблем, он НЕ защищён авторскими правами.

КАК ЗАСЛАТЬ ШПИОНА В АППЛИКАЦИЮ?

1. Сохраните файл spy.pbl на хард-диске (в папке, где хранятся PBL-файлы Вашей аппликации).
2. Добавьте его в library list Вашей аппликации.
3. Добавьте следующий фрагмент в скрипт события Clicked Вашего базового DW (например, u_dw в PFC) (можете перепрограммировать на другую клавишу или комбинацию клавиш если желаете или если Shift занята другой функциональностью):

Code: Select all
//------------------------ Open DW Spy ------------------------ BEGIN
n_parm   lnv_parm

if KeyDown(KeyShift!) then
   if Handle(GetApplication()) = 0 /* running from PB, NOT as a standalone executable */ then
      if IsNull(row) or IsNull(dwo) then
         MessageBox("DW Spy", "To open DW Spy, click the datawindow itself (not an object, placed on top of it).")
      else
         lnv_parm.uf_set(w_spy.PARM_NAME__DW, this)
         lnv_parm.uf_set(w_spy.PARM_NAME__ROW, row)
         lnv_parm.uf_set(w_spy.PARM_NAME__COL, dwo.name)
         OpenWithParm(w_spy, lnv_parm) // >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> http://code.intfast.ca/viewtopic.php?t=3
      end if
   end if
end if
//------------------------ Open DW Spy ------------------------ END

4. Сохраните. Вот и всё!

КАК ПОЛЬЗОВАТЬСЯ ШПИОНОМ?

Image

Чтобы вызвать Шпиона, просто нажмите Shift и кликните мышкой на DataWindow в запущенной (в хорошем смысле этого слова :lol: ) аппликации. Если Вас интересует информация о конкретных строке или поле, то кликайте именно по этим строке/полю. Вот как выглядит Шпион сразу после вызова:

Image

Следующие разделы описывают функциональность кнопок этого окна.

On-Window Hierarchy

По вертикали - иерархия отображаемых объектов (от окна до DataObject-a или хранимой процедуры).
По горизонтали - цепочка наследования каждого объекта, имеющего предков (включая PBL-и).

Пример информации, показываемой для ДатаВиндова, который расположен на Tab-е и в качестве источника данных имеет хранимую процедуру:

Code: Select all
###### WINDOW: ###################################

w_policy (C:\proj\policy.pbl)
    w_modal (C:\proj\lib.pbl)
        w_response (C:\proj\lib.pbl)
            w_base (C:\proj\lib.pbl)

###### TAB: ######################################

tab_policy

###### USEROBJECT: ###############################

tabpage_driver
    u_tab_driver (C:\proj\driver.pbl)
        u_tab (C:\proj\lib.pbl)
            u_custom_visual (C:\proj\lib.pbl)

###### DATAWINDOW: ###############################

dw_driver_claims
    u_dw_list_updatable (C:\proj\lib.pbl)
        u_dw_list (C:\proj\lib.pbl)
            u_dw (C:\proj\lib.pbl)

###### DATAOBJECT: ###############################

d_driver_claims (C:\proj\driver.pbl)

###### STORED PROCEDURE (DW'S DATA SOURCE): ######

s_driver_claims


Window's Menu

Присоединённое к окну меню и его цепочка наследования (включая PBL-и).

Size & Coordinates

Размер и координаты окна. Кнопка полезна во время отладки когда они вычисляются динамически.

Data Source

Источник данных DW (SQL Select, хранимая процедура или 'External DW'). Если в DW имеются аргументы (retrieval arguments), то это вызывает следующие изменения:

1. Текст кнопки становится "Data Source and Arguments".
2. Отображаемое сообщение содержит информацию об аргументах - названия, типы данных и значения во время последнего извлечения данных.

Invisible Fields

Невидимые поля. Для каждого поля показываются:

* Название в DataWindow.
* Название в базе данных (если отличается от названия в DataWindow).
* Значение (если оно было изменено, то наряду с текущим [current] показано и первоначальное [original]).
* Тип данных.
* Для вычисляемых полей (computed fields) показываются их выражения (expressions) и результирующие значения, вычисленные по этим выражениям для кликнутой строки.
* Обновляемое или необновляемое (Updatable / Not Updatable).
* DWItemStatus поля.

Если в DW нет ни одной строки, то показывается только не зависящая от строки информация.

Sort Expression

Высвечивает критерий сортировки DW если оно отсортировано. В противном случае кнопка неактивна, а её текст - "No Sort Applied".

Filter Expression

Высвечивает критерий фильтровки DW если оно отфильтровано. В противном случае кнопка неактивна, а её текст - "No Filter Applied".

Filtered Rows

Показывает содержимое буфера Filter! используя оригинальный DataObject исследуемого DW-а. Если буфер Filter! пуст, то кнопка неактивна, а её текст - "No Filtered Rows".

DW, отображающее отфильтрованные записи, может быть отсортировано по одной колонке. Чтобы отсортировать по возрастанию, дабл-кликните на колонке (при этом цвет её шрифта изменится на синий). Для сортировки по убыванию дабл-кликните на той-же колонке (её цвет станет красным). Для восстановления оригинальной сортировки закройте Шпиона и откройте заново.

Deleted Rows

Показывает содержимое буфера Delete! используя оригинальный DataObject исследуемого DW-а. Если буфер Delete! пуст, то кнопка неактивна, а её текст - "No Deleted Rows".

Size & Coordinates

Размер и координаты DW. Кнопка полезна во время отладки когда они вычисляются динамически.

Row Status

DWItemStatus кликнутой строки.

Updated Fields

Поля (видимые и скрытые) кликнутой строки, которые были изменены (пользователем или из кода), но ещё не были сохранены в базе данных, с их старыми и новыми значениями.

Field Info

Обычное поле: название в DataWindow (и в базе данных, если отличается), тип данных, DWItemStatus, значение (может оказаться полезным когда визуальная ширина поля недостаточна чтобы показать весь текст), выражения для свойств Enabled и Update (если есть), список атрибутов поля и их текущие значения. Если значение поля было изменено, то показываются оба значения - первоначальное (original) и текущее (current).

Вычисляемое поле: выражение и тип данных.

Поле с DropDownListBox: кодовая страница (пары 'Отображаемое Значение' - 'Сохраняемое Значение').

Поле с DropDownDataWindow: 'Отображаемое Значение', 'Сохраняемое Значение', а также DataObject, источник данных (SQL SELECT или процедура) и retrieval arguments выпадающего окна данных (DataWindowChild).

DDDW's Data

Отображает данные, содержащиеся в DropDownDataWindow-е кликнутого поля (используя оригинальный DataObject исследуемого DDDW-а).

Шпион показывает лишь содержимое буфера Primary!. Если в DDDW-е имеются отфильтрованные или удалённые строки, то появляется сообщение, предлагающее открыть дополнительный экземпляр Шпиона (кликом по DW на первом экземпляре) и затем нажать кнопку "Filtered Rows" / "Deleted Rows" на этом этом экземпляре. Похожее сообщение высвечивается также если в DDDW имеются невидимые поля (в этом случае в дополнительном экземпляре Шпиона предлагается нажать кнопку "Invisible Fields").

Image
User avatar
Ursego
Site Admin
 
Posts: 143
Joined: 19 Feb 2013, 20:33




Ketones are a more high-octane fuel for your brain than glucose. Become a biohacker and upgrade yourself to version 2.0!



cron
Traffic Counter

eXTReMe Tracker