SQL Server - Problema con un Store Procedure

 
Vista:

Problema con un Store Procedure

Publicado por Cristian (2 intervenciones) el 20/03/2007 16:09:12
Hola amigos, estoy realizando un programa en VB, con el gestor SQL y requiero enviar datos desde una maquina cliente, procesarlos en un servidor, y regresarme el resultado... sin embargo no entiendo porque no me regresa lo esperado... es decir como que al crecer el store procedure las cosas ya no funcionan aunque creo que las instrucciones estan correctas, no marca errores, sin embargo tampoco recibo lo que deseo como respuesta... el Store Procedure es el siguiente:

CREATE PROCEDURE sp_VERIFICA_NOMBRE_TABLA @Disyuntiva smallint, @Folio varchar(50), @Id_BDatos smallint, @Id_Usuarios smallint, @Validador int OutPut, @Cant_FLeidos bigint OutPut, @Id_Folios bigint OutPut, @Esp smallint OutPut, @Id_Caja_Paquete int OutPut, @Nume_Paquete bigint OutPut, @Nume_Caja smallint OutPut
AS
DECLARE @Verificador smallint
DECLARE @Fecha_Hora smalldatetime
SET @Fecha_Hora = GetDate()
IF @Disyuntiva = 0
BEGIN
SET @Verificador = (SELECT Verificador FROM FOLIOS_Nombre_Tabla WHERE Id_Folios = @Id_Folios)
IF @Verificador = 0
BEGIN
UPDATE FOLIOS_NOMBRE_TABLA SET Verificador = 1, FHora_Folio = @Fecha_Hora, Id_Usuarios = @Id_Usuarios WHERE Id_Folios = @Id_Folios
SET @Esp = (SELECT Esp FROM FOLIOS_NOMBRE_TABLA WHERE Id_Folios = @Id_Folios)
UPDATE BASE_DATOS SET Cant_FLeidos = (Cant_FLeidos + 1), Id_Ultimo_Folio_Leido = @Id_Folios WHERE Id_BDatos = @Id_BDatos
SET @Cant_FLeidos = @Cant_FLeidos + 1
SET @Validador = 0-- El Folio no había sido leído antes.
END
ELSE
BEGIN
IF @Verificador = 1
BEGIN
SET @Validador = 1 -- El Folio esta duplicado
END
ELSE
BEGIN
IF @Verificador = 2
BEGIN
SET @Validador = 2 -- El Folio es una reposición
END
END
END
END
ELSE
BEGIN
SET @Id_Folios = isNull((SELECT Id_Folios FROM FOLIOS_NOMBRE_TABLA WHERE Folio LIKE @Folio), -1)
IF @Id_Folios <> -1
BEGIN
SET @Id_Caja_Paquete = (SELECT Id_Caja_Paquete FROM CAJAS_PAQUETES_Nombre_Tabla WHERE Foli_IPaquete <= @Id_Folios AND Foli_FPaquete >= @Id_Folios)
SET @Nume_Paquete = (SELECT Nume_Paquete FROM CAJAS_PAQUETES_Nombre_Tabla WHERE Id_Caja_Paquete = @Id_Caja_Paquete)
SET @Nume_Caja = (SELECT Nume_Caja FROM CAJAS_PAQUETES_Nombre_Tabla WHERE Id_Caja_Paquete = @Id_Caja_Paquete)
SET @Verificador = (SELECT Verificador FROM FOLIOS_Nombre_Tabla WHERE Id_Folios = @Id_Folios)
IF @Verificador = 0
BEGIN
UPDATE FOLIOS_NOMBRE_TABLA SET Verificador = 1, FHora_Folio = @Fecha_Hora, Id_Usuarios = @Id_Usuarios WHERE Id_Folios = @Id_Folios
UPDATE BASE_DATOS SET Id_Ultimo_Folio_Leido = @Id_Folios WHERE Id_BDatos = @Id_BDatos
SET @Validador = 0 -- El Folio no había sido leído antes.
SET @Esp = (SELECT Esp FROM FOLIOS_NOMBRE_TABLA WHERE Id_Folios = @Id_Folios)
SET @Cant_FLeidos = isNull((SELECT Cant_FLeidos FROM BASE_DATOS WHERE Id_BDatos = @Id_BDatos),-1)
IF @Cant_FLeidos <> -1
BEGIN
UPDATE BASE_DATOS SET Cant_FLeidos = (Cant_FLeidos + 1) WHERE Id_BDatos = @Id_BDatos
SET @Cant_FLeidos = @Cant_FLeidos + 1
END
ELSE
BEGIN
SET @Cant_FLeidos = (SELECT COUNT(*) FROM FOLIOS_NOMBRE_TABLA WHERE Verificador = 1)
UPDATE BASE_DATOS SET Cant_FLeidos = @Cant_FLeidos WHERE Id_BDatos = @Id_BDatos
SET @Validador = -3 -- El Validador para Cant_FLeidos se ha actualizado
END
END
ELSE
BEGIN
IF @Verificador = 1
BEGIN
SET @Validador = 1 -- El Folio esta duplicado
END
ELSE
BEGIN
IF @Verificador = 2
BEGIN
SET @Validador = 2 -- El Folio es una reposición
END
END
END
END
ELSE
BEGIN
SET @Validador = -1 --El Folio no existe en la Base de Datos o es Nulo
END
END

