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

[SOLUCIONADO] Procedimeinto Almacenado Generar codigo !!!!!!!

Estas en el tema de Procedimeinto Almacenado Generar codigo !!!!!!! en el foro de SQL Server en Foros del Web. Hola que tal aqui nuevamente con otro problemita y es el siguiente: Quiero de su ayuda para crear un procedimeinto almacenado que me autogenere el ...
  #1 (permalink)  
Antiguo 21/02/2013, 20:57
Avatar de junior1920  
Fecha de Ingreso: noviembre-2010
Ubicación: Tumán
Mensajes: 77
Antigüedad: 13 años, 5 meses
Puntos: 1
Pregunta Procedimeinto Almacenado Generar codigo !!!!!!!

Hola que tal aqui nuevamente con otro problemita y es el siguiente:
Quiero de su ayuda para crear un procedimeinto almacenado que me autogenere el codigo y luego lo inserte

tengo la tabla:
Código SQL:
Ver original
  1. CREATE TABLE libreta_topograf2(
  2. codigo INT IDENTITY PRIMARY KEY,
  3. codigochar VARCHAR(12),
  4. descripcion text,
  5. tipo_obra VARCHAR(180),
  6. sector VARCHAR(100) NOT NULL,
  7. lugar VARCHAR(180),
  8. anno datetime NOT NULL
  9. );

Ahora lo que debe de generar es esto:
Por ejemplo selecciono una fecha y esa fecha que selecciono es por ejemplo 2009
y si la tabla ya tiene registros de ese mismo año debe de insertar en el campo codigochar algo como esto Proy000001, ....,nveces

Y si cambias a otro año no debe de empezar por el codigo de otros años debe de hacer un conteo nuevamente para ese año

ejemplo

codigo | codigovarchar | descripcion | tipo_obra | sector | lugar | anno
1 Proy000001 xxxxx xxxxx xxx xxx 2009
2 Proy000002 xxxxx xxxxx xxx xxx 2009

3 Proy000001 xxxxx xxxxx xxx xxx 2010
4 Proy000002 xxxxx xxxxx xxx xxx 2010


Ojala me respondan. Gracias de antemano
  #2 (permalink)  
Antiguo 22/02/2013, 06:27
Avatar de junior1920  
Fecha de Ingreso: noviembre-2010
Ubicación: Tumán
Mensajes: 77
Antigüedad: 13 años, 5 meses
Puntos: 1
Respuesta: Procedimeinto Almacenado Generar codigo !!!!!!!

Alguien por favor que me pueda ayudar
  #3 (permalink)  
Antiguo 22/02/2013, 09:09
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: Procedimeinto Almacenado Generar codigo !!!!!!!

puedes explicar un poco mejor tu problema???
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #4 (permalink)  
Antiguo 22/02/2013, 20:51
Avatar de junior1920  
Fecha de Ingreso: noviembre-2010
Ubicación: Tumán
Mensajes: 77
Antigüedad: 13 años, 5 meses
Puntos: 1
Exclamación Respuesta: Procedimeinto Almacenado Generar codigo !!!!!!!

Cita:
Iniciado por Libras Ver Mensaje
puedes explicar un poco mejor tu problema???
Estimado lo que quiero hacer es generar un codigochar; dicho codigo se incremente segun el año por ejemplo

año 2009 -- codigochar:Proy000001, ...n
año 2013 -- codigochar: Proy000001, ... n
  #5 (permalink)  
Antiguo 22/02/2013, 22:57
 
Fecha de Ingreso: julio-2012
Ubicación: Israel
Mensajes: 360
Antigüedad: 11 años, 9 meses
Puntos: 40
Respuesta: Procedimeinto Almacenado Generar codigo !!!!!!!

Crea la tabla sin codigochar, y recupera los datos así:
Código SQL:
Ver original
  1. SELECT ROW_NUMBER() OVER(Partition BY anno ORDER BY codigo) codigochar,
  2.           *
  3. FROM libreta_topograf2;
