Top Banner
©2019 Appeon Limited and its subsidiaries. All rights reserved. Marco MEONI C# for PowerBuilder Developers
48

C# for PowerBuilder Developers · 2019-05-31 · C# for PowerBuilder Developers . DISCLAIMER This presentation was authored by volunteer(s) in the Appeon community. This is not a

Apr 04, 2020

Download

Documents

dariahiddleston
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: C# for PowerBuilder Developers · 2019-05-31 · C# for PowerBuilder Developers . DISCLAIMER This presentation was authored by volunteer(s) in the Appeon community. This is not a

©2019 Appeon Limited and its subsidiaries. All rights reserved.

Marco MEONI

C# for PowerBuilder Developers

Page 2: C# for PowerBuilder Developers · 2019-05-31 · C# for PowerBuilder Developers . DISCLAIMER This presentation was authored by volunteer(s) in the Appeon community. This is not a

DISCLAIMER This presentation was authored by volunteer(s) in the Appeon community. This is not a work for hire by Appeon. The views and opinions expressed in this presentation are those of the author(s). Its contents are protected by US copyright law and may not be reproduced, distributed, transmitted, displayed, published or broadcast without the prior written permission of Appeon. All rights belong to their respective owners. Any reference to third-party materials, including but not limited to Websites, content, services, or software, has not been reviewed or endorsed by Appeon. YOUR USE OF THIRD-PARTY MATERIALS SHALL BE AT YOUR OWN RISK. Appeon makes no warranty of any kind, either express or implied, including but not limited to, the implied warranties of merchantability, fitness for a particular purpose, or non-infringement. Appeon assumes no responsibility for errors or omissions.

Page 3: C# for PowerBuilder Developers · 2019-05-31 · C# for PowerBuilder Developers . DISCLAIMER This presentation was authored by volunteer(s) in the Appeon community. This is not a

page 3 elevate.appeon.com

•  Introduction to C# •  Building Blocks •  Flow Control •  Data Structures •  OOP Concepts

• Real-life Use Cases • Discussion • From PowerScript to C# (Web API)

Presentation Agenda

Page 4: C# for PowerBuilder Developers · 2019-05-31 · C# for PowerBuilder Developers . DISCLAIMER This presentation was authored by volunteer(s) in the Appeon community. This is not a

Key Skills

Recent Projects

elevate.appeon.com

[email protected]

twitter.com/marcomeoni

linkedin.com/in/meonimarco

Marco MEONI •  2014 - 2019 : Some dozens of migration projects from PowerBuilder

to PowerServer Web & Mobile

•  2015 - 2018 : Ph.D in Big Data and Machine Learning for popularity prediction of ~50 PBytes/year of CERN Physics data

•  PowerBuilder

•  Machine Learning

•  PowerServer

•  Appeon MVP

•  Big Data

Author Profile

page 4

Page 5: C# for PowerBuilder Developers · 2019-05-31 · C# for PowerBuilder Developers . DISCLAIMER This presentation was authored by volunteer(s) in the Appeon community. This is not a

C# Syntax

Building Blocks

Page 6: C# for PowerBuilder Developers · 2019-05-31 · C# for PowerBuilder Developers . DISCLAIMER This presentation was authored by volunteer(s) in the Appeon community. This is not a

page 6 elevate.appeon.com

•  C#isthemainlanguageofthe.NETframework•  .NETincludesalargeclasslibrarynamedFCL•  Programswrittenfor.NETexecuteinaswenvcalledCLR• Howeverwetarget.NETCore,MScross-platformopen-sourceframework•  .NETCoreisacombinationofASP.NETMVCandASP.NETWebAPI

•  ASP.NETMVC:MSWebframeworkthatimplementsMVC•  ASP.NETWebAPI:MSframeworkforbuildingRESTfulservices•  YoucandevelopusingCLItools,VS2017,VSCodeorSnapDevelop

Background

