Skip to content

Latest commit

 

History

History
397 lines (309 loc) · 22 KB

definicion-tablas.md

File metadata and controls

397 lines (309 loc) · 22 KB

Definición de tablas

idioma: castellano también disponible en: inglés

Se definen tablas, vistas (que correspondan a una VIEW de la base de datos) o vistas (que son simplemente una query que conoce la aplicación pero que no generó una VIEW).

En el futuro habrá tablas que no sean originadas en la base de datos, por ejemplo una lista de campos tendría que poder verse en una tabla.

tableDef

propiedad tipo predeterminado uso
name T nombre que va a tener la tabla en el sistema
title T name título en la grilla
editable L false los permisos
allow OP editable objeto de permisos individuales
primaryKey [T] [] lista de nombres de campos que son PK
foreignKeys [O] [] lista las definiciones de las FK
softForeignKeys [O] [] lista las definiciones de las SFK. Especifica FKs (uno a uno) que no se define en la BBDD
constraints [O] [] lista de constraints (salvo las Pk, FK que van en otra lista)
sql O deducido sintaxis SQL para casos especiales
tableName T name nombre de la tabla física (generalmente es el mismo name de definición de la tabla en el sistema)
layout O {} opciones de despliegue
vertical L false si el despliegue predeterminado es vertical
forInsertOnlyMode L false si es una tabla de solo inserción
filterColumns [O] [] lista de objetos de la forma {column, operator, value} para que sea el filtro predeterminado de la grilla
registerImports [O] (registerImportsDef) lista de objetos. Configura opciones para guardar la definicion de los "otros" campos al importar un archivo (para que funcione debe existir un campo seteado como "defaultForOtherFields" (ver fieldDef))
sortColumns [O] [] ordenamiento predeterminado
detailTables [O] [] lista de tablas que permitirán desplegar subgrillas (estilo maestro/detalle)
functionDef O null definición de SQL paramétrico o funcional
lookupFields [T] [f.isName] lista de los nombres de campo que se muestran al desplegar la lista deplegable para elegir
nameForUpsert T null nombre físico de la columna en la tabla usado para el insert o update en tablas basadas en consultas
ejemplos lista formato elemento
foreignKeys {references:'ptable', fields:['atomic_number']}
softForeignKeys {references:'ptable', fields:['atomic_number']}
constraints {constraintType:'unique', fields:['atomic_number','order'], consName:'repeating order in atomic_number'}
filterColumns {column:'atomic_number', operator:'=', value:7}
sortColumns {column:'discovery_date', order:-1}
detailTables {table:'ptable', fields:['atomic_number'], abr:'A', refreshParent:true, refreshFromParent:true}
permisos tabla campo indica si se permite...
insert x x agregar registros a la grilla
update x x cambiar valores en la grilla
delete x borrar registros
select x x ver datos
filter x filtrar la grilla
import x importar datos desde archivos externos
export x exportar datos a un archivo
orientation x cambiar la orientación de la grilla de vertical/horizontal
sql uso
postCreateSqls texto con una o varias sentencias SQL que deben ejecutarse después de la creación. Sirve para agregar constraints que el motor no soporta.
constraintsDeferred true equivale a ejecutar SET CONSTRAINTS ALL DEFERRED al comienzo de la transacción al hacer upload
isTable true si es una tabla y por lo tanto hay que hacer el dump para el create table y si se le deben deducir los campos name de sus FK
insertIfNotUpdate false para deshabilitar la inserción de nuevos filas en el archivo excel que se está importando (pk no presente en la BD)

fieldDef

propiedad tipo predeterminado uso
name T nombre en la base de datos y id de campo
visible B true muestra/oculta un campo de manera predeterminada
typeName T tipo
title T name título para la grilla cuando no se quiere el name
inTable L true si pertenece físicamente a la tabla y por lo tanto entra en el dump.
sequence [O] (sequenceDef) determina si el campo tendria un valor auto-incremental
defaultValue T Valor predeterminado
defaultDbValue T Expresión SQL del valor predeterminado a nivel de la base de datos, no se ve en las tablas, for example "random()*1000"
defaultForOtherFields B false establece si el campo (que debe definirse como "text") se utiliza para guardar un JSON con los "otros" campos cuando se importa un archivo (para que funcione debe configurarse "registerImports" (ver tableDef))

foreignKey/softForeignKey

propiedad tipo predeterminado uso
references T nombre de la tabla
fields [O] lista de nombres de campos para el join (o {source:name, target:name} si los nombres son distintos)
alias T references alias para el join, es necesario cuando hay dos foreignKeys que referencian a la misma tabla.
displayFields [T] [references.isName] lista de nombres de campos de la tabla referida que deben mostrarse en la grilla de esta tabla. En caso de que no se especifiquen se toman los campos marcados con isName
displayAllFields B false si se deben mostrar todos los campos de la tabla referida
onUpdate T 'cascade' que hacer si hay un update en la tabla relacionada
onDelete T que hacer si hay un borrado (valor posible: 'cascade').
consName T nombre de la constraint generada
initiallyDeferred B false si se calcula al final la constraint
displayAfterFieldName T false después de qué nombre de campo debe desplegar los campos de la tabla relacionada, true al final de todos los campos, false a continuación de la FK