O más bien así:
Código SQL:
Ver original
  1. SELECT 'Proy'+RIGHT('00000'+CAST(ROW_NUMBER() OVER(Partition BY anno ORDER BY codigo) AS VARCHAR),6) codigochar,
  2.           *
  3. FROM libreta_topograf2;
__________________
El Castellano no es mi lengua materna: discúlpenme por los errores gramaticales.
Mi blog
  #6 (permalink)  
Antiguo 28/02/2013, 10:17
Avatar de junior1920  
Fecha de Ingreso: noviembre-2010
Ubicación: Tumán
Mensajes: 77
Antigüedad: 13 años, 5 meses
Puntos: 1
Pregunta Respuesta: Procedimeinto Almacenado Generar codigo !!!!!!!

Cita:
Iniciado por GeriReshef Ver Mensaje
Crea la tabla sin codigochar, y recupera los datos así:
Código SQL:
Ver original
  1. SELECT ROW_NUMBER() OVER(Partition BY anno ORDER BY codigo) codigochar,
  2.           *
  3. FROM libreta_topograf2;
O más bien así:
Código SQL:
Ver original
  1. SELECT 'Proy'+RIGHT('00000'+CAST(ROW_NUMBER() OVER(Partition BY anno ORDER BY codigo) AS VARCHAR),6) codigochar,
  2.           *
  3. FROM libreta_topograf2;
Umm lo probe y si normal hace lo que quiero pero a la hora de buscar cambia la numeración no habra una manera de que esto se genere cuando creo la tabla para que se inserte solo los datos en el campo codigochar. Por que la verdad cuando hago una busqueda la numeración cambia
  #7 (permalink)  
Antiguo 28/02/2013, 14:00
 
Fecha de Ingreso: julio-2012
Ubicación: Israel
Mensajes: 360
Antigüedad: 11 años, 9 meses
Puntos: 40
Respuesta: Procedimeinto Almacenado Generar codigo !!!!!!!

Supongo que el problema es que cuando filtras los resultados utilizando el Where - el sistema enumera las filas de nuevo.
La solución puede ser más o menos así:
Código SQL:
Ver original
  1. WITH T AS
  2. (SELECT 'Proy'+RIGHT('00000'+CAST(ROW_NUMBER() OVER(Partition BY anno ORDER BY codigo) AS VARCHAR),6) codigochar,
  3.           *
  4. FROM libreta_topograf2)
  5. SELECT *
  6. FROM   T
  7. WHERE tipo_obra='xxxx';
Espero que te sirva de ayuda.
__________________
El Castellano no es mi lengua materna: discúlpenme por los errores gramaticales.
Mi blog
  #8 (permalink)  
Antiguo 01/03/2013, 08:09
Avatar de junior1920  
Fecha de Ingreso: noviembre-2010
Ubicación: Tumán
Mensajes: 77
Antigüedad: 13 años, 5 meses
Puntos: 1
Pregunta Respuesta: Procedimeinto Almacenado Generar codigo !!!!!!!

Cita:
Iniciado por GeriReshef Ver Mensaje
Supongo que el problema es que cuando filtras los resultados utilizando el Where - el sistema enumera las filas de nuevo.
La solución puede ser más o menos así:
Código SQL:
Ver original
  1. WITH T AS
  2. (SELECT 'Proy'+RIGHT('00000'+CAST(ROW_NUMBER() OVER(Partition BY anno ORDER BY codigo) AS VARCHAR),6) codigochar,
  3.           *
  4. FROM libreta_topograf2)
  5. SELECT *
  6. FROM   T
  7. WHERE tipo_obra='xxxx';
Espero que te sirva de ayuda.
Hola nuevamente mira cambio la estructura de la BD ahora es asi:

Código SQL:
Ver original
  1. CREATE TABLE libreta_topograf(
  2. codigo INT IDENTITY PRIMARY KEY,
  3. /*codigochar as 'Proy'+ right('00000000'+cast(codigo as varchar(12)),6)persisted,*/
  4. descripcion text,
  5. tipo_obra VARCHAR(180),
  6. sector VARCHAR(100) NOT NULL,
  7. anno datetime NOT NULL,
  8. codlugar INT CONSTRAINT fk_codlugar FOREIGN KEY
  9. REFERENCES lugar_libreta_topograf(codlugar)
  10. );
  11. GO
  12. CREATE TABLE lugar_libreta_topograf(
  13. codlugar INT IDENTITY PRIMARY KEY,
  14. nombre VARCHAR(80),
  15. descrilugar text
  16. );
  17. GO

Y lo que me has indicado sobre usar With funca como si fuese una consulta normal; ahora lo quise implementar en un Procedimiento Almacenado:

Código SQL:
Ver original
  1. ALTER PROCEDURE likesector_dat_lib_topograf
  2.     @nsector VARCHAR(100),
  3.     @msg AS VARCHAR(100) OUTPUT
  4. AS
  5. BEGIN
  6.     SET NOCOUNT ON;
  7.     BEGIN Tran likesector
  8.     BEGIN Try
  9.         WITH T AS
  10.         (SELECT 'Proy'+RIGHT('00000'+CAST(ROW_NUMBER()
  11.         OVER(Partition BY codlugar,YEAR(anno) ORDER BY codlugar,
  12.         YEAR(anno)) AS VARCHAR),6) codigochar,
  13.         *
  14.         FROM libreta_topograf)
  15.         SELECT T.codigo,T.codigochar,T.descripcion,T.tipo_obra,T.sector,lu.nombre,T.anno
  16.         FROM   T INNER JOIN lugar_libreta_topograf lu ON lu.codlugar=T.codlugar
  17.         WHERE T.sector LIKE @nsector + '%'
  18.     SET @msg = 'Si existen registros.'
  19.         COMMIT TRAN likesector
  20.     END try
  21.     BEGIN Catch
  22.         SET @msg = 'Ocurrio un Error: ' + ERROR_MESSAGE() + ' en la línea ' + CONVERT(NVARCHAR(255), ERROR_LINE() ) + '.'
  23.         ROLLBACK TRAN likesector
  24.     END Catch
  25. END
  26. GO

Pero me marca este error:
Sintaxis incorrecta junto a la palabra clave 'with'. Si esta instrucción es una expresión de tabla común o una cláusula xmlnamespaces, la instrucción anterior debe terminarse con punto y coma (;).
  #9 (permalink)  
Antiguo 01/03/2013, 08:32
 
Fecha de Ingreso: julio-2012
Ubicación: Israel
Mensajes: 360
Antigüedad: 11 años, 9 meses
Puntos: 40
Respuesta: Procedimeinto Almacenado Generar codigo !!!!!!!

