Quantcast
Channel: PowerBuilder Developer Center
Viewing all 186 articles
Browse latest View live

Calling .Net Assemblies from PowerBuilder Classic Win32 via PowerShell

$
0
0

Recently someone asked me how they could get the output from PBDOM used from a PowerBuilder Classic Win32 application formatted with white space as PBDOM doesn't include it.  I gave them a number of options, particularly MSXML through OLE Automation or using a .Net class like XmlTextWriter.  Normally if you were going to try to access a .Net assembly from a PowerBuilder Classic Win32 application, you would do it via a COM Callable Wrapper.  However, for something this simple I thought there had to be a more lightweight way to accomplish it.  One particular lighterweight way that occurred to be would be to have the application launch a Windows PowerShell script that would then use the .Net class in question.  We're going to look at an example of how that's done.

 

The first thing we'll need is the PowerShell script to do the work. This is what I came up with (referenced as prettyprint.ps1 in the later code):

 

param(    [string]$filein,    [string]$fileout
)
[void][System.Reflection.Assembly]::LoadWithPartialName("System.Xml.Linq")
[System.Xml.Linq.XDocument]::Load($filein).Save($fileout)
# If running in the console, wait for input before closing.
if ($Host.Name -eq "ConsoleHost")
{     Write-Host "Press any key to continue..."    $Host.UI.RawUI.ReadKey("NoEcho,IncludeKeyUp") > $null
}

The script declares a couple of parameters (the input xml file and the output xml file).  It then loads the System.Xml.Linq .Net assembly via reflection.  Finally, we load the file and then write it back out again with white space.  The last few lines are just for debugging from a command line prompt, as it displays a "Press any key to continue..." prompt before closing the PowerShell process window.

 

To test it through a batch file, I used this:

 

@ECHO OFF
SET ThisScriptsDirectory=%~dp0
SET PowerShellScriptPath=%ThisScriptsDirectory%prettyprint.ps1
SET SourceFile=%ThisScriptsDirectory%config.xml
SET DestFile=%ThisScriptsDirectory%.config.new.xml
%SystemRoot%\system32\WindowsPowerShell\v1.0\powershell.exe -NoProfile -ExecutionPolicy Bypass -Command "& '%PowerShellScriptPath%' -filein '%SourceFile%' -fileout '%DestFile%'";
pause

The assumption here is that the batch file, the PowerShell script and the input xml file are all in the same directory.  I've got a pause statement in this script, so you actually get two "Press any key to continue..." prompts.  If it works properly, that's all you should see.  Otherwise you should see the error message from PowerShell or the batch file.

 

Once you know it's working, it's time to call it from PowerBuilder.  I'm going to cheat a bit in the following example.  I'm using the PowerScript Run function and have hard coded the location of the PowerShell executable.  In actual usage, you might query the operating system for the location of the SystemRoot, or use the ShellExecute, ShellExecuteEx or CreateProcess Windows API functions to invoke the process rather than Run.  Also note that the code assumes that the PowerShell script file is located in the same directory as the PowerBuilder Classic Win32 application.

 

int li_rc 
string ls_sourcepath
string ls_sourcefile
string ls_destpath
string ls_destfile
string ls_command
string ls_directory
ls_directory = GetCurrentDirectory()
ls_command = 'C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -NoProfile -ExecutionPolicy Bypass -Command "&'
ls_command += " '" + ls_directory + "\prettyprint.ps1' "
li_rc = GetFileOpenName ( "Select source file", ls_sourcepath, ls_sourcefile, "XML", "XML File (*.xml),*.xml" )
IF li_rc <> 1 THEN Return
ls_command += " -filein '" + ls_sourcepath + "' "
li_rc = GetFileSaveName ( "Select destination file", ls_destpath, ls_destfile, "XML", "XML File (*.xml),*.xml" )
IF li_rc <> 1 THEN Return
ls_command += " -fileout '" + ls_destpath + "' "
li_rc = Run ( ls_command )

In this case, the application prompts the user to select an XML file to process and then provide a name for the "pretty" version of the XML to output.

 

Without the second argument to Run, you will see the PowerShell process window open momentarily.  If you were to continue to use the Run method, you can pass Minimized! as a second argument to that function to suppress the window.  In addition, the ShellExecute, ShellExecuteEx and CreateProcess Windows API functions have options to suppress the PowerShell process window from displaying.


Creating a REST web service using PowerBuilder.Net 12.5

$
0
0

One of the new features introduced with PowerBuilder.Net 12.5 was the ability to create WCF web services.  The version of the product also introduced a client for REST web services as well, and a WCF client had been introduce in an earlier version.  One frequent question I heard when presenting the new features in conference or online sessions was when PowerBuilder.Net would provide the capability to create REST services, not just consume them.

 

Perhaps what few people realized (including myself at the time) is that WCF web services isn't just for creating SOAP services.  Since .Net 3.0, they have been capable of creating REST services as well.  So we've actually have had the capability to create REST web services with PowerBuilder.Net since 12.5 was released.  In this blog post we'll look at how we do that.

 

The first thing we need to do is go ahead and create a WCF soap web service.  We're going to use pretty much the same approach that is demonstrated in this SAP D&T Academy video.   One difference is that I'm just going to use an ODBC data source for this sample.  In the video I used an ADO.Net datasource, which is the better approach for anything more than a demo when using .Net targets.

 

As in that video, I have a datawindow that selects the employees from the EAS demo database.  I also have a structure that has the same configuration as the result set of the datawindow, so transferring the data to and array of that structure can be accomplished through a one line dot notation call.  The code for the function that retrieves the employees looks like this.

 

DataStore     lds
long          ll_rc
s_structure     emps[]
Transaction     ltrans
ltrans = create Transaction
// Profile EAS Demo DB V125
ltrans.DBMS = "ODBC"
ltrans.AutoCommit = False
ltrans.DBParm = "ConnectString='DSN=EAS Demo DB V125 Network Server;UID=dba;PWD=sql'"
//ltrans.DBParm = "ConnectString='DSN=EAS Demo DB V125 - 64 bit;UID=dba;PWD=sql'"
connect using ltrans ;
if ltrans.SQLCode <> 0 then     emps[1].emp_fname = "Connect failed: " + ltrans.SQLErrText
else     lds = create DataStore     lds.DataObject = 'd_grid'     ll_rc = lds.SetTransObject ( ltrans )     if ll_rc <> 1 then          emps[1].emp_fname = "SetTransObject failed: " + string ( ll_rc )     else          ll_rc = lds.Retrieve()          if ll_rc < 0 then               emps[1].emp_fname = "Retrieve failed: " + string ( ll_rc )          else               emps = lds.Object.Data          end if          disconnect using ltrans ;     end if ;     destroy ltrans
end if ;
return emps

