Welcome to the Appeon Community!

Learn, share knowledge, and get help.

 

Featured Blogs

Featured Articles

Git Enhancements in PowerBuilder 2017 R3

Support for using Git as a source control system without going through a bridge product was added in 2017 R2 and covered in a previous blog post.  In this blog post we're going to look at the enhancements that were added to that feature in 2017 R3. 

Read more

Comments (0)

There are no comments posted here yet

JSON Enhancements in PowerBuilder 2017 R3

There were some JSON features introduced in 2017 R2, in particular the JSONGenerator and JSONParser, which were covered in a previous blog post.  2017 R3 introduces additional important JSON features, in particular JSON import/export from a DataWindow, and a JSONPackage object that is used to merge/extract JSON data sets.  Those will be covered in this blog post.

Read more

Comments (2)

  1. Mir Dader Ali

Very Helpful article , PowerBuilder still a great language . BUT....

PowerBuilder's licensing policy i.e "per year per developer" is not competitive as comparison to other programing languages like c#, Java etc. This policy is one of discouraging factor for clients to continue with PowerBuilder ,this is my personal industrial experience as a consultant .

 
  1. albert smith

The new JSON features are just awesome. It comes with a more user-friendly interface. All the codes you have shared here are very much useful for the user. It is suitable for modern distributed applications. I also get more ideas from Canon Support. If you have more ideas about it please share with us.

 
There are no comments posted here yet

PowerBuilder 2017 R2 New Feature: REST

One of the new features added to PowerBuilder 2017 R2 is support for REST web services.  This feature isn't 100% complete, as additional REST functionality is planned for 2017 R3.  There's still a lot in the R2 release to look at though.

To make things simple for the demo, we're going to use a online REST web service called JSONPlaceHolder..  The service doesn't require creating an account or user authentication.  While the GET (retrieve) methods are fully functional the POST ( insert ), PUT/PATCH ( update ) and DELETE (delete) methods are placeholders.  They return result codes or in the case of POST the id value of the inserted row, but they don't actually modify the data.

Note that while REST web services can return data in any internet mime encodable format, the vast majority of them use JSON  and JSON is the only data format supported by the REST client object in PowerBuilder 2017.

Read more

Comments (7)

  1. Hani EL Dabet

Dear Mr. Armstrong,

I am trying to consume a webservice using powerbuilder 2017R2. I have consume the same service in C# and trying now to do the same in powerbuilder. I have created a WCF proxy to access the web service and able to connect. However, in order to call any function I need to add soap header for the API key.  similar to the code in c#:

 //add a soap header for API Key
MessageHeader ApiMessageHeader = MessageHeader.CreateHeader("API_KEY", "http://tempuri.org;", API_KEY);
                    System.ServiceModel.OperationContext.Current.OutgoingMessageHeaders.Add(ApiMessageHeader);


string userName = "username";
string passWord = "xxxxxx.";
string Provider = "dsadsa";
calls the authenticate user
if the authentication is successful it will assign the token variable the appropriate value         

client.AUEAuthenticateUser(userName, passWord, Provider, ref token);

--------------

How to add soap message header in  powerbuilder before calling the method AUEAuthenticateUser.

 

Thanks for your reply

 
  1. Bruce Armstrong

Please post this question in the regular forums.

 
  1. Chris Pollach

Hi Bruce;

Great article .. thanks!

Just a minor point .. the JSON returned must be formed within array brackets ... for example:

[


{
"userId": 1,
"id": 1,
"title": "sunt aut facere repellat provident occaecati excepturi optio reprehenderit",
"body": "quia et suscipit\nsuscipit recusandae consequuntur expedita et cum\nreprehenderit molestiae ut ut quas totam\nnostrum rerum est autem sunt rem eveniet architecto"
}

]

  If not, the DWO data transformation will not occur.

Regards .. Chris

 
  1. Richard Bianco

Hi Bruce,

Enjoyed the article as I prepare for a presentation will be doing for the conference.