Page 7: C# for PowerBuilder Developers · 2019-05-31 · C# for PowerBuilder Developers . DISCLAIMER This presentation was authored by volunteer(s) in the Appeon community. This is not a

page 7 elevate.appeon.com

• SnapDevelop is the new C# IDE included in PB 2019

•  Includes NuGet, the Package Manager for .NET •  Features IntelliSense from Visual Studio

• SnapObjects is the new C# framework •  Data components and PowerBuilder DataStore

SnapDevelop

Page 8: C# for PowerBuilder Developers · 2019-05-31 · C# for PowerBuilder Developers . DISCLAIMER This presentation was authored by volunteer(s) in the Appeon community. This is not a

elevate.appeon.com

Datatype Mapping

.NET C# PowerBuilderSystem.Boolean boolean Boolean

System.Byte byte Byte

System.Sbyte sbyte

System.Int16 short Int

System.UInt16 ushort Uint

System.Int32 int Long

System.UInt32 uint Ulong

System.Int64 long Longlong

System.UInt64 ulong

System.Single float Real

System.Double double Double

System.Decimal decimal Decimal

System.Char char Char

System.String string String

System.DateTime Datetime Datetime

page 8

Page 9: C# for PowerBuilder Developers · 2019-05-31 · C# for PowerBuilder Developers . DISCLAIMER This presentation was authored by volunteer(s) in the Appeon community. This is not a

elevate.appeon.com

public class BMI

{

} •  Justapublicclass

•  EquivalenttoPBnonvisualobject

page 9

Class

Page 10: C# for PowerBuilder Developers · 2019-05-31 · C# for PowerBuilder Developers . DISCLAIMER This presentation was authored by volunteer(s) in the Appeon community. This is not a

elevate.appeon.com

public class BMI

{

public float calcBMI(float weight, float height)

{

return weight / (height * height);

}

}

Publicclasswithpublicmethod

page 10

Methods

Page 11: C# for PowerBuilder Developers · 2019-05-31 · C# for PowerBuilder Developers . DISCLAIMER This presentation was authored by volunteer(s) in the Appeon community. This is not a

elevate.appeon.com

public class BMI

{

private static int calcCount;

public float calcBMI(float weight, float height)

{

calcCount++;

return weight / (height * height);

}

}

Aprivatefield(member)

page 11

Fields

Page 12: C# for PowerBuilder Developers · 2019-05-31 · C# for PowerBuilder Developers . DISCLAIMER This presentation was authored by volunteer(s) in the Appeon community. This is not a

elevate.appeon.com

public class BMI

{

private static int calcCount;

public static int ServiceCount {

get { return calcCount; }

}

public float calcBMI(float weight, float height)

{

calcCount++;

return weight / (height * height);

}

}

Apropertymethod

page 12

Properties

Page 13: C# for PowerBuilder Developers · 2019-05-31 · C# for PowerBuilder Developers . DISCLAIMER This presentation was authored by volunteer(s) in the Appeon community. This is not a

elevate.appeon.com

public struct address {

private string street {

get { return street.ToUpper(); }

set { street = value; }

}

private string city;

private string state;

private void clear() {

this.street = "";

this.city = "";

this.state = "";

}

}

AStructdefinition

page 13

Structs

Page 14: C# for PowerBuilder Developers · 2019-05-31 · C# for PowerBuilder Developers . DISCLAIMER This presentation was authored by volunteer(s) in the Appeon community. This is not a

elevate.appeon.com

interface movable

{

int speed{ get; set; };

void accelerate(int amount);

void decelerate(int amount);

void start();

void stop();

}

TheInterfacecontainsonlydeclarations

page 14

Interface

Page 15: C# for PowerBuilder Developers · 2019-05-31 · C# for PowerBuilder Developers . DISCLAIMER This presentation was authored by volunteer(s) in the Appeon community. This is not a

elevate.appeon.com

public enum Days

{

monday = 0,

tuesday = 1,

wednesday = 2,

thursday = 3,

friday = 4,

saturday = 5,

sunday = 6

};