I'm running the EAS Demo database in network server mode with TCP enabled as a communications method so that the web service can connect to an already running database.

 

At this point we can go into the project painter for the service, select that function to be exposed in the service and run the project (having specified the wfcservice_host.exe file in the webservice.out/bin/Debug directory as what is run when we run the project).  We'll see a command prompt window display, and we should be able to access the WSDL for the SOAP service and create a WCF client for it.

 

Once we know that part is working, we're going to make a few modifications to make it a REST service instead.  The first thing we're going to do is go back into the project painter, select the method we're exposing and then click on the operational attributes button.  Note that the button won't be enabled until you select a method that you want to adjust the attributes for.

 

operationalattribute.PNG

 

Within the dialog that appears, select the WebInvoke Attribute category.  Within that category, set the Method to Get and provide a UriTemplate.  In a REST web service, the method is called by adding the UriTemplate onto the end of the root URL for the service.  So in this case, since the service URL is:

 

http://localhost:8001/n_customnonvisual

 

The method for retrieving the employees becomes:

 

http://localhost:8001/n_customnonvisual/employees

 

Normally in REST services, a GET method is mapped to a retrieve, PUT to an insert, POST to an update, and DELETE deletes.  Arguments to the method are additional entry on the URL.  For example, we could create a method that returns a single employee record and takes the employee id as an argument.  If the employee id was 123, then the method URL might look like this:

 

http://localhost:8001/n_customnonvisual/employee/123

 

Unless we specify a specific ResponseFormat and RequestFormat, XML is assumed (same as the SOAP service).  REST services are more likely to return JSON though, as it is not as verbose.  We can tell WCF that we want JSON returned instead by specifying that for the ResponseFormat.

 

attributes.PNG

We're done with the service project.  What we need to do now is make some changes to the <projectname>.config file in the root directory.  First, we need to find the endpoint address entry for the service and change the binding from basicHttpBinding to webHttpBinding.  We're also going to add a behaviorConfiguration attribute and give it a name.  We'll define that a bit later in the same file.

 

Original File:

  <system.serviceModel>    <services>      <service name="Sybase.PowerBuilder.WCFNVO.n_customnonvisual"  behaviorConfiguration="ServiceNameBehavior">        <endpoint address=""  binding="basicHttpBinding"  contract="Sybase.PowerBuilder.WCFNVO.n_customnonvisual"  bindingNamespace="http://tempurl.org" />

Revised File

  <system.serviceModel>    <services>      <service name="Sybase.PowerBuilder.WCFNVO.n_customnonvisual"
behaviorConfiguration="ServiceNameBehavior">        <endpoint address=""  binding="webHttpBinding"  contract="Sybase.PowerBuilder.WCFNVO.n_customnonvisual"  bindingNamespace="http://tempurl.org"   behaviorConfiguration="EndpointNameBehavior" />

There should already be a serviceBehaviors section in the file within the behaviors section.  What we're going to do is add a endpointBehaviors section to the file as well below the serviceBehaviors.  Give it the same name as you referenced in the new attribute for the endpoint earlier.  The only thing we need to include it in is the webHttp attribute:

 

    </serviceBehaviors>      <endpointBehaviors>        <behavior name="EndpointNameBehavior">          <webHttp />        </behavior>      </endpointBehaviors>    </behaviors>

With that, we're done.  Redeploy the project so that all of the new settings apply.  You should now be able to open a browser and give it the base URL plus the URITemplate.  If all is working correctly, you should see JSON being returned.

 

json.PNG

 

One of the downsides of REST services that there really isn't a way to automatically generate documentation for how the service operates, like the WSDL for a SOAP operation.   You're going to have to develop documentation by hand to let users know how to consume the service.

 

Now let's look at a method that has arguments.  We're going to create a method that takes a single argument, the emp_id, and returns that employee.  If you have more than one argument, you'll just extend the technique we use here for a single argument.

 

The code that retrieves a single employee is a slight modification of the code that returns them all:

 

DataStore     lds
long          ll_rc
s_structure     emp
Transaction     ltrans
ltrans = create Transaction
// Profile EAS Demo DB V125
ltrans.DBMS = "ODBC"
ltrans.AutoCommit = False
ltrans.DBParm = "ConnectString='DSN=EAS Demo DB V125 Network Server;UID=dba;PWD=sql'"
//ltrans.DBParm = "ConnectString='DSN=EAS Demo DB V125 - 64 bit;UID=dba;PWD=sql'"
connect using ltrans ;
if ltrans.SQLCode <> 0 then     emp.emp_fname = "Connect failed: " + ltrans.SQLErrText
else     lds = create DataStore     lds.DataObject = 'd_grid2'     ll_rc = lds.SetTransObject ( ltrans )     if ll_rc <> 1 then          emp.emp_fname = "SetTransObject failed: " + string ( ll_rc )     else          ll_rc = lds.Retrieve( Integer ( empid ) )          if ll_rc < 0 then               emp.emp_fname = "Retrieve failed: " + string ( ll_rc )          else               emp = lds.Object.Data[1]          end if          disconnect using ltrans ;     end if ;     destroy ltrans
end if ;
return emp

What's not obvious from the code is that the emp_id we're taking as an argument is of type string, and we're converting it to an integer within the code.  We have to pass all of the arguments to the function as string values, and deal with converting to the appropriate data type within the method because all of the arguments passed in on a URL reference are considered to be of string data type.

 

Lets look at the way we set up the WebInvoke configuration for this operation, and you'll see another difference:

 

Capture.PNG

 

Note that the UriTemplate is now:

 

     employee/{empid}

 

That means that the method is expecting to be in the form we mentioned earlier where the argument is obtained from part of the URL itself,  In particular:

 

     http://localhost:8001/n_customnonvisual/employee/102

 

The {empid} indicates where an argument will occur and what name it has in the underlying method.  If you've created REST web service clients in PowerBuilder.Net, you should be somewhat familiar with that type of approach.

 

While this works well when there is only one argument, it's not ideal when a number of arguments need to be passed.  In that case, we can use an alternative UriTemplate approach which uses variable name value pairs:

Capture.PNG

And the URL used to retrieve a single employee would then be:

 

     http://localhost:8001/n_customnonvisual/employee?empid=102

 

Multiple arguments follow along with a & between them.

 

For a detailed discussion of how UriTemplates are used, see the "Designing the UreTemplates" section of this guidance from Microsoft:

 

A Guide to Designing and Building RESTful Web Services with WCF 3.5

 