I'm in the (mundane) process of wiring up REST endpoints to datawindows and wanted to ask if there was anything I could do to help with coding for the REST improvements being delivered for PB2018? I'm probably re-inventing the wheel doing some of the same things you might be doing as I'm trying to write my own utility that takes an endpoint address say... https://api.binance.com/api/v1/klines?symbol=ETHBTC&;interval=1m and creating my own datawindow from the actual Json returned.

The code you have was helpful as a first step. Some changes I'd make are adding support for Json when there the Json isn't surrounded by [ ] and is only surrounded by { } .

Other things I'm trying to write into an ancestor are handling of more than two levels of hierarchy, adding support for boolean, and adding support for automatically converting numbers surrounded by double quotes to be converted to number/decimal in the datawindow. Right now I load the Json into a rough datawindow, then perform transformations on data and moving row by row to another datawindow and saving to database.

I don't have much experience with extending PowerBuilder (at internal level via PBNI) but ideally it would be cool to extend RestClient to handle some of the things I talked about. I downloaded your PBNISMTP project on GitHub and trying to figure it out. If you'd be able/willing to share that code with me- I'd be more than happy to provide enhancements made so you can decide if you want to incorporate them into the tool. I would be honored to think that some of my code made it into the actual release and would expect no compensation. Though if you want to hire me as consultant I'd work for a very reasonable rate (for PB developer).

You should have access to my email via the site but will post it here anyway as this page is member only: rich@displacedguy.com or displacedguy@gmail.com I'm not the best about responding quickly but would really appreciate a response. I have some time and can surely help with any work you have.

p.s I'm also working on a wizard type window that I provide REST endpoint address (like above) and parse the Json into datawindow allowing me to set column name, data type, etc., with as much info derived as possible. Also I'd add ability to generate a database table to store result and have ideas on defining the Json fragments (complex object types) into my database so the definition of Json is data driven. Yeah I have a lot on my plate but it's fun.

Sincerely,
Rich Bianco

  Comment was last edited about 4 months ago by Richard Bianco Richard Bianco
  1. Armeen Mazda    Richard Bianco

I don't know about the feasibility if this could really cover all situations of automatically creating the DataWindow from the endpoint, but boy if you could do that it would be so cool and save time!

 
  1. Bertrand Terlat

Hi

These informations are really useful thanks a lot.

I have a question which concerns the command "http.sendrequest" I saw it was possible to call the function with the first parameter 'CONNECT' such as


