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

Procedimiento Generador de Codigos ID

Estas en el tema de Procedimiento Generador de Codigos ID en el foro de Bases de Datos General en Foros del Web. Saludos, estoy realizando un proyecto y necesito que las clavez se generen automáticamente en el servidor de base de datos, revise una de los procedimientos ...
  #1 (permalink)  
Antiguo 30/10/2008, 11:21
 
Fecha de Ingreso: octubre-2003
Ubicación: Huancayo - Peru
Mensajes: 32
Antigüedad: 20 años, 6 meses
Puntos: 0
Pregunta Procedimiento Generador de Codigos ID

Saludos, estoy realizando un proyecto y necesito que las clavez se generen automáticamente en el servidor de base de datos, revise una de los procedimientos que creé en MSSQL Server y trate de adecuarlo a MySQL, el procedimiento se crea sin errores, pero al llamarlo con:

CALL SP_NUEVROL('Elemento','Descripcion del elemento');

sale un mensaje que dice que idrol no puede ser nulo o vacio, osea que el procedimiento no esta creando el codigo o no lo esta enviando correctamente al INSERT

Que podría estar mal?

CREATE PROCEDURE SP_NUEVROL (IN nomrol VARCHAR(50), IN descrol VARCHAR(150))
BEGIN
DECLARE contador TINYINT;
DECLARE codigonuevo TINYINT;
DECLARE cadenaceros VARCHAR(3);
DECLARE contcodigo VARCHAR(3);
DECLARE ultimo VARCHAR(3);
DECLARE nuevocod VARCHAR(3);
SET nuevocod = 'R00';
SELECT contador = count(idrol) from MRoles;
IF contador = 0 THEN
SET nuevocod = 'R01';
ELSE
SELECT ultimo = MAX(idrol) from MRoles;
SET contcodigo = RIGHT(ultimo,2);
SET contador = contcodigo;
SET contador = contador + 1;
SET cadenaceros = REPEAT('0', 2 - LENGTH(contador));
SET nuevocod = 'R' + cadenaceros + contador;
END IF;
INSERT INTO MRoles(idrol, nomrol, descrol) VALUES (nuevocod, nomrol, descrol);
END;



Los codigos que deberian formarse son asi: R01.....
__________________
La fidelidad es a la vida de las emociones lo que la coherencia a la vida del intelecto. ("El Retrato de Dorian Gray" - Oscar Wilde)
  #2 (permalink)  
Antiguo 30/10/2008, 12:20
Avatar de 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: Procedimiento Generador de Codigos ID

Un poco de SQL básico: Cuando capturas un parámetros o varios, siemrpe que solamente te devuelva un registro, la sentencia no es SELECT X=loquesea, porque eso es una comparación que te debería dar TRUE o FALSE.
La sentencia para volcar el resultado de un registro a una variable es
SELECT X INTO variable FROM TABLA;
o bien
SELECT X FROM TABLA INTO variable;

Además de eso, la función que encadena variables no es "+" sino CONCAT(),
Cuando sumas directamente los contenidos de variables de dferente tipo, se hacen conversiones implícitas que pueden dar resultados inesperados, y si alguna de esas contiene un NULL, el resultado simplemente será NULL.

Por otro lado, te cuento que el tipo TINYINT es riesgoso, porque solamente te deja un rango de 0 a 255 en UNSIGNED y -128 a +127 en SIGNED. Es muy corto.


De modo que en principio la cosa sería:
Código sql:
Ver original
  1. CREATE PROCEDURE SP_NUEVROL (IN nomrol VARCHAR(50), IN descrol VARCHAR(150))
  2. BEGIN
  3. DECLARE contador TINYINT;
  4. DECLARE codigonuevo TINYINT;
  5. DECLARE cadenaceros VARCHAR(3);
  6. DECLARE contcodigo VARCHAR(3);
  7. DECLARE ultimo VARCHAR(3);
  8. DECLARE nuevocod VARCHAR(3);
  9. SET nuevocod = 'R00';
  10. SELECT contador = COUNT(idrol) FROM MRoles;
  11. IF contador = 0 THEN
  12. SET nuevocod = 'R01';
  13. ELSE
  14. SELECT MAX(idrol)  FROM MRoles INTO ultimo;
  15. SET contcodigo = RIGHT(ultimo,2);
  16. SET contador = contcodigo;
  17. SET contador = contador + 1;
  18. SET cadenaceros =
  19. REPEAT('0', 2 - LENGTH(contador));
  20. SET nuevocod = CONCAT('R', cadenaceros, contador);
  21. END IF;
  22. INSERT INTO MRoles(idrol, nomrol, descrol) VALUES (nuevocod, nomrol, descrol);
  23. END;
__________________
¿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 30/10/2008, 13:17
Avatar de uselox  
Fecha de Ingreso: agosto-2008
Ubicación: Lima, Perú
Mensajes: 168
Antigüedad: 15 años, 8 meses
Puntos: 12
De acuerdo Respuesta: Procedimiento Generador de Codigos ID

Código PHP:
create procedure generarcodigo
(nomtabla varchar(50),x varchar(20))
    
begin
        
declare ultcod varchar(20);
        declare 
total int;
        declare 
ceros int;
        declare 
opcion int;
        declare 
cod varchar(20);
        
set ultcod=(select ultimocodigo from auxiliar where tabla=nomtabla);    
        
set opcion = (select count(*) from auxiliar where tabla=nomtabla);
        if 
opcion 0 then
            set total 
=  cast(substring(ultcod,2,length(ultcod)) as unsigned) + 1;
            
set ceros length(ultcod) - length(total)-1;
            
set x concat(left(ultcod,1),repeat("0",ceros),total);            
            
update auxiliar set ultimocodigo=x where tabla=nomtabla;
        
end if;
    
end;
//-----------------------------
create function darcodigo(nomtabla varchar(20),cod varchar(20)) returns varchar(20)
begin
    select ultimocodigo into cod from auxiliar where tabla
=nomtabla;
    return 
cod;
end
//
------------------------------------;
create table auxiliar
(tabla varchar(50),
ultimocodigo varchar(50));
//
insert into auxiliar values("candidata","C000000");// 

Última edición por uselox; 06/07/2009 a las 10:22
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 08:31.