Declareyourownenumerations

page 15

Enumeration

Page 16: C# for PowerBuilder Developers · 2019-05-31 · C# for PowerBuilder Developers . DISCLAIMER This presentation was authored by volunteer(s) in the Appeon community. This is not a

elevate.appeon.com

namespace pbugg {

public class BMI {

private static int calcCount;

public static int ServiceCount {

get { return calcCount; }

}

public float calcBMI(float weight, float height) {

calcCount++;

return weight / (height * height);

}

} }

Namespacesprovidelevelsofcodeseparation

page 16

Namespace

Page 17: C# for PowerBuilder Developers · 2019-05-31 · C# for PowerBuilder Developers . DISCLAIMER This presentation was authored by volunteer(s) in the Appeon community. This is not a

elevate.appeon.com page 17

IncludethestandadnamespaceSystem

DefineaclassBMI

DefinetheMain()method–the

programentrypoint

PrinttextontheconsolebymethodWriteLinefromclassConsole

AppeonSnapDevelop

IDE

All Together

Page 18: C# for PowerBuilder Developers · 2019-05-31 · C# for PowerBuilder Developers . DISCLAIMER This presentation was authored by volunteer(s) in the Appeon community. This is not a

C# Syntax

Flow Control

Page 19: C# for PowerBuilder Developers · 2019-05-31 · C# for PowerBuilder Developers . DISCLAIMER This presentation was authored by volunteer(s) in the Appeon community. This is not a

elevate.appeon.com

for (int i = 0; i < 10; i++)

{

doSomething();

}

while (true)

{

doSomething();

}

foreach (var item in myStringArray)

{

System.Console.WriteLine(item);

}

page 19

Iteration Structures

Page 20: C# for PowerBuilder Developers · 2019-05-31 · C# for PowerBuilder Developers . DISCLAIMER This presentation was authored by volunteer(s) in the Appeon community. This is not a

elevate.appeon.com

if (user == "nobody")

{

doSomething();

}

else

{

doSomethingBetter();

}

switch (caseSwitch)

{ case 1:

Console.WriteLine("Case 1");

break;

case 2:

Console.WriteLine("Case 2");

break;

default:

Console.WriteLine("Case Else");

break;

}

Conditional Structures

page 20

Page 21: C# for PowerBuilder Developers · 2019-05-31 · C# for PowerBuilder Developers . DISCLAIMER This presentation was authored by volunteer(s) in the Appeon community. This is not a

elevate.appeon.com

try

{

// something happens here

}

catch (System.Exception ex)

{

System.Console.WriteLine("Error: " + ex.Message);

}

Exception

page 21

Page 22: C# for PowerBuilder Developers · 2019-05-31 · C# for PowerBuilder Developers . DISCLAIMER This presentation was authored by volunteer(s) in the Appeon community. This is not a

C# Syntax

Data Structures

Page 23: C# for PowerBuilder Developers · 2019-05-31 · C# for PowerBuilder Developers . DISCLAIMER This presentation was authored by volunteer(s) in the Appeon community. This is not a

elevate.appeon.com

string[] animals = new string[3];

animals[0] = "deer";

animals[1] = "moose";

animals[2] = "boars";

string[] animals2 = new string[] { "deer", "moose", "boars" };

string[] animals3 = { "deer", "moose", "boars" };