http.sendrequest( 'CONNECT', 'https://jsonplaceholder.typicode.com/posts' ..... I don't understand how to use it.

Would you please have an example using the parameter value 'CONNECT' ?

I have the case it's required to autenticate to the url to use it and I also tried to use '&token_auth' without any success in my case.

The result of http.GetResponseStatusCode() gives :

<title>401 - Unauthorized: Access is denied due to invalid credentials.</title>


Thanks in advance for help!!!

Kind Regards,

Bertrand

 
  1. Bruce Armstrong    Bertrand Terlat

I don't know where you saw it was possible to call it using "CONNECT", or why you would want to. That verb is used in the initial connection to the service that is done under the covers. It's not one of the HTTP verbs you would use for a REST service.

If you need to authenticate to the service, you would do that through request headers added prior to sending the request.

Rather than follow up here, I would suggest asking your question in the regular Q&A forums and I can follow up there.

 
There are no comments posted here yet

Most Popular Articles

Exporting Datawindows to Excel / Html without losing Format

I have a function called "GuardarAExcel2()" which uses a step datawindow called "d_filafichero". With this function you generate an excel with the same visual aspect as your datawindow. I hope it helps you:

Example of use:

GuardarAExcel2( dw_1, "c:\Report.xls")
GuardarAExcel2( dw_1, "c:\Report.html")

Result in datawindow:

 

Read more

Comments (20)

  1. Byron Guaman

Hola Eduardo G, intento ejecutar tu funcion pero falta el objeto ds_datastore, puedes publicarlo por favor para probar tu funcion saludos.

 
  1. Eduardo G.

Hola Byron, ds_datastore (UserObject) está heredado de datastore, puedes reemplazarlo por lo siguiente:

Hello Byron, ds_datastore (UserObject) is inherited from datastore, you can replace it with the following:

datastore dsHTML
dsHTML = CREATE datastore
dsHTML.DataObject = "d_FilaFichero"
dsHTML.ImportFile( Text!, spRuta )

Un saludo.

 
  1. jhon sparky

hello eduardo G,

it's work for me..but all border in cell not view..still loosing format..

 
  1. Leonardo Velazquez

Hola.... muchas gracias por el aporte.... en Chrome se ve muy bien... pero en Excel me divide en 2 renglones cada registro.... 

http://i304.photobucket.com/albums/nn178/leviatanMX/reporte.png

 
  1. Eduardo G.

Hola,
Te ocurre debido a que los objetos column que tienes en el detail no deben de estar a la misma altura o tienes alguno superpuesto a otro. Es muy aconsejable que los objetos no estén uno encima del otro para que funcione correctamente.

Un saludo.

 

Hello. Hi,
It happens to you because the column objects you have in the detail must not be at the same height or you have some superimposed to another. It is highly advisable that the objects are not on top of each other for them to function properly.
A greeting.

 

Buenos dias amigo me sale error en la funcion F_global_replace .

podrias especificar el tipo de valor y sus argumentos. Gracias es muy importante poner a prueba tu funcion 

 
  1. Eduardo G.

 

//f_global_replace(fuente,buscar,poner)

/*

Argument Type >> Argument Name

string >> source

string >> look_for

string >> replace_with

Return Type string

 

A String Occurrence Search and Replace Routine

The following code demonstrates a string occurrence search and replace routine.

This routine works generically for any string. For example, 

if old_str = "red" and new_str = "green", all occurrences of 

 "red" inside of mystring will be replaced with "green".

*/

int start_pos=1,len_look_for

len_look_for = len(look_for)

 

//find the first occurrence of look_for ...

start_pos = Pos(source,look_for,start_pos)

//only enter the loop if you find whats in look_for

DO WHILE start_pos > 0

//replace look_for with replace_with ...

source = Replace(source,start_pos,Len_look_for,replace_with)

//find the next occurrence of look_for

start_pos = Pos(source,look_for,start_pos+Len(replace_with))

LOOP

return source

 

 

 

 


// Función: f_cuenta_char

// Descripción: Cuenta todas las ocurrencias de as_char en  la cadena as_source

// Ambito: publica

// Argumentos: as_source {cadena de la que se desea borrar las ocurrencias de as_char}

//    as_char   {caracter a ser contado de la cadena as_source}

// Retorna: Integer {numero de ocurrencias encontradas}

//////////////////////////////////////////////////////////////////////////////////////

int li_pos

int ncuenta=0

 

li_pos = Pos (as_source, as_char, 1)

do while li_pos > 0

ncuenta+=1

as_source = Left (as_source, li_pos - 1) + &

Right (as_source, Len (as_source) - li_pos)

li_pos = Pos (as_source, as_char, 1)

loop

 

return ncuenta

 
  1. Eduardo G.

Ya lo tienes :-D

 
  1. Ivan Mesarc

Hello, it does not respect custome date format for datetime columns. Could you help please?

Thanks

 
  1. Eduardo G.

Hello, check the block "// Prevent text with / convert to date" to adapt it to your needs.
A greeting.

 
There are no comments posted here yet

PowerBuilder 2017 R2 New Feature: Git source control support

In a previous blog article we looked at the new feature of PowerBuilder 2017 R2 for Subversion source control support. In this blog article we're going to look at a very similar feature, Git source control support.  I'm not going to go through the history of source code support in PowerBuilder again, I'd refer you to that previous blog article for that.  We're going dive straight in to how the Git feature works.

Setting up Git

For this demo, we're going to use Bonobo Git Server.  One reason I like it is because it provide a web based admin console for managing the server, so I don't have to use the Git command line to do that.

Because it's an ASP.Net application, the machine where we're going to install it must have IIS and the .Net Framework 4.6 installed on it.  To install Bonobo Git once you've downloaded it you simply need to:

Read more

Comments (9)

  1. Michael Kiefer

Thanks for this article; it has been helpful.

I am hoping that Appeon improves the overall experience when working with Git as there are a few things that are less than ideal.

The workarounds for cloning/specifying the URL for the repo with some very-common GIT servers are a big problem. This is particularly true since after creating a new clone manually you must "Add to source control" files that are already in source control. This creates an unnecessary commit for what is essentially a "no change" situation. This could also lead to merge conflicts on binary files.

Fortunately, I found a workaround for this extra "Add to source control" step, which is to create the appropriate registry entries manually (or write a script to do it), so that the PB UI things the code is already under source control. For example:

Windows Registry Editor Version 5.00

[HKEY_USERS\S-1-5-21-1234567890-1234567890-839522115-2208969\Software\Sybase\PowerBuilder\17.0\Workspace\C:$dev$git$MyApp$myworkspace.pbw\SourceControlVersion2]
"Type"="Git"
"Name"=""
"ServerURL"=""
"LocalPath"="C:\\dev\\git\\MyApp"
"Author"="My Name"
"email"="myname@company.com"
"LogAllActivity"=""
"LogFilePath"=""
"AppenOverWrite"=""
"Comments"=""
"RefreshRate"=""

A better solution, would be for the PB UI to automatically detect that the workspace is located in a git repo and use the configuration information from the git repo directly instead of trying to maintain it separately in the registry.

I also dislike the fact that we are still storing binary files like PBLs -- particularly large ones -- in git. This is a very bad practice and leads to bad performance and huge repos. It should be possible to easily rebuild a PBL from a set of text-based source files (i.e. *.pbg, *.sr*). Unfortunately, it seems that the direction with PB2017 R3 is to go the opposite direction and eliminate the pbg files all together.

 
  1. Michael Kiefer

In case anyone wants the script for the above:

Function New-GitCloneForPowerBuilder { [CmdLetBinding()] Param( [Parameter(Mandatory = $true)] [string] $RepoUrl,

[Parameter(Mandatory = $true)] [string] $CloneLocation,

[Parameter(Mandatory = $true)] [string] $RelativePbwPath )

$pushedLocation = $false try { $ErrorActionPreference = 'Stop'

git clone $RepoUrl $CloneLocation $CloneLocation = Resolve-Path $CloneLocation Push-Location $CloneLocation $pushedLocation = $true

#get Git settings as set by the clone because we need to put them in the registry for PB $userEmail = git config --get user.email $userName = git config --get user.name

#Verify the workspace element exists $registryRoot = "HKCU:\Software\Sybase\PowerBuilder\17.0\Workspace" if (-not (Test-Path $registryRoot)) { New-Item -Path $registryRoot -Force| Out-Null }

#Create the specific workspace element $registryPath = $registryRoot + '\\' + ((Resolve-Path (Join-Path $CloneLocation $RelativePbwPath)) -replace '\\', '$') if (-not (Test-Path $registryPath)) { New-Item -Path $registryPath -Force | Out-Null }

$registryPath = $registryPath + '\\SourceControlVersion2' if (-not (Test-Path $registryPath)) { New-Item -Path $registryPath -Force | Out-Null }

$properties = @{ "Type" = "Git"; "Name" = ""; "ServerURL" = ""; "LocalPath" = $CloneLocation; "Author" = $userName; "email" = $userEmail; "LogAllActivity" = ""; "LogFilePath" = ""; "AppenOverWrite" = ""; "Comments" = ""; "RefreshRate" = ""; } foreach ($p in $properties.Keys) { New-ItemProperty -Path $registryPath -Name $p -Value $properties[$p] | Out-Null }

} catch { throw ("Unable to setup Git repo clone for PB workspace {0}`n{1}" -f $_.Exception.Message, $_.InvocationInfo.PositionMessage) } finally { if ($pushedLocation) { Pop-Location } } }

 
  1. jhon perker

I did not have many knowledge about PowerBuilder, but after your post, I am getting some knowledge about it, I want more information about that matter, and i also glad to know that PowerBuilder 2017 R2 release New Feature,But when I try to update it I face some technical error, so I decide to go hp printer won't print black they told me the process which I really need.

 
  1. John leeo

I think PowerBuider 2017 R2 release new feature for git source control. This feature is very useful for the users. If you searching Web Development Service? We have the best advice for you.

 
  1. Ray Collins

PowerBuilder 2017 R2 is a revision of PowerBuilder 2017, which was Appeon's first new installment of the PowerBuilder development platform. This revision adds new interoperability features, developer productivity enhancements, and support for the open-source PostgreSQL database.
In case you are in search of Responsive Web Design Services in Dubai, get in touch with our team of experts

 
  1. John Parker

It is the latest version of PowerBuilder 2017 whch comes with new functionality and advanced features. I also have a website which provide Microsoft Surface Pro Screen Replacement so that you can solve all the queries related to Surface Pro.

 
  1. Shahbaz Anshari

New version have the improved User interface and it Git support system will help in importing and export the resource code easily. For old version my suface was not working properly. So i raise the concern with MS Surface Support team for the resolution.

 
  1. Mohammad Hassan

Amazing Post.It is the most recent form of PowerBuilder 2017 whch accompanies new usefulness and propelled highlights. I likewise have a site which give Microsoft Surface Pro Support with the goal that you can settle every one of the questions identified with Surface Pro.

 
  1. Hussain Deewan

As we all know that there are many PowerBuiler version avaialble in the market but this latest version works well. I can say this surely because I personally used this PowerBuilder 2017. I personally recommend you if you want to use PowerBuilder then use the latest version because it comes with many new features.

Jaden
SEO services Dubai

 
There are no comments posted here yet

PowerBuilder 2017 R2 New Feature: Subversion (SVN) source control support

PowerBuilder's initial support for version control systems required drivers for specific vendors (e.g., PVCS) and often for specific versions of that vendor's products.  It was not unusual to find that you needed to wait to upgrade your source control product until PowerBuilder released an updated driver for it.  And if your source control provider wasn't supported by PowerBuilder you were simply out of luck.

 

 

That changed with PowerBuilder 6.  With that release, PowerBuilder abandoned the vendor specific drivers in favor of the recently introduced Microsoft Source Code Control Interface (MSSCCI).  Essentially an ODBC for version control, it freed the IDE from vendor lock-in.  Provide the source control provide provides an MSSCCI complaint interface, or there was a 'bridge' product available that could convert MSSCCI calls into the source control providers native API calls, PowerBuilder could use the product.

Read more

Comments (9)

  1. Maurice Losier

Hi Bruce,

Great write up it did help put everything in context. I'm looking to move to R2 for the benefit of no proxy / svn. My challenge is that we have over 10 years of History origanally from CVS and migrated to SVN. I'd like to maintain history but obviously we don't have the right structure. Any opinion strategy etc. would help

 

 

 
  1. David Sutton

While I love the idea of a move towards a native client we will still need MSSCCI support until this native client becomes more feature complete.

Can you confirm that MSSCCI support is still functional and has not changed in R2?

 
  1. Bruce Armstrong

We did our migration from PVSC to SVN back in 2009, and we used the SVNImporter tool to convert over our existing repositories.

https://polarion.plm.automation.siemens.com/products/svn/svn_importer

They have a version there for CVS as well. It worked quite well in our experience.

 

 
  1. Bruce Armstrong

Nothing in MSSCCI has changed.  You can still continue to use that.

I'm curious as to what features you think it's missing that are preventing you from moving to it.  Anything you can't do in the PB IDE you can still do through TortoiseSVN, it's just a tab bit more work.




 

 
  1. Jay Thangam

Burce,

We successfully integrated our PB code with Git Repository.
But when I try to push my changes from local to remote as I am getting below error.
Even I have tried this with colleague pc as we are getting the same error.
Any advice?

PB Version: 2017 R2
Git Server : VSTS
Client : Git Tortoise 2.1.8

---------- Source Control
Git push
Starting to push workspace...
Git client is pushing workspace. Please wait...
Git client error: Generic error..
Failed to push workspace.
Git push
---------- Done Source Control

 
  1. nirmal singh

Yes, To ensure they learn that habit is by applying the Subversion svn:needs-lock property on the PowerBuilder objects which is under source control. That property marks the source code files as read-only. I have tried it on canon customer service. It's great.

 
  1. Thomas Rolseth

Bruce,
We started using PB/Git last week and our initial setup went well. We were even able to commit changes from different developers and our first few pulls went fine. However, team members are now getting the error below when doing a pull and we are not sure how to resolve this? Any thoughts or suggestions?

Thanks, Tom

PB Version: 2017 R3
Git Server: GitLab
Client: TortoiseGit 2.7.0.0, git version 2.19.1.windows.1

---------- Source Control
Git pull
Git client is pulling workspace. Please wait...
Git client error code: Checkout conflicts prevented operation.
Failed to update: C:\Work\Projects\APP
Failed to do Git pull.
Git pull completed.
---------- Done Source Control

 
  1. Thomas Rolseth

False alarm Bruce -- we found out what the problem was. An inadvertent 'Upload PBL' operation. We used TortoiseGit in File Explorer to revert the pbl's in question and the subsequent pull worked ok.

Thanks, Tom

 
  1. Tim McGill

While we will be pinging Appeon on this, does anyone know their intentions WRT use of MSCCI and "bridge" products in 2018? The lack of icons indicating object status (not latest, checked out by another, checked out by me, etc.) is potentially a deal breaker to using the native SVN as having to switch to Tortoise SVN client for this is awkward.

 
There are no comments posted here yet

Using PowerBuilder 2017 with TFS source control

This article is a guide to connect Powerbuilder 2017 with TFS. It is important to follow the steps in the order listed in the article.

The prerequisite includes

  • PB17 installed on a local machine.
  • TFS server running with access to the user. A collection is required where the code will be checked in. 

Next follow the below points:

  1. Team explorer 2013 : Yes the first thing needed is to install Visual studio team explorer. I know the first question pop ups in mind is if Visual studio needs to be installed on every machine !! Well the answer is NO. All you need is Team explorer 2013 to access the TFS. Second question is why 2013 ? Well there comes the 32 bit and 64 bit compatibility issues, moreover there is no standalone installer for Team explorer 2015. If you figured out a way to do it with later versions, then mention it in the comments. 
Read more

Comments (13)

  1. Frank Frey

Nice article. Would this also be applicable to PB12.6 classic?

 
  1. Nasir Ahmad

Yes, It should work for 12.6 classic version and 12.5 as well. 

 
  1. Vollie Sanders Jr

Question I have is what TFS server version do we need to use, Corp office has TFS2010 and TFS2015. will ether of these work?

 
  1. LUIS GUTIERREZ

Frank, I am writing a similar document for PB 12.6 with TFS2017 (server), using VS2015. I hope to share it soon. My initial recommendation for you, is to create a folder for each PBL.

 
  1. Nasir Ahmad

TFS2015 server will work as per my knowledge since MSSCCI and team explorer i tested was for TFS 2013, which worked for TFS 2017.  

For earlier versions of TFS you test and find MSSCCI, Team explorer which are compatible with that version. 

 
  1. Van Sederburg

Worked perfectly!

 
  1. Armeen Mazda

Another way to use PB 2017 with TFS is to switch the repository from the legacy TFVC to Git. With recent versions of TFS the default repository is actually Git, and Microsoft recently acquired GitHub. The advantage of switching is that PB 2017 natively interfaces with Git rather than using the legacy MSSCCI interface, which gets you support for more source control features and faster performance of source control operations.

 
  1. saim thomus    Armeen Mazda

The local interface of the source control frameworks is utilized (rather than MSSCCI), wiping out the need and reliance on outsider modules. The PowerBuilder PBLs still stay as twofold libraries in the PowerBuilder IDE. At the point when a PowerBuilder workspace is transferred to the SVN or Git server, an undertaking is made for the workspace. The structure of the venture in the server (and also in the nearby store) is nearly the equivalent as the one in PowerBuilder IDE, then again, actually the genuine.PBL records are not transferred to the task. Rather, a sub organizer is made in the venture for each PBL, and the sub envelope contains all the source documents of the relating PBL. All the usually utilized SVN/Git directions will be upheld, including Connect to Workspace (identical to Checkout in SVN and Clone in Git), Add to Source Control, Commit, Revert, Update (SVN), Pull (Git), Push (Git), Delete, Copy and Move. Establishment of an SVN/Git customer is simply discretionary, yet doing as such may give extra source control administration includes that benefits your undertaking, for instance spreading and blending. for any Telstra issue How to setup Telstra Wi-Fi connection

 
  1. iliyan iliev

MSSCCI dosn't works with TFS 2018 ! Any idea how to use tfs 2018 ?!

 
  1. Nasir Ahmad    iliyan iliev

Is your team explorer connecting to TFS? which version of visual studio team explorer are you using ?

I would recommend you to move from TFVC to Git as recommended by Armeen Mazda in above comment.

 
  1. iliyan iliev    Nasir Ahmad

I'm use VSTE 2017

 
  1. Alain Van den Abbeele    iliyan iliev

It doesn't work with VS2017.
You need VS2013 or the free Team Explorer 2013.
Also configure your workspace in TFS as Server workspace!

 
  1. Alain Van den Abbeele

It works perfectly on Azure DevOps also!
But only with VS2013 or Team Explorer 2013.
TFS workspace must be configured as Server workspace.

 
There are no comments posted here yet

The beautiful thing is that pbUnit is written in PowerBuilder and is provided with source code. It's truly a "native son." You can see how it works, modify it to suit your individual needs, and participate in the community effort to grow the tool by sharing your enhancements with others. You will need to install two pieces to use pbUnit as an automated test harness: the app extension piece and the tester GUI piece. The app piece is housed in a single PBL that contains the ancestor CCUOs that you extend and implement to write xUnit type unit test cases in your app. Just add this PBL to your library list and you're off and running. The GUI piece is a standalone test harness app that allows you to rapidly execute tests outside the PB IDE or within your application. I find running the GUI outside the PB IDE an ideal approach. It is the one I will show in this article. For the sake of completeness, please note that it is possible to embed the pbTest GUI in your application and launch it within your application. It is also possible to run tests without the GUI. However, I will not demonstrate either of those approaches in this article.

Installing pbUnit is a piece of cake. First, create a separate folder off your workspace or target folder and name it pbUnit, then unpack the pbUnit3.3.zip file into it. Figure 1 shows what you'll have when you unzip the archive.

I'm going to start with the GUI by installing the GUI (you'll see why in a few moments).

My archive contains a compiled version of the GUI. Attempt to run the exe provided (I compiled it using 12.0 build 5107 [beta 2]). If it runs, you're done. If it doesn't run, you'll need to migrate the app to your version. To do, add PBUnitGUI.pbt to your version 12 Classic workspace and migrate it by right-clicking on the target and choosing Migrate. I won't elaborate on this as it is standard PowerBuilder operating procedure. Then deploy the app using the project object pr_pbunit (or pr_pbunit32 if your prefer machine code). Click the build button to force the painter to adjust the library paths to match your configuration, adjust the paths for the pbr and exe, make sure that PBDs are selected for every library, and deploy the application. When you run the EXE, it should look like Figure 2.

When you select a target and click OK, you should see what's shown in Figure 3. Okay, you're almost ready to rock and roll.

Copy the base library, PBUnit.pbl, from the pbUnit folder to the folder that contains your application PBLs and add it to the application library list. While you're at it, create a new library named Test_Cases and add it to the end of your library list. Put your test cases into this library. In an enterprise development effort you will have a test PBL for each application PBL whose code you bring under test. That's it; you're now ready to write your first test.

Writing Your First Test
Here's the basic TDD algorithm:

  • Pick a method you want to refactor and examine the code. Because TDD is method-level white box testing, it's crucial to read the code and understand it before writing your tests.
  • Take paper and pencil and write some assertions about what the code does given a known set of inputs. These logic statements assert what the method will return or what changes it will make to the memory or the GUI. You characterize the method behavior in your test.
  • Write a test in PowerScript to exercise the code against your assertions (an example follows).
  • Run the test in pbUnit and watch it fail.
  • Correct the test to make it pass. This will prove that your test works.
  • Repeat the coding process in order to cover your code with several tests that span the universe of possible inputs and outputs.