One last note.  ODBC profiles are unique between 32 and 64 bit apps.  PowerBuilder.Net is 32 bit, and the WCF service will (if run on a 64 bit machine) be running as a 64 bit app.  That means the service would need to use a different ODBC profile than the one I used to develop the app.  Further, PowerBuilder.Net has an easier time debugging the WCF service if it's running as 32 bit rather than 64 bit.  Therefore, I actually wanted the WCF service host to run as 32 bit rather than 64 bit for development and debugging.

 

To accomplish that, I copied the wcfservices_host.exe file in the output folder and renamed the copy to wcfservices_host32.exe.  I then ran corflags on it to change it to a 32 bit application.  I copied the wcfservices_host.exe.config file that PowerBuilder generated and renamed it to match the new executable name. Next, I marked them both read only so PowerBuilder wouldn't delete them the next time I deployed the app.  Finally, I modified the service project so it ran the 32 bit executable whenever  I wanted to run or debugged the service.

Sign up for Reporting Studio Beta and discover a new approach to create Business Reports

$
0
0

We will soon be launching the first version of Reporting Studio for PowerBuilder.

 

Unlike traditional reporting tools, it does not require any SQL skills to create a report.

Business users can add new reports themselves, and even deploy them to web and mobile users!

You can tightly integrate it with your PowerBuilder code, or use it as a standalone application.

 

We need your help to make the User experience as smooth as possible.

 

Interested in joining this innovative adventure ?

Sign-up for Reporting Studio BETA at this page.


Best Regards,

Christophe Dufourmantelle

Novalys


Name and Base Line_Small_TranspBKG.PNG

Legacy modernization comments

$
0
0

Here is what i found in a Legacy modernization site claiming that Powerbuilder needs to be replaced with some new age tools in the market. What do you guys think of this blabbering??

 

A Stress Free Call Center Upgrade

If you manage a call or contact center, you life is anything but stress free.

Call centers are competitive weapons for businesses of all types, so they’re under constant pressure to be fast, efficient and effective. They’re also under pressure to upgrade to new technologies, such as online chat and video streaming, as these become available. And every day, customers are using more credit cards and payment channels.

It’s no surprise you’ve got a bottle of Tums in your desk.

But if you manage a call center based on a legacy application platform like PowerBuilder, you need Tums in your desk, car, jacket pocket and next to your bed.

Your legacy development platform is old and your applications are fragile. Adding new functions or more agent-seats can be difficult and risky. Even finding the right developers can be a challenge. What developer wants to freshen up on PowerBuilder skills?

The good news is you’ve got options. The bad news is you’ve got only got a few. SaaS-based apps are a possibility if your needs are relatively simple. But in a competitive environment like, say, hotel reservations, the call center is essential for competitive advantage. You don’t want to build it around a SaaS vendor’s concept of what it should be.

Another option is a full rewrite, from PowerBuilder to a web-friendly platform like Java. Java opens the door to a ton of Open Source call center applications that are more-or-less future-proof, but first you’ll need to go through the horrors of ground-up development: budget overruns, missed deadlines, scope creep, incorrect requirements and so on. Also, you’ll have to burn significant time and money to train your agents, since most of what they do requires fast handling of function keys and complex commands. You’ll have to start over, train them, and then wait until they can get back up to their previous speed. You could be looking at a month or more before they’re back to top productivity.

The other option is using a transformation process to turn your legacy applications into Java applications. We’re a transformation company so you can understand why we’d favor this approach. But there are advantages to transformation, whether you use us or a different solution. Here are a few:

Complex function-key commands will stay the same, even though the applications will be completely “new,”
You’ll be able to leverage your intellectual property through automated tools that analyze your old business rules so they’ll carry through to the new applications,
Changeover to the new applications can be gradual, since you’ll be able to run the old and new platforms side-by-side until all agents are productive, and
Whatever retraining they need will be communicated within a one-page memo.
The bigger your company and more gnarly your legacy apps and interactions, the more likely transformation can help. Whichever solution you choose, realize that time is fast running out on platforms like PowerBuilder and Visual Basic. If you haven’t already begun, the time to start your changeover is, as they say, yesterday.

 

Also, my thoughts on providing a fitting reply to this legacy marketing hype:

There are winds of change in the Client/Server computing space..
1. In-memory computing – This can drastically change the underlying performance of your existing Powerbuilder data-driven applications to perform better and faster. This means, you only need to re-factor your existing applications to take advantage of the revolutionary changes in Database computing. Not try to change your front end or middle ware.
2. GUI RAD development – Let’s face it, even after 10 years, neither Java nor .NET technologies can match the speed and ease of 4GL enterprise grade development. The best way forward will be to use Powerbuilder or any GUI 4GL tool to spit web based Javascript for the GUI and take advantage of the powerful 4GL abstraction that makes life easy for software development.
3. Enterprise grade web development – We are talking about serious Enterprise applications and not some fancy shopping cart applications. Web development with Java and .NET can help build these fancy web apps but fail miserably when it comes to ERP and other enterprise grade applications. Best way forward will be to use Client/Server development tools like PB that can spit Javascipt, HTML, CSS for the GUI and take care of both 2-tier and 3-tier development.

Couple of things have changed since they have built their PB to Java/.Net transformation product.
1. In memory computing has become mainstream.
2. Web development tools still suck at developing Enterprise grade GUI apps. Cannot match the speed and ease of either PB or VB based 4GL. Have not seen a single Web application so far that has the richness or functionality packed in a client/server GUI. Web developers are still working around presenting the so called 'Legacy' GUI. Which tool is Legacy? Client/Server GUI which packs a punch or the stripped down Web GUI? You get it right?

 

Would invite your thoughts on this.

PowerBuilder new release available

$
0
0

Hi folks -

 

The latest release of PowerBuilder is now available - here If that link does not work, try the main page at SAP Service Marketplace

and search for the product.

 

This new release is the same as what folks tested in beta, although it has been renamed to be 12.6, which is more aligned with the feature set for the product.

 

Because the product was built as a major release, it will require a migration of your existing code to this new version.

 

Best regards

Sue

Appeon Future

$
0
0

As time passes and PB's future seems darker and darker, I couldn't help but wonder what would be the future of Appeon if PB gets EOLed. I might be wrong, but I believe that Appeon only works with PB. If that is the case Appeon's future isn't much brighter that PB's future.

Thinking about this gave me an idea to save PB (and Appeon): bundle them together and sell it as one product. That would make PB capable of targeting any platform.

Deploying PowerBuilder apps to desktops and mobile devices using Microsoft RemoteApp

$
0
0

Microsoft has recently announced a new feature of Windows Azure called RemoteApp that allows Windows applications to be hosted on Azure and then run via RDP on the desktop as well as mobile devices, including iOS and Android devices.  We're going to look to see how well that works for a PowerBuilder application.

 