Para evitar ambigüedades es obligatorio poner un semicolon (;) antes el With
si no es la primera instrucción.
En este caso:
Código SQL:
Ver original
  1. BEGIN Tran likesector
  2.     BEGIN Try
  3.         ;WITH T AS
  4.         (...
  5.         ...
__________________
El Castellano no es mi lengua materna: discúlpenme por los errores gramaticales.
Mi blog
  #10 (permalink)  
Antiguo 01/03/2013, 21:53
Avatar de junior1920  
Fecha de Ingreso: noviembre-2010
Ubicación: Tumán
Mensajes: 77
Antigüedad: 13 años, 5 meses
Puntos: 1
Respuesta: Procedimeinto Almacenado Generar codigo !!!!!!!

Hola ahora estoy intentando hacer este procedimiento almacenado para insertar el campo que se genera codigochar

Tabla:
Código SQL:
Ver original
  1. CREATE TABLE lugar_libreta_topograf(
  2. codlugar INT IDENTITY PRIMARY KEY,
  3. nombre VARCHAR(80),
  4. descrilugar text
  5. );
  6. GO
  7. CREATE TABLE libreta_topograf(
  8. codigo INT IDENTITY PRIMARY KEY,
  9. codigochar VARCHAR(100),/*codigochar as 'Proy'+ right('00000000'+cast(codigo as varchar(12)),6)persisted,*/
  10. descripcion text,
  11. tipo_obra VARCHAR(180),
  12. sector VARCHAR(100) NOT NULL,
  13. anno datetime NOT NULL,
  14. codlugar INT CONSTRAINT fk_codlugar FOREIGN KEY
  15. REFERENCES lugar_libreta_topograf(codlugar)
  16. );
  17. GO

Código SQL:
Ver original
  1. CREATE PROCEDURE insert_dat_lib_topograf
  2.     @ndescripcion text,
  3.     @ntipo_obra VARCHAR(180),
  4.     @nsector VARCHAR(100),
  5.     @ncodlugar INT,
  6.     @nanno datetime,
  7.     @msg AS VARCHAR(100) OUTPUT,
  8.     @Ncodigo AS VARCHAR(10)
  9.  
  10. AS
  11. BEGIN
  12.     SET NOCOUNT ON;
  13.     BEGIN Tran inserta
  14.     BEGIN Try
  15.        
  16.         IF @Ncodigo IS NULL
  17.         BEGIN
  18.         SET @Ncodigo='Proy000001'
  19.         END
  20.  
  21.         SET  @Ncodigo=(SELECT 'Proy'+RIGHT('00000'+CAST(ROW_NUMBER()
  22.                         OVER(Partition BY lt.codlugar,YEAR(lt.anno)
  23.                         ORDER BY lt.codlugar,lt.anno) AS VARCHAR),10) codigochar
  24.                         FROM libreta_topograf lt
  25.                         INNER JOIN lugar_libreta_topograf lu
  26.                         ON lu.codlugar=lt.codlugar)
  27.  
  28.         INSERT INTO libreta_topograf(codigochar,descripcion,
  29.         tipo_obra,sector,anno,codlugar)
  30.         VALUES(@Ncodigo,@ndescripcion,@ntipo_obra,
  31.         @nsector,@nanno,@ncodlugar)
  32.        
  33.         SET @msg = 'Se registro correctamente.'
  34.         COMMIT TRAN inserta
  35.     END try
  36.     BEGIN Catch
  37.         SET @msg = 'Ocurrio un Error: ' + ERROR_MESSAGE() + ' en la línea ' + CONVERT(NVARCHAR(255), ERROR_LINE() ) + '.'
  38.         ROLLBACK TRAN inserta
  39.     END Catch
  40. END
  41. GO

Pero me arroja este error:

Error al convertir el tipo de datos varchar a int.

Alguien que me pueda ayudar como levantar ese error
  #11 (permalink)  
Antiguo 01/03/2013, 23:00
 
Fecha de Ingreso: julio-2012
Ubicación: Israel
Mensajes: 360
Antigüedad: 11 años, 9 meses
Puntos: 40
Respuesta: Procedimeinto Almacenado Generar codigo !!!!!!!

Probe el procedimiento y me funciono perfectamente.
Como lo ejecutaste? con cuales parámetros?
__________________
El Castellano no es mi lengua materna: discúlpenme por los errores gramaticales.
Mi blog
  #12 (permalink)  
Antiguo 02/03/2013, 09:43
Avatar de junior1920  
Fecha de Ingreso: noviembre-2010
Ubicación: Tumán
Mensajes: 77
Antigüedad: 13 años, 5 meses
Puntos: 1
Pregunta Respuesta: Procedimeinto Almacenado Generar codigo !!!!!!!

Cita:
Iniciado por GeriReshef Ver Mensaje
Probe el procedimiento y me funciono perfectamente.
Como lo ejecutaste? con cuales parámetros?

Hola que tal lo ejecute de la siguiente manera:

Código SQL:
Ver original
  1. DECLARE @msg AS VARCHAR(100);
  2. EXEC insert_dat_lib_topograf 'ff','oo','ss','aqui','19-02-2013',@msg OUTPUT
  3. SELECT @msg AS msg

Umm dime has probado tu cuando la tabla tiene 0 registros??
y si te ejecuta correctamente te agradecería que me muestres como puedo ejecutarlo pues =)
  #13 (permalink)  
