Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

[SOLUCIONADO] Series y correlativos

Estas en el tema de Series y correlativos en el foro de Mysql en Foros del Web. hola compañeros tengo un gran problema en cuanto a hacer facturaciones, se da al tratar de hacer el numero de serie y numero correlativo, ¿como ...
  #1 (permalink)  
Antiguo 17/07/2014, 09:09
Avatar de crczyn  
Fecha de Ingreso: marzo-2010
Mensajes: 16
Antigüedad: 14 años, 8 meses
Puntos: 0
Pregunta Series y correlativos

hola compañeros tengo un gran problema en cuanto a hacer facturaciones, se da al tratar de hacer el numero de serie y numero correlativo, ¿como puedo hacerlo?
por ejemplo:

001-00001
001-12345
001-99999
002-00001
002-99999
003-11111

¿se puede hacer esta manipulación en una base de datos?, tengo que hacerlo directamente en la base de datos o es que tiene que ver más la parte de programación, ya que estoy utilizando java para ello.

un saludo. gracias
  #2 (permalink)  
Antiguo 17/07/2014, 09:12
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: Series y correlativos

A nivel de datos, se construye con dos campos, uno para el serie, y el otro para el correlativo. Luego recuperas ambos y construyes el serial completo.
Esa es la forma práctica.
Pero ni el correlativo ni el serial podrán ser auto incrementales. En todo caso lo podrías resolver completamente dentro de un stored procedure. Eso sería lo recomendable.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 17/07/2014, 09:29
Avatar de crczyn  
Fecha de Ingreso: marzo-2010
Mensajes: 16
Antigüedad: 14 años, 8 meses
Puntos: 0
Respuesta: Series y correlativos

muchas gracias por tu respuesta, podrías darme un ejemplo de como hacerlo soy nuevo todavía en mysql.
gracias
  #4 (permalink)  
Antiguo 17/07/2014, 09:32
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: Series y correlativos

Depende de cuánto conozcas de stored porcedures...
¿Has trabajado ALGO en algún otro DBMS?
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #5 (permalink)  
Antiguo 17/07/2014, 09:46
Avatar de crczyn  
Fecha de Ingreso: marzo-2010
Mensajes: 16
Antigüedad: 14 años, 8 meses
Puntos: 0
Respuesta: Series y correlativos

Estoy probando en este caso el campo correlativo esta 4 pero no incrementa +1 la serie

Código MySQL:
Ver original
  1. CASE WHEN correlativo='0000004'
  2.     THEN RIGHT(CONCAT('00',IFNULL(MAX(serie),0)+1),3)
  3.     WHEN IFNULL(MAX(Serie),0) = 0
  4.     THEN RIGHT(CONCAT('00',IFNULL(MAX(serie),0)+1),3)
  5.     ELSE MAX(Serie)
  6. END as serie,
  7. (RIGHT(CONCAT('000000',IFNULL(MAX(correlativo),0)+1),8)) as correlativo from comprobante;
[/QUOTE]

Última edición por gnzsoloyo; 17/07/2014 a las 10:17
  #6 (permalink)  
Antiguo 17/07/2014, 10:19
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: Series y correlativos

Estás entremezclando funciones numéricas con funciones de caracteres, y tratando de hacer una validación ineficiente en el SELECT (los CASE en SELECT son un espanto en MySQL).
Partamos de una base: Los números de serie y sus correlativos deben ser dos campos diferentes en la tabla.
¿Eso lo hiciste?
Muéstrame la tabla con esto:

Código MySQL:
Ver original
  1. SHOW CREATE TABLE comprobante;

..asumiendo que la tabla se llama realmente "comprobante".
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #7 (permalink)  
Antiguo 17/07/2014, 10:21
Avatar de crczyn  
Fecha de Ingreso: marzo-2010
Mensajes: 16
Antigüedad: 14 años, 8 meses
Puntos: 0
Respuesta: Series y correlativos

'id_comprobante', 'varchar(10)', 'NO', 'PRI', NULL, ''
'cod_cli', 'varchar(6)', 'NO', 'MUL', NULL, ''
'tipo', 'varchar(45)', 'NO', '', NULL, ''
'serie', 'varchar(6)', 'NO', '', NULL, ''
'correlativo', 'varchar(6)', 'NO', '', NULL, ''
'ruc_cli', 'varchar(11)', 'NO', '', NULL, ''
'sub_total', 'double', 'NO', '', NULL, ''
'igv', 'double', 'NO', '', NULL, ''
'total', 'double', 'NO', '', NULL, ''
'fec_comp', 'varchar(10)', 'NO', '', NULL, ''
'est_compro', 'varchar(1)', 'NO', '', NULL, ''
'cod_user', 'varchar(6)', 'NO', 'MUL', NULL, ''
  #8 (permalink)  
Antiguo 17/07/2014, 10:25
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: Series y correlativos

Postea lo que surja de ejecutar el código que te pasé.
No quiero una descripción de la tabla (no uses el DESCRIBE). Quiero la forma en que se crea.
El DESCRIBE omite información crítica.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #9 (permalink)  
Antiguo 17/07/2014, 10:29
Avatar de crczyn  
Fecha de Ingreso: marzo-2010
Mensajes: 16
Antigüedad: 14 años, 8 meses
Puntos: 0
Respuesta: Series y correlativos

Disculpa un error por copiarlo :D
Código Mysql:
Ver original
  1. 'comprobante', 'CREATE TABLE `comprobante` (\n  `id_comprobante` varchar(10) NOT NULL,\n  `cod_cli` varchar(6) NOT NULL,\n  `tipo` varchar(45) NOT NULL,\n  `serie` varchar(6) NOT NULL,\n  `correlativo` varchar(6) NOT NULL,\n  `ruc_cli` varchar(11) NOT NULL,\n  `sub_total` double NOT NULL,\n  `igv` double NOT NULL,\n  `total` double NOT NULL,\n  `fec_comp` varchar(10) NOT NULL,\n  `est_compro` varchar(1) NOT NULL,\n  `cod_user` varchar(6) NOT NULL,\n  PRIMARY KEY (`id_comprobante`),\n  KEY `xcodCli_idx` (`cod_cli`),\n  KEY `xcod_user_idx` (`cod_user`),\n  CONSTRAINT `xcodCli` FOREIGN KEY (`cod_cli`) REFERENCES `cliente` (`cod_cli`) ON DELETE NO ACTION ON UPDATE NO ACTION,\n  CONSTRAINT `xcod_user` FOREIGN KEY (`cod_user`) REFERENCES `usuario` (`cod_user`) ON DELETE CASCADE ON UPDATE CASCADE\n) ENGINE=InnoDB DEFAULT CHARSET=latin1'
  #10 (permalink)  
Antiguo 17/07/2014, 10:39
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: Series y correlativos

Bueno, por lo pronto, tienes más de un campo muy mal definido...
Los ID numéricos, deben ser campos INT UNSIGNED.
Los de fecha, pura y exclusivamente DATE, DATETIME o TIMESTAMP.
Los campos con valores decimales, en MySQL conviene que sean DECIMAL, no DOUBLE ni FLOAT.
Como varios campos que son FK parecieran ser usados con números, tengo la seria impresión de que el modelo completo tiene muchos errores, y francamente no sé por donde empezar a darte consejos.
Lo que si es claro es que con los campos numéricos definidos como VARCHAR, no puedes hacer nada bueno. Yo empezaría por reformar todo lo referente a la estructura de campos, y recién entonces me preocuparía por ver cómo lograr hacer los valores secuenciales que necesitas.
La verdad, pinta que tienes bastante trabajo y aprendizaje por delante.

¿Te animas a intentarlo?


Por cierto, ¿Con qué herramienta estás trabajando la base de datos?
Código MySQL:
Ver original
  1. CREATE TABLE `comprobante` (
  2.   `id_comprobante` varchar(10) NOT NULL, # < Esto está mal
  3.   `cod_cli` varchar(6) NOT NULL, # < Esto está mal, a menos que el codigo sea alfanumerico
  4.   `tipo` varchar(45) NOT NULL,
  5.   `serie` varchar(6) NOT NULL, # < Esto está mal
  6.   `correlativo` varchar(6) NOT NULL, # < Esto está mal
  7.   `ruc_cli` varchar(11) NOT NULL,
  8.   `sub_total` double NOT NULL, # < Esto está mal
  9.   `igv` double NOT NULL,
  10.   `total` double NOT NULL, # < Esto está mal, y no debería ser necesario (parece un campo calculado)
  11.   `fec_comp` varchar(10) NOT NULL, # < Esto está mal, definitivamente
  12.   `est_compro` varchar(1) NOT NULL,
  13.   `cod_user` varchar(6) NOT NULL, # < Esto está mal, a menos que el codigo sea alfanumerico
  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
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #11 (permalink)  
Antiguo 17/07/2014, 17:08
Avatar de crczyn  
Fecha de Ingreso: marzo-2010
Mensajes: 16
Antigüedad: 14 años, 8 meses
Puntos: 0
Respuesta: Series y correlativos

ya hice las modificaciones correspondientes, todavía persiste mi problema sobre series y correlativos
  #12 (permalink)  
Antiguo 18/07/2014, 09:36
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
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)

Etiquetas: series
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 13:08.