Manuales de desarrollo de YeboYebo
A veces un modelo no puede definirse únicamente como un registro en base de datos, sino que tiene una estructura más compleja. Por ejemplo, un pedido está definido por su cabecera y sus líneas.
Para definir estos modelos más complejos, usamos los esquemas M1. Por ejemplo:
"albaranescli": {
"funInicio": Albaranescli.iniciaValoresCursor,
"funCambio": Albaranescli.bChCursor,
"M1": [
{
"id": "lineas",
"tabla": "lineasalbaranescli",
"campoM1": "idalbaran",
"idModelo": "lineasalbaranescli",
"funAgregar": Albaranescli.calcularTotalesCursor
}
]
},
"lineasalbaranescli": {
"funInicio": Lineasalbaranescli.iniciaValoresCursor,
"funCambio": Lineaspedidoscli.commonBChCursor,
"ordenCampos": ["idalbaran", "referencia", "cantidad"]
},
Los subesquemas M1 se definen en un array bajo la clave M1 del esquema padre. Cada elemento del array define un subesquema. A continuación definimos las distintas claves que el diccionario de subesquema puede contener:
Identificador del subesquema dentro del array. Es también la clave del modelo que incluirá los datos asociados. Por ejemplo, para las líneas de un albarán, el id es lineas:
const miAlbaran = {
"codcliente": "000001",
"lineas": [
{ "referencia": "REF1", "cantidad": 1 },
{ "referencia": "REF2", "cantidad": 1 },
]
}
Nombre de la tabla asociada.
Clave del esquema asociado al subesquema. Suele coincidir con el valor de la clave tabla.
Función que se ejecutará sobre un cursor del registro padre tras crear, modificar o borrar registros asociados sobre el subesquema.
Podemos guardar el modelo en base de datos con la función crea:
const miAlbaran = {
"codcliente": "000001",
"lineas": [
{ "referencia": "REF1", "cantidad": 1 },
{ "referencia": "REF2", "cantidad": 1 },
]
}
formMODEL.crea(miAlbaran, "albaranescli")
La función crea hará lo siguiente:
Si un esquema tiene subesquemas asociados, la función carga cargará los datos asociados a todos los subesquemas.
const miAlbaran = formMODEL.carga(12, "albaranescli")
/* Si el albarán contiene líneas, obtenemos algo así como:
{
"idalbaran": 12,
"codigo": "20220A000001",
"codcliente": "000001",
...(resto de datos de cabecera)
"lineas": [
{ "idlinea": 123, "referencia": "REF1", ...etc },
{ "idlinea": 122, "referencia": "REF2", ...etc },
]
}
*/
Podemos especificar los tipos de registros hijo que queremos cargar indicando un tercer parámetro en la función:
// No carga datos de ningún subesquema:
const miAlbaran = formMODEL.carga(12, "albaranescli", { "M1": [] })
// Carga datos del subesquema lineas:
const miAlbaran = formMODEL.carga(12, "albaranescli", { "M1": [{ "id": "lineas" }] })
La función busca dispone del mismo parámetro de opciones que la función carga, por lo que podemos indicar qué datos de subesquemas queremos incluir en el resultado de la búsqueda.
Como la función carga, si no especificamos opciones obtendremos los datos de todos los subesquemas M1 asociados al esquema que busquemos.