Dinaup - Base de Conocimientos Help

Primeros pasos: DinaCode

Introducción

¿Qué es DinaCode?

DinaCode es el lenguaje de scripting propio de la plataforma Dinaup, diseñado para permitir a los desarrolladores crear soluciones personalizadas, automatizar procesos y manipular datos de manera eficiente dentro del ecosistema Dinaup.

Características Clave

  • Sencillez y Flexibilidad: Sintaxis intuitiva y fácil de aprender.

  • Integración Profunda: Acceso a las funcionalidades y datos internos de Dinaup.

  • Funciones Poderosas: Amplia gama de funciones integradas para diversas tareas.

  • Estructuras de Datos Avanzadas: Soporte para tablas de dat~~~~os y diccionarios.

Casos de Uso

  • Automatización de tareas rutinarias.

  • Generación de informes y documentos dinámicos.

  • Integración con APIs y servicios externos.

  • Personalización de la lógica de negocio.

  • Plantillas de impresión

  • Generación de documentos estructurados para leer desde API

Contextos de Uso

DinaCode se puede utilizar en diferentes contextos dentro de Dinaup:

  • Algoritmos: Para crear lógica personalizada en procesos internos.

  • Scripts de Formularios: Manipulación y validación de datos de entrada.

  • Documentos Dinámicos: Generación de documentos personalizados en diversos formatos, Plantillas de impresion, documentos API, HTML,CSV,PDF,JSON,XML...

Primeros Pasos

Sintaxis Básica

DinaCode utiliza una sintaxis simple y legible. Las líneas de código se escriben de forma secuencial y se pueden utilizar estructuras de control como if y for.

Para que DinaCode se ejecute dentro de un documento dinámico, el código debe estar encerrado entre <!--: y :-->. Además, puede mezclarse con HTML u otros contenidos.

Ejemplos:

<!--: F.Write("Hola mundo") :-->
<b><!--: F.Write("Hola mundo") :--></b>

Declaración de Variables

Las variables en DinaCode se declaran especificando el tipo de dato (txt o num) seguido del nombre de la variable. Para utilizarlas posteriormente, se debe usar el espacio de nombres v..

txt mensaje = 'Hola, mundo!' num contador = 1

Uso de variables:

<!--: F.Write(v.mensaje) :-->

Estructuras de Control

Condicionales

if v.contador >= 10 // Código si la condición es verdadera else // Código si la condición es falsa end if

Bucles

Los bucles for se escriben de la siguiente manera:

for 1 to 4 // Código a ejecutar en cada iteración next

Espacios de Nombres y Variables

Espacios de Nombres

DinaCode utiliza diferentes espacios de nombres para organizar y acceder a variables y funciones:

  • v.: Variables definidas por el usuario.

  • F.: Funciones integradas.

  • C: Campos de datos.

  • R: Campos relacionados (datos de tablas relacionadas, similar a un LEFT JOIN) (Solo disponible en Algoritmos compuestos).

  • D: Datos especiales.

  • S: Constantes y enumeraciones del sistema.

Tipos de Datos

DinaCode soporta dos tipos de datos principales:

  • txt: Cadenas de texto.

  • num: Números (pueden ser enteros o decimales).

Nota: Los valores booleanos se representan usando num, donde 1 es verdadero y 0 es falso. Las fechas, fechas y horas, horas, Guids, se almacenan en formato txt.

Funciones Integradas

DinaCode ofrece una amplia gama de funciones integradas disponibles a través del espacio de nombres F..

Funciones de Texto

Permiten manipular y analizar cadenas de texto.

  • F.Length(txt texto): Retorna la longitud de la cadena.

  • F.Contains(txt texto, txt subcadena): Verifica si texto contiene subcadena.

  • F.ToUpper(txt texto): Convierte la cadena a mayúsculas.

  • F.ToLower(txt texto): Convierte la cadena a minúsculas.

  • F.Replace(txt texto, txt buscar, txt reemplazar): Reemplaza todas las ocurrencias.

Ejemplo:

