Visión General

 

PowerBuilder 2019 (originalmente nombrado como PowerBuilder 2018) permite a los desarrolladores codificar en C# utilizando el IDE de PowerBuilder nativo. Cuenta con un nuevo conjunto de objetos para C#, que permiten la creación fácil y rápida, en una forma controlada de pruebas, de objetos del lado del servidor (ensamblajes .NET y API web RESTful). Obtendrás la productividad que es un sello distintivo de PowerBuilder junto con los beneficios clave de la plataforma .NET y la arquitectura en la nube.

 

Esta es una renovación total de los objetos .NET existentes de PowerBuilder. Como tal, el desarrollo se realiza utilizando el lenguaje C# y se basa en estándares abiertos, como el .NET Core de código abierto y el estándar OAuth. Las librerías de tiempo de ejecución del servidor no guardan el estatus de las transacciones y son 100% seguras para los subprocesos. Podrás experimentar una mayor seguridad, rendimiento y portabilidad que antes.

 

PowerBuilder 2018 expande su arsenal de desarrollo con C# en muy poco tiempo. La razón principal es que utiliza el conocido IDE de PowerBuilder para escribir C# que está centrado alrededor del popular DataWindow. Con prácticamente las mismas propiedades y funciones no visuales de antes, ¡ni siquiera necesitarás molestarte en leer cualquier documentación!

 

 En comparación con el desarrollo tradicional de C# en Visual Studio, PowerBuilder 2019 ofrece los siguientes beneficios clave:

  

bnt curva

bnt pruebas

bnt migracion

 

 

 

Productividad

 

 

¡Deja de perder el tiempo escribiendo toneladas de código!

 

public IDataStore GetOrderCustomerInfo(DateTime startDate, DateTime endDate, decimal amount)
{
    IDataStore dataStore = new DataStore("d_order_customer", _context);
    dataStore.Retrieve(startDate, endDate, amount);
    return dataStore;
}
public IEnumerable GetOrderCustomerInfo(DateTime startDate, DateTime endDate, decimal amount)
{
    var query = from c in _context.Set()
                from p in _context.Set()
                from s in _context.Set()
                where c.PersonId == p.Businessentityid &&
                      s.CustomerId == c.CustomerId &&
                      s.OrderDate >= startDate &&
                      s.OrderDate <= endDate
                group s.SubTotal by new
                {
                    p.Title,
                    p.Firstname,
                    p.Middlename,
                    p.Lastname,
                    c.ModifiedDate,
                    c.CustomerId
                } 
                into g
                let avg = g.Average()
                where avg > amount
                orderby avg
                select new D_Order_Customer
                {
                    Person_Title = g.Key.Title,
                    Person_Firstname = g.Key.Firstname,
                    Person_Middlename = g.Key.Middlename,
                    Person_Lastname = g.Key.Lastname,
                    Customer_Modifieddate = g.Key.ModifiedDate,
                    Customer_Customerid = g.Key.CustomerId,
                    Sumamt = g.Sum(),
                    Avgamt = avg
                };
 
    return query.ToList();
}
 
 
 
//code of model 
public class D_Order_Customer
{
    [SqlColumn("Title")]
    public String Person_Title { get; set; }
 
    [SqlColumn("FirstName")]
    public String Person_Firstname { get; set; }
 
    [SqlColumn("MiddleName")]
    public String Person_Middlename { get; set; }
 
    [SqlColumn("LastName")]
    public String Person_Lastname { get; set; }
 
    [SqlColumn("ModifiedDate")]
    public DateTime Customer_Modifieddate { get; set; }
    [Key]
    [Identity]
    [SqlColumn("CustomerID")]
    public Int32 Customer_Customerid { get; set; }
 
    [SqlColumn("sumamt")]
    public Decimal Sumamt { get; set; }
 
