problema en diseño de tablas contable y Error de Foreign key – javascript mysql base-de-datos

Pregunta:


Buenas noches

Estoy haciendo un sistema contable y debo guardar una declaracion contable que puede tener N cargos y N abonos (hay catalogos de ambas cosas), al crear los foreigh key de la tabla declaracion, me marca error al querer apuntar a dichos catalogos. ¿Cómo los puedo relacionar?

Por otro lado ¿Cómo puedo guardar y relacionar N cargos y N abonos que se relacionan entre si y que cambian en cada declaracion?

Es decir, en la imagen ponen un ejemplo de una declaracion, pero en la realidad, un abono puede ser pagado con N cargos y puede haber N abonos. Pensaba hacerlo en una sola tabla pero no me queda.

Agrego el codigo mysql de la tabla:

CREATE TABLE SDC.declaracion (
    idDecl INT AUTO_INCREMENT,
    operacion NUMERIC(14) NOT NULL,
    numCaso NUMERIC(14) NOT NULL,
    idCargo1 varchar(6),
    impCargo1 NUMERIC(10),
    idAbono1 varchar(6),
    impAbono1 NUMERIC(10),
    idCargo2 varchar(6),
    impCargo2 NUMERIC(10),
    idAbono2 varchar(6),
    impAbono2 NUMERIC(10), 

    CONSTRAINT pkIdDecl
    PRIMARY KEY(idDecl,operacion, numCaso), 

    CONSTRAINT fk_declaracion_cargo
    FOREIGN KEY (idCargo1)
    REFERENCES cargo(idCargo),

    CONSTRAINT fk_declaracion_abono
    FOREIGN KEY (idAbono1)
    REFERENCES abono(idAbono)
);

CREATE TABLE SDC.abono (
	idAbono NUMERIC(6),
	conceptoAbono VARCHAR (100),

	CONSTRAINT pkIdAbono
	PRIMARY KEY(idAbono));

CREATE TABLE SDC.cargo (
	idCargo NUMERIC(6),
	conceptoCargo VARCHAR (100),

	CONSTRAINT pkIdCargo
	PRIMARY KEY(idCargo));
 

Este es un ejemplo de lo que va a contener el catálogo de abonos

Este es un ejemplo de lo que va a contener el catálogo de cargos

introducir la descripción de la imagen aquí

Preguntado por: Angela_Gossow

Lo resolví así, espero que mi modelado esté bien.

Actualización:

Debido a que un cargo puede tener varios abonos, es necesario agregar una llave en la tabla de abonos, que indique a que cargo pertenece. Igualmente, existe una relación de 1 a 1 entre los cargos / conceptos y abonos, por lo que he agregado una tabla adicional conceptos en donde podrás registrar el nombre del concepto y el tipo del concepto (tipos de ejemplo, cargos, abonos, etc)….

introducir la descripción de la imagen aquí

CREATE TABLE IF NOT EXISTS `db_1`.`declaracion` (
  `idDecl` INT(11) NOT NULL AUTO_INCREMENT,
  `operacion` DECIMAL(10,0) NULL DEFAULT NULL,
  `numCaso` DECIMAL(10,0) NULL DEFAULT NULL,
  PRIMARY KEY (`idDecl`));

CREATE TABLE IF NOT EXISTS `db_1`.`cargo` (
  `idCargo` INT(11) NOT NULL AUTO_INCREMENT,
  `idDecl` INT(11) NULL DEFAULT NULL,
  `idConcepto` INT NULL,
  `Subtotal` DECIMAL(20,5) NULL DEFAULT NULL,
  `Impuestos` DECIMAL(20,5) NULL DEFAULT NULL,
  `Total` DECIMAL(20,5) NULL DEFAULT NULL,
  PRIMARY KEY (`idCargo`),
  INDEX `fk_cargo_decl_id_idx` (`idDecl` ASC),
  INDEX `fk_cargo_concep_id_idx` (`idConcepto` ASC),
  CONSTRAINT `fk_cargo_decl_id`
FOREIGN KEY (`idDecl`)
REFERENCES `db_1`.`declaracion` (`idDecl`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
  CONSTRAINT `fk_cargo_concep_id`
FOREIGN KEY (`idConcepto`)
REFERENCES `db_1`.`conceptos` (`idConcepto`)
ON DELETE NO ACTION
ON UPDATE NO ACTION);

CREATE TABLE IF NOT EXISTS `db_1`.`abono` (
  `idAbono` INT(11) NOT NULL AUTO_INCREMENT,
  `idDecl` INT(11) NULL DEFAULT NULL,
  `idCargo` INT NULL,
  `idConcepto` INT NULL,
  `Subtotal` DECIMAL(20,5) NULL DEFAULT NULL,
  `Impuestos` DECIMAL(20,5) NULL DEFAULT NULL,
  `Total` DECIMAL(20,5) NULL DEFAULT NULL,
  `id` VARCHAR(45) NULL,
  PRIMARY KEY (`idAbono`),
  INDEX `fk_abono_decl_id_idx` (`idDecl` ASC),
  INDEX `fk_abono_cargo_id_idx` (`idCargo` ASC),
  INDEX `fk_abono_concep_id_idx` (`idConcepto` ASC),
  CONSTRAINT `fk_abono_decl_id`
FOREIGN KEY (`idDecl`)
REFERENCES `db_1`.`declaracion` (`idDecl`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
  CONSTRAINT `fk_abono_cargo_id`
FOREIGN KEY (`idCargo`)
REFERENCES `db_1`.`cargo` (`idCargo`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
  CONSTRAINT `fk_abono_concep_id`
FOREIGN KEY (`idConcepto`)
REFERENCES `db_1`.`conceptos` (`idConcepto`)
ON DELETE NO ACTION
ON UPDATE NO ACTION);

CREATE TABLE IF NOT EXISTS `db_1`.`conceptos` (
  `idConcepto` INT NOT NULL AUTO_INCREMENT,
  `Nombre` VARCHAR(45) NULL,
  `Tipo` VARCHAR(20) NULL,
  PRIMARY KEY (`idConcepto`));

Quisiera sugerirte algunos cambios a tu script para la creación de tu
tabla y trataré de explicar el porque.

  1. En tu enunciado mencionas que una declaración puede tener N cargos y N abonos. Viendo la estructura de creación de la tabla
    declaración, estas limitado a tener sólo dos cargos y dos
    abonos (idCargo1, idCargo2, idAbono1, idAbono2). Al momento de existir tercer abono o un tercer cargo, tendrás que cambiar la
    estructura de la tabla.
  2. Para poder lograr el enunciado de tu descripción (1 declaración puede tener N cargos y abonos), deberías cambiar las estructuras de
    las tres tablas para que las tablas abonos y cargos tengan un
    ID que identifique a cual declaración pertenecen.

De esta manera, podrás tener la cantidad de abonos y cargos que sean
requeridos sin necesidad de realizar cambios en el futuro.

introducir la descripción de la imagen aquí

Fuente

Add a Comment

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *