Esta documentación está en fase de desarrollo y puede contener errores.

Buenas prácticas de DinaScript

Convenciones de estilo, rendimiento y diseño de algoritmos para que tus scripts se entiendan a la primera y no penalicen al guardar.

Cómo escribir DinaScript legible y rápido: nombres, condiciones, carga de datos y diseño de algoritmos. La referencia completa de cada función está en el índice de funciones.

Nombres y comentarios

  • El nombre de la variable cuenta qué contiene. txt nombreCliente se entiende solo; txt x obliga a leer el resto del script para saber qué es.
  • El comentario @ cuenta por qué. Documenta la regla de negocio, no lo que ya dice la línea. Un @ suma 1 no aporta; un @ los pedidos anulados no computan evita un error futuro.
  • Elige el tipo de script adecuado al trabajo: Terminal para la interfaz, Algoritmo para cálculos, Plantilla de impresión para documentos, Función API para lógica de servidor. Ver scripts y eventos.
  • Un script, una responsabilidad. Si crece demasiado, separa la lógica en scripts pequeños y encadénalos con F.ExecuteScript.
@ Los pedidos de más de 3.000 € llevan descuento por volumen
num umbralDescuento = 3000
¿v.totalPedido > v.umbralDescuento ? v.descuento = 5

Condiciones legibles

El if en línea ¿condición ? acción y el bloque if / end hacen lo mismo; la diferencia es cuánto cabe dentro.

  • En línea cuando hay una condición y una sola acción. Una línea, un vistazo.
  • Bloque cuando hay varias acciones, ramas else o elseif, o lógica anidada. Estirar un if en línea con acciones encadenadas se vuelve ilegible enseguida.
if v.totalPedido > v.umbralDescuento
    v.descuento = 5
    v.avisoCliente = "Descuento por volumen aplicado"
else
    v.descuento = 0
end

Escribe las condiciones en positivo cuando puedas y compara con valores con nombre (v.umbralDescuento), no con números sueltos repartidos por el script.

Valida antes de operar

DinaScript no tiene try/catch: si una operación falla a mitad de script, no hay red de seguridad. La defensa es comprobar antes con un if, sobre todo los valores que vienen del usuario o de campos que pueden estar vacíos.

@ Comprueba antes de usar: no hay manejo de errores después
¿F.IsEmpty_Text(v.emailCliente) = 1 ? v.error = "Falta el email del cliente"

Las funciones IsEmpty_* e IsNotEmpty_* cubren texto, fecha, hora y fecha-hora. Están en lógica y comparación.

Rendimiento: carga lo justo

Cargar un listado es un viaje a la base de datos. La regla: que viajen las filas que necesitas, no todas.

  • Filtra en la carga, no en el bucle. Un F.DataListLoadAddFilter recorta la consulta antes de traer datos. Un if dentro del recorrido trae toda la sección y descarta filas ya cargadas.
  • Pagina con cabeza. El tercer parámetro de F.DataListLoad limita cuántos resultados llegan. Pide 200 si vas a usar 200.
  • No cargues listados dentro de un recorrido. Un F.DataListLoad dentro de un bloque F.ProcessDataList_IniF.ProcessDataList_End es un viaje a la base de datos por cada fila. Si necesitas cruzar datos, replantea: casi siempre lo resuelve un informe con las columnas ya cruzadas o un algoritmo.
  • Guarda en variable lo que leas varias veces. Leer un campo o llamar a la misma función en cada vuelta del bucle repite trabajo; asígnalo una vez antes de entrar.
  • Los totales son de los algoritmos. Para sumar, contar o promediar registros no recorras un listado en un script: un algoritmo con F.Aggregate_Sum, F.Aggregate_Count o F.Aggregate_Average compila a SQL y calcula donde viven los datos.
@ El filtro viaja en la consulta: llegan solo los pedidos pendientes
F.DataListLoad(v.listadoPedidos, 1, 200)
F.DataListLoadAddFilter(v.listadoPedidos, "estado", "=", "pendiente")

Algoritmos: el tipo más simple que cubra el cálculo

Cada tipo de algoritmo opera sobre un alcance distinto, y el coste crece con el alcance:

  • Lineal — el cálculo vive en la propia fila y sus relaciones directas. El más barato; tu primera opción para campos auto-calculados.
  • Cruzado — resume registros relacionados en un valor (la factura que suma sus líneas). Cada cruce adicional encarece la consulta: no cruces lo que puedas leer con un Lineal.
  • Búsqueda — resuelve el id de un registro de otra sección a partir de un filtro.
  • Datos — agregado global de una sección, para dashboards e informes.
  • Independiente — valores de sesión o composición de otros algoritmos, sin contexto de fila.

Recorta pronto: el prefiltrado y los filtrados de izquierda y derecha reducen las filas antes de agregar. Filtrar después de traer todo es pagar la consulta grande para quedarte con el resultado pequeño. Las partes del algoritmo están explicadas en algoritmos.

Recálculo automático y cadenas

Un campo auto-calculado no se refresca solo por arte de magia. Su algoritmo se recalcula cuando:

  1. Se guarda o borra un registro de la sección origen.
  2. Un administrador lanza un recálculo masivo.
  3. Lo dispara una tarea programada.
  4. Cambia el resultado de otro algoritmo del que depende.

El sistema ordena la ejecución por dependencias y detecta los ciclos: un algoritmo no puede depender, directa o indirectamente, de su propio resultado.

Un algoritmo pesado enganchado a un campo auto-calculado se paga en cada guardado de la sección origen. Y una cadena larga de algoritmos convierte un guardado en una cascada de recálculos. Si guardar se vuelve lento, mira ahí primero: acorta la cadena o acota con filtros.

Encadenar algoritmos es legítimo para construir cálculos por etapas, pero mantén las cadenas cortas y con un propósito claro por eslabón.

Límites del lenguaje

LímiteQué implica al escribir
Sin recursiónUn script no puede llamarse a sí mismo, ni directamente ni a través de una cadena de F.ExecuteScript.
Sin funciones propiasTodas las funciones son las integradas del espacio F.. Para reutilizar lógica, sepárala en otro script.
Ejecución línea a líneaNo hay expresiones multilínea: cada instrucción completa en su línea.
Sin try/catchNo existe manejo de excepciones. Protege las operaciones delicadas con comprobaciones previas.
Ejecución síncronaLas instrucciones corren una tras otra; un paso lento retrasa todo lo que viene después.
Indiferente a mayúsculasF.Round y f.round son la misma función. Usa la grafía de la referencia para poder buscarla.
Palabras clave bilingüesif y si valen igual. Elige una y no las mezcles en el mismo script.

Índice de funcionesAlgoritmosScripts y eventos

On this page