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 (1)

  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 .

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

 
  1. luis miguel sanchez ordoñez

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 (3)

  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.

 
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 (5)

  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

 
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 (10)

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

 
There are no comments posted here yet
  • Copy the main folder from the unzipped download into the wwwroot folder for IIS
  • Give the IIS User modify and write permissions to the App_Data folder of the app
  • Convert the folder into an Application in IIS Manager
  • Ensure that the app pool that the application uses is based on .Net 4.0 rather than 2.0

Also, because the PowerBuilder IDE currently doesn't support a full set of the Git options (e.g., show log, repo browser, etc.) I'm going to install TortoiseGit in order to use those features.  As before, we could use the git command line client to do this, but I prefer having the options available to me through a GUI, in this case Windows Explorer.  TortoiseGit is dependent on Git For Windows, and you'll be prompted to install as well it during the install.

Creating a Repository

Open the admin console (http://localhost/Bonobo.Git.Server) as the admin user (default password "admin") and click the Repositories link at the top of the page.  From there, hit the "Create New Repository" button.

The only thing you need to provide to create the repository is a name.  Enter that and then click the Create button on the bottom of the page.

Now click on the Users link at the top of the page.  You'll want to create at least one user id.  I'm creating two because I'm going to be demonstrating what happens when two different developers edit the same object at about the same time.

I'm going to go back to the repository now, edit it and add the two users I created as contributors for the repository.

Click on the Repositories link again.  To the right of the repository name is a set of icons, the first one of which will copy the URL for the repository to the clipboard.  We're going to need that later.

Add the PowerBuilder Project to a Git Repository

As mentioned in the Subversion article, the way we connect to Subversion and Git is different than how we used to do it using the MSSCCI interface.  Instead of going to the Source Control tab on the Workspace Properties window, we're going to right click on the Workspace and select the new Add to Source Control option.

That will bring up the "Add to Source Control" dialog, from which we can select Git.

The next dialog that PowerBuilder displays asks for the name and email address you want to use while committing your changes to Git.

The next dialog shows us the objects that will be added in the initial commit.  As pointed out in the Subversion article, this includes the workspace file, the PBLs, and the source code that has been exported into PBL based folders under the ws_object folder under the workspace.

After we click OK here, the output pane will show the status of the add to source control.

At this point if you haven't used Git before you might be wondering why we never specified any information about the Git server.  That's because Git is a distributed source control system.  If you go back and look at the last dialog that appeared you'll notice that at the top it says "Create local working repository...".  That's all we've done so far.  The Git server we set up, even though it's running on the same machine in this demo, is the remote repository.  This diagram can help explain what is going on:

Image: Dirk Dunn

In a distributed source control system, you have a local repository and the commits are done against that.  At some point you then "push" your changes to the remote repository and "pull" down changes that have been made by other developers.  Other developers can't see the changes you've committed, only the changes that you have pushed to the remote repository.

So, right click on the workspace again and select the Git Push option that is now available.

This is the dialog that appears when you do that the first time, so you can configure the remote repository.

An here's where we're going to run into an issue.  Normally the URL for a Git repository is in this format:

           https:///.git

What the folks that designed this dialog expected you to do is name the repository name the same as your workspace name.  And so now you would populate the portion of the dialog next to "Repository URL" with the the portion of the repository of the URL up through the server name.  That would result in a repository URL in the form of:

          https:///

If the repository you create and the workspace have the same name, you should end up with the URL of the repository you just created.  There's on minor issue though.   Note that the URL that gets formed through the dialog is missing the .git extension.  Many Git repositories (e.g., GitHub, GitLab, Perforce HelixTeamHub ) don't care and you'll be able to do the push once you've filled the dialog.  However, Bonobo does care, and you'll get an "Invalid URL" error if you attempt to push using the URL generated by that dialog.  The one other server I found that also had issues with the missing .git extension on the URL is Team Foundation Server.  In addition to Team Server Version Control, Team Foundation Server also support Git.  Never fear though, if you want to use either Bonobo or Team Foundation Server there is a workaround.

All that dialog is going to do is set the remote repository for the local repository.  We don't have to do that through PowerBuilder.  As mentioned earlier, I've installed TortoiseGit.  So I'm going to use that instead to configure the local repository to work with the remote repository.  Fine the workspace folder in Windows Explorer, right click on it, and select TortoiseGit -> Settings from the popup menu.

You'll get a notice from TortoiseGit about hierarchical configuration, just press OK.

In the Settings dialog, look for Git->Remote.  Enter the URL in that page of the settings and hit OK.

Go back into PowerBuilder now and select Git Push again.  This time we get no dialog, and the push works.

As with Subversion, what we can see if we use the repository browser is that when Git is used as source control PowerBuilder creates a ws_objects folder with the exported source code in it.  In that folder there are subfolders for each PBL, so we no longer have to put our original PBLs in separate folders (as we used to do with MSSCCI to avoid object name conflicts).  And we'll see that PowerBuilder has also checked in the PBLs and the PBW file, something it doesn't do under MSSCCI.

The reason it's done that is to make it easier for another developer to do a "checkout" from source control and end up with something they can start using right away.  Previously under MSSCCI, only the raw source code was in version control, and a developer would need to get a copy of the PBLs from another developer or create them by importing the raw source code before they start working on the app.  We're going to look at that change now:

Download the Repository into a New Workspace

Let's close the current workspace and then with no workspace in the IDE select the new "Connect to Workspace" option that is available.

Once again we're presented with that dialog in which we can put the Git Repository URL, and once again it's not going to work when we're using Bonobo.  Fortunately, once again there's a workaround.

Go back into TortoiseGit, right click on the parent directory under which you want to put the directory that will contain the PowerBuilder workspace.  Right click on it and then select "Git Clone..." from the popup menu.

In the Tortoise Git dialog that appears, provide the Git repository UR and hit OK.

You'll see a dialog like the following showing the status of the clone.

The great thing is that since the clone brought down the PBW and PBT files and the PBLs, we can go back into PowerBuilder and do an Open Workspace on the PBW file.  PowerBuilder doesn't know anything about the workspace being in Git yet though, so right click on the workspace and select "Add to Source Control" again as we did when we first registered it.  Also, use TortoiseGit again on the local repository to make sure that the remote is still set to our Bonobo server.

Making Source Code Changes

As with Subversion, PowerBuilder behaves a bit differently with Git for source control than when we were using MSSCCI.  If you open a file and edit it, it appears in the system tree with a check mark on it.  Unlike MSSCCI, that doesn't mean that the file has been locked in source control, it just means it's changed and will be affected by the next commit.

Let's make two different changes in the two different workspaces in the same object and see what happens as a result.  I'm going to change the title of the window in one workspace.    I'm going into the second workspace and change the background color.  Now I commit in that workspace.

Now I go back to the first workspace and commit there as well.  Now if you open up the object in either workspace you'll notice the only changes you see are the ones you made in that workspace.  Once again, if you're not familiar with Git, you might wonder what went wrong.  If you refer back to that Git diagram above, you see that a commit only affects the local repository.  Right now the Git server doesn't know about either change.

So, in that first workspace, lets do another Git Push.

Now go to the second workspace and try to do another Git Push.  You'll receive an error like this:

That's Git's way of telling you that another user pushed a change to the object since you last did a pull from the server.  What we need to do is pull down and merge their changes with our work.  So do a Git Pull.

Fortunately, Git was able to merge the changes from the first workspace with this one.  So now we can attempt our Git Push again, and this time it works.

That was too easy.  Let's try something else and see if we can force a merge conflict.

  • I created three object functions on the window with some sample code in them.  ( of_a, of_b and of_g ).  
  • I pushed that to the git repository and then pulled that into the second workspace so they were both in sync.  
  • In one workspace I added another function ( of_f ) and committed that.  
  • In the other workspace and deleted the of_b function and committed that.
  • I pushed one workspace to the Git repository.
  • I attempted to push the second workspace and got the "not fast-forwardable" error.
  • I pulled from the second workspace and the merge was performed.
  • I opened the object in the second workspace and sure enough, it had methods of_a, of_f and of_g.

I'm impressed.  That same operation caused huge problems with Subversion.  Not only did it result in a merge conflict, but a merge conflict that would be difficult to solve using the standard Edit Conflict tools.  That's a good thing, because for the most part Git doesn't offer the ability to lock files to prevent merge conflicts that Subversion does, which is the main way we prevent merge conflicts in Subversion.

Avoiding merge conflicts

Like Subversion, one good way to reduce the chances you'll have a merge conflict is to do a Pull before you start editing an object.  However, most Git distributions don't offer the ability to lock a file to prevent simultaneous editing like Subversion does.  That would be hard for Git to offer, because technically there can be multiple remote servers, and in that case there's no centralized server that could server as the authority as to who has a file locked.  There are a couple of options if you do feel that file locking is something you need to implement.  One is GitLab Enterprise.  Another is Gitolite.  Based on what we've seen with some simple testing though, it looks like merge conflicts might not be as significant an issue under Git as it can be with Subversion.

Summary

As with Subversion, the native Git interface introduced in PowerBuilder 2017 R2 eliminates the need to use a bridge product and the MSSCCI interface to work with Git.  And with the removal of the bridge project, we get faster performance and better access to the underlying Git features.  But also as with Subversion, Git introduces a significantly different method of doing source control, even more different than Subversion, and does require a bit of a learning curve.

 

Comments (3)

  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.

 
There are no comments posted here yet