Once you know your tests work, you can go ahead and refactor your code, running the tests after each change to ensure that refactoring didn't break the code. This may seem like a lot of work, but it's really not. The coding and testing go quite fast once you get the process into your blood.

To write a single or a related set of tests in pbUnit, you inherit from the TestCase CCUO located in the PBUnit PBL. You code each test in a separate custom user event inside the CCUO. There is usually a one-to-one relationship between a TestCase class and a class under test. To conform with naming conventions, start each test name with test_. Put each test in a separate event so that the outcome of one test doesn't affect the results of other tests. pbUnit runs each test event in isolation from any others.

A typical test has of four sections:

  1. Setting up to do the test -you write code to get the state of the system just right so the test can be run.
  2. Executing the code that is under test
  3. Comparing the results of the run against what you expected to determine whether the test succeeded or failed; this is your assertion
  4. Tearing down the setup to clean up memory after the test

To keep things clear, I'm going to illustrate the process using this exceedingly simple interest calculator (see Figure 4).

Figure 5 shows the clicked method (event) of the calc button that we'll get under test and then refactor. Assume this instance variable: constant decimal idc_interest_rate = 4.08

Write a test that characterizes how the system behaves with positive input by inheriting from pbUnit's TestCase class and saving the CCUO as Test_Calculator in your TestCases PBL. Add a custom user event named test_positives. Here's the code for the test:

