progress-4gl
Variables
Buscar..
Introducción
El progreso ABL se escribe estáticamente. Las variables deben declararse y el tipo de datos no se puede cambiar durante el tiempo de ejecución.
Sintaxis
DEFINIR VARIABLE i AS INT64 INICIAL -200 NO-UNDO. // Un entero de 64 bits inicializado a -200
DEFINE VARIABLE l COMO LÓGICO NO-UNDO. // Una variable lógica llamada l
DEFINIR VARIABLE c COMO SENSIBLE AL SISTEMA DE CARACTER SIN CARACTER. // Una variable que distingue entre mayúsculas y minúsculas ('a' <> 'A').
DEFINICIÓN DE VARIABLE COMO LA FECHA INTERNACIONAL HOY NO-UNDO. // Una variable de fecha establecida en la fecha de hoy.
DEFINIR LA VARIABLE a COMO EXTENSIÓN DE CARÁCTER 5 NO-UNDO. // Una matriz de caracteres con longitud = 5
DEFINIR VARIABLE j COMO INTEGER EXTENTE NO-UNDO. // Una extensión sin una longitud determinada
DEFINIR VARIABLE b COMO ETIQUETA DE FECHA "Hora de salida". // Una variable con una etiqueta
Declaraciones variables básicas
/*
These variables are declared with `NO-UNDO`.
That states that no undo handling is wanted for this specific variable
in case of a transactional roll-back.
This should always be the default unless transactional control over
this variable is a requirement.
*/
/* Strings. A character longer than 32K should be a longchar */
DEFINE VARIABLE c AS CHARACTER NO-UNDO.
DEFINE VARIABLE cl AS LONGCHAR NO-UNDO.
/* Integers and decimals. INTEGER = 32 bit. INT64 = 64 bits */
DEFINE VARIABLE i AS INTEGER NO-UNDO.
DEFINE VARIABLE j AS INT64 NO-UNDO.
DEFINE VARIABLE k AS DECIMAL NO-UNDO.
/* Date and datetimez. Unset variables have the unknown value ? */
DEFINE VARIABLE d AS DATE NO-UNDO.
DEFINE VARIABLE dt AS DATETIME NO-UNDO.
DEFINE VARIABLE dtz AS DATETIME-TZ NO-UNDO.
/* LOGICAL = Boolean data. True or false (or ?) */
DEFINE VARIABLE l AS LOGICAL NO-UNDO.
/* Rowids and recids are internal identifiers to database records */
DEFINE VARIABLE rid AS ROWID NO-UNDO.
DEFINE VARIABLE rec AS RECID NO-UNDO.
/* A handle is a handle to anything: a session, an on screen widget etc */
/* A Com-handle is used for ActiveX Com-automation */
DEFINE VARIABLE h AS HANDLE NO-UNDO.
DEFINE VARIABLE hc AS COM-HANDLE NO-UNDO.
/* A raw variable can contain any data. Binary, strings etc */
DEFINE VARIABLE rw AS RAW NO-UNDO.
/* A mempointer contains a sequence of bytes in memory. */
DEFINE VARIABLE m AS MEMPTR NO-UNDO.
Arrays - definición y acceso
El progreso admite matrices unidimensionales, pero se llaman EXTENTS
.
/* Define a character array with the length 5, and display it's length */
DEFINE VARIABLE a AS CHARACTER EXTENT 5 NO-UNDO.
DISPLAY EXTENT(a).
Posiciones individuales i se accede a la matriz utilizando corchetes de estilo c "estándar". Pero el índice comienza en 1. El tamaño máximo es 28000.
a[1] = "A".
a[2] = "B".
a[3] = "C".
a[4] = "D".
a[5] = "E".
DISPLAY a[5].
Resultado:
El índice 0 generará un error:
DISPLAY a[0].
Resultado:
También puede definir una matriz indeterminada sin una longitud establecida. La longitud (extensión) se puede establecer en tiempo de ejecución. ¡Pero sólo una vez!
DEFINE VARIABLE a AS CHARACTER EXTENT NO-UNDO.
EXTENT(a) = 10.
EXTENT(a) = 1.
La tercera línea procurará el siguiente error:
Puede usar la opción INITIAL
en la sentencia DEFINE VARIABLE
para establecer los valores iniciales.
DEFINE VARIABLE a AS CHARACTER EXTENT 3 INITIAL ["one","two","three"] NO-UNDO.
/* Some statements (like DISPLAY) can handle a whole array: */
DISPLAY a.
Resultado:
Si no establece todas las extensiones, el resto obtendrá el último valor establecido:
DEFINE VARIABLE a AS CHARACTER EXTENT 10 INITIAL ["one","two","three"] NO-UNDO.
DISPLAY a.
Resultado:
Usando la palabra clave LIKE
Usando LIKE
puede basar la definición de su variable en otra variable o un campo en una base de datos o tabla temporal.
La definición de una variable LIKE
un campo de base de datos requiers la base de datos para estar siempre conectada. Esto podría no ser siempre lo que quieres.
DEFINE VARIABLE i AS INTEGER NO-UNDO LABEL "Nr" FORMAT "99999".
/* Define a variable with the same properties as "i" */
DEFINE VARIABLE j LIKE i.
/* Define a variable based on Customer.Custnum from the sports2000 database but
override the label-definition */
DEFINE VARIABLE k LIKE Customer.Custnum LABEL "Client".