DW Spy

Share this topic:



Link to this posting

Postby Ursego » 19 Feb 2013, 21:24

The latest version's date: 23-APR-2013.
Your version's date: see your copy of w_spy -> comment in the instance variables section.


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 productiveness of developers and production support analysts, adding them speed and comfort: in order to instantly see hidden information, they simply right-click on appropriate DataWindow's areas while "secret keys" Alt+F1 are 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 project's newcomers: now they are exempted from never-ending scrolling in PB's Objects Browser. Displayed messages can be copied to the Windows clipboard to be used for later reference; 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.

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

It's not a commercial product - in fact, I created it for myself 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, no problem, it's not copyrighted. And if you have more ideas about DW espionage and wish to improve the utility - please leave a comment in this topic!

HOW TO ADD THE SPY TO AN APPLICATION?

1. Save the files exception.pbl and spy.pbl on your hard disk (in the folder where the PBLs are stored).
2. Add them to the end of your application's library list.
3. Add the following code fragment to RButtonDown event of the ancestor DW (like u_dw in PFC) (you can change the keys combinations if these are already used in your application):

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

if KeyDown(KeyAlt!) and KeyDown(KeyF1!) then
   if Handle(GetApplication()) = 0 /* running from PB, NOT as a standalone executable */ then
      lnv_parm.uf_set(w_spy.PARM_NAME__DW, iuo_dw)
      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)
   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 the "secret keys" Alt+F1 and right-click on a DataWindow in a running application. If you want to get information about a row or a field then right-click just on that row/field. That's how the Spy is looking just after calling (irrelevant buttons are always disabled and their text explains why):

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).

Window's Menu

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

Size & Coordinates

Size & Coordinates of the window. Useful when debugging a window with size and coordinates calculated dynamically.

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 field, the following information is shown:

Name in the DataWindow.
Name in the DB (if differs from the name in the DataWindow).
Value (if it has been changed then the both - the Original and the Current one).
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 contents of the Filter! buffer using the original DataObject of the investigated DW. If the Filter! buffer is empty then the button is disabled and its text is "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 its text is "No Deleted Rows".

Size & Coordinates

Size & Coordinates of the DW. Useful when debugging a DW with size and coordinates calculated dynamically.

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) and 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 instanse).




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

Link to this posting

Postby Ursego » 27 Feb 2013, 10:44

RUSSIAN TRANSLATION

Дата последней версии: 23-APR-2013.
Дата Вашей версии: смотрите Вашу копию w_spy -> комментарий в разделе объявлений instance variables.


Image


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

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

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

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

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

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

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

if KeyDown(KeyAlt!) and KeyDown(KeyF1!) then
   if Handle(GetApplication()) = 0 /* running from PB, NOT as a standalone executable */ then
      lnv_parm.uf_set(w_spy.PARM_NAME__DW, iuo_dw)
      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)
   end if
end if
//------------------------ Open DW Spy ------------------------ END

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

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

Image

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

Image

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

On-Window Hierarchy

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

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: 112
Joined: 19 Feb 2013, 20:33


Return to Tips and Tricks

Who is online

Users browsing this forum: No registered users and 1 guest


DW Spy

Share this topic:


If you think that this site is not too bad, please LIKE it in Facebook. Thanks!





cron
free counters

eXTReMe Tracker