PowerBuilder 2018 Vista Previa - Desarrollo en C#

 

 

 


   

 

 

 

VISTA PREVIA

 

PowerBuilder 2018 tiene previsto proporcionar nuevos objetos de C# que permitan a los desarrolladores crear rápidamente, de forma controlada para pruebas, objetos comerciales del lado del servidor (por ejemplo, API web RESTful).

 

Así obtienes 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, diseñados teniendo en cuenta la interoperabilidad, la seguridad y el rendimiento. Como tal, el desarrollo se realiza utilizando el lenguaje C# y se basa en estándares abiertos, como el .NET Core de fuente abierta y el estándar OAuth.

 

Experimentarás  mayor portabilidad y rendimiento 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 2018 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 2018 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 2018 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 2018 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 2018 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?

Prueba 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 no hace por ti de manera inmediata.

 

 

 

 

Funcionalidades 

 

Con PowerBuilder 2018 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 2018 ofrece algunas características valiosas y el elimina  al 100% la necesidad de codificar manualmente SQL.

 PowerBuilder 2018 C#Entity Framework 6.2Dapper 1.5
   Funcionalidad ORM 
  Tracking Changes  
   Lambda Expressions  
  SQL Dinámico
  Generación de SQL   
  SQL Validación de Sintaxis  
  SQLValidación de Operaciones     
  Generación de Data Model  Solo Entidades  
  Validación de Data Model