//(1) Setting up to do the test
// Disregard that Windows are visual objects (you're not testing the GUI here)
w_calctester lw_calctester // create the window in memory so you can get at its members
lw_calctester = Create w_calctester
//(2) Executing the code that is under test
lw_calctester.sle_years.text ='5'                                  //provide inputs
lw_calctester.sle_amount.text = '50000'
lw_calctester.cb_calc.triggerevent(clicked!)   //execute the method
//(3) comparing the results of the run against expected results
// The boolean Assert method has 2 parameters, (1) An error message to display in the GUI if the test fails and (2) The result you expect based on the conditions you provided
this.assert( 'Positive Value Incorrectly Calculated', &
lw_calctester.sle_interest_paid.text ='0' )  //this test will obviously fail! We provided a wrong result!
//(4) Tearing down the setup to clean up after the test.
destroy lw_calctester

Save the test case. Leaving the PB IDE open, navigate to the pbUnit GUI, locate your target, find your test case and run it. You will get the failure message and the red bar because your assertion is wrong. The interest will not be 0 (see Figure 6).

Navigate over to PB and correct your assertion. You are really expecting that the SLE will contain ‘$10,200.00.' Save your change and rerun the test. You will get the Green Bar - congratulations (see Figure 7).

Now you can write a couple more assertions to fully characterize the calculator's behavior. Add two events, one characterizing the behavior with negative value inputs and the other with zero inputs. Follow the algorithm you used above to set up, run the test, make the assertion and tear down.

Once the tests are in place you can confidently go about restructuring and streamlining the code in the clicked event, covered by tests demonstrating that your refactoring did not in any way alter program behavior.

You're now on your way to mastering a powerful methodology for refactoring your code using unit testing. You might already see how refactoring using a Test Driven Development methodology helps you to:

  • Think more deeply and completely about your code
  • Really exercise your code to remove all defects and flaws
  • Refactor with confidence surrounded by a safety net of unit tests

If you'd like to watch me do this demo in action, check out my Refactoring tutorial on Sybase.com at http://video.sybase.com/products/powerbuilder/future-proofing-pb/player.html . The demo is midway through the tutorial.

What's Next?
In my next article I'll show you a technique to roll multiple test cases into a test suite and an approach to writing test cases for database centric methods.

 

--This article was originally published on PBDJ.

 

Comments (0)

There are no comments posted here yet