Antiguo 02/03/2013, 10:18
 
Fecha de Ingreso: julio-2012
Ubicación: Israel
Mensajes: 360
Antigüedad: 11 años, 9 meses
Puntos: 40
Respuesta: Procedimeinto Almacenado Generar codigo !!!!!!!

Proba esto:
Código SQL:
Ver original
  1. DECLARE @msg AS VARCHAR(100);
  2. EXEC insert_dat_lib_topograf 'ff','oo','ss',1,'20130219',@msg OUTPUT,'muuu'
  3. SELECT @msg AS msg
1. El parámetro @ncodlugar obtiene números y no cadenas ('aqui').
2. La fecha debe ser de la forma 'yyyymmdd'.
3. te faltó el último parámetro (@ncodigo).
__________________
El Castellano no es mi lengua materna: discúlpenme por los errores gramaticales.
Mi blog
  #14 (permalink)  
Antiguo 02/03/2013, 11:13
Avatar de junior1920  
Fecha de Ingreso: noviembre-2010
Ubicación: Tumán
Mensajes: 77
Antigüedad: 13 años, 5 meses
Puntos: 1
Respuesta: Procedimeinto Almacenado Generar codigo !!!!!!!

Código SQL:
Ver original
  1. CREATE PROCEDURE insert_dat_lib_topograf
  2.     @ndescripcion text,
  3.     @ntipo_obra VARCHAR(180),
  4.     @nsector VARCHAR(100),
  5.     @ncodlugar INT,
  6.     @nanno datetime,
  7.     @msg AS VARCHAR(100) OUTPUT,
  8.     @Ncodigo AS VARCHAR(10)
  9.  
  10. AS
  11. BEGIN
  12.     SET NOCOUNT ON;
  13.     BEGIN Tran inserta
  14.     BEGIN Try
  15.        
  16.  
  17.         SET  @Ncodigo=(SELECT 'Proy'+RIGHT('00000'+CAST(ROW_NUMBER()
  18.                         OVER(Partition BY lt.codlugar,YEAR(lt.anno)
  19.                         ORDER BY lt.codlugar,lt.anno) AS VARCHAR),10) codigochar
  20.                         FROM libreta_topograf lt
  21.                         INNER JOIN lugar_libreta_topograf lu
  22.                         ON lu.codlugar=lt.codlugar)
  23.         INSERT INTO libreta_topograf(codigochar,descripcion,
  24.         tipo_obra,sector,anno,codlugar)
  25.         VALUES(@Ncodigo,@ndescripcion,@ntipo_obra,
  26.         @nsector,@nanno,@ncodlugar)
  27.    
  28.         IF @Ncodigo IS NULL
  29.         BEGIN
  30.         SET @Ncodigo='Proy000001'
  31.         INSERT INTO libreta_topograf(codigochar,descripcion,
  32.         tipo_obra,sector,anno,codlugar)
  33.         VALUES(@Ncodigo,@ndescripcion,@ntipo_obra,
  34.         @nsector,@nanno,@ncodlugar)
  35.         END
  36.        
  37.         SET @msg = 'Se registro correctamente.'
  38.         COMMIT TRAN inserta
  39.     END try
  40.     BEGIN Catch
  41.         SET @msg = 'Ocurrio un Error: ' + ERROR_MESSAGE() + ' en la línea ' + CONVERT(NVARCHAR(255), ERROR_LINE() ) + '.'
  42.         ROLLBACK TRAN inserta
  43.     END Catch
  44. END
  45. GO