Console.WriteLine(”Array size: " + animals.Length);

Array

page 23

Page 24: C# for PowerBuilder Developers · 2019-05-31 · C# for PowerBuilder Developers . DISCLAIMER This presentation was authored by volunteer(s) in the Appeon community. This is not a

elevate.appeon.com

List<Car> myCollection = new List<Car>();

myCollection.Add(new Car("Fiat 500 D"));

myCollection.Add(new Car("Lancia Fulvia HF"));

myCollection.Add(new Car("Alfa Romeo Giulietta Spider"));

myCollection.Add(new Car("Fiat Topolino A"));

foreach (var car in myCollection)

{

System.Console.WriteLine(car.ToString());

}

List

page 24

Page 25: C# for PowerBuilder Developers · 2019-05-31 · C# for PowerBuilder Developers . DISCLAIMER This presentation was authored by volunteer(s) in the Appeon community. This is not a

page 25 elevate.appeon.com

• Specialized classes for data storage and retrieval • Enhancement to the arrays • Array

•  useful for working with fixed number of strongly-typed objects • Collections

•  group of objects can grow and shrink dynamically •  you can assign a key to objects for quick retrieve •  type safe because can contain only one type of data

Collections

Page 26: C# for PowerBuilder Developers · 2019-05-31 · C# for PowerBuilder Developers . DISCLAIMER This presentation was authored by volunteer(s) in the Appeon community. This is not a

page 26 elevate.appeon.com

• Standard (System.Collections) •  Store elements of type Object •  ArrayList, Hashtable, Queue, Stack

• Generic (System.Collections.Generic) •  Enhance code reuse, type safety, and performance •  Dictionary<T, T>, List<T>, Queue<T>, SortedList<T>, and Stack<T>

• Concurrent •  BlockingCollection<T>, ConcurrentDictionary<T, T>,

ConcurrentQueue<T>, and ConcurrentStack<T>

Collection (cont)

Page 27: C# for PowerBuilder Developers · 2019-05-31 · C# for PowerBuilder Developers . DISCLAIMER This presentation was authored by volunteer(s) in the Appeon community. This is not a

C# Syntax

OOP Concepts

Page 28: C# for PowerBuilder Developers · 2019-05-31 · C# for PowerBuilder Developers . DISCLAIMER This presentation was authored by volunteer(s) in the Appeon community. This is not a

elevate.appeon.com page 28

public class X {

public void GetInfo() {

System.Console.WriteLine("Base Class");

}

}

public class Y : X {

public void GetInfo () {

System.Console.WriteLine("Derived Class");

}

public class TestUnit {

static void Main(string[] args) {

Y y = new Y();

y.GetInfo();

} }

Class Inheritance

Use base.Method() to call a base class method that has been overridden

Page 29: C# for PowerBuilder Developers · 2019-05-31 · C# for PowerBuilder Developers . DISCLAIMER This presentation was authored by volunteer(s) in the Appeon community. This is not a

elevate.appeon.com page 29

interface IName { void GetName(string x); } interface ICity { void GetCity(string x); } interface IAge { void GetAge(int x); } class User : IName, ICity, IAge { public void GetName(string a) { Console.WriteLine("Name: {0}", a); } public void GetCity(string a) { Console.WriteLine("City: {0}", a); } public void GetAge(int a) { Console.WriteLine("Age: {0}", a); } } class Program { static void Main(string[] args) { User u = new User(); u.GetName("Marco Meoni"); u.GetCity("Florence"); u.GetAge(45); } }

Multiple Inheritance

Page 30: C# for PowerBuilder Developers · 2019-05-31 · C# for PowerBuilder Developers . DISCLAIMER This presentation was authored by volunteer(s) in the Appeon community. This is not a

elevate.appeon.com page 30

public class Shape { public int Height { get; set; } public int Width { get; set; } public virtual void Draw() { Console.WriteLine("Perform drawing tasks"); } } class Circle : Shape { public override void Draw() { } // Code to draw a circle... } class Rectangle : Shape { public override void Draw() { } // Code to draw a rectangle... } class Triangle : Shape { public override void Draw() { } // Code to draw a triangle... } class Program { static void Main(string[] args) { var shapes = new List<Shape> { new Rectangle(), new Triangle(), new Circle() }; foreach (var shape in shapes) { shape.Draw(); } } }

Polymorphism

Page 31: C# for PowerBuilder Developers · 2019-05-31 · C# for PowerBuilder Developers . DISCLAIMER This presentation was authored by volunteer(s) in the Appeon community. This is not a

C# Code Examples

Real-lifeUseCases

Page 32: C# for PowerBuilder Developers · 2019-05-31 · C# for PowerBuilder Developers . DISCLAIMER This presentation was authored by volunteer(s) in the Appeon community. This is not a

page 32 elevate.appeon.com

NoneedforPBDOMCreate XML docs

Page 33: C# for PowerBuilder Developers · 2019-05-31 · C# for PowerBuilder Developers . DISCLAIMER This presentation was authored by volunteer(s) in the Appeon community. This is not a

elevate.appeon.com

Read System Props

page 33

Page 34: C# for PowerBuilder Developers · 2019-05-31 · C# for PowerBuilder Developers . DISCLAIMER This presentation was authored by volunteer(s) in the Appeon community. This is not a

elevate.appeon.com

Send an Email

page 34

Page 35: C# for PowerBuilder Developers · 2019-05-31 · C# for PowerBuilder Developers . DISCLAIMER This presentation was authored by volunteer(s) in the Appeon community. This is not a

elevate.appeon.com

Web Resource

page 35

Page 36: C# for PowerBuilder Developers · 2019-05-31 · C# for PowerBuilder Developers . DISCLAIMER This presentation was authored by volunteer(s) in the Appeon community. This is not a

elevate.appeon.com

Write Encoded files

page 36

Page 37: C# for PowerBuilder Developers · 2019-05-31 · C# for PowerBuilder Developers . DISCLAIMER This presentation was authored by volunteer(s) in the Appeon community. This is not a

Discussion

Page 38: C# for PowerBuilder Developers · 2019-05-31 · C# for PowerBuilder Developers . DISCLAIMER This presentation was authored by volunteer(s) in the Appeon community. This is not a

page 38 elevate.appeon.com

• Should I care of C#? •  Do not understimate yourself

• PB 2019 includes breakthrough C# Web API feature • Long history of solutions/hacks to run B.L. on the server

•  Application Server plugin (JEE) •  SOAP WS (.NET) •  Assembly via WS (.NET) •  Stored Procedure

• With C# (Datastore) you can reuse most of the PB DW handling

I’m a PowerBuilder developer!

Page 39: C# for PowerBuilder Developers · 2019-05-31 · C# for PowerBuilder Developers . DISCLAIMER This presentation was authored by volunteer(s) in the Appeon community. This is not a

page 39 elevate.appeon.com

• PowerServer doesn't really separate out B.L. from client app •  Built-in data connectivity, transaction mgt, DW support, load balancing… •  …but PB NVOs remain client code

•  Workarounds: Get/SetFullState, SPs, .NET assembly, WS •  Non-optimized code suffers of heavy script and multiple server calls

• B.L. separation is the purpose of C# Web API •  No unsupported PB features •  C# has more extensive feature set than PB itself •  Expose app B.L. to the world for integration purposes

• PSW/PSM migration effort can leverage C# Web API too •  It is not PowerServer vs C# Web API: combine them and get the best

I’m a PowerServer developer!

Page 40: C# for PowerBuilder Developers · 2019-05-31 · C# for PowerBuilder Developers . DISCLAIMER This presentation was authored by volunteer(s) in the Appeon community. This is not a

From PowerScript to

C# Web API

Mykickoffexperience

Page 41: C# for PowerBuilder Developers · 2019-05-31 · C# for PowerBuilder Developers . DISCLAIMER This presentation was authored by volunteer(s) in the Appeon community. This is not a

page 41 elevate.appeon.com

•  Case sensitive! •  Return => return

•  String •  in double quotes, backslash-escaped •  String(li_num) => li_num.ToString()

•  Flow Control •  if ll_row = 1 then else end if => if(ll_row == 1) { } else { }

Difference

Page 42: C# for PowerBuilder Developers · 2019-05-31 · C# for PowerBuilder Developers . DISCLAIMER This presentation was authored by volunteer(s) in the Appeon community. This is not a

page 42 elevate.appeon.com

•  DataStore operations •  li_rc = lds.SetItem(1, val) => lbool = lds.SetItem(1, val) •  => li_row = lds_cal.InsertRow(0); // row index starts from 0!!! •  ll_val = lds.Getitemnumber(1, 'col') => ll_val = (long) lds.GetItemNumber(0, "col") •  => lds.SetItem(1, "col", (Int32) lds_1.ll_val); // cast

This is how you learn the language!

Difference (cont)

Page 43: C# for PowerBuilder Developers · 2019-05-31 · C# for PowerBuilder Developers . DISCLAIMER This presentation was authored by volunteer(s) in the Appeon community. This is not a

elevate.appeon.com

private int DoJob(ref Calc calc, ref Err err) { int rc = 1; var dsReq = new DataStore("Ds_Req_Getinfo", _dataContext); int rows = dsReq.Retrieve(calc.reqNum); if (rows == 1) { calc.calType = (long)dsReq.GetItemNumber(rows - 1, "type"); calc.calDay = (DateTime)dsReq.GetItemDateTime(li_rows - 1, "day"); calc.calScore = Score(calc.calType, calc.calDay); } else { err.message = "Retrieve error for req. " + calc.reqNum.ToString(); rc = -1; } return rc; }

private function integer of_doJob(ref anv_calc anv_calc, ref nv_err anv_err);

Integer li_rc = 1 String ls_temp Long ll_rows

Datastore lds_req lds_req = CREATE datastore lds_req.DataObject = "ds_req_getinfo” lds_req.SetTransObject(sqlca) ll_rows = lds_req.Retrieve(anv_calc.il_reqNum)

If ll_rows = 1 Then

anv_calc.il_calType = lds_req.GetItemNumber(ll_rows, 'type') anv_calc.iddt_calDay = lds_req.GetItemDatetime(ll_rows, 'day') anv_calc.il_calScore = of_Score(anv_calc.il_calType, anv_calc.iddt_calDay)

Else

anv_err.is_message = "Retrieve error for req. "+string(anv_calc.il_reqNum) li_rc = -1

End If

Destroy lds_req

Return li_rc

end function

Not automatic… …but easy

page 43

Page 44: C# for PowerBuilder Developers · 2019-05-31 · C# for PowerBuilder Developers . DISCLAIMER This presentation was authored by volunteer(s) in the Appeon community. This is not a

elevate.appeon.com page 44

IntelliSense

Page 45: C# for PowerBuilder Developers · 2019-05-31 · C# for PowerBuilder Developers . DISCLAIMER This presentation was authored by volunteer(s) in the Appeon community. This is not a

elevate.appeon.com page 45

MVC

Page 46: C# for PowerBuilder Developers · 2019-05-31 · C# for PowerBuilder Developers . DISCLAIMER This presentation was authored by volunteer(s) in the Appeon community. This is not a

page 46 elevate.appeon.com

• Ready to create your first C# Web API… • …with SnapDevelop

What’s next?

Page 47: C# for PowerBuilder Developers · 2019-05-31 · C# for PowerBuilder Developers . DISCLAIMER This presentation was authored by volunteer(s) in the Appeon community. This is not a

Connect with the Appeon Community

Follow Appeon and community members to get the latest tech news.

twitter.com/AppeonPB Follow Appeon and community members to get the latest tech news.

google.appeon.com

Encourage us with a “like”, see cool pics, and get notified of upcoming events.

facebook.com/AppeonPB Share important Appeon videos with others; no account registration required.

youtube.com/c/AppeonHQ

linkedin.com Build up your career profile, and stay in contact with other professionals.

Discussions, tech articles and videos, free online training, and more.

community.appeon.com

elevate.appeon.com page 47

Page 48: C# for PowerBuilder Developers · 2019-05-31 · C# for PowerBuilder Developers . DISCLAIMER This presentation was authored by volunteer(s) in the Appeon community. This is not a

elevate.appeon.com

Thank you!

Questions? ? page 48