Saltar al contenido principal
Versión: 20 R7 BETA

Collection

Las colecciones son listas ordenadas de valores de tipos similares o diferentes (texto, número, fecha, objeto, booleano, colección o null).

Las variables de tipo Collection se administran utilizando notación de objetos.

Para acceder a un elemento de la colección, hay que pasar el número del elemento entre corchetes:

collectionRef[expression]

Puede pasar toda expresión 4D válida que devuelva un entero positivo en expression. Ejemplos:

 myCollection[5]  //acceso al 6º elemento de la colección
myCollection[$var]

Atención: los elementos de la colección se numeran a partir de 0.

Puede asignar un valor a un elemento de la colección u obtener el valor de un elemento de colección:

 myCol[10]:="My new element"
$myVar:=myCol[0]

Si se asigna un índice de elemento que sobrepasa el último elemento existente de la colección, la colección se redimensiona automáticamente y a todos los nuevos elementos intermedios se les asigna un valor nulo:

 var myCol : Collection
myCol:=New collection("A";"B")
myCol[5]:="Z"
//myCol[2]=null
//myCol[3]=null
//myCol[4]=null

Instanciación

Las colecciones deben haber sido instanciadas, de lo contrario intentar leer o modificar sus elementos generará un error de sintaxis.

La instanciación de la colección puede realizarse de una de las siguientes maneras:

info

Varios comandos y funciones 4D devuelven colecciones, por ejemplo Monitored activity o collection.copy. En este caso, no es necesario instanciar explícitamente la colección, el lenguaje 4D lo hace por usted.

Comando New collection

El comando New collection crea una nueva colección vacía o prellenada y devuelve su referencia.

Ejemplos:

 var $colVar : Collection //declaración de una colección de tipo 4D variable
$colVar:=New collection //instanciación de la colección y asignación a la variable 4D

var $colFilled : Collection
$colFilled:=New collection("a";"b";1;42;{}) //instanciación y asignación de una colección pre-rellenada

operador []

El operador [] permite crear un literal de colección. Un literal de colección es una lista de cero o más expresiones, cada una de las cuales representa un elemento de la colección, encerradas entre corchetes ([]). Cuando se crea una colección utilizando un literal de colección, se instancia con los valores especificados como sus elementos, y su longitud se establece en el número de argumentos especificados.

Dado que cualquier elemento se considera una expresión, puede crear subcolecciones utilizando [] en los elementos. También puede crear y referenciar literales objeto.

Si un elemento no está definido, aparecerá como Null en la colección.

Ejemplos:

var $col1; $col2; $users : Collection
$col1:=[] //colección vacía
$col2:=[1;2;3;4;5;6] //colección de números
//colección de objetos
$users:=[{name: "Alice"; \
height: 183; \
eyecolor: "hazel"; \
id: $col2[5]\
}; \
{name: "Bob"; \
height: 172; \
eyecolor: "blue"\
}]
nota

Si crea un literal de colección que contenga un único elemento, asegúrese de no utilizar un nombre que corresponda a un nombre de tabla existente; de lo contrario, la sintaxis de la tabla [tableName] tendrá prioridad.

Colección estándar o compartida

Puede crear dos tipos de colecciones:

  • las colecciones estándar (no compartidas), utilizando el comando New collection o la sintaxis literal de la colección ([]). Estas colecciones pueden ser editadas sin ningún control de acceso específico, pero no pueden ser compartidas entre procesos.
  • las colecciones compartidas, utilizando el comando New shared collection. Estas colecciones pueden ser compartidas entre procesos, incluidos los hilos apropiativos. El acceso a estas colecciones se controla mediante estructuras Use...End use.

Para más información, consulte la sección Objetos y colecciones compartidos.

Funciones de colección

Las referencias a colecciones 4D se benefician de funciones de clase específicas (a veces llamados funciones miembro). Las funciones de colección están listadas en la sección Referencia de la API de Clase.

Por ejemplo:

$newCol:=$col.copy() //copia de $col a $newCol
$col.push(10;100) //añade de 10 y 100 a la colección

Ciertas funciones devuelven la colección original después de la modificación, para que pueda ejecutar las llamadas en una secuencia:

 $col:=New collection(5;20)
$col2:=$col.push(10;100).sort() //$col2=[5,10,20,100]

parámetro rutaPropiedad

Varias funciones aceptan un propertyPath como parámetro. Este parámetro significa:

  • o bien un nombre de propiedad del objeto, por ejemplo "apellido"
  • o una ruta de propiedades del objeto, es decir, una secuencia jerárquica de subpropiedades vinculadas con caracteres de punto, por ejemplo "empleado.hijos.nombre".

Atención: Cuando utilice funciones y parámetros propertyPath, no puede utilizar ".", "[ ]", o espacios en los nombres de las propiedades ya que impedirá que 4D analice correctamente la ruta:

 $vmin:=$col.min("My.special.property") //undefined
$vmin:=$col.min(["My.special.property"]) //error

Operadores en las colecciones

Puede utilizar operadores de comparación con referencias de colección, lo que significa que puede evaluar si dos o más referencias apuntan a la misma instancia de una colección.

var $c1:=["a";42] //referencia a una instancia
var $c2:=["a";42] //referencia a otra instancia
var $c3:=$c1 //referencia a la misma instancia

Basándonos en el código anterior, la tabla comparativa es:

OperaciónSintaxisDevuelveExpressionValor
IgualcollectionRef = collectionRefBoolean$c1 = $c3True
$c1 = $c2False
DesigualdadcollectionRef # collectionRefBoolean$c1 # $c3False
$c1 # $c2True

Indefinido

La lectura de la propiedad length de una colección indefinida produce 0:

     var $c : Collection //variable creada pero sin colección definida
$size:=$c.length //$size = 0