Monday, April 21, 2014

ISUG Tech Conference 2014 Report



It's good not to be in Las Vegas.  The location in Atlanta is rather convenient.  You can take a MARTA train straight from the airport to a shopping mall close to the hotel and then take a covered walkway from the mall to the hotel.  The one issue though is that things are not well marked.  It seems that the people responsible for signage may be looking at it from the perspective of people that already know the area. I found it quite hard to find my way around when I first arrived.

What is interesting about the location is that the area is quite packed during the day (for example when I ran back over to the mall to get lunch) and deserted at night (being the downtown area).  Since most places serve the folks that are working at their offices during the day, large parts of the area close down between 6 and 8PM.  I'd like a location that was a little more active during non-conference hours.


It went quickly.  We received a badge, a small program guide and a copy of the ISUG - TECH journal.  Those of us who were speaking also received a polo shirt.  One thing I noted is that the program guide indicated when the second day of Yakov's workshop was, but forgot to include the first.  Not sure if I'm that upset, because the first day of his session runs concurrent with the 3 sessions I'm doing.

Welcome Reception

Held at the lounge at the top of the hotel.  Well attended, though not a lot of food.  Most folks headed out afterwards for a real meal.



Standard continental breakfast located next to the ballroom where the general sessions are being held. Suggestion for next conference: Have the breakfast and general sessions in the same room.  Let people take a bit more time with breakfast (eating it during the session).

Opening Keynote

Also held in a section of the ballroom.  It was actually configured to be quite wide and not very deep, so that everyone was fairly close to the platform.  The first three rows of the middle seating was simply chairs.  The next three rows behind them and all of the seating on the right and left wings was chairs spaced farther apart behind long tables.  I really like having tables and more space. Suggestion for next year:  Provide power outlets at the tables as well.

Mike Harrold and Brian Enochs started with a discussion of ISUG-TECH and their role.

Irfan Kahn ( SVP and General Manager for SAP Database and Technology)  then discussed the HANA platform and noted that the SAP release of ASE was one of the most significant versions in ASE history, so SAP is committed to investing in the non HANA products.

Richard Plederder (Senior Vice President Development HANA Platform Data Management) then discussed the Real Time Data Platform (note PowerBuilder included in the slide).

That was followed by a demo of ASE 16 doing linear scaling from 16 to 80 processors.  Then representatives of the China Academy of Railway Sciences discussed how they are using ASE to support their enormous ticket sales (3 billions transactions a day with a peak load of 9.4 million transactions per hour during peak travel season).

Then a discussion of coming features in future versions of ASE including Low Latency (In memory row store with MVCC and compiled queries), Speed ( memory and storage tier with Flash, parallel utilities and lazy decompression), Security (data masking and workload analysis) and Simplicity (heat map for data tiering and real time workload capture).

For IQ, future enhancements include Reduced TCO (shared nothing on direct attached storage), Real Time Capabilities (In memory scale out) and HANA support (SAP HANA extended storage and near line storage).

For Replication Server, enhancements include Increase Throughput with reduced latency, Zero Data Loss HA/DR via synchronous replication, Real-time replication into HANA from AP.

SQL Anywhere enhancements include Newly emerging embedded systems, SAP ecosystem integration and High performance synchronization.

That was followed by a Q&A session with the speakers.  Richard Plederder mentioned that PowerBuilder is not under his group, but it is proceeding forward and would be covered in the Plenary session.  He also indicated that PowerDesigner is doing well and they are working on an HTML portal version of it that would be discussed later at the conference.

Plenary session

About 40 people, including 6 from Appeon's engineering team.  Do to a travel approval SNAFU, Sue wasn't able to make it.  Dave asked how many people had the beta, and only one person (Jeff Gibson who is presenting on it) did.  Dave discussed the SAP release process including the Partner Beta test in Waldorf in May and then the subsequent release.  Dave demonstrated the 64 bit capability and referenced Jeff's session for demonstrations of docking windows, OData, etc.

Dave indicated is what Sue would like to see moving forward is a release per year with a few new features rather than large major releases less frequently.  Dave has come back to PowerBuilder as of January.  Is looking to have CodeJam events featuring PowerBuilder at the time of the product release.