    [SqlColumn("avgamt")]
    public Decimal Avgamt { get; set; }
}
public function datastore of_retrieve (date ad_start, date ad_end, decimal adec_amt); 
Datastore lds
lds = Create Datastore
lds.dataobject = "d_order_customer"
lds.SetTransObject(SQLCA) 
lds.Retrieve(ad_start, ad_end, adec_amt) 
Return lds 
end function

 

 

 

 

 

Realmente no se puede vencer el poder del objeto DataStore de C# y el desarrollo visual de PowerBuilder. Si prefieres realizar un desarrollo de C# no visual, PowerBuilder 2019 también ofrece un objeto C# ModelStore que todavía tiene menos código C# que Entity Framework.

 

¡Deja de perder tiempo escribiendo y probando SQL!

 

    • Generación Automatica de SQL

PowerBuilder 2019 genera automáticamente SQL, sin importar si usas SQL incrustado, SQL dinámico, DataStore o la nueva ModelStore. Ya no pierdas el tiempo en asegura que el código SQL sea compatible con las bases de datos cruzadas. 

 

  • Pruebas Automáticas de SQL

PowerBuilder 2019 valida automáticamente la sintaxis de todos los SQL generados así como la operación de datos real en su base de datos. Ya no necesitas perder tiempo ejecutando tu aplicación para descubrir problemas básicos de SQL.

 

  • Arquitectura de Modelo de Datos

PowerBuilder 2019 soporta una arquitectura de modelo de datos en la cual la lógica de acceso está particionada en modelos de datos. Ya no es necesario que dediques tiempo a escribir código SQL redundante para vincular tus conjuntos de resultados a modelos de datos. 

 

 

¡Deja de perder tiempo en el ajuste de rendimiento!

 

¿Puedes decir qué código C# funciona bien?

 

 

public IEnumerable GetOrderCustomerInfo(DateTime startDate, DateTime endDate, decimal amount)
{
    var query = from c in _context.Set()
                from p in _context.Set()
                from s in _context.Set()
                where c.PersonId == p.Businessentityid &&
                      s.CustomerId == c.CustomerId &&
                      s.OrderDate >= startDate &&
                      s.OrderDate <= endDate
                group s.SubTotal by new
                {
                    p.Title,
                    p.Firstname,
                    p.Middlename,
                    p.Lastname,
                    c.ModifiedDate,
                    c.CustomerId
                } 
				into g
                let avg = g.Average()
                where avg > amount
                orderby avg
                select new D_Order_Customer
                {
                    Person_Title = g.Key.Title,
                    Person_Firstname = g.Key.Firstname,
                    Person_Middlename = g.Key.Middlename,
                    Person_Lastname = g.Key.Lastname,
                    Customer_Modifieddate = g.Key.ModifiedDate,
                    Customer_Customerid = g.Key.CustomerId,
                    Sumamt = g.Sum(),
                    Avgamt = avg
                };

    return query.ToList();
}



//code of model 
public class D_Order_Customer
{
    [SqlColumn("Title")]
    public String Person_Title { get; set; }

    [SqlColumn("FirstName")]
    public String Person_Firstname { get; set; }

    [SqlColumn("MiddleName")]
    public String Person_Middlename { get; set; }

    [SqlColumn("LastName")]
    public String Person_Lastname { get; set; }

    [SqlColumn("ModifiedDate")]
    public DateTime Customer_Modifieddate { get; set; }
    [Key]
    [Identity]
    [SqlColumn("CustomerID")]
    public Int32 Customer_Customerid { get; set; }

    [SqlColumn("sumamt")]
    public Decimal Sumamt { get; set; }

