====== Layout de los formularios (PWA_FORMS) ======
//Cómo se declara, en un texto de configuración, lo que enseña cada ficha de
edición de SmartPWA: sus pestañas y campos, las rejillas del panel inferior y
las opciones de su menú desplegable.//
Nada de esto está en el programa: vive en la base de datos, en el campo
''DESCRIPCION'' de la tabla ''PWA_FORMS'', y se lee cada vez que se abre la
ficha. Cambiar dónde va un campo, añadir una pestaña de una tabla hija o
quitarle a una instalación una opción del menú es cambiar ese texto, sin tocar
la aplicación ni publicar una versión nueva.
===== Dónde vive y a quién se le aplica =====
Una fila de ''PWA_FORMS'' es la definición de una pantalla para un ámbito. La
clave primaria es ''COD_FORM + TIPO_AMBITO + COD_AMBITO + CLAVE_INSTALACION'',
donde ''COD_FORM'' es el código de la pantalla tal y como lo nombra la
aplicación: ''albaran-venta-edit'', ''parte-averia-edit'', ''producto-edit''…
(distingue mayúsculas de minúsculas).
Cuando la ficha se abre, ''PWA_GET_FORM(COD_FORM, COD_USUARIO)'' elige **una
sola** de esas filas —usuario, usuario del que hereda, clave de instalación,
clave de grupo y, por último, la general—, así que una instalación que no
alquile no tiene por qué ver la pestaña «Precios alquiler», y a un usuario se
le puede dejar la ficha con los cuatro campos que usa. Cómo se gestiona todo
eso está en [[pwa:doc:Documentación de ámbitos en SmartPWA|Ámbitos: quién ve qué]].
Cada definición describe la ficha **entera**, no un parche
sobre la general: lo que se añada a la general no llega a quien tenga la suya.
El texto se lee en tres trozos de 8000 caracteres, así que el límite
práctico de un layout son **24 000 caracteres**. Una ficha con cuarenta
pestañas anda por los ocho mil.
La aplicación cachea la definición por usuario y formulario. Después
de cambiar el texto hay que volver a entrar en la aplicación para verlo.
===== Cómo se edita =====
* Desde la propia aplicación, en **Formularios** (''/formularios''), que además ofrece «Copiar script de actualización» y «Descargar script (.sql)» para llevar el cambio a otras bases de datos.
* En el repositorio, los layouts generales están versionados en ''db/pwa_forms_layouts.sql'' (''UPDATE OR INSERT'', idempotente), y de ahí salen los scripts ''JMnnnn'' que se incorporan a las bases de los clientes.
===== El texto, línea a línea =====
Una directiva por línea. Las líneas en blanco se ignoran y los nombres se
recortan. Lo que no encaje con ninguna directiva se toma como una fila de
campos.
^ Directiva ^ Qué hace ^
| ''P:título'' | abre una pestaña de la cabecera |
| ''L:título'' | corta el formulario en horizontal: cierra las columnas y abre un bloque nuevo debajo, con sus propias columnas |
| ''C1:40%'' | abre una columna del ancho indicado (el número que sigue a la C es libre) |
| ''CAMPO'' | una fila de la columna actual; varios separados por coma van en la misma fila |
| ''D:alias = origen'' | declara un origen de datos auxiliar |
| ''R:título = origen'' | añade una pestaña al panel inferior |
| ''G:título'' | abre un grupo de pestañas del panel inferior |
| ''A:título = destino'' | añade una opción al menú desplegable de la ficha |
==== Campos ====
P:General
C1:40%
NRO_ALBARAN
TIPO_TERCERO, COD_TERCERO
-USUARIO_CREA
+COMENTARIOS(300%, 100%)
QRES.S_CUOTA_TOTAL
* **Coma**: los campos de una misma línea se pintan uno al lado del otro.
* **Guión delante** (''-USUARIO_CREA''): el campo se ve pero no se edita.
* **Más delante** (''+COMENTARIOS''): la etiqueta va encima del cuadro en vez de a su izquierda. Es lo que quieren los campos anchos.
* **Paréntesis con dos porcentajes** (''COMENTARIOS(300%, 100%)''): cuadro de texto multilínea. El primero es cuánto crece de alto respecto a un campo normal (100 % = el doble de alto) y el segundo, el ancho como porcentaje de la columna.
* Las marcas se combinan y en cualquier orden: ''-+USUARIO_CREA''.
* **ALIAS.CAMPO**: el campo sale de un origen auxiliar ''D:'' y no de la tabla de la ficha; siempre de solo lectura.
=== Ejemplo: la pestaña General del albarán de venta ===
P:General
C1:40%
NRO_ALBARAN
TIPO_TERCERO, COD_TERCERO
NOMBRE
RAZON_SOCIAL
COD_OBRA
DESC_OBRA
C2:30%
NRO_PEDIDO
REFERENCIA
FECHA_SERVICIO
FECHA_DEVENGO
COD_DELEGACION
C3:30%
COD_FORMA_ENTREGA
SOLICITANTE
ENTREGADO_A
PRIORIDAD
Tres columnas que suman el 100 %, y el tercero en su fila junto a su tipo. Los
anchos son orientativos: si no suman cien, se reparte lo que haya.
=== Ejemplo: una pestaña de un solo cuadro de texto ===
P:Comentarios
C1:100%
+COMENTARIOS(300%, 100%)
Etiqueta encima, cuatro veces el alto de un campo normal y todo el ancho de la
columna. Es como están los comentarios del cliente, del producto y del parte de
avería.
=== Ejemplo: dos bloques, uno encima de otro ===
P:Datos
C1:50%
CODIGO
DESCRIPCION
C2:50%
FECHA_ALTA
COD_DELEGACION
L:Importes
C1:33%
BASE_IMPONIBLE
C2:33%
CUOTA_IVA
C3:34%
TOTAL
Sin el ''L:'', las columnas nuevas se seguirían añadiendo a la derecha de las
anteriores. Con él, //Importes// empieza una franja debajo, con sus propios
anchos y su título.
==== Valores: lo que se puede escribir entre paréntesis o corchetes ====
Es el mismo juego en los datasets ''D:'', en las rejillas ''R:'' y en las
acciones ''A:'':
^ Se escribe ^ Vale ^
| '':CAMPO'' | el valor que tiene ese campo en la cabecera de la ficha |
| ''123'' | el número |
| ''%%'007'%%'' | el texto entre comillas simples, tal cual (los códigos con ceros delante) |
| ''NULL'' | un nulo de verdad, que no es lo mismo que no pasar nada |
| ''SIMULACION'' | la simulación de la sesión |
| ''HOY'', ''INI_ANO'', ''FIN_ANO'' | fechas, con desplazamiento opcional: ''HOY-10D'', ''HOY+6M'', ''FIN_ANO-1A'' |
En las rejillas de procedimiento, un parámetro con **''?''** delante no se
fija: se propone. El usuario lo ve relleno en la barra de filtros y puede
cambiarlo antes de consultar.
===== D: orígenes auxiliares =====
No todos los campos de una cabecera salen de su tabla: algunos los calcula un
procedimiento (los totales) y otros viven en una tabla aparte.
D:QRES = RESUMEN_ALB_VENTA_TOTAL3(:NRO_ALBARAN)
D:QUSU = USUARIOS_EN_ALBARANES[NRO_ALBARAN = :NRO_ALBARAN]
...
QRES.S_CUOTA_TOTAL
Con **paréntesis** el origen es un procedimiento seleccionable y lo de dentro
son sus parámetros, **por posición**. Con **corchetes** es una tabla y lo de
dentro son las condiciones del WHERE. Se lee la primera fila, y sus campos son
siempre de solo lectura.
=== Ejemplo: los totales del albarán, que no están en su cabecera ===
D:QRES = RESUMEN_ALB_VENTA_TOTAL3(:NRO_ALBARAN)
P:Totales
C1:50%
QRES.S_BASE_TOTAL
QRES.S_CUOTA_TOTAL
QRES.S_TOTAL
=== Ejemplo: el último tenedor de la máquina, en el parte de avería ===
D:SIT = SITUACION_ACTIVO_A_FECHA(:COD_PRODUCTO, :NRO_SERIE, :FECHA_PARTE)
P:Último tenedor
C1:50%
SIT.S_TIPO_TERCERO
SIT.S_COD_TERCERO
SIT.S_COD_OBRA
C2:50%
SIT.S_FECHA_INI
SIT.S_FECHA_FIN
SIT.S_DIAS_NATURALES
El procedimiento recibe tres campos de la propia cabecera, así que la pestaña
se rellena sola en cuanto la ficha sabe de qué máquina habla.
===== R: las pestañas del panel inferior =====
Cada ''R:'' es una pestaña de la parte de abajo de la ficha: las tablas hijas y
las consultas del documento. Se añaden a las que la pantalla traiga de código
—las líneas de un albarán no son configurables: un albarán sin líneas no es
nada— y salen en el orden en que se declaran.
R:Unidades = UDS_EQUIV_PRODUCTO
R:Ubicaciones = UBICACION_PRODUCTO [COD_ALMACEN = :COD_ALMACEN] orden=COD_ALMACEN
R:Extracto = EXTRACTO_TERCERO(P_COD_TERC = :CODIGO, ?P_FEC_INI = HOY-3A)
* **Corchetes**: filtran la rejilla. Sin ellos manda el filtro que pase la ficha (el número del albarán, el código del producto…), que es lo normal.
* **Paréntesis**: el origen es un procedimiento y la pestaña enseña su consulta. Dentro van los parámetros que se fijan, **por nombre**; los que no se nombren quedan a mano del usuario en la barra de filtros.
==== Modificadores de las rejillas de tabla ====
^ Modificador ^ Qué hace ^
| ''alta=modal'' | el alta abre el diálogo de registro nuevo (por defecto) |
| ''alta=none'' | la pestaña no deja dar de alta |
| ''alta=maximo(CAMPO, incremento)'' | numera sola la fila nueva: máximo + incremento (10000 si no se dice) |
| ''alta=generador(PROC, P_UNO = valor…)'' | el número lo da un procedimiento |
| ''alta=proceso(PROC, P_UNO = valor…)'' | el botón «Nueva» ejecuta el procedimiento y recarga; solo tiene sentido con ''modo=lista'' |
| ''borrado=delete'' | el borrado borra la fila |
| ''borrado=anular(CAMPO)'' | el borrado pone ese campo a nulo |
| ''modo=edicion'' | se teclea sobre la propia rejilla (por defecto) |
| ''modo=lista'' | no se edita en línea; el doble clic abre la ficha de la fila |
| ''modo=memo'' | no hay rejilla: es el texto libre que la tabla guarda en una única fila por registro |
| ''campo=CAMPO'' | el campo que edita ''modo=memo'' (por defecto, ''COMENTARIO'') |
| ''orden=CAMPO'' | por qué campo se ordenan las filas |
| ''totales=CAMPO1;CAMPO2'' | columnas que llevan fila de totales |
| ''n=si'' | la pestaña enseña en un chip cuántas filas tiene |
''n=si'' es un ''COUNT'' más al abrir el grupo de pestañas: se pone donde
el número compense.
==== Modificadores de las rejillas de procedimiento ====
^ Modificador ^ Qué hace ^
| ''visibles=P_UNO;P_DOS'' | los únicos parámetros que se enseñan; los demás van fijos |
| ''ocultas=CAMPO1;CAMPO2'' | columnas del resultado que no se enseñan |
| ''totales=si'' | fila de totales de la consulta, que calcula el servidor |
==== Ejemplos de rejillas de tabla ====
Líneas que se numeran solas, de diez en diez mil o de una en una:
R:Productos = PRODUCTO_TERCERO alta=maximo(NRO_LINEA, 1)
R:Productos complementarios = PROD_COMPLEMEN_PROD alta=maximo(NRO_LINEA)
Una tabla hija cuyo número lo da un generador de la base de datos:
R:Obras = OBRA_TERCERO modo=lista alta=generador(GEN_NRO_OBRA)
R:Documentación = DOC_PERFIL [COD_PRODUCTO = :CODIGO] modo=lista
alta=generador(GEN_NRO_DOCUMENTO, P_FECHA = HOY, P_SIM = SIMULACION)
Documentos de otra tabla que cuelgan de esta ficha, para mirar y no para
teclear (''modo=lista'' abre la ficha con doble clic; ''alta=none'' quita el
botón de nueva fila):
R:Ofertas = CAB_OFERTA_VENTA [TIPO_TERCERO = :TIPO, COD_TERCERO = :CODIGO]
modo=lista alta=none
R:Partes de avería = CAB_PARTE_AVERIA [TIPO_TERC_ALB = :TIPO,
COD_TERC_ALB = :CODIGO, CERRADO = 'N'] modo=lista alta=none
Fíjese en el ''CERRADO = 'N''': un filtro no tiene por qué apuntar a un campo
de la ficha; puede ser un literal, y así la pestaña enseña solo los partes
abiertos.
Una fila que crea el sistema, no el usuario: el botón «Nueva» ejecuta un
procedimiento y recarga la pestaña.
R:Ficha de crédito y caución = CLIENTE_CREDITO_CAUCION [CIF_NIF = :CIF_NIF]
modo=lista alta=proceso(CREA_CYC_DESDE_CL, P_TIPO_TERCERO = :TIPO,
P_COD_TERCERO = :CODIGO)
El comentario libre del cliente, que vive en otra tabla con una única fila por
tercero y se edita como un texto y no como una rejilla:
R:Comentario libre = COMENTARIO_TERCERO modo=memo campo=COMENTARIO
Y una pestaña que además dice cuántas filas tiene, ordenada por almacén:
R:Ubicaciones = UBICACION_PRODUCTO [COD_ALMACEN = :COD_ALMACEN]
orden=COD_ALMACEN n=si
==== Ejemplos de rejillas de consulta ====
El extracto del cliente, con dos fechas que el usuario puede cambiar y las
columnas técnicas escondidas:
R:Extracto = EXTRACTO_TERCERO(P_TIPO_TERC = :TIPO, P_COD_TERC = :CODIGO,
P_NRO_FACTURA = NULL, ?P_FEC_INI = HOY-3A, ?P_FEC_FIN = HOY)
ocultas=TIPO_TERCERO;COD_TERCERO;S_TIPO_TERCERO;S_COD_TERCERO
Los cobros pendientes a una fecha, con fila de totales y con un único parámetro
a la vista:
R:Cobros pendientes = COBROS_PENDIENTES(P_TODO = 'S', P_TIPO_TERCERO = :TIPO,
P_COD_TERCERO = :CODIGO, ?P_FECHA = FIN_ANO)
visibles=P_FECHA totales=si
Cada rejilla va en **una sola línea**; en la página se han
partido para que quepan.
===== G: grupos de pestañas =====
Cuando las pestañas son muchas, ''G:'' las reparte: cada ''R:'' cae en el grupo
que abrió el último ''G:'', y el panel enseña una fila con los grupos y, debajo,
solo las pestañas del que esté elegido.
G:Tablas
R:Direcciones = DIRECCION_TERCERO
G:Consultas
R:Extracto = EXTRACTO_TERCERO(P_COD_TERC = :CODIGO)
=== Ejemplo: los grupos de la ficha de cliente ===
G:Consultas
R:Extracto = EXTRACTO_TERCERO(P_TIPO_TERC = :TIPO, P_COD_TERC = :CODIGO)
R:Cobros pendientes = COBROS_PENDIENTES(P_TODO = 'S', ?P_FECHA = FIN_ANO)
G:Tablas
R:Bancos = BANCO_TERCERO
R:Obras = OBRA_TERCERO modo=lista alta=generador(GEN_NRO_OBRA)
R:Comentario libre = COMENTARIO_TERCERO modo=memo campo=COMENTARIO
Las ''R:'' anteriores al primer ''G:'' se quedan sin grupo y caen en //Detalles//,
que es donde van también las pestañas que la ficha trae de código. Un layout
que no declare ningún grupo sigue enseñando la barra de pestañas de siempre.
===== A: las opciones del menú =====
Cada ''A:'' es una opción del menú desplegable de la ficha (el botón de la
flecha, arriba a la derecha). Salen en el orden en que se declaran y **delante**
de las que ofrecen todas las fichas —Eliminar, Copiar url, Color de fondo y
Volver—, de las que las separa una línea horizontal.
A:título = destino modificadores
==== El destino ====
^ Se escribe ^ Qué hace ^
| ''PROC(args)'' | ejecuta el procedimiento (''EXECUTE PROCEDURE''); los argumentos van **por posición** |
| ''TABLA[filtros]'' | lleva a la pestaña del panel inferior que enseña esa tabla; si el layout no la trae, abre su listado con los filtros puestos |
| ''@metodo'' | llama a un método de la propia pantalla, para lo que no se puede declarar |
El ''@metodo'' es la válvula de escape: hay opciones cuya lógica no cabe en una
línea de texto —la que encadena tres procedimientos mirando lo que devuelve
cada uno, la que abre un diálogo propio para elegir una máquina—. Esas siguen
en el programa, pero **el layout manda igualmente** en su texto, su icono, su
sitio en el menú y su tecla. Los nombres de método que admite cada pantalla los
publica esa pantalla.
==== Los modificadores ====
^ Modificador ^ Qué hace ^
| ''icono=cash-outline'' | icono de la opción, de los que la aplicación sabe pintar; el que no esté sale sin icono |
| ''tecla=F11'' | atajo de teclado de la ficha |
| ''pregunta="¿Facturar el parte :NRO?"'' | pide confirmación antes de hacer nada; sin él, no pregunta |
| ''boton="Facturar"'' | texto del botón que confirma (por defecto, «Aceptar») |
| ''si=CONFIRMADO<>S'' | la opción solo sale si el campo de la cabecera cumple; admite ''='' y ''<>'', y varias condiciones se cumplen todas |
| ''modo=consulta'' | no ejecuta el procedimiento: abre su consulta, que es como se piden los informes |
| ''modo=proceso'' | abre la pantalla de ejecutar procesos con los parámetros declarados fijos y el resto a mano del usuario |
| ''proc=PROC(args)'' | procedimiento que se ejecuta **antes** del destino; se puede repetir, y corren en el orden en que se declaran |
| ''tras=…'' | qué hacer al terminar (ver debajo) |
En los textos de ''pregunta='' y ''aviso('')'' se escribe '':CAMPO'' para meter el
valor del campo de la cabecera.
==== tras=: qué pasa al terminar ====
Varias cosas separadas por punto y coma, y en ese orden:
^ Se escribe ^ Qué hace ^
| ''refrescar'' | relee la cabecera de la ficha |
| ''pestana(TABLA)'' | lleva a la pestaña del panel que enseña esa tabla (y abre el panel si estaba recogido) |
| ''abrir(TABLA, CAMPO_PK)'' | abre la ficha del documento que acaba de salir |
| ''aviso("Se ha creado :SALIDA")'' | lo cuenta en un diálogo |
| ''volver'' | cierra la ficha |
''abrir'' y ''aviso'' miran la **primera salida** del procedimiento —los de este
sistema devuelven el número del documento que crean, o nada—, que en los textos
se escribe '':SALIDA''. Si no hay salida no se abre ni se avisa: el
procedimiento no llegó a crear nada.
==== Ejemplo: el menú del parte de avería ====
A:Confirmar F11 = @confirmar icono=checkmark-circle-outline tecla=F11
A:Facturar avería = FACTURAR_AVERIA(:NRO) icono=cash-outline
pregunta="¿Facturar el parte :NRO?" boton="Facturar"
tras=refrescar;abrir(CAB_FACTURA_VENTA, NRO_FACTURA)
A:Imprimir F8 = IMPRES_PARTE_AVERIA(P_NRO_PARTE = :NRO) modo=consulta
icono=print-outline tecla=F8
A:Generar albaranes F10 = CAB_ALBARAN_VENTA[NRO_PARTE_AVERIA = :NRO]
proc=GEN_ALBARANES_AVERIA(:NRO) proc=GEN_ALBARANES_AVERIA_COMPRA(:NRO)
icono=receipt-outline tecla=F10
A:Asignar terminal = PCO_ADD_AVERIA_CARTERA(P_NRO_PARTE = :NRO) modo=proceso
icono=phone-portrait-outline
Cada opción va en **una sola línea**; aquí se han partido para
que quepan en la página.
Mientras un layout no declare ninguna ''A:'', la ficha enseña el menú que
trae de código. Es lo que permite ir pasando las pantallas al layout de una en
una, sin que ninguna se quede por el camino sin opciones.
==== Más ejemplos de opciones ====
**Ejecutar un procedimiento y contar lo que ha hecho.** Si no ha creado nada,
no dice nada:
A:Confirmar (albarán compra) = CONFIRM_PARTE_AVERIA_COMPRA(:NRO, HOY)
icono=cart-outline pregunta="¿Confirmar el parte :NRO en albarán de compra?"
boton="Confirmar"
tras=refrescar;aviso("Se ha generado el albarán de compra :SALIDA.")
**Cerrar algo y llevar a la pestaña donde se ve el resultado:**
A:Cerrar presupuesto = CIERRA_AVERIA_PPTO(:NRO, NULL)
icono=lock-closed-outline pregunta="¿Cerrar el presupuesto de la avería :NRO?"
boton="Cerrar" tras=refrescar;pestana(CAB_OFERTA_VENTA)
**Generar primero y enseñar después.** Los dos ''proc='' corren en orden y luego
se abre la pestaña de los albaranes (o su listado, si esta instalación no la
tiene en el panel):
A:Generar albaranes F10 = CAB_ALBARAN_VENTA[NRO_PARTE_AVERIA = :NRO]
proc=GEN_ALBARANES_AVERIA(:NRO) proc=GEN_ALBARANES_AVERIA_COMPRA(:NRO)
icono=receipt-outline tecla=F10
**Una misma opción con dos caras**, según cómo esté el registro. Son dos líneas
que nunca salen a la vez:
A:Confirmar F11 = CONFIRM_ALB_VENTA(:NRO_ALBARAN) si=CONFIRMADO<>S
tecla=F11 icono=checkmark-circle-outline
pregunta="¿Confirmar el albarán :NRO_ALBARAN?" boton="Confirmar"
tras=refrescar
A:Desconfirmar F11 = CONFIRM_ALB_VENTA_DESHACER(:NRO_ALBARAN) si=CONFIRMADO=S
tecla=F11 icono=close-circle-outline
pregunta="¿Desconfirmar el albarán :NRO_ALBARAN?" boton="Desconfirmar"
tras=refrescar
**Un informe**, que no es más que una consulta con sus parámetros puestos:
A:Imprimir F8 = IMPRES_PARTE_AVERIA(P_NRO_PARTE = :NRO) modo=consulta
icono=print-outline tecla=F8
**Un proceso que el usuario termina de rellenar.** Lo declarado va fijo y lo
demás lo pide la pantalla de procesos:
A:Asignar terminal = PCO_ADD_AVERIA_CARTERA(P_NRO_PARTE = :NRO) modo=proceso
icono=phone-portrait-outline
**Un listado de otra tabla acotado a esta ficha**, sin procedimiento de por
medio:
A:Ver sus facturas = CAB_FACTURA_VENTA[TIPO_TERCERO = :TIPO,
COD_TERCERO = :CODIGO] icono=document-text-outline
**Algo que hay que hacer en el programa**, con el layout decidiendo dónde va y
cómo se llama:
A:Escoger máquina = @escogerMaquina icono=cube-outline
===== Recetas =====
^ Lo que se quiere ^ Cómo se escribe ^
| Que un campo se vea pero no se toque | ''-FECHA_ALTA'' |
| Dos campos en la misma línea | ''TIPO_TERCERO, COD_TERCERO'' |
| Un cuadro grande para escribir | ''+OBSERVACIONES(300%, 100%)'' |
| Un dato que no está en la tabla de la ficha | un ''D:'' y luego ''ALIAS.CAMPO'' |
| Una pestaña con las líneas de una tabla hija | ''R:Título = TABLA alta=maximo(NRO_LINEA)'' |
| Una pestaña de documentos que se abren, no se teclean | ''R:Título = TABLA [FILTRO = :CAMPO] modo=lista'' |
| Que esa pestaña no deje añadir | ''alta=none'' |
| Una consulta con fechas que el usuario cambie | ''R:Título = PROC(?P_FEC_INI = HOY-3A, ?P_FEC_FIN = HOY)'' |
| Esconder columnas técnicas de una consulta | ''ocultas=CAMPO1;CAMPO2'' |
| Saber cuántas filas tiene una pestaña sin abrirla | ''n=si'' |
| Ordenar las pestañas en dos filas | ''G:Tablas'' y ''G:Consultas'' |
| Una opción que ejecute un proceso y pregunte antes | ''A:Título = PROC(:CAMPO) pregunta="¿…?"'' |
| Que además abra el documento creado | ''tras=abrir(TABLA, CAMPO_PK)'' |
| Que además recargue la ficha | ''tras=refrescar'' |
| Una opción solo para los registros sin cerrar | ''si=CERRADO<>S'' |
| Quitarle a una instalación una opción o una pestaña | borrar esa línea de **su** fila de ''PWA_FORMS'' |
===== Un layout completo, en pequeño =====
D:SIT = SITUACION_ACTIVO_A_FECHA(:COD_PRODUCTO, :NRO_SERIE, :FECHA_PARTE)
P:General
C1:50%
NRO
DESCRIPCION
COD_PRODUCTO, NRO_SERIE
C2:50%
FECHA_PARTE
-CERRADO, -FECHA_CIERRA
P:Último tenedor
C1:100%
SIT.S_TIPO_TERCERO
SIT.S_COD_TERCERO
P:Comentarios
C1:100%
+COMENTARIOS(300%, 100%)
G:Tablas
R:Albaranes de venta = CAB_ALBARAN_VENTA [NRO_PARTE_AVERIA = :NRO] modo=lista
G:Consultas
R:Facturas = FACTURAS_EN_AVERIA(P_NRO_PARTE = :NRO)
A:Cerrar avería = CIERRA_AVERIA(:NRO, NULL) icono=lock-closed-outline
==== El más corto que hay en producción ====
La ficha de series, entera:
P:General
C1:50%
CODIGO
DESCRIPCION
SERIE_RELACIONADA
C2:50%
SIMULACION
OMITIR_CTRL_BLOQ_ULT_FRA
Una pestaña, dos columnas, cinco campos. No hace falta más para que la ficha
funcione: sin ''R:'' no hay panel inferior, y sin ''A:'' el menú es el de
siempre.
===== Páginas relacionadas =====
* [[pwa:doc:Documentación diseño de menús en SmartPWA|Diseño del menú (PWA_MENUS)]], que se declara con la misma idea y otra sintaxis.
* [[pwa:doc:Documentación de ámbitos en SmartPWA|Ámbitos: quién ve qué]], común a formularios, menús e informes.
===== Cómo se mantiene esta página =====
Este meta-lenguaje crece: cada vez que una ficha necesita algo que no se podía
declarar, se le añade una directiva o un modificador. **La página se actualiza
en el mismo cambio**, que es la única manera de que siga sirviendo.
Lo que hay que mirar en el código, por si esta página se ha quedado atrás:
^ Qué ^ Dónde ^
| Directivas, campos, datasets y rejillas | ''projects/smart-core/src/lib/formularios/layout-cabecera.ts'' |
| Opciones del menú (''A:'') | ''projects/smart-core/src/lib/formularios/acciones-layout.ts'' |
| Valores (''%%:CAMPO%%'', ''HOY'', ''SIMULACION''…) | ''projects/smart-core/src/lib/formularios/valores-layout.ts'' |
| Ejecución de las opciones del menú | ''projects/smart-core/src/lib/servicios/acciones-layout.service.ts'' |
| Iconos que se pueden nombrar | ''projects/smart-core/src/lib/componentes/acciones-popover/iconos-acciones.ts'' |
| Ámbitos y precedencias | ''projects/smart-core/src/lib/utilidades/pwa-forms.ts'' y ''form-layout.service.ts'' |
| Layouts generales versionados | ''db/pwa_forms_layouts.sql'' |