Ver Mensaje Individual
  #12 (permalink)  
Antiguo 18/07/2014, 09:36
Avatar de gnzsoloyo
gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: Series y correlativos

Vamos a supponer que la tabla ahora es mas o menos así:

Código MySQL:
Ver original
  1. CREATE TABLE `comprobante` (
  2.   `id_comprobante` INT UNSIGNED NOT NULL,
  3.   `cod_cli` INT UNSIGNED NOT NULL,
  4.   `tipo` varchar(45) NOT NULL,
  5.   `serie` INT UNSIGNED NOT NULL,
  6.   `correlativo` INT UNSIGNED NOT NULL,
  7.   `ruc_cli` varchar(11) NOT NULL,
  8.   `sub_total` DECIMAL(14, 3) NOT NULL,
  9.   `igv` DECIMAL(14, 3) NOT NULL,
  10.   `total` DECIMAL(14, 3) NOT NULL,
  11.   `fec_comp` DATE NOT NULL,
  12.   `est_compro` varchar(1) NOT NULL,
  13.   `cod_user` INT UNSIGNED NOT NULL,
  14.   PRIMARY KEY (`id_comprobante`),
  15.   KEY `xcodCli_idx` (`cod_cli`),
  16.   KEY `xcod_user_idx` (`cod_user`),
  17.   CONSTRAINT `xcodCli` FOREIGN KEY (`cod_cli`) REFERENCES `cliente` (`cod_cli`) ON DELETE NO ACTION ON UPDATE NO ACTION,
  18.   CONSTRAINT `xcod_user` FOREIGN KEY (`cod_user`) REFERENCES `usuario` (`cod_user`) ON DELETE CASCADE ON UPDATE CASCADE

Suponiendo que todo se hace en la misma tabla, y partiendo de la base que ID_COMPROBANTE se ingresa manualmente (programáticamente), el SP que ingrese un registro debería ser algo como:
Código SQL:
Ver original
  1. CREATE PROCEDURE insertarnuevo(
  2. IN Vid_comprobante INT,
  3. IN Vcod_cli INT,
  4. IN Vtipo VARCHAR(45),
  5. IN Vserie INT,
  6. IN Vruc_cli VARCHAR(11),
  7. IN Vsub_total DECIMAL(14, 3),
  8. IN Vigv DECIMAL(14, 3),
  9. IN Vtotal DECIMAL(14, 3),
  10. IN Vfec_comp DATE,
  11. IN Vest_compro VARCHAR(1),
  12. IN Vcod_user INT)
  13. BEGIN
  14.   DECLARE Vcorrelativo INT UNSIGNED;
  15.   SET Vcorrelativo = 0;
  16.   IF (SELECT serie FROM comprobante WHERE serie = Vserie) > 0 THEN
  17.      SELECT MAX(correlativo)
  18.      FROM comprobante
  19.      WHERE serie = Vserie
  20.      INTO Vcorrelativo;
  21.      SET Vcorrelativo = Vcorrelativo + 1;
  22.   ELSE
  23.     IF Vserie = 0 THEN
  24.     SELECT MAX(serie)
  25.     FROM comprobante
  26.     INTO Vserie;
  27.     SET Vserie = Vserie + 1;
  28.   END IF;
  29.  
  30.   INSERT INTO comprobante
  31.   VALUES(IN Vid_comprobante, Vcod_cli, Vtipo, Vserie, Vcorrelativo, Vruc_cli, Vsub_total, Vigv, Vtotal, Vfec_comp,
  32.          Vest_compro, Vcod_user);
  33.   SELECT CONCAT(LPAD(Vserie, 6, '0'), '-', LPAD(Vcorrelativo, 6, '0')) serial;
  34. END
La idea es, además, que te devuelva el serial ya formateado como '000000-000000'.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)