    [SqlColumn("avgamt")]
    public Decimal Avgamt { get; set; }

}
public IEnumerable GetOrderCustomerInfo(DateTime startDate, DateTime endDate, decimal amount)
{
    var query = from c in _context.Set()
                join p in _context.Set() 
                    on c.CustomerId equals p.Businessentityid
                join s in _context.Set()
                    on c.CustomerId equals s.CustomerId
                where s.OrderDate >= startDate &&
                      s.OrderDate <= endDate
                group s.SubTotal by new
                {
                    p.Title,
                    p.Firstname,
                    p.Middlename,
                    p.Lastname,
                    c.ModifiedDate,
                    c.CustomerId
                } 
				into g
                let avg = g.Average()
                where avg > amount
                orderby avg
                select new D_Order_Customer
                {
                    Person_Title = g.Key.Title,
                    Person_Firstname = g.Key.Firstname,
                    Person_Middlename = g.Key.Middlename,
                    Person_Lastname = g.Key.Lastname,
                    Customer_Modifieddate = g.Key.ModifiedDate,
                    Customer_Customerid = g.Key.CustomerId,
                    Sumamt = g.Sum(),
                    Avgamt = avg
                };

    return query.ToList();
}



//code of model 
public class D_Order_Customer
{
    [SqlColumn("Title")]
    public String Person_Title { get; set; }

    [SqlColumn("FirstName")]
    public String Person_Firstname { get; set; }

    [SqlColumn("MiddleName")]
    public String Person_Middlename { get; set; }

    [SqlColumn("LastName")]
    public String Person_Lastname { get; set; }

    [SqlColumn("ModifiedDate")]
    public DateTime Customer_Modifieddate { get; set; }
    [Key]
    [Identity]
    [SqlColumn("CustomerID")]
    public Int32 Customer_Customerid { get; set; }

    [SqlColumn("sumamt")]
    public Decimal Sumamt { get; set; }

    [SqlColumn("avgamt")]
    public Decimal Avgamt { get; set; }
}
public IEnumerable GetOrderCustomerInfo(DateTime startDate, DateTime endDate, decimal amount)
{
    var query = _context.Set()
                .Join(_context.Set(),
                        c => c.PersonId,
                        p => p.Businessentityid,
                        (c, p) => new
                        {
                            p.Title,
                            p.Firstname,
                            p.Middlename,
                            p.Lastname,
                            c.ModifiedDate,
                            c.CustomerId,
                        })
                .Join(_context.Set(),
                        cp => cp.CustomerId,
                        s => s.CustomerId,
                        (cp, s) => new
                        {
                            cp,
                            s
                        })
                .Where(m => m.s.OrderDate >= startDate && 
							m.s.OrderDate <= endDate)
                .GroupBy(m => m.cp, n => n.s.SubTotal)
                .Where(m => m.Sum() > amount)
                .Select(g => new D_Order_Customer
                {
                    Person_Title = g.Key.Title,
                    Person_Firstname = g.Key.Firstname,
                    Person_Middlename = g.Key.Middlename,
                    Person_Lastname = g.Key.Lastname,
                    Customer_Modifieddate = g.Key.ModifiedDate,
                    Customer_Customerid = g.Key.CustomerId,
                    Sumamt = g.Sum(),
                    Avgamt = g.Average()
                })
                .OrderBy(m => m.Avgamt);

    return query.ToList();
}



//code of model 
public class D_Order_Customer
{
    [SqlColumn("Title")]
    public String Person_Title { get; set; }

    [SqlColumn("FirstName")]
    public String Person_Firstname { get; set; }

    [SqlColumn("MiddleName")]
    public String Person_Middlename { get; set; }

    [SqlColumn("LastName")]
    public String Person_Lastname { get; set; }

    [SqlColumn("ModifiedDate")]
    public DateTime Customer_Modifieddate { get; set; }
    [Key]
    [Identity]
    [SqlColumn("CustomerID")]
    public Int32 Customer_Customerid { get; set; }

    [SqlColumn("sumamt")]
    public Decimal Sumamt { get; set; }

    [SqlColumn("avgamt")]
    public Decimal Avgamt { get; set; }
}
public IDataStore GetOrderCustomerInfo(DateTime startDate, DateTime endDate, decimal amount)
{
    IDataStore dataStore = new DataStore("d_order_customer", _context);
    dataStore.Retrieve(startDate, endDate, amount);
    return dataStore;
}

 

 