txt saludo = 'Hola, Mundo!' txt saludoMayusculas = F.ToUpper(v.saludo) // Resultado: 'HOLA, MUNDO!'

Funciones Matemáticas

Para cálculos y operaciones numéricas.

  • F.Round(num valor, num decimales): Redondea valor al número de decimales especificado.

  • F.Ceiling(num valor): Redondea hacia arriba al entero más cercano.

  • F.Floor(num valor): Redondea hacia abajo al entero más cercano.

Ejemplo:

num resultado = F.Round(3.1416, 2) // Resultado: 3.14

Funciones de Fecha y Hora

Manipulación y obtención de información sobre fechas y horas.

  • F.Day(txt fecha): Obtiene el día de la fecha.

  • F.Month(txt fecha): Obtiene el mes de la fecha.

  • F.Year(txt fecha): Obtiene el año de la fecha.

Ejemplo:

num dia = F.Day('2023-10-19') // Resultado: 19

Funciones de Formato y Conversión

Para formatear y convertir tipos de datos.

  • F.FormatMoney(num valor): Formatea un número como moneda.

  • F.FormatPercentage(num valor): Formatea un número como porcentaje.

  • F.Cast_TextToNum(txt texto): Convierte una cadena a número.

Ejemplo:

txt precioFormateado = F.FormatMoney(1234.5) // Resultado: '1.234,50 €' (dependiendo de la configuración regional)

Funciones de Interacción con el Usuario

Interacción directa con el usuario.

  • F.MsgBox(txt mensaje): Muestra un mensaje al usuario.

  • F.PreguntarSiNo(txt pregunta): Realiza una pregunta de sí o no.

Ejemplo:

num respuesta = F.PreguntarSiNo('¿Desea continuar?') if v.respuesta == 1 // Código si el usuario selecciona 'Sí' else // Código si el usuario selecciona 'No' end if

Funciones de WebClient

Para realizar solicitudes HTTP y comunicarse con APIs externas.

  • F.WebClient_Request(txt url, txt método, txt datos): Realiza una solicitud HTTP.

Ejemplo:

txt respuesta = F.WebClient_Request('https://api.example.com/data', 'GET', '')

Funciones de Eventos y Triggers

Manejo de eventos dentro de Dinaup.

  • F.InitializeTrigger(): Inicializa un trigger para un documento dinámico.

  • F.TriggerIfFieldsFilled(num campoID): Configura el trigger para que solo se active si los campos especificados están llenos.

Funciones de Utilidades

Funciones generales de uso común.

  • F.NewPassword(): Genera una contraseña aleatoria.

  • F.NewGuid(): Genera un identificador único global.

Funciones de Email

Para enviar correos electrónicos desde DinaCode.

  • F.EmailSend(txt destinatario, txt asunto, txt mensaje): Envía un correo electrónico.

Ejemplo:

F.EmailSend('[email protected]', 'Asunto del Correo', 'Contenido del mensaje.')

Funciones de Metadatos

Manipulación de metadatos en documentos dinámicos.

  • F.MetaData_Set(txt clave, txt valor): Establece un metadato.

  • F.MetaData_Read(txt clave): Lee el valor de un metadato.

Ejemplo:

F.MetaData_Set('titulo', 'Informe de Ventas') txt titulo = F.MetaData_Read('titulo')

Funciones de Gráficas

Creación y manipulación de gráficas.

  • F.Chart_New(): Crea una nueva gráfica y devuelve su ID.

  • F.Chart_AddSerie(num graficaID, txt nombreSerie): Añade una serie a la gráfica.

  • F.Chart_AddValue(num graficaID, txt nombreSerie, num valor): Añade un valor a la serie especificada.

  • F.Chart_ToHTML(num graficaID): Convierte la gráfica a código HTML.

Estructuras de Datos Avanzadas

Tablas de Datos (DataTable)

Las tablas de datos son estructuras que permiten almacenar y manipular conjuntos de datos en memoria.