The RemoteApp feature, at the time this blog was written, is in preview, and is available free of charge for developers to try out.  Azure itself also has a 30 day free trial program going.  However, there can be a rather long delay between the time you sign up for the RemoteApp preview and when it is approved.  In my case, my 30 day free trial of Azure was expiring by the time I got approval for RemoteApp, and so I had to obtain a pay-as-you-go subscription for Azure and apply for RemoteApp access again using the new subscription.  Note also that the notice they send letting you know that your RemoteApp access was approved is sent to the Microsoft account email address (e.g., hotmail, outlook.com, live.com) that you used to register, so you need to monitor that email address.

 

RemoteApp comes in two flavors:  Cloud and Hybrid.  The Cloud version is for hosting applications that can run entirely within Azure, include Microsoft Office applications and a few other Microsoft programs provided on the default image, as well as your own custom applications that do not require access to remote resources. The Hybrid version is for applications that need to access a database or other on-premise resources, and involve the creation of a site-to-site VPN link to allow the Azure cloud to securely access your on-premise resources.  This is a significant feature, as one of the stumbling blocks for many companies for moving to a public cloud offering has been the security and control over their database resources.  By providing a Hybrid option that leaves the database resources on-premise, Microsoft has taken great strides in overcoming those objections.

 

For the purpose of this walkthrough, we're going to create a custom template image which includes a PowerBuilder application that does not need to access a database (I decided to use the FreeCell sample app from the Sybase CodeXchange site).  We'll then do a straight Cloud deployment. We're going to follow the instructions at How to create a custom template image for RemoteApp and How to create a cloud deployment of RemoteApp to do so.

 

Windows Azure and Remote App Access

The first step, obviously, is to create an account on Windows Azure and then obtain access to the RemoteApp service.  You can sign up for the free 30 day Azure account at Microsoft Azure Free Trial: Try Azure | Azure Free Trial or the Pay as You Go plan at Pay-As-You-Go.  Once you have one of those, you can request access to RemoteApp via this page: RemoteApp.

 

Install Azure PowerShell

You'll need to have Azure PowerShell installed on your local machine in order to upload the custom template image to Azure.  Instructions on obtaining and installing Azure PowerShell can be found at How to install and configure Azure PowerShell

 

Obtain a Windows Server 2012 R2 Image

The template image we're going to create will be a customization of a Windows Server 2012 R2 image.  Therefore, you will need to obtain a DVD or ISO file to use to install on the image.  I used my MSDN Operating System account to obtain an ISO image.  Note that images obtained through MSDN are only for development purposes, you would need to obtain a retail license for Windows Server 2012 R2 to move to production.

 

Create a VHD file

There's a great walk-through on how to create a VHD file on Windows 7 at: Create and Use a Virtual Hard Disk on Windows 7.  The guide on creating the custom template image also has some pretty good instructions.  First, access the Disk Management tool via Control Panel -> System and Security -> Administrative Tools -> Computer Management:

 

dsikmanager.PNG

 

1. Right-click Disk Management and then click Create VHD. Follow the prompts that appear.

2. Right-click the new disk and then click Initialize Disk. Click OK.

3. Right-click the new disk and then click New Simple Volume (or select a different volume type, if available). Follow the prompts that appear.

 

Obtain a Microsoft Hyper-V Product

You'll need to install Windows Server 2012 R2 on the VHD file, install your application, and then configure the image using one of Microsoft's Hyper-V offerings.  Two options are Microsoft Hyper-V Server 2008 R2 and Microsoft Hyper-V Server 2012 R2.  Both are command line only server products.  The 2008 version is available free of charge.  The 2012 is available as an unlimited evaluation.  I tried both of them, but found that setup and configuration of them was too much effort to justify.  To use the server products you need to run the Hyper-V manager from another machine and deal with a huge number of configuration issues to get the two machines to talk to one another.  If that's something you feel comfortable with, more power to you.  Otherwise, you might want to consider the third option.

 

I ended up with the third option, which is to use the Hyper-V manager built into Windows 8.x.  Since I didn't want to dedicate a physical machine for this purpose, I created a virtual Windows 8 machine using VMPlayer, which is available free of charge for non-commercial purposes.  Once again, I used my MSDN Operating Systems account to obtain a Windows 8.1 image.  One thing you need to make sure you do when you create the Windows 8 virtual machine is change the Guest Operating System Version from "Windows 8" to "Hyper-V (unsupported)".  That's because VMPlayer is a Hyper-V server, but it needs to allow Windows 8 to see hardware support for Hyper-V as well so it's Hyper-V capability will work.

 

hyperv.PNG

What's interesting is that once you get Windows 8 Hyper-V running and install the Windows Server 2012 image on the VHD and start that, you'll actually have *three* different Hyper-V products running, one inside another, in a sort of Matryoshka doll configuration.  VMPlayer -> Windows 8 -> Windows Server 2012.

 

Install Windows 2012 R2 on the VHD image file

 

Once you have Windows 8 (or one of the other Hyper-V products), open the Hyper-V manager, connect to the server (in the case of Windows 8 the manager just connects to the process running on the Windows 8 machine), right click and select "New -> Virtual Machine".  At the "Specify Generation" page of the wizard, leave it set to Generation 1.  On the "Connect Virtual Hard Drive", choose the "Use an existing virtual hard disk" option and select the VHD file you created earlier.  In the "Installation Options" subpage, you can point to the DVD or ISO image that has the Windows Server 2012 R2 setup on it.

 

selectdrive.PNG

Start and configure the Windows Server 2012 R2 image

 

Once Windows Server 2012 R2 is installed on the VHD file, start up the image and perform the customization steps listed in the custom template image guide.  In particular:

 

  • Enable the Remote Desktop Services role and Desktop Experience.
  • Install your application and ensure that it runs on the custom template image.
  • In order to expose your application as a RemoteApp, it needs to appear on the Start Menu.  To do that, create a shortcut and then copy that shortcut to the %SYSTEMDRIVE%\Program Data\Windows\Start Menu\Programs directory.  (You can also publish by path once the service is provisioned, but adding the shortcut to the Start Menu is easier).
  • Disable the file encrypting system
  • Sysprep the image

 

The image will shut down as the final steps of the sysprep.  At this point you need to copy the modified VHD file from the Windows 8 image back to the computer that has the Azure PowerShell installed on it.

 

Upload the custom template image

 

Go back into the Azure Management Console, and under the "RemoteApp" tab select "Template Images" and then the option to "Upload a Template Image".

 

uploadtemplate1.PNG

 

Once you give the template image a name, the management console will provide you with a script and a command to run using the script that you will need to run under an elevated privileges Azure PowerShell command prompt.

 

uploadtemplate2.PNG

Do that by searching for the Azure PowerShell, and then right clicking on it and running it as Administrator

 