donde "NOMBRE_TABLA" es un dato variable que cambia deacuerdo al nombre de la tabla, siempre que aparezca debe ser modificado por el nombre de la tabla correspondiente.
Estoy utilizando varias tablas, BASE_DATOS, que contiene los nombres y algunas características de cada base de datos, CONFIGURACION_JOB que es una tabla para configurar el trabajo actual con el que estoy trabajando, y la tabla FOLIOS_NOMBRE_BASE DATOS que es la que me almacena una numero con una cantidad de folios de arriba de un millon, en la que tengo una variable "verificador" que me indica si ya fue leido dicho folio desde un lector de código de barras.

Desde ahoritq gracias por su apoyo.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Problema con un Store Procedure

Publicado por ale (9 intervenciones) el 20/03/2007 16:18:21
Hola mira si cambia el nombre de la tabla es aqui donde tienes el problema
ya que lo tienes q meter en una instruccion de query dynamico
busca en la ayuda para q te des una mejor idea, aqui te envio un pequeño ejemplo

create procedure sp_pru1
@tabla as varchar(50)
as
declare cadena as varchar(100)

cadena="select nombre,apellido " + "from " + @tabla
exec (cadena)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Problema con un Store Procedure

Publicado por Cristian (2 intervenciones) el 20/03/2007 16:44:20
Gracias Alex, solo que en realidad el sp lo modifico desde VB antes de mandarlo... un ejemplo de un sp como llegaría sería:

SET QUOTED_IDENTIFIER ON
GO
SET ANSI_NULLS ON
GO

