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

Problemas con create FUNCTION

Estas en el tema de Problemas con create FUNCTION en el foro de SQL Server en Foros del Web. Hol@ a todos, tengo problemas en mi BD He creado una tabla con un campo que se actualiza después de la creación de otra tabla. ...
  #1 (permalink)  
Antiguo 11/08/2010, 11:14
 
Fecha de Ingreso: agosto-2010
Mensajes: 5
Antigüedad: 13 años, 8 meses
Puntos: 0
Problemas con create FUNCTION

Hol@ a todos,
tengo problemas en mi BD
He creado una tabla con un campo que se actualiza después de la creación de otra tabla. Al insertar valores en la tabla1, quiero utilizo un procedimiento almacenado que crea directamente la tabla2. Y dentro del procedimiento almacenado, llamo a la FUNCTION y pongo el valor que devuelve la function en una variable para actualizar directamente este campo en la tabla1.
Pero al ejecutar el procedimiento, me da este error

Mens. 195, Nivel 15, Estado 10, Línea 2
'getidpagos' no es un nombre de función integrada reconocido.


Aquí van la function y el Procedimiento.

CREATE FUNCTION GetIdPagos (@IdCasal smallint,@IdNino smallint)
RETURNS smallint
WITH EXECUTE AS CALLER
AS
BEGIN
DECLARE @Id_Pago smallint
SELECT @Id_Pago= IdPagos
FROM Pagos
WHERE IdCasal_Pag= @IdCasal
and IdNino_pag=@IdNino
RETURN(@Id_Pago)
END;
GO



CREATE PROCEDURE PagosInscripcion
@Total numeric OUTPUT,
@Idcasal smallint,
@Idnino smallint,
@Idpagos smallint OUTPUT
AS
SELECT @Total=SUM(tarifa)
FROM InscripcionCasal,Opciones
WHERE IdCasal_insc=IdCasal_Op and IdOpcion_Insc=IdOpcion and IdNino_Insc=@Idnino

UPDATE Pagos
SET TotalPago=@Total,IdCasal_Pag=@IdCasal,IdNino_pag=@ IdNino

SELECT @Idpagos=GetIdPagos(@Idcasal, @Idnino)

UPDATE InscripcionCasal
SET IdPagos_Insc=@Idpagos


DECLARE @Total numeric, @Idpagos smallint
EXECUTE PagosInscripcion '1', '1',
@Total OUTPUT, @Idpagos OUTPUT



ni select getidpagos(1,1) funciona después de crear la función.

NO SE QUE HACER NI COMO HACERLO.
POR FAVOR AYUDA!!!!!!
GRACIAS......
  #2 (permalink)  
Antiguo 11/08/2010, 11:26
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 16 años, 9 meses
Puntos: 180
Respuesta: Problemas con create FUNCTION

TODAS las funciones al ser llamadas, debera agregarseles dbo

Te funciona asi:

Código SQL:
Ver original
  1. SELECT @Idpagos=dbo.GetIdPagos(@Idcasal, @Idnino)
  #3 (permalink)  
Antiguo 11/08/2010, 11:43
 
Fecha de Ingreso: agosto-2010
Ubicación: Ecuador
Mensajes: 46
Antigüedad: 13 años, 8 meses
Puntos: 0
Sonrisa Respuesta: Problemas con create FUNCTION

es como dice iislas, para llamar funciones creadas por e usuario utilizas la palabra dbo.tufuncion , de no hacerlo asi, el DBMS sabe que llamas una funcion, pero piensa que es una que el trae por defecto y al no ser asi, no la encuentra y no la ejecuta y te da el error de funcion integrada no reconocida.

Saludos!!!.
  #4 (permalink)  
Antiguo 12/08/2010, 16:09
 
Fecha de Ingreso: agosto-2010
Mensajes: 5
Antigüedad: 13 años, 8 meses
Puntos: 0
Gracias y os pido un poquito más!

Mil gracias chicos! Ya me funciono!
Pero llego con otros problemas :

1* Se puede poner o no, 4 FOreign Key en una tabla?