powershell.PNG

Then navigate to the directory where the script file downloaded from the Azure site is located, and paste in the command to run.

 

powershell2.PNG

Once you grant it access to run, it will prompt you for the location of the custom template image.  The script will then calculate an MD5 hash for the file and preform the upload.  On my machine with an Intel i7 processor and a 75/75 FIOS line, it takes approximately 30 minutes to calculate the hash and another 30 minutes to do the upload for a 8GB VHD file.

 

Create a RemoteApp Service

 

Now that you have loaded a custom template image, go back into the Azure Management Console -> RemoteApp -> RemoteApp Services and click the option to create a new service.  In the dialog that appears, choose "Quick Create", give it a name, and then select your custom image from the drop down for template images.

 

createremoteapp.PNG

 

At that point, Azure will start provisioning the RemoteApp service, which can take 30 minutes or more.

 

Publish RemoteApp Applications

 

Once the RemoteApp service has been provisioned, click on it to open up the Quick Start menu.  From that menu, select the "Publishing" option.

 

pub2.PNG

 

You have a choice between selecting programs that appear on the Start Menu or just specifying the path to the application.

 

pub3.PNG

 

Since we added the program to the Start Menu, we'll choose that option.  The system will then provide us with a list of the programs on the images Start Menu.  From that, select the application(s) you want the users to have access to.  In this case, we'll make the custom app we added to the image available.

 

publishremoteapp.PNG

Download the RemoteApp client to your desktop and/or mobile device(s) and access the app

 

We're ready to run the application.  For the desktop, you can obtain the RemoteApp client from the following location:  Microsoft Azure RemoteApp.  For mobile devices (i.e., iOS, Android) you can download them from the respective app stores (iTunes or Play Store).  I don't have (or want) a Windows based mobile device, so I can't address how to install the client there.

 

Once the client is downloaded, run it and login to Azure.  For the mobile device apps, this may involve selecting an "Add RemoteApp" option on the client menu.  The application you published should appear, and you can run it from the device.

 

Here's what the client and application looks like when running RemoteApp from my Windows desktop:

 

windowsmenu.PNG

 

windowsapp.PNG

 

Here's the client menu and application running on my iPad mini:

 

IMG_0614.PNG

 

IMG_0613.PNG

 

And finally, here is the client menu and application running on my Samsung Galaxy S5 (Android):

 

Screenshot_2014-09-09-23-47-31.png

 

 

Screenshot_2014-09-09-23-48-02.png