Ocurrio un Error: No se puede insertar el valor NULL en la columna 'codigochar', tabla 'INVENTARIO_L

No funca man
  #15 (permalink)  
Antiguo 03/03/2013, 20:38
Avatar de junior1920  
Fecha de Ingreso: noviembre-2010
Ubicación: Tumán
Mensajes: 77
Antigüedad: 13 años, 5 meses
Puntos: 1
De acuerdo Respuesta: Procedimeinto Almacenado Generar codigo !!!!!!!

ESTIMADO(S):
LOGRE CREAR EL PROCEDIMIENTO ALMACENADO: INGRESA EL REGISTRO Y TIENE EL CAMPO codigochar QUE ES COMO UN CODIGO DE SEGUIMIENTO EL CUAL INCREMENTA SEGUN EL LUGAR Y EL AÑO.

Código SQL:
Ver original
  1. CREATE PROCEDURE insert_dat_lib_topograf
  2.     @ndescripcion text,
  3.     @ntipo_obra VARCHAR(180),
  4.     @nsector VARCHAR(100),
  5.     @ncodlugar INT,
  6.     @nanno datetime,
  7.     @msg AS VARCHAR(500) OUTPUT
  8.    
  9. AS
  10. BEGIN
  11.     SET NOCOUNT ON;
  12.     BEGIN Tran inserta
  13.     BEGIN Try
  14.         DECLARE @Ncodigo AS VARCHAR(12)
  15.         DECLARE @N AS VARCHAR(12)
  16.         DECLARE @A AS INT
  17.         DECLARE @CONT AS INT
  18.             BEGIN
  19.                 SET @CONT=0
  20.                 --SELECT @C=max(codigo) FROM libreta_topograf
  21.                 SELECT @A=COUNT(codigo) FROM libreta_topograf  
  22.                 WHERE datepart(YEAR,anno)=DATEPART(YEAR,@nanno)
  23.                 AND codlugar=@ncodlugar
  24.                 IF @A>0
  25.                     BEGIN
  26.                         SET @CONT=@A+1
  27.                         SELECT @N='Proy'+ RIGHT('00000000'+CAST(@CONT
  28.                         AS VARCHAR(12)),8) FROM libreta_topograf
  29.                         SET  @Ncodigo=@N
  30.                    
  31.                     INSERT INTO libreta_topograf(codigochar,descripcion,
  32.                     tipo_obra,sector,anno,codlugar)
  33.                     VALUES(@Ncodigo,@ndescripcion,@ntipo_obra,
  34.                     @nsector,@nanno,@ncodlugar)
  35.                     END
  36.                 IF @A=0 OR @A=NULL
  37.                     BEGIN
  38.                         SET @N='Proy00000001'
  39.                         SET  @Ncodigo=@N
  40.                         INSERT INTO libreta_topograf(codigochar,descripcion,
  41.                         tipo_obra,sector,anno,codlugar)
  42.                         VALUES(@Ncodigo,@ndescripcion,@ntipo_obra,
  43.                         @nsector,@nanno,@ncodlugar)
  44.                     END
  45.             --BREAK
  46.             END
  47.         SET @msg = 'Se registro correctamente.'
  48.         COMMIT TRAN inserta
  49.     END try
  50.     BEGIN Catch
  51.         SET @msg = 'Ocurrio un Error: ' + ERROR_MESSAGE() + ' en la línea ' + CONVERT(NVARCHAR(555), ERROR_LINE() ) + '.'
  52.         ROLLBACK TRAN inserta
  53.     END Catch
  54. END
  55. GO

Última edición por junior1920; 03/03/2013 a las 20:40 Razón: PEQUEÑO DETALLE

Etiquetas: registro, tabla
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

SíEste tema le ha gustado a 1 personas




La zona horaria es GMT -6. Ahora son las 16:10.