ALTER PROCEDURE sp_VERIFICA_010_Partt21 @Disyuntiva smallint, @Folio varchar(50), @Id_BDatos smallint, @Id_Usuarios smallint, @Validador int OutPut, @Cant_FLeidos bigint OutPut, @Id_Folios bigint OutPut, @Esp smallint OutPut, @Id_Caja_Paquete int OutPut, @Nume_Paquete bigint OutPut, @Nume_Caja smallint OutPut
AS
DECLARE @Verificador smallint
DECLARE @Fecha_Hora smalldatetime
SET @Fecha_Hora = GetDate()
IF @Disyuntiva = 0
BEGIN
SET @Verificador = (SELECT Verificador FROM FOLIOS_010_Partt21 WHERE Id_Folios = @Id_Folios)
IF @Verificador = 0
BEGIN
UPDATE FOLIOS_010_Partt21 SET Verificador = 1, FHora_Folio = @Fecha_Hora, Id_Usuarios = @Id_Usuarios WHERE Id_Folios = @Id_Folios
SET @Esp = (SELECT Esp FROM FOLIOS_010_Partt21 WHERE Id_Folios = @Id_Folios)
UPDATE BASE_DATOS SET Cant_FLeidos = (Cant_FLeidos + 1), Id_Ultimo_Folio_Leido = @Id_Folios WHERE Id_BDatos = @Id_BDatos
SET @Cant_FLeidos = @Cant_FLeidos + 1
SET @Validador = 0
END
ELSE
BEGIN
IF @Verificador = 1
BEGIN
SET @Validador = 1
END
ELSE
BEGIN
IF @Verificador = 2
BEGIN
SET @Validador = 2
END
END
END
END
ELSE
BEGIN
SET @Id_Folios = isNull((SELECT Id_Folios FROM FOLIOS_010_Partt21 WHERE Folio LIKE @Folio), -1)
IF @Id_Folios <> -1
BEGIN
SET @Id_Caja_Paquete = (SELECT Id_Caja_Paquete FROM CAJAS_PAQUETES_010_Partt21 WHERE Foli_IPaquete <= @Id_Folios AND Foli_FPaquete >= @Id_Folios)
SET @Nume_Paquete = (SELECT Nume_Paquete FROM CAJAS_PAQUETES_010_Partt21 WHERE Id_Caja_Paquete = @Id_Caja_Paquete)
SET @Nume_Caja = (SELECT Nume_Caja FROM CAJAS_PAQUETES_010_Partt21 WHERE Id_Caja_Paquete = @Id_Caja_Paquete)
SET @Verificador = (SELECT Verificador FROM FOLIOS_010_Partt21 WHERE Id_Folios = @Id_Folios)
IF @Verificador = 0
BEGIN
UPDATE FOLIOS_010_Partt21 SET Verificador = 1, FHora_Folio = @Fecha_Hora, Id_Usuarios = @Id_Usuarios WHERE Id_Folios = @Id_Folios
UPDATE BASE_DATOS SET Id_Ultimo_Folio_Leido = @Id_Folios WHERE Id_BDatos = @Id_BDatos
SET @Validador = 0
SET @Esp = (SELECT Esp FROM FOLIOS_010_Partt21 WHERE Id_Folios = @Id_Folios)
SET @Cant_FLeidos = isNull((SELECT Cant_FLeidos FROM BASE_DATOS WHERE Id_BDatos = @Id_BDatos),-1)
IF @Cant_FLeidos <> -1
BEGIN
UPDATE BASE_DATOS SET Cant_FLeidos = (Cant_FLeidos + 1) WHERE Id_BDatos = @Id_BDatos
SET @Cant_FLeidos = @Cant_FLeidos + 1
END
ELSE
BEGIN
SET @Cant_FLeidos = (SELECT COUNT(*) FROM FOLIOS_010_Partt21 WHERE Verificador = 1)
UPDATE BASE_DATOS SET Cant_FLeidos = @Cant_FLeidos WHERE Id_BDatos = @Id_BDatos
SET @Validador = -3
END
END
ELSE
BEGIN
IF @Verificador = 1
BEGIN
SET @Validador = 1
END
ELSE
BEGIN
IF @Verificador = 2
BEGIN
SET @Validador = 2
END
END
END
END
ELSE
BEGIN
SET @Validador = -1
END
END
GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO


Y así es como le llega en realidad a SQL, el problema es que antes de que utilizara tantos parametros, actualmente utilizo 11 cuantro de entrada y 7 de entrada salida, todo andaba bien; pero ahora no entra a la primera sentencia "IF @Disyuntiva = 0" y por ende el resto me lo hace mal, no me regresa los valores correctos... en especial el valor de ESP. me lo devuelve en nulll, cuando en la base de datos existe un -1 para la primera vez que no se haya modificado... sin embargo si ejecuto el sp desde el servidor directamente, me efectua el trabajo sin problemas...
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Problema con un Store Procedure

Publicado por Carlos Reyes (49 intervenciones) el 23/03/2007 15:29:55
Primero que nada debo decirte que me da la impresion que no indentas tu codigo; la indentacion consiste en Separar el codigo por bloques jerarquicos. Te recomiendo que indentes tu codigo, una vez hecho esto, si te fijas, hay bloques que estan incorrectamente cerrados empezando por los BEGIN y sus Respectivos END. Te recuerdo que la primera condicion if en abrirse es la ultima en cerrarse y que sus subcondiciones se van cerrando internas a este if y con la misma metodologia

Segun entiendo lo que pretendes hacer es subselecciones de acuerdo con tus parametros de entrada, si es asi, muy probablemente el problema sea que los bloques de instrucciones esten mal delimitados asi que te recomiendo que depures tu codigo y lo reagas, asi te evitaras problemas en la funcionalidad del mismo.

Te mando el codigo indentado y con bloques corregidos, pruebalo y me dices que onda, si no se soluciona te recomiendo que reestructures tu codigo y lo vuelvas a armar

Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar