Skip to content

Instantly share code, notes, and snippets.

@HiroNakamura
Last active March 18, 2024 17:23
Show Gist options
  • Save HiroNakamura/f74a66463321b92c7c584c242fa7639f to your computer and use it in GitHub Desktop.
Save HiroNakamura/f74a66463321b92c7c584c242fa7639f to your computer and use it in GitHub Desktop.
Progress- Language Programming

Progress

Progress- Language Programming

Progress ABL es un lenguaje de programación vinculado al entorno Progress OpenEdge, su base de datos y las utilidades que lo rodean. Es similar al inglés fuertemente tipado, enlazado en tiempo de ejecución.

Aunque inicialmente se diseñó como un lenguaje procedimental, a partir de la versión 10.1 se mejoró con elementos de gramática orientada a objetos, que se pueden mezclar con el estilo procedimental original.

A diferencia de otros lenguajes, Advanced Business Language (ABL) permite a los desarrolladores administrar datos relacionales de la manera que mejor se adapte a sus necesidades comerciales, lo que aumenta significativamente la productividad.

Un desarrollador de OpenEdge puede crear API para .NET, JavaScript, clientes Java, mensajería Java e incluso asignar esquemas de bases de datos a formatos XML, al mismo tiempo que aprovecha la eficiencia de ABL.

ABL también ofrece herramientas esenciales para el desarrollo de aplicaciones, lo que le permite tener fácil acceso a todos los recursos de su aplicación:

  Editor de procedimientos
  Compilador de aplicaciones
  Depurador
  Diccionario de datos
  Gestión de datos
  Servidor de desarrollo OpenEdge

Beneficios clave

  Expresar y comprender rápidamente reglas de negocio enriquecidas
  Las declaraciones sobrealimentadas hacen el trabajo de cientos de líneas de código en lenguajes como Visual Basic o Java.
  Acceda, manipule y almacene fácilmente datos de varias fuentes y formatos de datos
  Soporta plataformas Windows, UNIX y Linux

Ejemplo

for each customer
  display customer.name.
end.

/* Ejemplo de iteración de una tabla de base de datos en Progress OpenEdge ABL */

FOR EACH Clientes:
    DISPLAY Clientes.Nombre Clientes.Edad.
END.

/* Resultado en pantalla:
   Juan 25
   María 30
   Carlos 28
   ...
*/

/* Ejemplo de sentencia IF-ELSE en Progress OpenEdge ABL */

DEF VAR edad AS INTEGER.
edad = 18.

IF edad >= 18 THEN
    DISPLAY "Es mayor de edad.".
ELSE
    DISPLAY "Es menor de edad.".
ENDIF.

/* Resultado en pantalla:
   Es mayor de edad.
*/

Tipos de datos

Progress OpenEdge ABL (Advanced Business Language) admite varios tipos de datos, incluyendo:

Caracteres (CHAR): Utilizados para almacenar cadenas de caracteres.

Números enteros (INTEGER): Utilizados para almacenar valores numéricos enteros.

Decimales (DECIMAL): Utilizados para almacenar valores numéricos con decimales de precisión fija.

Lógicos (LOGICAL): Utilizados para representar valores lógicos como "VERDADERO" o "FALSO".

Fechas (DATE): Utilizadas para almacenar valores de fecha.

Fechas y horas (DATETIME): Utilizadas para almacenar valores de fecha y hora.

Números de punto flotante (FLOAT): Utilizados para almacenar valores numéricos de punto flotante.

Cadenas de caracteres largas (LONGCHAR): Utilizadas para almacenar cadenas de caracteres más largas que las que se pueden almacenar en el tipo CHAR.

Objetos (OBJECT): Utilizados para representar objetos en una base de datos orientada a objetos.

Tablas (TABLE): Utilizadas para almacenar conjuntos de registros y campos relacionados.

Manejadores de eventos (HANDLE): Utilizados para manipular eventos y objetos dinámicamente.

Declaraciones de variables

/*Declaración de variables*/
DEF VAR nombre AS CHAR.
DEF VAR edad AS INTEGER.
DEF VAR salario AS DECIMAL.
DEF VAR esMayorEdad AS LOGICAL.
DEF VAR fechaNacimiento AS DATE.
DEF VAR fechaHora AS DATETIME.
DEF VAR descripcion AS LONGCHAR.
DEFINE TEMP-TABLE ttClientes
    FIELD nombre AS CHAR
    FIELD edad AS INTEGER.
CREATE ttClientes.


/*Asignación de valor*/
nombre = "Juan".
edad = 25.
salario = 1500.50.
esMayorEdad = TRUE.
fechaNacimiento = DATE("1990-05-15").
fechaHora = DATETIME("2023-02-05 14:30:00").
descripcion = "Este es un texto largo...".


/*Mostramos en pantalla*/
DISPLAY "Nombre: "nombre.
DISPLAY "Edad: "edad.

DEFINE TEMP-TABLE ttClientes
    FIELD nombre AS CHAR
    FIELD edad AS INTEGER.
CREATE ttClientes.
FOR EACH ttClientes:
    DISPLAY ttClientes.nombre ttClientes.edad.
END.

Enlaces

DEFINE VARIABLE PI AS DECIMAL NO-UNDO INITIAL 3.14159.
DEFINE VARIABLE RADIO AS DECIMAL NO-UNDO.
DEFINE VARIABLE AREA AS DECIMAL NO-UNDO INIT 0.0.
DISPLAY "PI: "PI.
ASSIGN
RADIO = 23.43
AREA = PI * RADIO * RADIO.
DISPLAY "RADIO: "RADIO.
/* Mostramos el cálculo del área del círculo */
DISPLAY "AREA: "AREA.
def var sueldo as decimal no-undo.
define variable porcentaje as dec no-undo.
porcentaje = 0.15 /* 15% */
sueldo = 20000.0.
{&OUT} "Sueldo inicial: " sueldo "<BR>".
if sueldo <= 25000.0 then
sueldo = sueldo + (sueldo * porcentaje).
{&OUT} "Sueldo fnal: " sueldo "<BR>".
DEFINE OUTPUT PARAMETER xout-param AS DECIMAL NO-UNDO.
DEFINE INPUT PARAMETER newin AS INTEGER NO-UNDO.
DEFINE OUTPUT PARAMETER xnew-param AS CHARACTER NO-UNDO.
DEFINE INPUT PARAMETER xin-param AS INTEGER NO-UNDO.
FOR EACH Customer NO-LOCK:
xout-param = xout-param + Customer.Balance.
END.
DISPLAY xout-param LABEL "Balance" WITH SIDE-LABELS.
ASSIGN
xout-param = xout-param + newin + xin-param
xnew-param = "Example Complete".
/* Ejemplo de bucle WHILE en Progress OpenEdge ABL */
DEF VAR contador AS INTEGER.
contador = 1.
/* Itera mientras el contador sea menor o igual a 5 */
DO WHILE contador <= 5:
DISPLAY "Contador: " contador.
contador = contador + 1.
END.
/* Resultado en pantalla:
Contador: 1
Contador: 2
Contador: 3
Contador: 4
Contador: 5
*/
/* Ejemplo de bucle FOR en Progress OpenEdge ABL */
DEF VAR i AS INTEGER.
/* Itera desde 1 hasta 5 */
DO i = 1 TO 5:
DISPLAY "Iteración #" i.
END.
/* Resultado en pantalla:
Iteración #1
Iteración #2
Iteración #3
Iteración #4
Iteración #5
*/
def var celsius as dec no-undo initial 33.9.
/* Función para realizar la conversión de Celsius a Fahrenheit */
function getFahrenheit dec(valor as dec):
return (9.0 / 5.0) * valor + 32.0.
end.
/* Función para realizar la conversión de Fahrenheit a Celsius */
/*
function getCelsius dec(valor as dec):
return (valor - 32.0) / (1.8).
end function.
*/
FUNCTION getCelsius RETURNS DECIMAL (
INPUT valor AS DECIMAL
):
DEFINE VARIABLE celsius AS DECIMAL.
ASSIGN
celsius = (valor - 32.0) * (5.0 / 9.0).
RETURN celsius.
END FUNCTION.
display "Celsius: " celsius " , Fahrenheit: " getFahrenheit(celsius).
display "Celsius: " getCelsius(getFahrenheit(celsius)).
for each customer
display customer.name.
end.
DEF VAR edad AS INTEGER NO-UNDO.
edad = 18.
DISPLAY "Edad="edad.
function factorial returns integer (num as integer):
if num = 0 then
return 1.
else
return num * factorial(num - 1).
end.
{&OUT} "Factorial (5): " factorial(5) "<BR>".
DEFINE BUTTON btnFind LABEL "Find Customer".
DO WITH FRAME frCustomer WITH SIDE-LABELS:
ENABLE Customer.CustNum btnFind.
ON CHOOSE OF btnFind DO:
RUN getCustomer (Customer.CustNum:HANDLE, BUFFER Customer).
IF NOT ERROR-STATUS:ERROR THEN
DISPLAY Customer EXCEPT Customer.Comments WITH SIDE-LABELS.
END.
ON ENTRY OF Customer.CustNum
HIDE MESSAGE.
END.
WAIT-FOR WINDOW-CLOSE OF CURRENT-WINDOW.
PROCEDURE getCustomer:
DEFINE INPUT PARAMETER hWidget AS HANDLE NO-UNDO.
DEFINE PARAMETER BUFFER bufCustomer FOR Customer.
FIND bufCustomer WHERE bufCustomer.CustNum =
INTEGER(hWidget:SCREEN-VALUE) NO-LOCK NO-ERROR.
IF NOT AVAILABLE bufCustomer THEN DO:
MESSAGE "Customer record not found." VIEW-AS ALERT-BOX.
RETURN ERROR.
END.
END.
find first cliente where cliente.cuenta=296545 no-lock no-error.
display cliente.nombre cliente.cuenta cliente.monto.
DEFINE VARIABLE i AS INTEGER NO-UNDO.
DEFINE VARIABLE cOut AS CHARACTER NO-UNDO.
DO i = 1 TO 100:
/* Dividable by 3: fizz */
IF i MODULO 3 = 0 THEN
cOut = "Fizz".
/* Dividable by 5: buzz */
ELSE IF i MODULO 5 = 0 THEN
cOut = "Buzz".
/* Otherwise just the number */
ELSE
cOut = STRING(i).
/* Display the output */
DISPLAY cOut WITH FRAME x1 20 DOWN.
/* Move the display position in the frame down 1 */
DOWN WITH FRAME x1.
END.
{&OUT} "<B>Hola, mundo</B>".
/*Otra forma*/
DISPLAY "Hola, mundo".
/* Crear una función que retorne "Hola, mundo" en Progress OpenEdge ABL */
FUNCTION GetSaludoHolaMundo RETURNS CHARACTER:
RETURN "Hola, mundo".
END FUNCTION.
/* Llamar a la función y mostrar el resultado en pantalla */
DISPLAY GetSaludoHolaMundo().
FUNCTION calcularFactorial RETURNS DECIMAL (
INPUT numero AS DECIMAL
):
DEFINE VARIABLE resultado AS DECIMAL INIT 1.
DEFINE VARIABLE contador AS DECIMAL.
DO contador = 1 TO numero:
resultado = resultado * contador.
END.
RETURN resultado.
END FUNCTION.
/*
FUNCTION calcularFactorial RETURNS DECIMAL (
INPUT numero AS DECIMAL
):
IF numero = 0 THEN
RETURN 1.
ELSE
RETURN numero * calcularFactorial(numero - 1).
END FUNCTION.
DISPLAY calcularFactorial(5).
*/
DISPLAY calcularFactorial(5).
DEFINE VARIABLE result AS INTEGER NO-UNDO.
MESSAGE " It's a whole new world!"
VIEW-AS ALERT-BOX MESSAGE BUTTONS OK TITLE "ABL Message".
RUN MessageBoxA (0, " It's a whole new world, again!!",
"ABL DLL access", 0, OUTPUT result).
PROCEDURE MessageBoxA EXTERNAL "user32.dll":
DEFINE INPUT PARAMETER hwnd AS LONG.
DEFINE INPUT PARAMETER mbtext AS CHARACTER.
DEFINE INPUT PARAMETER mbtitle AS CHARACTER.
DEFINE INPUT PARAMETER style AS LONG.
DEFINE RETURN PARAMETER result AS LONG.
END.
def var a as dec no-undo.
def var b as dec no-undo.
FUNCTION suma decimal(input x2 as dec, input y2 as decimal):
DEFINE VAR resultado as dec no-undo.
ASSIGN
resultado = x2 + y2.
RETURN resultado.
END FUNCTION.
FUNCTION resta decimal(input x2 as dec, input y2 as decimal):
DEFINE VAR resultado as dec no-undo.
ASSIGN
resultado = x2 - y2.
RETURN resultado.
END FUNCTION.
FUNCTION producto decimal(input x2 as dec, input y2 as decimal):
DEFINE VAR resultado as dec no-undo.
ASSIGN
resultado = x2 * y2.
RETURN resultado.
END FUNCTION.
FUNCTION division decimal(input x2 as dec, input y2 as decimal):
DEFINE VAR resultado as dec no-undo.
IF y2=0 OR y2<=0 THEN
ASSIGN
resultado = x2.
ELSE
ASSIGN
resultado = x2 / y2.
RETURN resultado.
END FUNCTION.
ASSIGN
a = 5.6
b = 4.
DISPLAY "a: " a " , b: " b.
DISPLAY "Suma: " suma(a,b).
DISPLAY "Resta: " resta(a,b).
DISPLAY "Producto: " producto(a,b).
DISPLAY "Division: " division(a,b).
DEFINE INPUT-OUTPUT PARAMETER io-param AS INTEGER NO-UNDO.
DEFINE VARIABLE inp-qty AS INTEGER NO-UNDO.
PROMPT-FOR inp-qty LABEL "Quantity Received?".
ASSIGN inp-qty.
io-param = io-param + inp-qty.
DEFINE VARIABLE io-param AS INTEGER NO-UNDO.
FOR EACH Item:
DISPLAY Item.ItemName Item.OnHand WITH 1 DOWN.
io-param = Item.OnHand.
RUN r-param2.p (INPUT-OUTPUT io-param).
Item.OnHand = io-param.
DISPLAY io-param LABEL "New Quantity On-hand".
END.
function roundUp returns decimal(x as dec, p as integer):
if truncate(x,p) = x then
return x.
else
return truncate(x,p) + exp(0.1, p).
end.
{&OUT} "Retorna: " roundUp(5,3) "<BR>".
{&OUT} "Retorna: " roundUp(0.766,4) "<BR>".
/* Crear un procedimiento que imprima "Hola, mundo" en Progress OpenEdge ABL */
PROCEDURE SaludoHolaMundo:
MESSAGE "Hola, mundo" VIEW-AS ALERT-BOX.
END PROCEDURE.
/* Llamar al procedimiento para mostrar el mensaje */
RUN SaludoHolaMundo.
/* Ejemplo de sentencia CASE (Switch) en Progress OpenEdge ABL */
DEF VAR diaSemana AS CHARACTER.
diaSemana = "Lunes".
CASE diaSemana:
WHEN "Lunes" THEN
DISPLAY "Es el primer día de la semana.".
WHEN "Martes" THEN
DISPLAY "Es el segundo día de la semana.".
WHEN "Miércoles" THEN
DISPLAY "Es el tercer día de la semana.".
ELSE
DISPLAY "Es otro día de la semana.".
END CASE.
/* Resultado en pantalla:
Es el primer día de la semana.
*/
DEFINE VARIABLE new-param AS CHARACTER NO-UNDO FORMAT "x(20)".
DEFINE VARIABLE out-param AS DECIMAL NO-UNDO.
DEFINE VARIABLE in-param AS INTEGER NO-UNDO INITIAL 20.
RUN r-param1.p (OUTPUT out-param, 10, OUTPUT new-param, in-param).
DISPLAY out-param LABEL "Updated YTD Sales" SKIP new-param LABEL "Status"
WITH SIDE-LABELS.
/* Ejemplo de iteración de una tabla en Progress OpenEdge ABL */
DEFINE TEMP-TABLE ttClientes
FIELD nombre AS CHARACTER
FIELD edad AS INTEGER.
CREATE ttClientes.
ASSIGN ttClientes.nombre = "Juan"
ttClientes.edad = 25.
ASSIGN ttClientes.nombre = "María"
ttClientes.edad = 30.
ASSIGN ttClientes.nombre = "Carlos"
ttClientes.edad = 28.
FOR EACH ttClientes:
DISPLAY ttClientes.nombre ttClientes.edad.
END.
/* Resultado en pantalla:
Juan 25
María 30
Carlos 28
*/
DEF VAR edad AS INTEGER NO-UNDO.
DEF VAR salida AS CHAR NO-UNDO.
edad=18.
{&OUT} "Edad:"edad.
IF edad>=18 THEN
salida="Puede votar".
ELSE
salida="No puede votar".
{&OUT} "<BR>".
{&OUT} salida.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment