Campos de uso opcional

EXPSAN.odb

Hola de nuevo. Espero que sea la última pregunta.

Es todo relacionado con mis preguntas anteriores. Hay cosas que he podido solucionar, pero otras no. He podido trabajarlo esta mañana. Cosa que no pude hacer la semana pasada.

Tengo una tabla de infracciones, identificadas por un código, además de por el campo clave primaria (ID_Infraccion). Tienen un código identificativo numérico. Como he dicho anteriormente, la infracción a veces está especificada en otra norma.

La INFRACCION tiene una norma principal asociada. Pero a veces, algunos artículos están asociados a otra norma.

La cuestión es que quiero saber cómo se puede sacar el nombre de la norma. Porque para la principal vale, está el campo Nombre_Norma_Super_Largo de NORMA, pero en INFRACCION hay varias normas referenciadas. Y claro, ya no se puede hacer.

EXPEDIENTE-SANCIONADOR es la tabla donde realmente se usarían todos esos datos.

¿Se puede hacer con macros? ¿O con procedimientos almacenados? De eso, no sé nada. He intentado saber algo de ello, pero no me aclaro.

Os dejo hasta el código.

CREATE TABLE “EXPEDIENTE-SANCIONADOR” (“ID_Expediente” INT GENERATED BY DEFAULT AS IDENTITY
(START WITH 1, INCREMENT BY 1) PRIMARY KEY,
“Ejercicio” INT NOT NULL,
“Expediente” INT NOT NULL,
“Identificador_Denuncia” VARCHAR(30) NOT NULL,
“Motivo_Denuncia” INT NOT NULL,
“Norma_Infringida” INT NOT NULL,
“Descripcion_Ampliacion” VARCHAR(3000),
“Nombre_Apellidos_Infractor” VARCHAR(100) NOT NULL,
CONSTRAINT “uc_expediente” UNIQUE (“Expediente”));

CREATE TABLE “NORMA”
(“ID_Norma” INT GENERATED BY DEFAULT AS IDENTITY
(START WITH 1, INCREMENT BY 1) PRIMARY KEY,
“Nombre_Norma_Super_Largo” VARCHAR(400) NOT NULL
);

CREATE TABLE “INFRACCION”
(“ID_Infraccion” INT GENERATED BY DEFAULT AS IDENTITY
(START WITH 1, INCREMENT BY 1) PRIMARY KEY,
“Codigo_Infraccion” INT NOT NULL,
“Hecho_Denunciado” VARCHAR(200) NOT NULL,
“ID_Norma” INT NOT NULL,
“Art_Infringido” VARCHAR(300) NOT NULL,
“Texto_Articulo_Infringido” VARCHAR(3000) NOT NULL,
“Norma_Secundaria_Art_Infringido” INT,
“Articulo_Calificacion” VARCHAR(300) NOT NULL,
“Calificacion” INT NOT NULL,
“Norma_Secundaria_Art_Calificacion” INT,
CONSTRAINT “uc_codigo_infraccion” UNIQUE (“Codigo_Infraccion”)
);

ALTER TABLE “INFRACCION” ADD FOREIGN KEY (“ID_Norma”) REFERENCES “NORMA”(“ID_Norma”);

ALTER TABLE “INFRACCION” ADD FOREIGN KEY (“Norma_Secundaria_Art_Infringido”) REFERENCES “NORMA”(“ID_Norma”);

ALTER TABLE “INFRACCION” ADD FOREIGN KEY (“Norma_Secundaria_Art_Calificacion”) REFERENCES “NORMA”(“ID_Norma”);

ALTER TABLE “EXPEDIENTE-SANCIONADOR” ADD FOREIGN KEY (“Motivo_Denuncia”) REFERENCES “INFRACCION”(“ID_Infraccion”);

ALTER TABLE “EXPEDIENTE-SANCIONADOR” ADD FOREIGN KEY (“Norma_Infringida”) REFERENCES “NORMA”(“ID_Norma”);

CONSULTA1:

SELECT
“INFRACCION”.“ID_Norma”,
“INFRACCION”.“Norma_Secundaria_Art_Infringido”,
“INFRACCION”.“Norma_Secundaria_Art_Calificacion”,

“NORMA”.“Nombre_Norma_Super_Largo”
FROM “EXPEDIENTE-SANCIONADOR”,“INFRACCION”,“NORMA”
WHERE
“NORMA”.“ID_Norma” = “EXPEDIENTE-SANCIONADOR”.“Norma_Infringida” AND

“EXPEDIENTE-SANCIONADOR”.“Motivo_Denuncia” = “INFRACCION”.“ID_Norma”

No usado de momento

Casewhen( “INFRACCION”.“Norma_Secundaria_Art_Infringido” IS NOT NULL, “INFRACCION”.“Norma_Secundaria_Art_Infringido”
, “NORMA”.“Nombre_Norma_Super_Largo” ) “Ley_Secundaria_Art_Infringido”,

“NORMA”.“ID_Norma” = “INFRACCION”.“Norma_Secundaria_Art_Infringido” AND
“NORMA”.“ID_Norma” = “INFRACCION”.“Norma_Secundaria_Art_Calificacion” AND

Yo creo que antes de liarte con macros y cosas de esas, debes hacer un buen diseño, bien meditado, de las tablas que necesita tu base de datos y las relaciones que tiene que haber entre ellas. El diseño hay que hacerlo de tal manera que ninguna información se repita en más de una tabla.
Por ejemplo, yo entiendo que en un expediente sancionador se pueden cometer muchas infracciones, pero según tu diseño esto no está reflejado (yo lo he hecho con una tabla intermedia, que permite añadir muchas infracciones a cada expediente y permite que la infracción se pueda unir a muchos expedientes) ¿quizá es lo que pretendes con los campos normas secundarias?
Si lo que pretendes es que una infracción esté cubierta por varias normas, lo que tienes que hacer es sacar las normas a otra tabla (y así podrás tener infinitas normas “secundarias” en cada infracción.
Si el hecho denunciado está en el expediente no debe estar en la infracción, que valdrá para varios hechos denunciados, porque claro, yo entiendo que se puede denunciar una hecho y se abre un expediente, pero la infracción no es propia de ese hecho (y de ese expediente)
Resumiendo, si haces un buen diseño de las tablas y las relaciones, seguramente no necesitarás muchas macros ni cosas especiales, todo se podrá hacer de manera sencilla con formularios y poco más. Te adjunto una imagen de como (sin conocer el caso en profundidad, claro) veo yo el diseño de partida. Por cierto, aunque no lo he hecho en mi diseño, por claridad, sería mejor reducir el nombre de las tablas.

Hola, he intentado entrar para comentar tu solución. Pero no sé por qué no puedo entrar en el foro, con mi contraseña. Lo intentaré mañana desde el ordenador del trabajo.

Te agradezco tu respuesta. Aunque hay parte del diseño en el que me he visto obligado (por mi jefe) a hacerlo así, (una desnomalización, sobre todo la tabla de infracciones). Mañana la veré tu diseño en profundidad, aunque ya me queda poco de contrato, solo eran seis meses. En realidad, he tenido que aprender Base a marchas forzadas.

Saludos y muchas gracias.
Salvador.

De hecho, cada expediente sancionador tiene varias resoluciones asociadas, pero no necesito varios expedientes sancionadores por resolución. Por eso está hecho así.

Saludos de nuevo.
Salvador.

Me es imposible entrar. Mis datos de entrada son:

salvi992@gmail.com

BjZ65Rb9

No hay forma de entrar …

¿Me podéis ayudar?

Saludos.
Salvador.

Había leído que está semana de agosto había una migración de servidor. Espero que sea eso.

Saludos.
Salvador.

EXPESANC.odb (18.3 KB)