CREATE TABLE InscripcionCasal1
(
IdInscripcionCasal smallint not null IDENTITY PRIMARY KEY,
FechaInscripcion smalldatetime DEFAULT getdate(),
IdCasal_Insc smallint not null,
IdNino_Insc smallint not null,
IdOpcion_Insc smallint not null,
IdPagos_Insc smallint,
FOREIGN KEY (IdCasal_Insc) REFERENCES Casal(IdCasal)ON UPDATE CASCADE ON DELETE CASCADE,
FOREIGN KEY (IdNino_Insc) REFERENCES Nino(IdNino)ON UPDATE CASCADE ON DELETE CASCADE,
FOREIGN KEY (IdOpcion_Insc) REFERENCES Opciones(IdOpciones)ON UPDATE CASCADE ON DELETE CASCADE,
FOREIGN KEY (IdPagos_Insc) REFERENCES Pagos(IdPagos)ON UPDATE CASCADE ON DELETE CASCADE,
CONSTRAINT InscripcionUnica1 UNIQUE(IdCasal_Insc, IdNino_Insc,IdOpcion_Insc)
)

Me da estos errores:

Mens. 1785, Nivel 16, Estado 0, Línea 1
Si especifica la restricción FOREIGN KEY 'FK__Inscripci__IdOpc__5070F446' en la tabla 'InscripcionCasal1', podrían producirse ciclos o múltiples rutas en cascada. Especifique ON DELETE NO ACTION o UPDATE NO ACTION, o bien modifique otras restricciones FOREIGN KEY.
Mens. 1750, Nivel 16, Estado 0, Línea 1
No se pudo crear la restricción. Consulte los errores anteriores.




2* Cómo restringir un campo para que sólo admita números? por ejemplo un campo de numero de telefono?



3* El problema más gordo. He enriquecido el procedimiento que me daba errores ayer con un CASE y no funciona. Es un poco largo... lo siento...



CREATE PROCEDURE PagosInscripcion
@Caso tinyint,
@Idcasal smallint,
@Idnino smallint,
@Pagado numeric(6,2),
@Idpagos smallint OUTPUT,
@Total numeric(6,2) OUTPUT
AS

SELECT --@Caso,
CASE @Caso
WHEN 1 THEN --- primer registro en pagos, primer plazo
-- Cálculo de la suma de todas las opciones escogidas
SELECT @Total=SUM(tarifa)
FROM InscripcionCasal,Opciones
WHERE IdCasal_insc=IdCasal_Op and IdOpcion_Insc=IdOpciones and IdNino_Insc=@Idnino
-- Inserción del registro de pago con el dinero pagado
INSERT INTO Pagos(TotalPago,PrimerPlazo,IdCasal_Pag,IdNino_pag )
VALUES (@Total,@Pagado,@IdCasal,@IdNino)
-- llamada de la función que recoge el identificante del pago
SELECT @Idpagos=dbo.GetIdPagos(@Idcasal, @Idnino)
-- YA ME HA FUNCIONADO, GRACIAS A VOSOTROS
-- actualización de la tabla inscripcion con el identificador del pago
UPDATE InscripcionCasal
SET IdPagos_Insc=@Idpagos
WHERE IdCasal_insc=@Idcasal and IdNino_Insc=@Idnino

WHEN 2 THEN --- segundo pago
-- Búsqueda del número de pago
SELECT DISTINCT @IdPagos=IdPagos_Insc -- DISTINCT porque cada opción tiene un registro
FROM InscripcionCasal
WHERE IdCasal_insc=@IdCasal and IdNino_Insc=@Idnino
-- actualización de la tabla inscripcion con el identificador del pago
UPDATE Pagos
SET SegundoPlazo=@Pagado, FechaSP=getdate()
WHERE IdPagos=@IdPagos

WHEN 3 THEN --- tercer pago
-- Búsqueda del número de pago
SELECT DISTINCT @IdPagos=IdPagos_Insc -- DISTINCT porque cada opción tiene un registro
FROM InscripcionCasal
WHERE IdCasal_insc=@IdCasal and IdNino_Insc=@Idnino
-- actualización de la tabla inscripcion con el identificador del pago
UPDATE Pagos
SET TercerPlazo=@Pagado, FechaTP=getdate()
WHERE IdPagos=@IdPagos
END



Y me da este error:
Mens 156, Nivel 15, Estado 1, Procedimiento PagosInscripcion, Línea 14
Sintaxis incorrecta cerca de la palabra clave 'SELECT'.
Mens 156, Nivel 15, Estado 1, Procedimiento PagosInscripcion, Línea 27
Sintaxis incorrecta cerca de la palabra clave 'WHEN'.
Mens 156, Nivel 15, Estado 1, Procedimiento PagosInscripcion, Línea 37
Sintaxis incorrecta cerca de la palabra clave 'WHEN'.
Mens 102, Nivel 15, Estado 1, Procedimiento PagosInscripcion, Línea 46
Sintaxis incorrecta cerca de 'END'.
  #5 (permalink)  
Antiguo 12/08/2010, 16:40
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 16 años, 9 meses
Puntos: 180
Respuesta: Problemas con create FUNCTION

1.- CICLOS INFINITOS en el argot de modelado de base de datos, significa que 2 o mas entidades se ligan (apuntan) y se usa ON CASCADE, cuando actualizas una, se actualiza la otra y asi infinitamente.

2.- Declarandolo NUMERICO, en caso de ser un CHAR, entonces puedes colocarle un constraint CHECK

3.- No apliques CASE, utiliza IF
  #6 (permalink)  
Antiguo 14/08/2010, 03:49
 
Fecha de Ingreso: agosto-2010
Mensajes: 5
Antigüedad: 13 años, 8 meses
Puntos: 0
Merci

Muchas gracias IISLAs,
Sigo sin entender los de las FK porque no hay redundancia, pero bueno...

Lo de IF, lo había pensado y con IF me sale peor loquería hacer con CASE (+ bonito) pero si no se puede, no pasa nada.

Gracias por todo amigo.
  #7 (permalink)  
Antiguo 14/08/2010, 09:20
 
Fecha de Ingreso: agosto-2010
Mensajes: 5
Antigüedad: 13 años, 8 meses
Puntos: 0
Problemas con IF...UPDATE

porqué

IF @Monitor1!=null UPDATE Grupos SET IdMonitor_Grup1=@Monitor1 WHERE IdCasal_Grup=@Casal and Nombre like @NombreGrupo

no me funciona????
  #8 (permalink)  
Antiguo 15/08/2010, 19:53
Avatar de matanga  
Fecha de Ingreso: octubre-2007
Ubicación: España
Mensajes: 1.091
Antigüedad: 16 años, 6 meses
Puntos: 85
Respuesta: Problemas con create FUNCTION

Te dejo un pequeño ejemplo

Código:
1> declare @var int
2> set @var = null
3>
4> if @var = null
5> select 1
6> else
7> select 0
8>
9> if @var != null
10> select 1
11> else
12> select 0
13>
14> if @var is null
15> select 1
16> else
17> select 0
18> go

 -----------
           0

(1 fila afectada)

 -----------
           0

(1 fila afectada)

 -----------
           1

(1 fila afectada)
El nulo es la eterna discusión, no es un valor, representa la ausencia de valor, por lo tanto no puedes comparar una variable con null, solo puedes preguntar si la variable es null.

Imagina que tienes dos cajas con monedas dentro, sabes la cantidad de monedas y dinero que hay en la primera pero no sabes nada de la segunda, en este caso la segunda representa un null, no puedes responder a las preguntas, ¿cuanto dinero suma la primera caja más la segunda?, ¿tienen la misma cantidad de dinero?, etc. Solo puedes responder que no tienes el valor de la segunda, esto es @var is null?

Es probable que lo único que buscabas era saber porque no funciona la línea de código que posteaste, pero me pareció un buen momento para comentar este tema :)

Saludos
  #9 (permalink)  
Antiguo 16/08/2010, 01:33
 
Fecha de Ingreso: agosto-2010
Mensajes: 5
Antigüedad: 13 años, 8 meses
Puntos: 0
Gracias

Gracias, lo voy a probar ahora mismo

Etiquetas: create, function
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 10:40.