It appears that changes in orientation are not supported on mobile devices (or at least I didn't figure out how to support it).  It seems I was restricted to landscape mode.

 

Also note that since this is based on Remote Desktop, my signing in on a second device while the app was running in an initial device did not start up a new instance of the application.  It just transferred control of the original instance of the application to the more recent device login.  Of course, this only applies to logins from the same users, but it is an interesting and potentially useful feature of Microsoft's implementation.

 

Finally, it may be possible to create the custom image entirely within Azure using the virtual machine options they provide.  I'll leave that as an exercise for the reader.

 

 

 

 

 


PowerBuilder 12.6 eval available


PowerBuilder 5.0 on Ebay!

How to capture error messages from an ActiveX control

$
0
0

Normally when you use OLEObject to connect to an ActiveX control and encounter an error, you will get the generic run time error 'R0035 - Application terminated. Error calling external object function xxx'.

 

I have run across a very simple way to capture the actual error code and message generated by the ActiveX control.

 

First, create a new Standard Class object and select oleobject for the type.

 

Next add the following instance variables:

 

ULong ErrorCode

String ErrorText

 

Then add this code to the externalexception event:

 

ErrorCode = ResultCode

ErrorText = Description

 

Finally save the object as n_oleobject.

 

In your script that calls the ActiveX control functions you will do the following:

 

n_OLEObject oleTheObj

Integer li_rc

 

oleTheObj = Create n_OLEObject

li_rc = oleTheObj.ConnectToNewObject("TheObject.Name")

If li_rc = 0 Then

   try

      oleTheObj.TheFunction()

   catch ( RuntimeError rte )

      PopulateError(oleTheObj.ErrorCode, oleTheObj.ErrorText)

      MessageBox("OLE Runtime Error #" + &

            String(Error.Number), Error.Text, StopSign!)

      oleTheObj.DisconnectObject()

      Return

   end try

   oleTheObj.DisconnectObject()

Else

   MessageBox("OLE Connect Error #" + String(li_rc), &

         "Connect To Object Failed!", StopSign!)

End If

 

You'll notice that in the catch section I used PopulateError to get the instance variables with the error information. I did this so I would also have the objectname/scriptname/linenumber for error logging if this were a real application.

Charlotte PowerBuilder Conference - 2015

$
0
0

CPBCBanner2015sm.png

 

The North Carolina PowerBuilder User Group (ncpbug.org), Appeon Corporation and Novalys are pleased to announce the 2015 Charlotte PowerBuilder Conference to be held on May 6-7-8 2015 in Charlotte, North Carolina.  As with the successful inaugural event in 2014, the focus of the conference is the unparalleled Rapid Application Development tool PowerBuilder

 

As part of the PowerBuilder World Tour, the Charlotte PowerBuilder Conference brings the latest news and information on all things Appeon and PowerBuilder. Appeon will have product experts available to present the latest product roadmap and answer questions on current and future plans for the product. This is your opportunity to have your questions answered and see Appeon Mobile first hand.

 

Learn how to quickly modernize and extend your PowerBuilder applications with Web, Mobile, and Cloud technologies from Appeon Corporation. See how to upgrade the look and feel of traditional PB apps with new GUI components and internationalization tools available from Novalys. Attend sessions on current GUI design and application development from industry veterans. Workshops on topics such as stored procedure debugging, getting the most out of your source control system, and the 'how tos' of working with application frameworks are in the mix right now.

 

More than fifty hours of PowerBuilder specific content is planned for the Conference.  You will not find a better PowerBuilder value for your hard earned dollars anywhere in North America.  Pre-registration for the three day event is only $295 - that's 40% off the normal registration price of $495.

 

 

Call for Session Abstracts

 

Now is your chance to 'feed' the PowerBuilder Community by presenting a session at the conference. As a whole we can only get stronger by coming together and sharing ideas, know-how, and experiences. Showcase your achievements in front of your peers - help us all grow through exposure to new thinking updated ideas.

 

Session length may be either 60, 90, or 120 minutes. Demo type presentations should be limited to sixty minutes; in depth technical discussions or detailed analysis/examples would be more appropriate for a 90 or 120 minute slot.

 

Sessions need to be educational and technically focused. Intermediate level topics are encouraged.

 

Speakers must be available to present during the entire span of the conference (May 6-8, 2015). We offer complimentary registration to approved speakers.

 

Deadline for submission is December 1, 2014. Notifications will be sent out by December 8th.

 

 

Go to www.ncpbug.organd submit your session idea today!

Using NetTcp instead of Http accessing your WCF Service

$
0
0


I've been doing a lot of WCF lately (mostly in VS) and wanted to share some of my experience and knowledge with my PB brothers and sisters. If you are working with WCF on both ends (client and server) you have the option of using NetTcp instead of Http. NetTcp is faster than Http so you'll want to consider this option if it's available. For more info on the hows and whys ask the internet. I only know enough to be dangerous so let's get to it!

 

I used PB 12.5.2 for this but any 12.5 version or above should suffice.

The agenda...

1. Create a WCF service in PB.Net that retrieves data from the demo db and create a PDF from it. Return the PDF as a blob.

2. Configure the service with 2 end points: BasicHttp and NetTcp

3. Install Windows Process Activiation Service (WAS)

4. Create a WPF client using PB.Net to call the WCF Service.

5. Create a Win32 client using PB Classic to call the WCF Service.

 

Create the WCF Service

Open up PB.Net

If you don't have a workspace created go ahead and create one.

Right click on your workspace and add a new target of type WCF Service

Go through the wizard. You can take the defaults if you like but I prefer to put each target in its own folder.

Go ahead and select 'Custom Nonvisual' as the initial object to create.

I like to name the virtual directory something useful too. _wcfservice just doesn't light my fire.

Now create a datawindow that retrieves all columns from the employee table.

Make the where clause where dept_id = :ai_dept_id

Save the datawindow as d_grid

Create a new nvo with two instance variables.

blob ib_pdf

string is_error_msg.

Save it as n_ret. We will use this to return the PDF document

Open the nvo the wizard created for you. It will be called n_customnonvisual if you took the defaults.

Create a function on it called of_create_pdf that takes an integer argument and returns a n_ret (the nvo you created earlier).

Paste the code from the attachment of_create_pdf.txt into your function.

It basically connects to the db, retrieves the data into the datawindow, creates a pdf file, creates a blob from the pdf file, deletes the pdf file on the server and returns the blob as part of n_ret.

Save your nvo and close it.

Open the project file.

Expose your function to create the pdf by checking the box. Rename it if you want to.

Set the Operation Attribute STAOperationBehavior.

Here's an example...

Capture.PNG

Copy the web service url to the clipboard. You'll need it later.

 

Configure the WCF Service using the Service Configuration Editor

Locate the config file in your target. It should be the only one with a 'config' extension in your solution explorer.

Right click on it and select 'open with' then click the Add button

Click the ellipse button and navigate to the following file... C:\Program Files\Microsoft SDKs\Windows\v7.1\Bin\NETFX 4.0 Tools\SvcConfigEditor.exe

Enter a friendly name to name it and click Ok. You now have the Microsoft SDK WCF service configuration editor in your PB arsenal.

Select it from your list and open your config file.

Capture.PNG

Right click on the 'Bindings' folder and add a new binding configuration.

Select basicHttpBinding and click Ok.

Increase all values in the general section that have 65536 to something bigger. I chose 1048576.

Change all the zeros in the Reader Quotas section to 1048576 too.

Make the name something meaningful like BasicBindingMax

Create another binding configuration but this time choose netTcpBinding.

Set its values to the same as the basicHttpBinding values.

Now locate your service in the services folder at the top of the tree.

You should see two endpoints in your service. One for basicHttpBinding and one for MexHttpBinding.

Locate the name field in the grid and give each a name so that '(Empty Name)' doesn't show up in the tree.

Set the binding configuration for your basicHttpBinding to the basic binding you just created. Its probably the only option.

Now right click on the EndPoints folder and add a new endpoint.

Set the binding to netTcpBinding

Set the binding configuration to the netTcp one you just created earlier. Again its probably the only option.

Name your netTcp endpoint.

Save your changes and close the config editor.

Here's an example...

Capture.PNG

Build and deploy your WCF using the project painter.

 

Install WAS (Windows Process Activation Service)

 

Go to Control Panel and bring up the add/ remove windows features and install WAS...

Capture.PNG

Now install .Net 3.5 Framework

Capture.PNG

Go to Component Services and start the WAS service

Capture.PNG

 

Launch IIS Manager (InetMgr)

Create a pdf folder under your WCF Service and give Authenticated Users write access

Select the Default Web Site

Click Advanced Properties

Add net.tcp to the Enabled Protocols property...

Capture.PNG

Do the same thing for your WCF web service by selecting it and going to Advanced Properties.

 

Now your ready to test your web service configuration.

Launch the WCF Test Client app ("C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE\WcfTestClient.exe")

Point to your web service url from your project file (it should be on your clipboard so just paste it)

You should see both your basicHttp and your netTcp end points exposed...

Capture.PNG

They won't work because PDFs are too large for the default settings of the WCF Test Client. We just wanted to verify that the end points were exposed.

Now lets create some clients and show some PDFs!

 

Create a WPF target in PB.Net

Add a window

Add code in the app open event to open the window

Add a new wcf client proxy project that points to your service

Generate the proxy using the proxy project

Save your proxy project changes and close the project painter

Add a button to your window that will be clicked to call your web service

Add a single line edit to capture the dept id, two radio buttons to capture the binding preference Http or NetTcp, and a web browser control to display the PDF

Paste the code from click.txt into the clicked event of your button

This code creates a client proxy, assigns the connection based on the binding selected, increases the buffers to hold a PDF file, calls the service, then displays the PDF using a web browser control

Here's an example of the GUI...

Capture.PNG

Now run the WPF app and see if it works using  either binding.

 

Last but not least lets create a Win32 client with PB Classic

 

Create a regular PB app

Add a window that has a button, sle, two radio buttons and a web browser control

You will need to add the proper registry entries for your service in order for PB to find it

Bruce has covered this very well so I won't go in to that.

Add the PB web service extension to get the soap objects (pbwsclient125.pbx)

Add the code in the attachment win32_click.txt to the clicked event of the button

It should look something like this...

Capture.PNG

Run the app and see if it works using either binding.

 

This was a long post and exposed you to several different programs. I hope you got something out of it. I can post the code for all three programs if desired.

 

Thanks and Good Luck!

Mark

PowerBuilder Sessions at SAP TechEd && d-code Las Vegas

$
0
0

Next week! PowerBuilder at SAP TechEd && d-code.

 

One inconvenient schedule collision...

 

UXP206 and DMM115 both occur at 10:30am on Wednesday.

 

Definitely go see Matt Balent's UXP206 "Enhance Existing SAP PowerBuilder Apps Through Mobile Technologies".

DMM115 will rerun on Friday at 8am.


Thanks for the table layout below Bruce!

 

NumberTitlePresenterDayTimeSummary
DMM115SAP PowerBuilder 12.6 – The OverviewJohn Strano, SAPWed10:30 a.m. - 11:30 a.m.See the features of the long-awaited release of SAP PowerBuilder 12.6 in action! Updated support for the .NET Framework v4.5, MSS 2012, Windows 8, 32, and 64 bit deployment, and Dockable Windows. Learn how SAP PowerBuilder 12.6 can now interact with SAP HANA with its new OData DataWindow!
Fri08:00 a.m. - 09:00 a.m
DMM117SAP HANA and SAP PowerBuilder 12.6 – The Solution MixJohn Strano, SAPWed11:45 a.m. - 12:45 p.m.SAP PowerBuilder has been heralded as the most productive custom application development environment in the industry. Examine multiple architectures and avenues for having SAP PowerBuilder develop the presentation layer and business logic for retrieving, manipulating, transforming, and persisting data for custom solutions on the SAP HANA platform.
Fri09:15 a.m. - 10:15 a.m.
UXP206Enhance Existing SAP PowerBuilder Apps Through Mobile TechnologiesMatthew Balent, McKessonWed10:30 a.m. - 11:30 a.m.This session demonstrates techniques for adding imaging and barcode scanning capabilities from mobile devices into existing desktop applications. With the emphasis on a single generic toolset, see how a small footprint and generic component can make a big impact on the viability of your existing SAP PowerBuilder technology stack.

 

 

For more information:

 

SAP TechEd d-code Las Vegas | October 20 - 24, 2014 | PowerBuilder Sessions

Embedding JavaScript Visuals in PowerBuilder

$
0
0

There is no doubt that the role of JavaScript changed for the software development stack during the last years. There are impressive examples how to visualize data in web and mobile applications. A popular library to create graphs and charts is D3.js . But is it only targeted to HTML based frontends? This is a small Proof-Of-Concept how to use JavaScript applications in PowerBuilder. It means not only to call a JavaScript application from PB, but to use it as an high integrated part of a solution.

 

Architecture

The first step for us is to think about how to run the JavaScript code. The best (but not only) way is to run it in browser. In PowerBuilder it is really easy to put an WebBrowser COM control onto a window and load a HTML document. In this HTML document you can run your Script. Done! Blog post is over, isn't it?

 

It is not. There are problematic facts. It is possible to navigate to a HTML document and load the app, but we loose control immediatly. The only way to pass data to the application is in url before loading or by manipulating the source files before loading. The consequence is to reload the app whenever we have to interact. This will not result in a good user experience. Another point is that we cannot get any results of interaction in the JavaScript application to PowerBuilder. So this is not the final solution.

 

To workaround these problems we have to take a look into the .NET world. There is a solution for these problems. The .NET WebBrowser Control has one method and a property we should notice.

 

  1. Document.InvokeScript invokes JavaScript from .NET applications
  2. ObjectForScripting could be an .NET-UserControl to receive messages from JavaScript by using window.external.HelloMyDotNetMethod('hola!')

 

What we have to do is to use the described Control as an wrapped component in PB. This practice is was very well documented by Bruce Armstrong. So we could build a wrapper to interact with JavaScript applications.

 

JS_UML.pngWith this piece of software it is easy to use JavaScript examples with the mentioned D3.js library in PowerBuilder. For a small Demo I selected this impressive example by Emil Stolarsky (thank you!). I modified it in a way to use DataWindows to load molecules. New items are noticed in PB and inserted to the Controls. The selected item in browser is marked in the corresponding datawindow in PowerBuilder.


JsExample.pngCool, isn't it? It's time for some code.


Snippets

The JavaScript example already have methods to add new atoms to the molecule. What we have to do is to call it from PB. We have two methods to realize this. The first is InjectScript. It will create a new Script-Tag in the HTML document including the passed script. The second method is InvokeScript to trigger the new code. Notice that InvokeScript cannot take any arguments. Any data you have to pass, has to be in the injected code. For adding atoms by type (as_type) this code will work.


ole_browser.object.JsInject("window.addAtomFromPB = function(){addAtom('" + as_type + "');}")
ole_browser.object.JsInvoke("addAtomFromPB")

The second part is receiving data from the JavaScript application. To realize this we have to extend the JavaScript code a bit. For example to trigger PB everytime an atom was selected by the user, we have to extend the JavaScript code in this way.


var atomClicked = function (dataPoint) {         if (dataPoint.symbol === "H")             return;         if (atomSelected)             atomSelected.style("filter", "");         atomSelected = d3.select(this)            .select("circle")             .style("filter", "url(#selectionGlove)");        // Send to PB what's the selected atom        if(window.external){            window.external.JsTrigger("atomClicked->" + atomSelected[0][0].parentNode.__data__.id);        }    };

The JsTrigger event is passed from the interop control to PB and can be used in this way.


method = mid(arguments,1,pos(arguments, "->")-1)
args = mid(arguments, len(method)+3)
choose case lower(method)    case "atomclicked"        row = dw_nodes.find("id='" + args + "'", 1, dw_nodes.rowCount() +1)        dw_nodes.setRow(row)        dw_nodes.selectRow(0, false)        dw_nodes.selectRow(row, tr
end choose


Conclusion

There is a lot of progress to find new ways visualizing data in web applications with HTML5 and JavaScript. Maybe PowerBuilder can participate in the shown way.


Pitfalls

I really recommend to try this example by your own. But Maybe you will run into trouble loading the web application. The problem is that you have to set the compatibility mode for the application. Solve it by creating a DWORD entry name it like the example exe and set the value to 00002af9 in key HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION.

 

Keep in mind to install the ComInteropWebBrowser.dll to the gac by using gacutil -i and regasm.

 

Links

From SAP TechEd && d-code

$
0
0

Had eight attendees at my session today!  One gentleman even came from Singapore since there are/were no PowerBuilder sessions at the asia events (go figure).

 

John Strano had similar numbers.

 

Don't forget to check out ncpbug.org for information on the Charlotte PowerBuilder Conference in May 2015.


Funniest comment heard at SAP Teched && d-code

$
0
0

"What database does HANA run on"?

Calling .Net Assemblies from PowerBuilder Classic Win32 via PowerShell

$
0
0

Recently someone asked me how they could get the output from PBDOM used from a PowerBuilder Classic Win32 application formatted with white space as PBDOM doesn't include it.  I gave them a number of options, particularly MSXML through OLE Automation or using a .Net class like XmlTextWriter.  Normally if you were going to try to access a .Net assembly from a PowerBuilder Classic Win32 application, you would do it via a COM Callable Wrapper.  However, for something this simple I thought there had to be a more lightweight way to accomplish it.  One particular lighterweight way that occurred to be would be to have the application launch a Windows PowerShell script that would then use the .Net class in question.  We're going to look at an example of how that's done.

 

The first thing we'll need is the PowerShell script to do the work. This is what I came up with (referenced as prettyprint.ps1 in the later code):

 

param(    [string]$filein,    [string]$fileout
)
[void][System.Reflection.Assembly]::LoadWithPartialName("System.Xml.Linq")
[System.Xml.Linq.XDocument]::Load($filein).Save($fileout)
# If running in the console, wait for input before closing.
if ($Host.Name -eq "ConsoleHost")
{     Write-Host "Press any key to continue..."    $Host.UI.RawUI.ReadKey("NoEcho,IncludeKeyUp") > $null
}

The script declares a couple of parameters (the input xml file and the output xml file).  It then loads the System.Xml.Linq .Net assembly via reflection.  Finally, we load the file and then write it back out again with white space.  The last few lines are just for debugging from a command line prompt, as it displays a "Press any key to continue..." prompt before closing the PowerShell process window.

 

To test it through a batch file, I used this:

 

@ECHO OFF
SET ThisScriptsDirectory=%~dp0
SET PowerShellScriptPath=%ThisScriptsDirectory%prettyprint.ps1
SET SourceFile=%ThisScriptsDirectory%config.xml
SET DestFile=%ThisScriptsDirectory%.config.new.xml
%SystemRoot%\system32\WindowsPowerShell\v1.0\powershell.exe -NoProfile -ExecutionPolicy Bypass -Command "& '%PowerShellScriptPath%' -filein '%SourceFile%' -fileout '%DestFile%'";
pause

The assumption here is that the batch file, the PowerShell script and the input xml file are all in the same directory.  I've got a pause statement in this script, so you actually get two "Press any key to continue..." prompts.  If it works properly, that's all you should see.  Otherwise you should see the error message from PowerShell or the batch file.

 

Once you know it's working, it's time to call it from PowerBuilder.  I'm going to cheat a bit in the following example.  I'm using the PowerScript Run function and have hard coded the location of the PowerShell executable.  In actual usage, you might query the operating system for the location of the SystemRoot, or use the ShellExecute, ShellExecuteEx or CreateProcess Windows API functions to invoke the process rather than Run.  Also note that the code assumes that the PowerShell script file is located in the same directory as the PowerBuilder Classic Win32 application.

 

int li_rc 
string ls_sourcepath
string ls_sourcefile
string ls_destpath
string ls_destfile
string ls_command
string ls_directory
ls_directory = GetCurrentDirectory()
ls_command = 'C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -NoProfile -ExecutionPolicy Bypass -Command "&'
ls_command += " '" + ls_directory + "\prettyprint.ps1' "
li_rc = GetFileOpenName ( "Select source file", ls_sourcepath, ls_sourcefile, "XML", "XML File (*.xml),*.xml" )
IF li_rc <> 1 THEN Return
ls_command += " -filein '" + ls_sourcepath + "' "
li_rc = GetFileSaveName ( "Select destination file", ls_destpath, ls_destfile, "XML", "XML File (*.xml),*.xml" )
IF li_rc <> 1 THEN Return
ls_command += " -fileout '" + ls_destpath + "' "
li_rc = Run ( ls_command )

In this case, the application prompts the user to select an XML file to process and then provide a name for the "pretty" version of the XML to output.

 

Without the second argument to Run, you will see the PowerShell process window open momentarily.  If you were to continue to use the Run method, you can pass Minimized! as a second argument to that function to suppress the window.  In addition, the ShellExecute, ShellExecuteEx and CreateProcess Windows API functions have options to suppress the PowerShell process window from displaying.

THANK YOU!

$
0
0

Despite the uncertainty surrounding SAP’s plans for PowerBuilder,

more of you answered the 2014 PowerBuilder Survey than previous years.

 

SAP Management recently confirmed that they are preparing PowerBuilder’s future,

but for the moment no announcement has been published.

In this context, it’s important to show how committed the PowerBuilder community is.

 

This year, SAP added questions to identify the most demanded evolutions by PowerBuilder developers.

Your answers were numerous and very detailed.

We compiled them by theme to help SAP elaborate an eventual roadmap.

 

Even if no one can predict SAP’s plans for PB, the best message that can be sent to SAP is to show them your loyalty as PB developers.

This is what all those who answered the survey did, and the PowerBuilder community thanks them!

 

Christophe

 

2014 PB survey's results

SAP at the Charlotte PowerBuilder Conference

$
0
0

I've just received word that John Strano, long time PowerBuilder evangelist/technologist/guru, will be representing SAP at the May 2015 event.

 

A preliminary abstract for his session is as follows:

 

HANA and PowerBuilder 12.6 – The Solution Mix

PowerBuilder has long been heralded as the most productive custom application development environment in the industry. We’ll examine multiple architectures and avenues for having PowerBuilder develop the presentation layer and business logic for retrieving, manipulating, transforming and persisting data for custom solutions on the HANA platform.


You can find more information on all of the sessions at the North Carolina PowerBuilder User Group site http://www.ncpbug.org


In addition to the three day conference itself we are offering two 'pre-conference' classes on intermediate topics taught by renowned PB expert Yakov Werde.  These will be held on Monday, May 4, and Tuesday, May 5 and last eight hours each.


Registration is now open!


CPBCBanner2015sm.png

Tip for Searching For A Solution while Creating an Incident

$
0
0

When you are in the process of creating an Incident on http://support.sap.com, an important tip to
remember is when you are at Step 2 -  Prepare Solution Search, add the component for which you

are reporting/creating the Incident on.

 

 

For example, here is a screenshot of Step 2.

 

fig1.png

 

 

 

You enter the keywords for the search term that best fit your issue.  Make sure  to add the component

for which you are reporting the incident on.   The component that you need to enter is based on

product as listed in Table 1.

 

 

Table 1.  Basis Components (BC) - Sybase Products (SYB)

 

ComponentProduct
BC-SYB-PD-AMCPowerAMC
BC-SYB-PDPowerDesigner
BC-SYB-PBPowerBuilder
BC-SYB-IMInfoMaker
BC-SYB-EASEAServer

 

 

Now when you go to  Step 3 – Find Solution, you should now see search results that best match the search

terms you entered in.   Click on the url link in the search results.

 

fig2.png

 

 

 

You can possibly find a solution before actually opening the Incident.

 

fig3.png

 

In Summary, add the Component when at Step 2 – Prepare Solution Search.  Leaving the Component

blank will result in ‘No SAP Note/Knowledge Base Articles found’.

 

fig4.png

Viewing all 186 articles
Browse latest View live


<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>