Dave asked who was using PowerBuilder.Net and got about 6 hands.  He then asked who was doing WPF development and only got 1.

New ProcessBitness property on Environment object so you can see whether you're in the IDE (32 bit) or a running app (64 bit).  You will need to add code to test for that and then specify which database driver you want to use, particularly if you want to test the app in the 32 bit IDE but deploy to 64 bit.  If you compile for 64 bit the machine code option is not available.  Dave asked who was doing machine code compiles and only one person (Jeff) raised their hand.

Dave then demoed some SAP products that incorporate PowerBuilder technology.  The first was SAP UI5.   You can take your DataWindow SRD files and use them in SAP UI5 and then view them on any device in any browser.

They are also working on a tool called Web Access Toolkit (WAT) which is a browser based IDE to do development.  It sounds like it will replace App Builder, which is a web based IDE, but focused on mobile development.

EAServer is no longer being sold.  It isn't end of life yet, but the only thing in the future is maintenance releases.  They won't go end of life until they decide just how long they will continue to support it.

Armeen then demoed Appeon.


Lunch was located next to the exhibit hall.  The food was largely fried and breaded, and water seemed to be the only beverage served.

Technical Sessions

How to Develop Native Cross-OS Mobile Apps with PowerBuilder - Armeen Mazda

This is standard workshop for Appeon, though condensed down due to lack of time.  A USB card was handed out with a developer version of Appeon.  Armeen then walked through pre-configuring the users laptops for the install (about 30 minutes) and then the install and configuration of Appeon (another 30 minutes).  The remainder of the time was spend working with the Appeon sample application.  There were about 40 people in the session.

Agile Software Engineering (ASE) - An Overview - Dave Fish

I sat through the first half of this session, where Dave went over the basis of Agile development.  I had to leave halfway through to catch the session on PB15 enhancements.  There were about 20 people in the session.

What's New in PowerBuilder 15 - Jeff Gibson.