registerImportsDef

propiedad tipo predeterminado uso
inTable T null nombre de tabla para guardar definicion de "otros" campos. Debe definirse si se quiere guardar la informacion (la tabla debe existir, ver ejemplo integrador)
fieldNames [O] (fieldNamesDef) Objeto con configuracion de campos de la tabla definida

sequenceDef

Un objeto que contiene información para generar una secuencia auto-incremental

Si no se especifica el objeto o el nombre se usará la cláusula GENERATED ALWAYS AS IDENTITY

property type default value use
name T null nombre de la secuencia
firstValue Number 1 primer número de la secuencia
prefix T null prefijo de la secuencia

fieldNamesDef

Cada propiedad define que nombre de campo de tabla seteada en "registerImports.inTable" se va a utilizar para guardar la información referida a "otros" campos importados

propiedad tipo predeterminado uso y restricciones
tableName T 'table_name' tabla de origen del campo (no puede ser null y se debe definir como text y PK en "registerImports.inTable")
fieldName T 'field' nombre del campo (no puede ser null y se debe definir como text y PK en "registerImports.inTable")
fieldIndex T 'field_index' posición del campo en el archivo (no puede ser null y debe definirse como integer en "registerImports.inTable")
originalFileName T null nombre del archivo al que pertenece el campo(puede ser null y debe definirse como text en "registerImports.inTable")
serverPath T null path del archivo al que pertenece el campo(puede ser null y debe definirse como text en "registerImports.inTable")
lastUpload T null fecha de ultima subida del archivo al que pertenece el campo(puede ser null y debe definirse como timestamp en "registerImports.inTable")

Los campos que son null pueden no estar en la definicion de campos de la tabla definida en "registerImports.inTable", los demás son obligatorios y deben respetar las restricciones. Si no se setean los optativos (los que pueden ser null), la información no se registra por mas que existan en la tabla definida en "registerImporst.inTable".

functionDef

Llamamos SQL paramétrico cuando la propiedad from está definidia tiene parámetros $1, $2, etc. Y Llamamos que la tabla es funcional cuando el tableName es el nombre de una función que devuelve un recordset.

propiedad tipo uso
parameters [{name, typeName}]

Context

La definición de la tabla depende del parámetro context que tiene la siguiente definición

propiedad uso
db la base de datos. En principo es solo para usar quoteIdent, y quoteNullable
forDump indica si se pide la definición para hacer un dump de la base
user objeto con la información del usuario una vez que está logueado.

Ejemplo integrador, primero en javascript luego en typescript con other tables:

module.exports = function(context){
    return {
        name:'isotopes',
        title:'stable isotopes',
        allow:{
            insert:context.user.rol==='boss',
            delete:context.user.rol==='boss',
            update:context.user.rol==='boss',
        },
        registerImports:{
            inTable:'other_fields', 
            fieldNames:{
                originalFileName:'original_filename',
                serverPath:'server_filepath',
                lastUpload:'last_upload',
            }
        },
        fields:[
            {name:'atomic_number', title:'A#', typeName:'integer' , width:100, nullable:false,      orderForInsertOnly:'1' },
            {name:'mass_number'              , typeName:'integer' , width:100,                      orderForInsertOnly:'2' },
            {name:'order'                    , typeName:'integer' , width:100,                      orderForInsertOnly:'4' },
            {name:'stable'                   , typeName:'boolean' , width:100,                                             },
            {name:'others'                   , typeName:'text'    , width:700, defaultForOtherFields: true                },
        ],
        filterColumns:[
            {column:'atomic_number', operator:'>', value:context.be.internalData.filterAtomicNumberForIsotopes}
        ],
        primaryKey:['atomic_number','mass_number'],
        constraints:[
            {constraintType:'unique', fields:['atomic_number','order'], consName:'repeating order in atomic_number'}
        ],
        foreignKeys:[
            {references:'ptable', fields:['atomic_number']}
        ]
    };
}
"use strict";

import {TableDefinition, TableContext} from "backend-plus";

export function table_with_otherfields(context:TableContext):TableDefinition {
    var admin = context.user.rol==='boss';
    return {
        name:'table_with_otherfields',
        allow:{
            insert:true,
            update:true,
        },
        title:'information about other fields',
        editable:admin,
        fields:[
            {name:'table_name'          , typeName:'text'       , nullable:false  },
            {name:'field'               , typeName:'text'       , nullable:false  },
            {name:'field_index'         , typeName:'integer'    , nullable:false  },
            {name:'original_filename'   , typeName:'text'                         },
            {name:'server_filepath'     , typeName:'text'                         },
            {name:'last_upload'         , typeName:'timestamp'                    },
        ],
        primaryKey:['table_name', 'field'],
    };
}