La respuesta es C# DataStore, y puedes ver lo sencillo que es el código. ¡El código simple hace que sea difícil escribir código de bajo rendimiento! Por supuesto, es posible optimizar el código C# para el Entity Framework si tienes mucha experiencia y tienes el tiempo. Pero ¿por qué hacer eso?

Revisa las pruebas de rendimiento para conocer cómo optimizar el código de C# para que Entity Framework  funcione tan bien como el DataStore de C#.

¡Deja de crear manualmente data models/objets!

 

 

dw generator1

 

Todos los objetos de datos DataWindow (incluidos DataStore) basados en PowerScript existentes migran automáticamente a DataStore de C# y DataModel. Imagina el ahorro de tiempo de no tener que volver a crear tus DataWindows y no tener que crear todos los modelos de datos (requeridos por Entity Framework).

Si prefiere usar el nuevo objeto C# ModelStore, PowerBuilder 2018 se encarga de crear todos los modelos de datos por ti (incluso los modelos de consulta) ... algo que el Entity Framework lo hace por ti de manera inmediata.

 

  

 

Características

 

Con PowerBuilder 2019 tendrás a tu disposición todas las funcionalidades que cualquier otro desarrollador de C# podría usar para crear objetos de negocio del lado del servidor (porque se ejecuta en .NET). También obtiene las potentes funciones ORM de PowerBuilder, además de algunas otras ventajas (que revelaremos cuando PowerBuilder 2018 esté disponible).

En comparación con los ORM líderes para C#, el desarrollo con PowerBuilder 2019 ofrece algunas características valiosas y el elimina  al 100% la necesidad de codificar manualmente SQL.

 PowerBuilder 2019 C#Entity Framework 6.2Dapper 1.5
   Funcionalidad ORM 
  Tracking Changes

Actualizar solo modelos

(Sólo entidades)

 
   Lambda Expressions  
  SQL Dinámico
  Generación de SQL   
  SQL Validación de Sintaxis Sintaxis solamente  
  SQLValidación de Operaciones     
  Generación de Data Model 

Actualizar solo modelos

(Sólo entidades)

 
  Validación de Data Model   

Portabilidad

PowerBuilder 2019 ha sido diseñado cuidadosamente teniendo en cuenta la portabilidad, de modo que puedas beneficiarte de ...

portabilidad

portabilidad 2

portabilidad 3

portabilidad

portabilidad 2

 

 

 

 

 

 

 

 

 

¿Cómo logra PowerBuilder 2019 esa portabilidad pero también ahorra tanto tiempo?

portabilidad

portabilidad

portabilidad

 

 
 

Showcase

 

c Data

 

 

 

 

 

 

 

 

C# DataStore

El poder del DataStore nativo en una arquitectura pura de C # y n niveles, esencialmente con el mismo conjunto de API.

> Características principales / Ejemplos de código

> Puntos de referencia de rendimiento

 

 

 

c Data

 

 

 

 

 

 

 

 

C# ModelStore

Una alternativa al C# DataStore. Codifica en C# directamente contra modelos de datos y obtén un rendimiento aún más rápido

> Características principales / Ejemplos de código

> Puntos de referencia de rendimiento

 

 

 

c SQL

 

 

 

 

 

 

 

 

SQLExecutor

¡Deja de codificar a mano en SQL! El SQLExecutor genera código SQL para ti que se enlaza a POCO así como a modelos dinámicos.

> Características principales / Ejemplos de código

> Puntos de referencia de rendimiento

 

 

 

 

Demo

 

 

En este video, verás...

 

Desarrollo rápido de C# con el nuevo Data Store de C# y los objetos en la nube;

Utilidades de "portabilidad" de C# para la transformación de bajo riesgo de tu lógica de negocios;

Temas personalizables para la mejora de la interfaz de usuario sin código.