Jeff covered the enhancement coming in PowerBuilder 15, including:

  • OData data source
  • 64 bit deployment in PowerBuilder Classic
    • bitness indicator so you can add conditional code so you can debug in IDE (32 bit) and deploy (64 bit) with same code
    • note that in Windows displays two different ODBC panels (one 32 bit and one 64 bit), but the panels display profiles from both
    • note that when you are writing to registry, 32 bit and 64 bit apps write to different areas
  • Windows 8 support
  • .Net 4.5 support
  • Dockable windows
    • MDIDock,  MDIDockHelp
    • OpenSheet:  Docked!   Floating!  TabbedDocument!  TabbedWindow!
    • A  number of new OpenSheet commands to support opening windows into specific areas.
  • Updated Database Drivers
    • Microsoft SQL Server  20122
    • Oracle 12
  • Upgraded Graphic DataWindows in PowerBuilder.Net (perhaps,, Jeff found it in the documentation  at one point and then couldn't find it later)
There were approximately 40 people in his session.  He asked how many people had access to the beta, and only one person did.

Sponsor Reception

Mostly drinks, very little food, so I went out to get something to eat and back to my hotel room to work on my demos.



On the second day it was Quiche, so I decided to find something else and headed off to my first session.

Technical Sessions

Introducing SAP Mobile Platform (SMP 3.0) - Dave Fish

Best of Breed between Sybase, SAP and Syclo.  Doesn't provide a development tool other than App Builder.  You bring your own tools.  7 people attending.  It does provide an SDK based on Cordova (formerly PhoneGap) so that you don't have to deal directly with device APIs.  Agentry UI framework allows you to create apps with little coding.

SAP Mobile SDK 3.0 Overview - Tony Woods

Tony gave a bit deeper dive into the mobile SDK provided with SMP.

Introduction to SAP River - Dave Fish

Dave then discussed River, a tool that uses a definition language to create the data model, business logic and access control logic and then exposes it as OData services that can be called from a number of different clients.  SAP has floated the idea of enabling PowerBuilder to generate the definition language used by River in order to provide a graphical development tool for it.


It seems my California influenced healthy eating habits don't quite mesh the the meals provided in the South.  I found something else.

Introduction to SAP UI 5 - Day One - Dave Fish

This was my only technical session on Wednesday afternoon (some 4 hours or so long, the first of two) and one of my favorites.  It was an intro to SAP UI5, but one that involved hands on coding.  We did about half the coding exercises used, a collaborative javascript coding environment that is entirely browser based.  It does eliminate the need to do the somewhat involved setup of eclipse and configure it for SAP UI5.  However, it doesn't seem to offer a whole lot of help diagnosing coding errors.  We did the rest of the coding exercises (including a music store that plays sample of tunes by pulling the preview from itunes) in SAP UI5 in the eclipse IDE.


Wednesday evening from 6pm to 11pm was spent at CodeJam.  Another of my favorite events because it involved hand on coding.  (That the served all you can eat pizzas and drinks didn't hurt either, so much for healthy eating!).  This time the tools included HANA Studio and SAP UI5.  There were others as well, but I was only able to get through 4 of the 13 exercises (all involving HANA Studio) in the time allowed.

They had us all remoting into our own virtual desktops in Amazon Web Services (AWS) and running the tools from there, which ensured we didn't have very many problems getting the environments configured.  However, given that they took down the instances shortly after CodeJam ended, we don't have any opportunity to play with them further (without going out and setting up our own environment on AWS at least).  I would have liked to have access to the desktop for a few days afterwards to try some of the other exercises that I didn't have a chance to get to.



I skipped the conference provided breakfast again, opting for something a bit more health conscious.

Technical Sessions

My turn to present.  I did three sessions back to back.

  • PowerBuilder.Net Visual Assemblies in Visual Studio.Net
  • COM Callable Wrapped Web Services in PowerBuilder Classic
  • Creation and Consumption of Web Services
It didn't occur to me until that morning that the last two courses should have been presented in reversed order, as the last one would have made a great intro for the second one.

Attendance wasn't bad, particularly considering that they were concurrent with the first day of Yakov's workshop.


This time I did find something to eat at the lunch.  It's also when ISUG held the drawing from the exhibit hall contest.  I was the first winner, and got a second blue ISUG shirt.

Introduction to SAP UI 5 - Day Two - Dave Fish

Not much to add, just finishing up the hands on coding exercises.

Conference End

And that was it.  Headed through the walkways to the MARTA station, took the MARTA to the airport and then I'm on my way home.


All in all a good experience.  Given that it's the first time in a while that ISUG has done a conference separate from the now defunct TechWave, that word about it got out late, and that there as a PowerBuilder specific conference within 250 miles of the location the prior month, turnout was still pretty good.  It will be interesting to see how much better attended it might be next year as it establishes itself as an annual event, word get out about it sooner and overlap with other regional events might be avoided.  There will also be a new version of PowerBuilder out by then, so there should be a greater opportunity for new session content.


One note about my food comments.  I'm rather particular.  I made similar complaints about food at TechWave 2010.  At SAP TechEd/TechWave 2011 I never even made it for SAP provided lunch until the last day.

I had a similar experience the two times I stopped at Chik-fil-a while I was there in Atlanta (once in the mall, and then later at the airport on the way out).  I asked for grilled rather than fried chicken (it's one of their menu items!) and got a blank stare for a minute, and then told I would have to wait a few minutes because they don't keep the grilled chicken readily available like they do fried.

Check this out regarding healthy food (and activities) and conferences:  How To Keep The People Attending Your Conference Alive

Also, I'm also a coffee and drink snob.  I skipped the conference provided drinks as well.  I just checked, and I spent over $150 buying coffee, vitamin waters, protein bars and outside meals while at the conference.  It's not unusual for me to bring a cooler with my own food to a conference if it's fairly local or I might buy a cooler and my own food at a grocery store neat the event the day before the conference if it's farther away.

Saturday, April 12, 2014

How to use .Net visual controls in PowerBuilder Classic

Using non-visual .Net classes in PowerBuilder Classic is somewhat straightforward.  Provided the assembly (and the classes and methods within it) have been marked as COM Visible, you can run REGASM on them to create OLE registry entries and then use the class through OLE Automation.  I have a video on the SAP D&T Academy that demonstrates the process.

Using Net visual controls takes a bit more work.  There is an add-in for Visual Studio Professional called the Microsoft InteropForms Toolkit that essentially puts an ActiveX wrapper around a .Net visual user object that can contain one or more visual controls.  Some observations:

  • The toolkit is an add-in for Visual Studio.  As a result, it will only work in the Professional or higher versions of Visual Studio.  The Express versions of VB6 Visual Studio don't support add ins.  Apparently some people have found a way around the limitation, but doing so is beyond the scope of this article.
  • The toolkit only supports the language.   If you are more comfortable with C#, there are third party utilities that extend the toolkit so that you can use C# instead.  That will not be covered in this article, but you can seeInterop Forms Toolkit for C# - Home for one example.
  • The toolkit exposes Windows Forms controls.  However, you can add an ElementHost control to the toolkit control and then use that to host a WPF control.  Once again, that is beyond the scope of this article.

I have a video on the SAP D&T Academy as well that covers this technique.  This blog post will look at a different sample implementation than the one used in that video and will include the code used.

Note that the code used here was adapted from a CodeProject sample of a stand alone multi-page TIF viewer.  The code was converted from C# to VB.Net and then adapted to function as a single user object with methods rather that a stand alone viewer.

So, the first thing we're going to do is fire up Visual Studio.Net and create a new VB6 Interop UserControl.

Drag a PictureBox control over from the Toolbox onto the user object in the designer and then set the Dock property of the control to Fill.  Since we've only got one control in this user object, this will ensure that the PictureBox will always fill the entire contents of the user control when it's resized.

In the code editor, we're now going to declare some instance variables in the user object that we will use to track a few properties we're interested in the
"VB6 Interop Code" Region, just after the "#If COM_INTEROP_ENABLED Then" declaration.

  1.     Private _CurrPage As Integer = 0 'defining the current page (its some sort of a counter)  
  2.     Private _Opened As Boolean = False 'if an image was opened  
  3.     Private _NumPages As Integer 'the number of pages in the tiff file  
  4.     Private _FileName As String 'the name of the file that was opened  
We want a couple of those to be read only properties as well for the control, so we add those into the "VB6 Properties" Region:

  1.     Public ReadOnly Property NumberOfPages() As Integer  
  2.         Get  
  3.             Return _NumPages + 1  
  4.         End Get  
  5.     End Property  
  6.     Public ReadOnly Property CurrentPageNumber() As Integer  
  7.         Get  
  8.             Return _CurrPage + 1  
  9.         End Get  
  10.     End Property  
The reason that we're adding 1 to each of these values before returning it is because the mechanism that tracks the page numbers internal to the control is zero index based (the first page is page 0).  We need to adjust that before displaying it to the user who understands page numbers as one index based.

Finally, we're going to add some methods into the "VB6 Methods" Region, one of which is internal and the others which we'll be using from PowerBuilder to interact with the control.

The first method is the internal method that is used to refresh the image in the control when a TIF is first loaded or the user navigates to a different page:

  1.     Private Sub RefreshImage()  
  2.         Dim myBmp As Image 'a new occurrence of Image for viewing  
  3.         Dim myImg As Image 'setting the selected tiff  
  4.         myImg = System.Drawing.Image.FromFile(_FileName) 'setting the image from a file  
  5.         _NumPages = myImg.GetFrameCount(System.Drawing.Imaging.FrameDimension.Page) - 1 'the first page is 0 so we must correct the number of pages to -1  
  6.         myImg.SelectActiveFrame(System.Drawing.Imaging.FrameDimension.Page, _CurrPage) 'going to the selected page  
  7.         myBmp = New Bitmap(myImg, PictureBox1.Width, PictureBox1.Height) 'setting the new page as an image  
  8.         'Description on Bitmap(SOURCE, X,Y)  
  9.         PictureBox1.Image = myBmp 'showing the page in the pictureBox1  
  10.     End Sub  
Recreating myImg an _NumPages each time the function is called is perhaps a bit of overkill, but I wasn't interesting in trying to refactor the code, just convert it for this sample.

The following function is used to pass a filename from PowerBuilder into the control so that the control will read it and display the first page:

  1.     Public Sub OpenFile(ByVal FileName As String)  
  2.         _FileName = FileName  
  3.         _CurrPage = 0 'reseting the counter  
  4.         RefreshImage() 'refreshing and showing the new file  
  5.         _Opened = True 'a file was opened.  
  6.     End Sub  
This function is used to navigate forward one page in the TIF file:

  1.     Public Sub NextPage()  
  2.         If (_Opened) Then 'the button works if the file is opened. you could go with button.enabled  
  3.             If (_CurrPage = _NumPages) Then 'if you have reached the last page it ends here  
  4.                 'the "-1" should be there for normalizing the number of pages  
  5.                 _CurrPage = _NumPages  
  6.             Else  
  7.                 _CurrPage = _CurrPage + 1  
  8.                 RefreshImage()  
  9.             End If  
  10.         End If  
  11.     End Sub  
And finally, this function is used to navigate back one page in the TIF file:

  1.     Public Sub PriorPage()  
  2.         If (_opened) Then 'the button works if the file is opened. you could go with button.enabled  
  3.             If (_CurrPage = 0) Then 'it stops here if you reached the bottom, the first page of the tiff  
  4.                 _CurrPage = 0  
  5.             Else  
  6.                 _CurrPage = _CurrPage - 1 'if its not the first page, then go to the previous page  
  7.                 RefreshImage() 'refresh the image on the selected page  
  8.             End If  
  9.         End If  
  10.     End Sub  
That's a good start.  The user object could obviously be embellished.  For example, offering methods to navigate to a certain page directly, zoom in and out on the displayed image, print one or more pages of the image, etc. could all be added later.

Once you compile the project, Visual Studio.Net will create the registry entries that make the user object available as an ActiveX control.  Open up PowerBuilder Classic, open a window control and start to insert an OLE Control onto the window.  In the dialog that appears, select the third tab (Insert Control), and then scroll to the name of the control you created in Visual  In my sample, I give it the rather unimaginative name of "TiffViewerControl.TiffViewerControl"


In the PowerBuilder window, I added buttons to open a TIF file and display it in the control, to move forward one page and to move backwards one page.  I also have a static text field that display the current page number and number of pages in the document.

Note that the functions and properties of the user object do not display in the PowerBuilder IDE.  You end up calling them as methods and properties of the ole control object attribute.  PowerBuilder compiles that without question and only attempts to validate that the references are valid when the code is run.

The script in the button that opens a TIF file for display is as follows:

  1. Integer li_rc  
  2. String ls_pathname, ls_filename  
  3. li_rc = GetFileOpenName ( "Select a TIFF file", ls_pathname, ls_filename, "TIF", "TIF Files (*.tif),*.tif" )  
  4. IF li_rc = 1 THEN  
  5.   ole_1.Object.OpenFile ( ls_pathname )  
  6.   of_displaylocation()  
  7. END IF  
To move forward one page:

  1. ole_1.Object.NextPage()  
  2. of_displaylocation()  
To move backwards one page:

  1. ole_1.Object.PriorPage()  
  2. of_displaylocation()  
The of_displaylocation function called by all three scripts is the one that populates the static text field with the current and total page numbers:

  1. integer  li_currpage  
  2. integer  li_numpages  
  3. li_currpage = ole_1.Object.CurrentPageNumber  
  4. li_numpages = ole_1.Object.NumberOfPages  
  5. st_location.text = "Page " + String ( li_currpage ) + " of " + String ( li_numpages )  
Finally, I have some code in the resize event of the window so that the user object resizes when the window is resized.

  1. ole_1.Resize ( newwidth - 150, newheight - 250 )  
With that, we're done.  Run the app, load up a TIF file and start browsing through it.  For this sample, I converted the 142 page PowerBuilder ORCA manual from PDF to TIF.


The sample code, both for Visual Studio.Net and for PowerBuilder 12.5 Classic, is available on my Google Drive.