Tipos de datos
Cada variable y cada resultado de actividad tiene un tipo de dato. El tipo determina qué puedes hacer con ese valor: un texto se puede pasar a mayúsculas, un número se puede sumar, una tabla se puede recorrer fila por fila. Conocer el tipo de tus variables es clave para escribir expresiones correctas.
Tipos primitivos
Sección titulada «Tipos primitivos»Son los valores más simples: un texto, un número, un sí/no.
| Tipo | Descripción | Ejemplos |
|---|---|---|
string | Texto | "Hola mundo", "FAC-001" |
number | Número entero o decimal (el separador decimal es el punto) | 42, 3.14, -7 |
boolean | Valor lógico: verdadero o falso | true, false |
DateTime | Fecha y hora | resultado de now(), today() |
Miembros de string
Sección titulada «Miembros de string»Sobre un texto puedes llamar estos métodos (además de las funciones integradas como upper, trim…):
| Miembro | Devuelve | Descripción |
|---|---|---|
.Length | int | Cantidad de caracteres |
.ToUpper() | string | Mayúsculas |
.ToLower() | string | Minúsculas |
.Trim() / .TrimStart() / .TrimEnd() | string | Quita espacios |
.Contains(valor) | bool | ¿Contiene el sub-texto? |
.StartsWith(valor) / .EndsWith(valor) | bool | ¿Empieza / termina con? |
.Replace(viejo, nuevo) | string | Reemplaza ocurrencias |
.Split(separador) | string[] | Divide en partes |
.Substring(inicio) / .Substring(inicio, largo) | string | Extrae una porción |
.IndexOf(valor) | int | Posición de la primera aparición (-1 si no está) |
.PadLeft(ancho, car) / .PadRight(ancho, car) | string | Rellena hasta un ancho |
= nombre.ToUpper()= codigo.Substring(0, 3) // primeros 3 caracteres= correo.Split("@")[1] // dominio del correoMiembros de DateTime
Sección titulada «Miembros de DateTime»| Miembro | Devuelve | Descripción |
|---|---|---|
.Year .Month .Day | int | Componentes de la fecha |
.Hour .Minute .Second .Millisecond | int | Componentes de la hora |
.DayOfWeek | DayOfWeek | Día de la semana |
.DayOfYear | int | Día del año (1–366) |
.Date | DateTime | Solo la fecha (00:00:00) |
.ToString(formato) | string | Da formato. Ej: "yyyy-MM-dd", "dd/MM/yyyy HH:mm" |
.AddDays(n) .AddHours(n) .AddMinutes(n) | DateTime | Suma tiempo (n puede ser negativo) |
.AddMonths(n) .AddYears(n) | DateTime | Suma meses / años |
.Subtract(otraFecha) | TimeSpan | Diferencia entre dos fechas |
= today().AddDays(-7) // hace una semana= now().ToString("yyyy-MM-dd_HH-mm") // útil para nombrar archivos= fechaVencimiento.Subtract(today()).Days // días que faltanTipos de colección
Sección titulada «Tipos de colección»Agrupan varios valores. Los índices empiezan en 0.
List — lista ordenada
Sección titulada «List — lista ordenada»Una secuencia de elementos. Se crea con la actividad List Create, con la función newList(), o como resultado de actividades como split o Page Extract Table.
| Miembro | Devuelve | Descripción |
|---|---|---|
.Count | int | Número de elementos |
.Add(item) | — | Agrega un elemento al final |
.Remove(item) / .RemoveAt(indice) | — | Quita un elemento |
.Clear() | — | Vacía la lista |
.Contains(item) | bool | ¿Está el elemento? |
.IndexOf(item) | int | Posición del elemento |
.First() / .FirstOrDefault() | elemento | Primero (FirstOrDefault devuelve nulo si está vacía) |
.Last() | elemento | Último |
.Any() / .All(cond) | bool | ¿Hay alguno / cumplen todos? |
.Where(cond) | IEnumerable | Filtra (LINQ — terminar con .ToList()) |
.Select(proy) | IEnumerable | Transforma (LINQ — terminar con .ToList()) |
.OrderBy(clave) | IEnumerable | Ordena (LINQ) |
.ToList() / .ToArray() | List / array | Materializa el resultado |
= productos.Count= productos.Where(p => p > 100).ToList()= nombres.Contains("Ana")Dictionary — mapa clave→valor
Sección titulada «Dictionary — mapa clave→valor»Asocia una clave de texto a un valor. Se crea con Dict Create o newDict().
| Miembro | Devuelve | Descripción |
|---|---|---|
.Count | int | Número de claves |
.Keys / .Values | colección | Todas las claves / valores |
.ContainsKey(clave) | bool | ¿Existe la clave? |
.Add(clave, valor) | — | Agrega un par |
.Remove(clave) | bool | Quita una clave |
.GetValueOrDefault(clave) | valor | Valor o nulo si no existe |
= config["timeout"] // acceso por clave= config.ContainsKey("proxy")= config.GetValueOrDefault("idioma")DataTable — tabla de filas y columnas
Sección titulada «DataTable — tabla de filas y columnas»Una tabla con columnas nombradas, como una hoja de Excel. Es el formato común que comparten Excel, CSV, bases de datos y Google Sheets: lo que lees de una fuente lo puedes escribir en otra sin convertir.
| Miembro | Devuelve | Descripción |
|---|---|---|
.Rows | DataRowCollection | Las filas |
.Rows.Count | int | Número de filas |
.Columns | DataColumnCollection | Las columnas |
.Columns.Count | int | Número de columnas |
.AsEnumerable() | IEnumerable<DataRow> | Para usar LINQ sobre las filas |
.Select(filtro) | DataRow[] | Filtra con una expresión SQL (ej. "Total > 1000") |
.NewRow() | DataRow | Crea una fila vacía con la misma estructura |
.Clone() | DataTable | Copia la estructura sin filas |
.Copy() | DataTable | Copia estructura y filas |
Funciones cómodas para tablas: rowCount(dt), colCount(dt), firstRow(dt), asRows(dt), selectRows(dt, cond) (ver Expresiones).
DataRow — una fila de la tabla
Sección titulada «DataRow — una fila de la tabla»Cada elemento de un For Each sobre una DataTable es una DataRow. Accedes a sus celdas por nombre de columna con corchetes:
= fila["Cliente"] // valor crudo (puede ser DBNull)= str(fila["Cliente"]) // texto seguro (recomendado)= num(fila["Total"]) // número seguro| Miembro | Devuelve | Descripción |
|---|---|---|
fila["columna"] | object | Valor de la celda |
.Table | DataTable | Tabla a la que pertenece |
.ItemArray | object[] | Todas las celdas como arreglo |
.IsNull("columna") | bool | ¿La celda está vacía? |
Editar colecciones a mano
Sección titulada «Editar colecciones a mano»Cuando un parámetro acepta una lista, un diccionario o una tabla literal, el panel de Propiedades muestra un botón Editar con un editor visual, para que no tengas que escribir la estructura a mano. Lo mismo para las condiciones de filtrado y los valores de fila.
Todos los editores visuales del Designer están explicados en Editores de parámetros.
Tipos de sesión (recursos abiertos)
Sección titulada «Tipos de sesión (recursos abiertos)»Algunas actividades abren un recurso (un navegador, un libro de Excel, una conexión a base de datos) y devuelven una sesión que representa ese recurso abierto. Pasas esa sesión a las demás actividades del mismo paquete, y al final la cierras. Es el mismo patrón en toda la plataforma: abrir → usar → cerrar.
| Tipo | Lo abre | Lo cierra | Para qué |
|---|---|---|---|
ZoanBrowserSession | Open Browser / Browser Attach | Browser Close | Navegador web (Chrome/Edge) |
ZoanPageSession | Browser Open / Browser New Page | Page Close | Una pestaña/página concreta del navegador |
ZoanExcelSession | Excel Open / Excel Create | Excel Close | Libro de Excel |
ZoanWordSession | Word Open / Word Create | Word Close | Documento de Word |
ZoanDbSession | DB Connect | DB Close | Conexión a base de datos |
ZoanSftpSession | SFTP Connect | SFTP Close | Servidor SFTP |
ZoanGoogleSheetsSession | GoogleSheets Open | GoogleSheets Close | Hoja de cálculo de Google |
ZoanOutlookSession | (actividades de Outlook) | — | Sesión de Outlook |
ZoanDesktopSession | Open App / Win Attach | Win Close | Aplicación de escritorio Windows |
// Patrón típico: la salida de "abrir" alimenta a las siguientes actividades// Open Browser → output: page// Page Navigate → page: = page// Page Get Text → page: = page → output: titulo// Browser Close → browser: = pageTipos de resultado de actividades
Sección titulada «Tipos de resultado de actividades»Otras actividades devuelven un objeto con datos estructurados que sí lees por sus propiedades.
ZoanHttpResponse — respuesta HTTP
Sección titulada «ZoanHttpResponse — respuesta HTTP»Resultado de las actividades HTTP (GET, POST, PUT, PATCH, DELETE).
| Propiedad | Tipo | Descripción |
|---|---|---|
.StatusCode | number | Código HTTP (200, 404, 500…) |
.Ok | boolean | true si el código es 2xx |
.Body | object | Cuerpo de la respuesta. Si es JSON, se deserializa automáticamente |
.Headers | Dictionary | Cabeceras de la respuesta |
= respuesta.Ok= respuesta.StatusCode == 200= respuesta.Body["token"] // si el body es JSON= respuesta.Headers["Content-Type"]ZoanMail — correo
Sección titulada «ZoanMail — correo»Resultado de actividades de lectura de correo (Outlook, IMAP, POP3).
| Propiedad | Tipo | Descripción |
|---|---|---|
.Id | string | Identificador único (úsalo en mover/eliminar/adjuntos) |
.Subject | string | Asunto |
.From | string | Remitente |
.To / .Cc / .Bcc | string[] | Destinatarios |
.Body | string | Cuerpo (texto plano o HTML según IsHtml) |
.IsHtml | boolean | ¿El cuerpo es HTML? |
.SentAt | DateTime | Fecha de envío/recepción |
.IsRead | boolean | ¿Está leído? |
.Attachments | ZoanAttachment[] | Adjuntos (si se pidió incluirlos) |
= correo.Subject= correo.From= count(correo.Attachments) > 0ZoanAttachment — adjunto
Sección titulada «ZoanAttachment — adjunto»| Propiedad | Tipo | Descripción |
|---|---|---|
.Name | string | Nombre del archivo |
.ContentType | string | Tipo MIME (ej. application/pdf) |
.Content | byte[] | Contenido binario |
ZoanQueueItem — elemento de cola
Sección titulada «ZoanQueueItem — elemento de cola»Resultado de consumir una cola de Nexus (paquete Queue).
| Propiedad | Tipo | Descripción |
|---|---|---|
.Id | string | Identificador del ítem |
.QueueId | string | Cola a la que pertenece |
.Reference | string? | Referencia de negocio (ej. número de factura) |
.Priority | string | low / normal / high |
.Status | string | new / inProgress / success / failed… |
.SpecificContent | Dictionary | Datos del ítem (los campos que pusiste al encolarlo) |
.Output | Dictionary? | Resultado, una vez procesado |
.Attempts | int | Número de intentos |
.CreatedAt | string | Fecha de creación |
= item.Reference= item.SpecificContent["nit"]ZoanError — error capturado
Sección titulada «ZoanError — error capturado»Es el objeto que recibe la variable errorVariable de Try / Catch cuando algo en el try falla.
| Propiedad | Tipo | Descripción |
|---|---|---|
.Message | string | Mensaje del error |
.Type | string | Tipo de excepción (p. ej. "HttpRequestException", "TimeoutException"); úsalo para distinguir errores |
.Source | string | Origen de la excepción |
.StackTrace | string | Traza de la pila |
= error.Message= error.Type == "TimeoutException" // ramificar según el tipo de errorTratarlo como texto usa el mensaje (= "Error: " + error), así que leerlo como string sigue funcionando.
Conversión entre tipos
Sección titulada «Conversión entre tipos»Cuando un valor llega como texto pero necesitas un número (o al revés), conviértelo explícitamente:
= toNumber(fila["Total"]) // texto → número= toInt(cantidadTexto) // texto → entero= toString(contador) // número → texto= parseDouble(replace(monto, ",", ".")) // "1.234,56" con coma decimal → númeroConsulta la lista completa en Expresiones › Conversión de tipos.
Siguientes pasos
Sección titulada «Siguientes pasos»- Variables — declarar variables con un tipo.
- Expresiones — operar sobre estos tipos.
- Catálogo de actividades — qué tipo devuelve cada actividad.