Ver Mensaje Individual
  #6 (permalink)  
Antiguo 04/05/2014, 20:07
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: Auto-Incrementar Campos en Mysql

Cita:
Iniciado por josueruiz91 Ver Mensaje
Intenté hacerlo a través de un procedimiento almacenado. Nunca había trabajado con algunos. Puedes decirme donde tengo el error? Asi tal cual no me funciona

DROP PROCEDURE IF EXISTS sp_autoincremento;
//
CREATE PROCEDURE sp_autoincremento()
BEGIN
if(exists(select libro,folio,boleta from biblioteca)) them
if(exists(select boleta from bautizo where mod(boleta,2)=0)) them
update bautizo set folio=folio+1;
if(exists(select boleta from bautizo where boleta=6)) them
update bautizo set boleta=1,folio=1,libro=libro+1;
else
update bautizo set boleta=boleta+1;
endif;
else
insert into bautizo(libro,folio,boleta) values(1,1,1);
endif;
END
//
Tienes más de un error, además de que estás planteando una solución sin analizarla previamente, lo que sólo te llevará a complicaciones.
1) No es THEM ("ellos"), sino THEN ("entonces").
2) No es ENDIF, sino END IF.
3) Tienes un IF sin cerrar al final.
4) No debes actualizar numeraciones, sino insertar registros nuevos. Esto me lleva a pensar que no está correctamente diseñado el modelo de datos.

Lo primero sería tratar de crear el algorimo que debería cumplirlo que quieres. Y eso se hace simplemente razonando lo que describes.
Debes:
1) Validar si existe el Libro (por consecuencia el prototipo del SP debería recibir al menos UN parámetro).
2) Si existe el libro: Validar cuál es el máximo de Boleta y del Folio para ese Libro.
2.3. Si Boleta < 3
2.3.1. Si Folio < 9 y es múltiplo de 3, sumar 1 a Boleta.
2.3.2. Sumar 1 a Folio.
3) Si no existe el Libro:
3.1. Dar de alta el Libro, la Boleta 1 y el Folio 1.

Un bosquejo de la idea, suponiendo que existen tres tablas (Libro, Biblioteca y Folio) sería mas o menos:
Código MySQL:
Ver original
  1. DELIMITER $$
  2. DROP PROCEDURE IF EXISTS sp_autoincremento$$
  3.  
  4. CREATE PROCEDURE sp_autoincremento(IN vlibro INT)
  5. /*
  6. 1) Validar si existe el Libro (por consecuencia el prototipo del SP debería recibir al menos UN parámetro).
  7. 2) Si existe el libro: Validar cuál es el máximo de Boleta y del Folio para ese Libro.
  8. 2.3. Si Boleta < 3
  9. 2.3.1. Si Folio < 9 y es múltiplo de 3, sumar 1 a Boleta.
  10. 2.3.2. Sumar 1 a Folio.
  11. 3) Si no existe el Libro:
  12. 3.1. Dar de alta el Libro, la Boleta 1 y el Folio 1.
  13.  
  14. */
  15.     DECLARE v_libro INT;
  16.     DECLARE v_boleta INT;
  17.     DECLARE v_folio INT;
  18.  
  19.  
  20.     IF (SELECT COUNT(*) FROM biblioteca WHERE libro = vlibro) > 0 THEN
  21.     SELECT libro
  22.     FROM biblioteca
  23.     WHERE libro = vlibro
  24.  
  25.     INTO V_LIBRO;
  26.         SELECT MAX(boleta)
  27.         FROM bautizo
  28.         WHERE libro = v_libro
  29.         INTO V_BOLETA;
  30.  
  31.         SELECT MAX(folio)
  32.         FROM folios
  33.         WHERE libro = v_libro AND boleta = v_boleta
  34.         INTO V_FOLIO;
  35.         IF vBoleta < 3 THEN
  36.             IF ((v_folio DIV 3) * 3) = v_folio THEN
  37.                 SET v_boleta = v_boleta + 1;
  38.                 INSERT INTO bautizo(libro, boleta) VALUES (v_libro, v_boleta);
  39.             END IF;
  40.             SET v_folio = v_folio + 1;
  41.             INSERT INTO folios(libro, boleta, folio) VALUES(v_libro, v_boleta, v_folio);
  42.         ELSE
  43.             IF ((v_folio DIV 3) * 3) = v_folio THEN
  44.                 SET v_libro = v_libro + 1;
  45.                 SET v_boleta = 1;
  46.                 SET v_folio = 1;
  47.             else
  48.                 SET v_libro = v_libro + 1;
  49.                 SET v_boleta = v_boleta + 1;
  50.                 SET v_folio = v_folio + 1;
  51.             END IF;
  52.             INSERT INTO folios(libro, boleta, folio) VALUES(v_libro, v_boleta, v_folio);
  53.         END IF;
  54.    
  55.     ELSE
  56.         SELECT MAX(libro)
  57.         FROM biblioteca
  58.         WHERE libro = vlibro
  59.         INTO V_LIBRO;
  60.         IF v_libro IS NULL THEN
  61.             SET v_libro = 1;
  62.         ELSE
  63.             SET v_libro = v_libro + 1;
  64.         END IF;
  65.  
  66.         INSERT INTO bautizo(libro) VALUES(v_libro);
  67.         INSERT INTO biblioteca(libro, boleta) VALUES(v_libro, 1);
  68.         INSERT INTO folios(libro, boleta, folio) VALUES(v_libro, 1, 1);
  69.     END IF;
  70. END$$
Esto es nada más que una aproximación, a la que hay que probar. La estoy bosquejando a vuelo de pájaro, por lo que peude tener errores.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)