Creación y Manipulación

  • Crear una tabla:

    num tablaID = F.DataTable_New('Producto', 'Cantidad', 'Precio Unitario')
  • Añadir una fila y establecer valores:

    F.DataTable_AddRow(v.tablaID) F.DataTable_SetValueText(v.tablaID, 'Producto', 'Café') F.DataTable_SetValueNum(v.tablaID, 'Cantidad', 2) F.DataTable_SetValueMoney(v.tablaID, 'Precio Unitario', 5.00)

Renderización

  • Renderizar en HTML:

    txt tablaHTML = F.DataTable_Build(v.tablaID, 'html|class="table table-striped"') F.Write(v.tablaHTML)
  • Renderizar en JSON:

    txt tablaJSON = F.DataTable_Build(v.tablaID, 'jsonaarray') F.Write(v.tablaJSON)

Ejemplos Prácticos

Generación de una tabla de productos HTML:

num tablaID = F.DataTable_New('Producto', 'Cantidad', 'Precio Unitario') F.DataTable_AddRow(v.tablaID) F.DataTable_SetValueText(v.tablaID, 'Producto', 'Café') F.DataTable_SetValueNum(v.tablaID, 'Cantidad', 2) F.DataTable_SetValueMoney(v.tablaID, 'Precio Unitario', 5.00) F.DataTable_AddRow(v.tablaID) F.DataTable_SetValueText(v.tablaID, 'Producto', 'Té') F.DataTable_SetValueNum(v.tablaID, 'Cantidad', 3) F.DataTable_SetValueMoney(v.tablaID, 'Precio Unitario', 3.50) txt tablaHTML = F.DataTable_Build(v.tablaID, 'html|class="table table-striped"') F.Write(v.tablaHTML)

Diccionarios

Los diccionarios son estructuras de datos que almacenan pares clave-valor.

Diccionarios de Texto

  • Crear un diccionario de texto:

    num diccionarioID = F.DicT_New() F.DicT_Add(v.diccionarioID, 'clave1', 'valor1') F.DicT_Add(v.diccionarioID, 'clave2', 'valor2')
  • Obtener un valor:

    txt valor = F.DicT_Get(v.diccionarioID, 'clave1')

Diccionarios Numéricos

  • Crear un diccionario numérico:

    num diccionarioNumID = F.DicN_New() F.DicN_Add(v.diccionarioNumID, 'clave1', 100) F.DicN_Add(v.diccionarioNumID, 'clave2', 200)

Documentos Dinámicos

Generación de Documentos

Los documentos dinámicos permiten generar contenido personalizado en diferentes formatos, como HTML o PDF. Se puede mezclar DinaCode con HTML para crear documentos enriquecidos.

Uso de Buffers y Mezcla con HTML

Ejemplo de mezcla de DinaCode con HTML:

<!DOCTYPE html> <html> <head> <title>Documento Dinámico</title> </head> <body> <h1><!--: F.Write(v.titulo) :--></h1> <p>Bienvenido, <!--: F.Write(v.nombreUsuario) :--></p> </body> </html>

Incluyendo Contenido

  • Incluir otro documento dinámico:

    F.Include(v.documentoID)
  • Obtener el contenido de un documento dinámico:

    txt contenido = F.GetDynamicDocumentContent(v.documentoID) F.Write(v.contenido)

Carga y Procesamiento de Datos

Carga de Listados de Datos

Permite cargar datos de secciones específicas.

F.DataListLoad(S.Secciones.Clientes.ID, 1, 100)

Filtrado y Ordenación

  • Añadir un filtro:

    F.DataListLoadAddFilter(S.Secciones.Clientes.ID, C.Clientes.Nombre, '=', 'Juan')
  • Procesar los datos cargados:

    F.ProcessDataList_Ini(S.Secciones.Clientes.ID) // Acceder a los campos con I.NombreDeLaSeccion.NombreDelCampo txt nombreCliente = I.Clientes.Nombre F.ProcessDataList_End

Funciones Avanzadas

Funciones de Google Maps

Permiten interactuar con Google Maps dentro de DinaCode.

  • Crear un mapa:

    num mapaID = F.Maps_New()
  • Añadir un punto clickable:

    F.Maps_AddClickablePoint(v.mapaID, -34.6037, -58.3816, 'Buenos Aires')
  • Convertir el mapa a HTML:

    txt mapaHTML = F.Maps_ToHTML(v.mapaID) F.Write(v.mapaHTML)

Funciones de Intersecciones

Para calcular intersecciones entre intervalos.

  • Intersección de fechas:

    num interseccion = F.Intersect_Date('2023-01-01', '2023-01-10', '2023-01-05', '2023-01-15')

Mejores Prácticas

Optimización de Código

La optimización del código es esencial para garantizar que tus scripts sean eficientes, mantenibles y fáciles de entender. A continuación, se presentan algunas prácticas recomendadas para optimizar tu código en DinaCode:

  • Evita redundancias y código innecesario: Revisa tu script para identificar secciones que realizan tareas similares y considera abstraerlas en funciones o reutilizar variables existentes. Esto reduce la complejidad y facilita el mantenimiento.

  • Utiliza F.DataListLoad para recuperar datos de forma eficiente: La manera más óptima de recuperar varios campos de un mismo registro es utilizando F.DataListLoad y, en caso de necesitar un solo registro, filtrar por su ID. Esta función está diseñada para cargar toda la información necesaria accedida mediante I. en una sola operación (HIT), lo que minimiza las llamadas al servidor y mejora significativamente el rendimiento del script. Ejemplo de uso eficiente:

    // Declarar el ID del registro que deseas obtener num registroID = 123 // Cargar los datos de la sección específica filtrando por ID F.DataListLoad(S.Secciones.MiSeccion.ID, 1, 1) F.DataListLoadAddFilter(S.Secciones.MiSeccion.ID, C.MiSeccion.ID, '=', v.registroID) // Procesar los datos cargados F.ProcessDataList_Ini(S.Secciones.MiSeccion.ID) // Acceder a los campos del registro utilizando I. txt campo1 = I.MiSeccion.Campo1 num campo2 = I.MiSeccion.Campo2 // Realizar operaciones con los campos obtenidos F.Write(F.Concat('Campo1: ', v.campo1, ', Campo2: ', F.Cast_NumToText(v.campo2))) F.ProcessDataList_End

    En este ejemplo:

    • Carga eficiente: Al utilizar F.DataListLoad y filtrar por el ID del registro, se obtiene toda la información necesaria en una sola operación.

    • Acceso a datos: Los campos del registro se acceden mediante I.MiSeccion.Campo, lo que es más rápido y limpio que realizar múltiples consultas individuales.

    • Mejora del rendimiento: Reducir el número de operaciones y llamadas al servidor agiliza la ejecución del script y disminuye la carga en el sistema.

  • Planifica tus consultas y filtros: Cuando necesites trabajar con conjuntos de datos más grandes, utiliza filtros y ordenaciones para limitar la cantidad de datos procesados. Esto no solo mejora el rendimiento sino que también hace que tu script sea más eficiente en términos de recursos utilizados.

  • Optimiza los bucles y procesos iterativos: Evita colocar operaciones costosas dentro de bucles siempre que sea posible. Si necesitas realizar una operación repetidamente, considera si puedes moverla fuera del bucle o calcularla previamente.

  • Utiliza variables locales para almacenar resultados intermedios: Si un valor calculado se utiliza varias veces, almacénalo en una variable local (v.) en lugar de recalcularlo o volver a obtenerlo. Esto reduce el número de operaciones y facilita el mantenimiento del código.

  • Mantén un estilo de código consistente: Sigue convenciones de nomenclatura y estructura para que tu código sea fácilmente entendible por otros desarrolladores. Un código limpio y consistente es más fácil de optimizar y depurar.

Implementando estas prácticas en tus scripts de DinaCode, mejorarás tanto el rendimiento como la calidad de tu código, lo que resultará en soluciones más efectivas y sostenibles a largo plazo.

Contacto y Soporte

Para obtener ayuda y soporte técnico, puede ponerse en contacto con el equipo de Dinaup a través de los canales oficiales.

Last modified: 04 February 2025