PowerBuilder Interview Questions – Beyond Canned
I have been through dozens of PowerBuilder interviews over the last twenty years and there is one that that never changes, the list of PowerBuilder interview questions. You can pretty much bank on being asked about the datawindow buffers, the variable protections levels, or the difference between SetTrans and SetTransObject. There is nothing wrong with the canned list of questions but I don’t think they are the best way to gauge the PowerBuilder developers experience level.
I’ve posted the typical canned interview questions at the bottom of this article after the “beyond canned” questions so you can use both. This article is going to be a work-in-progress because it I do not publish it now I may not get back to it for another six months… check back later for updates.
I’ve also added a few interviewee tips at the bottom, if you can ace them you might be able to avoid the technical screening altogether.
Questions about PowerBuilder Eccentricities
|eccentricity [ˌɛksɛnˈtrɪsɪtɪ] n pl -ties
||If you have worked with PowerBuilder for more than a few years then you have experienced some some odd behavior or quirkiness with the development tool or deployment process that is not usually learned from a book or class. There may not be an exact answer|
I would throw a question like this into the mix if I wasn’t sure about the developer or you hear a log of “click, click, clack, clack” in the background during a phone interview. This question will throw an experienced developer for a loop and you really can’t look it up on the internet (well except here), so give them a moment to digest it and maybe throw in a sample answer. Once they understand the question and the initial nervousness is gone there is no reason a developer of three years or more cannot come up with something in fact this is where an experienced developer can take control of the interview and give a very long answer making the rest of the interview a formality.
We aren’t looking for a walking syntax machine but rather get a feel for the depth of their knowledge and experience and a question like this will catch the inexperienced developer off-guard, which isn’t nice, but you aren’t doing the interview to make friends.
Question 1: PowerBuilder IDE – Real world experiences
Which painter or area in the PowerBuilder IDE do you dislike the most, and why?
If they don’t understand or need clarification then they might not have much experience but maybe they are nervous, so you can clarify by giving a very basic example that even a green developer can relate to. If they need more direction, ask which datawindow types they like the least, freeform, grid, n-up, or tree-view and why.
Valid Answers or Hints:
- The library painter sucks because it is so slow!
- the library painter sucks because it doesn’t handle inheritance changes well, for example if you removed a couple menu items in an ancestor you need to open the menu painter for every descendant and save so that the changes are reflected properly – regenerating alone isn’t enough.
- The Window, Menu, Function, User Object painters, the script modification/viewing section isn’t the best for viewing code when there is inheritance and you can’t open ancestor when a descendant of it is open in any painter.
- The Window, Menu, Function, User Object painters, script sections do not have any visible indication that a script has been overridden, you need to right click the code and make sure “Extend script” is checked.
- The Window, Menu, Function, User Object painters, script section when creating functions or events with no return value, the value (None) in the drop down datawindow of choices is at the bottom of the list.
- All the script painters with events because you can’t overload them like you can with functions.
- The script painters when adding new events or functions it seems like you always end up with a blank argument when pressing the tab too quickly.
- All painters when inheritance is used and the ancestor object name truncates at the top of the window so it is hard to see what the ancestor is.
- The datawindow painter with grid dataobject type is sometimes challenging when adding computed fields or having headers that are not directly above the columns.
- The datawindow painter when you leave the retrieve as needed option “on” and you open a dataobject that has a select with no WHERE clause PB will try to retrieve the entire database, usually locking the machine.
- Trying to change code in the debugger, unsuccessfully and then realizing you are still in the debugger.
Better Answer 1:
The menu painter because it is painfully slow and doesn’t handle changes in inheritance very well. If you change an ancestor menu by removing a menu item and open the descendant menu, the menu painter will often have problems. Often you need to open the descendant menu and save it before changes to the ancestor are applied. Another oddity of the menu painter, when there are multiple levels of inheritance is that you will sometimes get errors that duplicate menu items exist particularly for the menu separators (dash) that are commonly not given a meaningful name (e.g. m_1, m_2.. m_24)
Better Answer 2: (Thanks Jack T. via comments):
The function selection painter, when somebody has eight overloaded versions of the same function (with a nice long name), with different variable combos for the same function disappearing off the right side of the window, and you have to open each one to see which version you need. I don’t know why they didn’t make that window stretchable… maybe they do now.
The datawindow painter because of some quirky behavior and common problems. The datawindow painter sometimes crashes upon save if you switch your database connection while editing the dataobject. Another common issue, or mistake made in the datawindow painter is using the wrong database logon, for example a developer may make changes to the dataobject while logged into a specific schema in a multi-schema database. This will cause PowerBuilder to remove the schema qualification in the dataobject SQL, and when the application is delivered to the end user who logs into the database as a normal user, the datawindow doesn’t work because the tables are missing the schema qualifier.
Question 2: PowerBuilder IDE crash problem solving
What would you do if you were starting a new job and they gave you PowerBuilder, PB source code, and asked you to change a window in the application, but every time you tried opening the window in the PowerBuilder IDE it crashed? What things would you check, or what steps might you take in solving problem?
This is a great question one that everyone should have an answer for, and one that an experienced developer should be able to set themselves apart with. An inexperienced developer would struggle with this question and an experienced developer would be “relating” as this is something that all senior level PB developers have had to deal with in their career at one point or another. The problem with these type questions is that they need to be asked by a senior level PB developer, you couldn’t give this list to an HR person and expect them to know what a good answer is.
Valid Answers in no particular order:
- Make sure that all of the PBL’s are included in the library search path.
- Make sure PBL’s are listed in the proper order in library search path.
- Try regenerating the PBL’s or finding a project object and doing a full build.
- Determine ancestor objects and see if they compile and/or open.
- Make sure you have the right version of the application object, you might have a generic application object because some shops don’t put the application object under source control and you may not be using intended custom transaction or other system object.
- Try rebooting and/or restarting PB.
- Try connecting to the database if one is used in the application.
- Edit the source, rather than using the window painter and try to locate the problem area.
- Edit the source, rather than using the window painter and comment problem code until window compiles. Open window using IDE and determine why commented code fails (e.g. missing objects and/or ancestors)
- Set up a database profile in the PowerBuilder IDE if there isn’t one (new PB install) already, even if it is an unrelated ODBC connection to an Excel file, sometimes PB gets cranky if there isn’t a db connection and an object has embedded SQL.
- If there is version control, try turning it off to isolate that issue.
- Re-install PowerBuilder and the proper updates from the Sybase website.
- After completing basic troubleshooting maybe see if a co-worker is able to open the window to rule out a bad PB installation or PC related issue.
- Look at the window source (via edit source) and see if there are Active X controls that might be added to the window but are not available on your PC.
Question 2 Goals:
The goal for this question is to determine the developers ability to problem solve. I would expect a seasoned developer to come up with at least three of these right off the bat. If you have others to add to the list please add a comment; and I will add them to the list!
Question 3: PowerBuilder Datawindow ItemStatus Indicators (Row & Column)
Can you tell me about the datawindow item status feature of a datawindow and examples of what you might use them for? This question has many answers, and the good developer will run with it describing how to update multiple tables, how to initialize columns and not generate insert statements if the user doesn’t change any values, or how to copy rows from datawindow and manually control which sql statements are generated.
There are four possible datawindow item statuses, only two are used in determining which SQL statement gets generated.
1. Not Modified – Row & Column, indicate data is unchanged from what was retrieved.
2. Data Modified –Row & Column, indicate data is changed from what was retrieved.
3. New Modified –Row Only, indicate row is new and has been modified
4. New – Row Only, indicate row is new but not modified.
When the datawindow update function is called, PowerBuilder uses the row and column status indicators to determine which SQL statements need to be generated and which columns need to be included in inserts or updates. The dataobject of course needs to be set to updateable and columns marked as updateable.
Insert and Update statements are generated from the row statuses in the Primary! and Filtered! buffers.
- SQL INSERT – for rows with status of NewModified!
- SQL UPDATE – for rows with status of DataModified!
Delete statements are generated based on row status of rows in the DeleteBuffer!
- SQL DELETE – for rows in the Delete! not having status New! prior to the DeleteRow function.
UPDATE or INSERT statements use columns that are set to column status of DataModified! *Assuming they are in the updateable column list set in the dataobject.
Question 4: Real World Debugging of PowerBuilder application
Let’s say you recently migrated an application to a newer version of PowerBuilder and during unit-testing you noticed that one of the features no longer worked, the “New” button on the Order window appears to do nothing as if it were disabled but you expected it to insert a blank row. What are some things you would do in researching and solving this? There are no wrong answers, just tell me the things that you might look for if a button appeared to stop working.
The answer is not going to be right or wrong but rather graded on a scale from bad to great. Here are some of the things I’d probably expect for answers:
- Open the window, examine code in the window/button.
- Add messagebox to see if the clicked event is firing for the object as you expect.
- Right click the script and make sure the “Extend script” is checked (if it was supposed to be) sometimes the check disappears during migrations effectively overriding the ancestor script.
- Run the application though debugger, adding breakpoints in the button/window code.
- Use the SQLPreview event of the datawindow control (answer courtesy of Jack T. via comments below)
- Perform a Full Regeneration of code.
- Worst case re-create object.
Question 5: (For Developers on Recent Versions) Recent PowerBuilder Functions or Features
What are some of the new functions or features that were introduced to PowerBuilder since you’ve been using PowerBuilder. This question hasn’t made it to the common canned interview lists yet and it is a good way to see if the developer has used recent versions of PowerBuilder.
A.) Function “SaveAsFormattedText” was added in Version 10 of PowerBuilder. The SaveAsFormattedText method for DataWindow controls and DataWindow objects has the same function as SaveAsAscii, but lets you select the encoding of the file to which you save. Like SaveAsAscii, this function also mirrors more closely what the user sees on the screen with the added benefit of allowing save in different file encodings. The function also displays column headers with real column header text, and displays computed fields.
B.) SaveAsAscii was introduced in PowerBuilder 6, it is a cross between the SaveAs (Text!) function and the SaveAs (HTMLTable!) function with additional arguments. It mirrors more closely what the user sees on the screen. Arguments allow the user to control how contents are separated and delimited in the ASCII file. PowerBuilder assigns a cell for each DataWindow object (which can include computed columns and group totals).
C.) Unicode support is a big one that most newer developers will know about. It was added in version 10 and anyone performing migrations from older versions to version 10 or newer had to deal with the move to Unicode. The source code in PowerBuilder 10 PBLs is encoded in UTF-16LE. UTF-16LE is a Unicode encoding scheme that serializes a UTF-16 code unit sequence as a byte sequence in little-endian format, in which multiple-byte numerical values are stored with the least significant byte first. PBLs developed in earlier versions of PowerBuilder contain source code in ANSI or DBCS format. When you migrate applications to PowerBuilder 10, each PBL is first migrated to the new version of PowerBuilder, as in previous releases. Then PowerBuilder converts the source code from ANSI or DBCS to Unicode, performs a full build, and saves the source code back to the same file.
- The FromAnsi, FromUnicode, ToAnsi, and ToUnicode functions were added to help with the Unicode migration, however are removed from a future versions of PowerBuilder and the migration tool replaces them with the appropriate syntax of the Blob or String function.
D.) The PFC was removed from PowerBuilder Installation program in version 10, and made available on the PowerBuilder CodeXchange Web site for public use and modification. The PFC was included on the CD, however not part of the installation options.
E). The SetFilter has a new parameter added in PB11 that allows changing the sort from dictionary to ascii. The sort parameter is /s and is used in the SetFilter expression, and when used the sorting is dictionary.
F.) The Rich Text Edit controls, 3D Graph Styles and PNG Support were added in PB version 11.5. Support for function calls on .NET primitive and enumerated types was also added in PB11.5. Also notable were native database connectivity to MS SQL Server 2008 and Oracle 11.
G.) WPF Targets, Complete .NET Interoperability were added in PB Version 12. Version 12 was the first delivered with two IDE’s the classic and .NET versions.
H.) The dot notation was added as an option to PowerBuilder in more recent versions (approx version 7) that can be used in place of some common datawindow object functions such as dwCreate, dwModify, GetItemString, GetItemNumber, etc..
I.) Database connection pooling was added in Version 12, allowing sharing of a database connection.
Question 6: PowerBuilder IDE Options & Customizations
Please describe some options or customizations that you typically make to your PowerBuilder IDE. What changes do you make in options and customizations and why? Some examples might be toolbars that are visible, custom menu items, system font settings. A seasoned PB developer, if not rushed should be able to come up with a handful of settings that they are used to making. I’d be looking for some of the less common ones.
Some common changes that I make to my IDE are:
Retrieve on Preview – I typically turn off this option because it causes problems when you create datawindow’s with queries using very large tables with multiple joins and few restrictive where clause statements. Typically this would be done when you create the select statement, to be used in a case that the where clause is built dynamically, and the moment the datawindow hits preview mode PB will lock as it tries to retrieve the entire database. This usually leads to a control-alt-delete to kill PB, and if you are unlucky it will bring down the database and result in a call from the DBA.
Just In Time Debugging – I always use this cool option because when this option is checked, you can open the Debug window while running in normal mode by clicking the PowerBuilder icon and clicking the Debug button on the dialog box that displays. The Debug window also opens automatically if a system error occurs taking you directly to the exact point of failure in code.
Disable Database Connection When Compiling and Building – When PowerBuilder compiles an application that contains embedded SQL, it connects to the database profile last used in order to check for database access errors during the build process. For applications that use multiple databases, this can result in spurious warnings during the build since the embedded SQL can be validated only against that single last-used database and not against the databases actually used by the application. In addition, an unattended build, such as a lengthy overnight rebuild, can stall if the database connection cannot be made. Back in the day when PB compiles took a long time, there would be times we’d kick off the compile and arrive the next day to see PB prompted for a DB connection and had barely started.
Initialization path – I use this to change the initialization path for PowerBuilder to use corporate network user drives rather than the default local folders. By default, the initialization path is either c:\documents and settings\userName\local settings\application data\sybase\powerbuilder 12.5 (Windows XP and Windows 2003) or c:\users\userName\AppData\Local\Sybase\PowerBuilder 12.5 (Vista and later), where userName is the user currently logged in.
Adding a Custom Buttons to the Menu can be done for any of the following reasons:
- Run an executable
- Invoke a PB menu item
- Run a query
- Preview a DataWindow
- Assign a display format to column in a datawindow object (DataWindow painter only)
- Create a computed field in a datawindow
- Select a user object to display on a window or custom user object
Prompt on Exit – I don’t change this option. I prefer to be prompted before quitting PowerBuilder
Options on Workspaces Tab – There are options to reopen workspace at startup, reload painters that were open when the workspace was closed, set the number of recent workspaces, and recent objects in the File menu.
Options on System Printer & Font Size – There are options to set the Fonts, Sizes, Background colors, Colors for Printer and System.
Window Layout Settings – Windows for various painters can be customized or set to “Default”. If you find that a window is not set properly and you are unable to fix, you can set it to “Default Layout” and restore all the panes and settings to original.
Setting Object Prefixes – While uncommon, it is possible to set default prefixes for standard objects created in PowerBuilder. For example cb_ for command button, dw_ for datawindow controls, gb_ for group box, etc. Each can be set based on corporate naming standards or preferences.
Question 7: Database Connectivity
Connecting to the database is one of those things that was always challenging when you didn’t know PB, but mindless once you do have experience. I would ask a developer which databases they have connected to with PowerBuilder. And depending on the answers, ask for clarifications, such as exactly what steps would you take to create a new database connection for Oracle? A good developer should be able to talk with authority about their experiences in this area. creat
If you want to drill into it deeper maybe ask them which client libraries they had to use to connect to the database.
Oracle: OCI or newer Instant Client
SQL Server: DB Lib and/or CT Lib
PowerBuilder Interview Questions – Typical Questions
Q. List the different datawindow buffers and describe the function of each.
- Primary! – Contains data that has not been filtered or deleted.
- Delete! – Contains rows that have been selected for deletion and will generate database delete statements upon update.
- Filter! – Contains rows that have been filtered using the SetFilter & Filter functions.
Original! – This buffer is not the same as the others and is like the extra-credit answer. It contains the data as it existed when retrieved from the database so if a column were changed by the user, you could compare the new value with that of the Original! buffer to see what the column value is changing from. The way to use the Original! buffer is via the GetItem functions using true as the last argument.
The following statements set ls_name to the original string in the delete buffer for row 3 of the column named emp_name of dw_employee:
ls_name = dw_employee.GetItemString(3, “emp_name”, Delete!, true)
Q: What are the “PBCAT” tables?
A: The five PBCAT tables are: pbcatcol (columns) pbcatedt (edit styles), pbcatfmt (formats), pbcattbl (tables), and pbcatvld (validation rules). These tables are also known as the PowerBuilder system tables or collectively as the “repository” are created when first connecting to the database via the PowerBuilder IDE or initially by the DBA prior to connecting to the database using the IDE. When a row or column is added or deleted to a table from the DB Painter in Powerbuilder, a corresponding row is inserted/deleted in the pbcatcol and pbcattbl tables. If extended attributes are added, entries in the pbcatfmt, pbcatvld and pbcatedt are created.
Q: What are the three main object types that support inheritance in PowerBuilder
A: Windows, Menus & User Objects. The User Objects can consist of many different variants (e.g. singlelineedit, editmask, datawindow, datastore, custom visual, custom non-visual)
Q: How would you enable the Drop Down Calendar service in the PFC? (first two lines are the only two required)
A:dw_control.of_SetDropDownCalendar(True) iuo_calendar.of_Register(‘sales_order_date_col’, iuo_calendar.DDLB_WITHARROW) iuo_calendar.of_SetInitialValue(True) iuo_calendar.of_SetDateFormat(“mm/dd/yyyy”) iuo_calendar.of_SetCloseOnClick(True) or iuo_SetCloseOnDClick(True) (close on click or close on double click)
Q: Explain Usage of the PFC Datawindow Filter Service and/or Benefits of the Filter Service over the standard datawindow filter.
- A choice of three different styles of filter dialog windows. (Standard, PFC Simple, PFC Extended)
- The two PFC filter dialog windows provide the following additional functionality:
- The ability to exclude columns from the filter dialog window, including specific column names or all invisible columns
- The ability to specify whether the list of columns should show the database column names, datawindow column names, or column header names
- The display of data values for the chosen column for the user to pick from
dw_1.of_SetFilter(TRUE) /* Specify 1 for extended filter style */
dw_1.inv_filter.of_SetStyle(1) or dw_1.inv_filter.of_SetStyle(dw_1.inv_filter.EXTENDED) /* Exclude column names within the dialogs (optional) */ dw_1.inv_filter.of_SetColumnDisplayNameStyle or dw_1.inv_filter.of_SetColumnDisplayNameStyle(dw_1.inv_filter.HEADER) /* Exclude all hidden columns from the dialog (optional) */ dw_1.inv_filter.of_SetVisibleOnly(TRUE) /* Exclude one specific column from the dialog */ /* declare a string array */
string ls_exclude /* add desired column names to string array */
ls_exclude = “last_name” /* call function with populated string array */
dw_1.inv_filter.of_SetExclude(ls_exclude) /* Cause the dialog to display and filter to be applied */
Expert Level PowerBuilder Interview Questions
Most of these are extreme questions will not be know by a senior developer unless they’ve come across some unusual circumstances. I wouldn’t penalize any developer for not knowing these but I’ll add the arcane questions as I come across them so you can use one for the expert developer that seems a little too overconfident and you want to test their humility.
Q: What is the maximum precision supported in PowerBuilder and Oracle with the Number (size, precision) datatype? How would you work around it?
A: A decimal in powerscript will handle a signed decimal of up to 18 digits, the decimal point can go anywhere in the 18 digits. The problem arises when you need more than 18 digits of precision such as Number(32,30) where you would lose precision.
To overcome this design constraint within PowerBuilder you can do the following:
- If possible use FLOAT instead of Number in Oracle. (A FLOAT will map to a Number datatype in the datawindow source).
- Work around the constraint by manually swapping out decimal(18) for real and set the dbparm DisableBind=1
Steps involved working around:
a.) Export the DataWindow (or edit the source directly, this option is available in PB 8 and higher)
b.) find the section of the source where the column datatype mapping is specified, and swap out decimal(18) with real for all affected columns
c.) Import the source (or save the source using PB 8 or higher).
PowerBuilder – Notable Changes by Version
This info might be useful when conducting interviews so that you are aware of which features were available by version.
- PowerBuilder 7.x
– New IDE
– TreeView and ListView changes
- PowerBuilder 8.x
– Workspaces and Targets added
– Source Code Control (SCC) configuration
– SystemError event behavior changes
- PowerBuilder 9.x
– PowerDynamo support removed
– Distributed PowerBuilder removed
- PowerBuilder 10
– Unicode implementation
– Last Sybase delivery of PFC (now Open Source)
– SQL Server native driver removed
- PowerBuilder 10.5
– Byte data type added
– Updated Decimal support
– Rich Text Control implementation enhanced
– Icon changes
– .NET Web Service support added
- PowerBuilder 11
– SySAM license management added
– DataDirect database drivers removed
– SQL Server native driver (SNC) added
- PowerBuilder 12
– SySAM license challenges including runtimes
Graceful Handling Of Unanswered Technical Questions
A good developer should be comfortable saying that they aren’t a walking syntax-machine. I don’t recommend saying it that way but the point is that the interviewer is likely looking for a strong developer that has a firm-grasp of the technologies being used and not the other way around. Handling answer-fails in a graceful way makes you appear human and humble plus it gives you a chance to miss a question with a positive attitude.
There is no shame in saying something like:
“Can you give me a moment on that one, for some reason it isn’t coming to mind”
“You know, to be honest I am drawing a blank on this one.”
“I must have relied on the help file for that too much and can’t remember.”
Interviewing Tips For Developers (Interviewee)
I’ll let you in on a few secrets that I’ve learned in the twenty years as a developer and interviewer.
I’ve been on both sides of the interview, being the interviewer and interviewee and there are often times where the technical screening is waived completely. This only happens a small percentage of the time, but when it does it is a blessing to both participants. Neither party has to deal with a bunch of boring canned technical screening questions and the interviewer knows they have a winner without having to talk much.
Getting a waiver on technical questions
In most interviews, you are given some opportunity to introduce yourself, or are told, “Tell me a little about yourself”. This is what you are hoping for because it is a gift. The reason that it is a gift is that it allows you to take control of the interview and take it where you want to go rather than leaving things to chance.
When I’m being interviewed– I usually condense my experience to about ten minutes and speak only about jobs that relate and that are positives. If the job is short I might give two sentences about it and then quickly move to more favorable current roles spending as much as five minutes on a longer job and a few minutes on shorter ones. Ideally you want to try to anticipate what the interviewer wants and answer the questions before being prompted.
You can jump over less meaningful job experiences very easily by highlighting how your experience there is relevant, something like, “… and while at XXX company, I was responsible for <insert something they are looking for here> … “. Skipping a few short roles that don’t help you are not a problem because you are molding the narrative to what is relevant and not just reading them your resume saying “I went to school here, then worked here, then did this” which is boring and takes too long. You really only have about 5-10, maybe 15 max minutes to do the hard-sell. If you go much longer you risk putting them to sleep, or coming across as arrogant or pushy.
I usually end with a question giving clear control back to them, something like: “Well I think that I’ve covered the most relevant information is there anything that you’d like to hear about in more detail?”. If you’ve done your job right, you’ll get a response like, “No, you’ve really covered everything that we need to hear I don’t think we need to bother with technical questions you obviously have some good experience”. When you get here, it feels like a million bucks and is really a win-win for everyone.
Now, if it doesn’t end like that don’t fear every interview is different. If you covered your highlights you will not have done yourself any harm and can let the interview continue with the ball in the interviewee’s court. And if you don’t feel good about the interview don’t beat yourself up. This one is hard I know but seriously some days you are on your game and some days not. We are only human and if there wasn’t a match, the job probably wasn’t right for you anyway.
Was this information useful?
The interviewee tips may not be as useful as I hoped because if you are a junior developer it is hard to pull this off, you will not have the experience or breadth of skills to make it work. Though you could do a shorter sell that starts the interview out on the right foot. I think this might be most useful for developers that are advancing beyond junior and have around five years of experience or so. If you get the chance to give interviews, take them because it helps you anticipate what the interviewer wants to hear.