Insert y funciones que devuelven un tipo TABLE. (Ya estaba posteada pero no la encuentro)

23/08/2005 - 08:31 por José Antonio | Informe spam
Hola a todos.
Me he encontrado con una situacion nueva y no he encontrado la forma de
reselverla sin un cursor de solo lectura.
Tengo una tabla con operaciones, en el que el unico dato que me hace falta
es el numero de operacion.
Este numero de operacion se lo paso a una funcion definida por el usuario
que me devuelve un tipo table con x filas.

Debo de insertar en una tabla de anotaciones todas las anotaciones que me
devuelvan un rango de operaciones especifico, por ejemplo desde la operacion
120 a la 467.

Con la instruccion select * from dbo.funcion(operacion) consigo las
anotaciones de una operacion y con insert anotaciones select * from
dbo.funcion(operacion) inserto las anotaciones que corresponden a una
operacion.

Pero para insertar las anotaciones desde la operacion 120 a la 467 no
encuentro la forma a no ser que recorra la tabla operaciones on un cursor
desde la operacion 120 a la 467.

El cursor recorre la siguiente instruccion select operacion from operaciones
where operacion>0 and operacion<F7

Alguien encuentra la forma de hacer esto sin un cursor?


La funcion es esta:
CREATE FUNCTION CG_DR_ASILEASING (@OPERACION INT)
RETURNS @TABLA TABLE (OPERACION INT,TIPO CHAR(1),APUNTE INT,CUENTA
VARCHAR(10),FECHA DATETIME,DOCUMENTO VARCHAR(20),DEBE DECIMAL(15,2),HABER
DECIMAL(15,2))
AS
BEGIN

aqui definicion de varias variables para sumar y restar columnas.

e inserto las filas en el la tabla que sera devuelta.

INSERT @TABLA VALUES (@OPERACION,CASE WHEN @DEBE!=0 THEN 'D' ELSE 'H'
END,1,@CDERECHOS,@FECHAVAR,@DOCUMENTO,@DEBE,@HABER)

INSERT @TABLA VALUES (@OPERACION,CASE WHEN @DEBE!=0 THEN 'D' ELSE 'H'
END,2,@CINTDIF,@FECHAVAR,@DOCUMENTO,@DEBE,@HABER)

INSERT @TABLA VALUES (@OPERACION,CASE WHEN @DEBE!=0 THEN 'D' ELSE 'H'
END,3,@CIVADIF,@FECHAVAR,@DOCUMENTO,@DEBE,@HABER)

INSERT @TABLA VALUES (@OPERACION,CASE WHEN @DEBE!=0 THEN 'D' ELSE 'H'
END,4,@CPLARGO,@FECHAVAR,@DOCUMENTO,@DEBE,@HABER)

INSERT @TABLA VALUES (@OPERACION,CASE WHEN @DEBE!=0 THEN 'D' ELSE 'H'
END,5,@CPCORTO,@FECHAVAR,@DOCUMENTO,@DEBE,@HABER)

RETURN
END



Saludos y gracias.

Preguntas similare

Leer las respuestas

#1 Alejandro Mesa
23/08/2005 - 14:46 | Informe spam
José Antonio,

Puedes postear el codigo de la udf?

Otra forma seria usando un loop / lazo, que a final de cuentas equivale a un
tratamiento fila por file.

declare @operacion int

set @operacion = 120

while @operacion < 468
begin
insert into t1(c1,..., cn)
select c1,..., cn
from dbo.funcion(@operacion)
end
go

Me gustaria ver el codigo de la funcion para ver si podemos encontrar una
solucion basada en operaciones de conjunto.


AMB

"José Antonio" wrote:

Hola a todos.
Me he encontrado con una situacion nueva y no he encontrado la forma de
reselverla sin un cursor de solo lectura.
Tengo una tabla con operaciones, en el que el unico dato que me hace falta
es el numero de operacion.
Este numero de operacion se lo paso a una funcion definida por el usuario
que me devuelve un tipo table con x filas.

Debo de insertar en una tabla de anotaciones todas las anotaciones que me
devuelvan un rango de operaciones especifico, por ejemplo desde la operacion
120 a la 467.

Con la instruccion select * from dbo.funcion(operacion) consigo las
anotaciones de una operacion y con insert anotaciones select * from
dbo.funcion(operacion) inserto las anotaciones que corresponden a una
operacion.

Pero para insertar las anotaciones desde la operacion 120 a la 467 no
encuentro la forma a no ser que recorra la tabla operaciones on un cursor
desde la operacion 120 a la 467.

El cursor recorre la siguiente instruccion select operacion from operaciones
where operacion>0 and operacion<F7

Alguien encuentra la forma de hacer esto sin un cursor?


La funcion es esta:
CREATE FUNCTION CG_DR_ASILEASING (@OPERACION INT)
RETURNS @TABLA TABLE (OPERACION INT,TIPO CHAR(1),APUNTE INT,CUENTA
VARCHAR(10),FECHA DATETIME,DOCUMENTO VARCHAR(20),DEBE DECIMAL(15,2),HABER
DECIMAL(15,2))
AS
BEGIN

aqui definicion de varias variables para sumar y restar columnas.

e inserto las filas en el la tabla que sera devuelta.

INSERT @TABLA VALUES (@OPERACION,CASE WHEN @DEBE!=0 THEN 'D' ELSE 'H'
END,1,@CDERECHOS,@FECHAVAR,@DOCUMENTO,@DEBE,@HABER)

INSERT @TABLA VALUES (@OPERACION,CASE WHEN @DEBE!=0 THEN 'D' ELSE 'H'
END,2,@CINTDIF,@FECHAVAR,@DOCUMENTO,@DEBE,@HABER)

INSERT @TABLA VALUES (@OPERACION,CASE WHEN @DEBE!=0 THEN 'D' ELSE 'H'
END,3,@CIVADIF,@FECHAVAR,@DOCUMENTO,@DEBE,@HABER)

INSERT @TABLA VALUES (@OPERACION,CASE WHEN @DEBE!=0 THEN 'D' ELSE 'H'
END,4,@CPLARGO,@FECHAVAR,@DOCUMENTO,@DEBE,@HABER)

INSERT @TABLA VALUES (@OPERACION,CASE WHEN @DEBE!=0 THEN 'D' ELSE 'H'
END,5,@CPCORTO,@FECHAVAR,@DOCUMENTO,@DEBE,@HABER)

RETURN
END



Saludos y gracias.




Respuesta Responder a este mensaje
#2 Alejandro Mesa
23/08/2005 - 14:49 | Informe spam
Correccion,

Olvide incrementar la variable @operacion.

declare @operacion int

set @operacion = 120

while @operacion < 468
begin

insert into t1(c1,..., cn)
select c1,..., cn
from dbo.funcion(@operacion)

set @operacion = @operacion + 1
end
go


AMB

"Alejandro Mesa" wrote:

Community Message Not Available
Respuesta Responder a este mensaje
#3 Jose Antonio
23/08/2005 - 18:45 | Informe spam
Alejandro el codigo de la funcion esta en el mensaje, al final del mismo.


"Alejandro Mesa" escribió en el
mensaje news:
Correccion,

Olvide incrementar la variable @operacion.

declare @operacion int

set @operacion = 120

while @operacion < 468
begin

insert into t1(c1,..., cn)
select c1,..., cn
from dbo.funcion(@operacion)

set @operacion = @operacion + 1
end
go


AMB

"Alejandro Mesa" wrote:

Community Message Not Available
Respuesta Responder a este mensaje
#4 Alejandro Mesa
23/08/2005 - 20:02 | Informe spam
Jose Antonio,

Esa funcion esta incompleta. Sin ver o saber lo que hace exactamente, no
puedo pensar en una solucion.


AMB

"Jose Antonio" wrote:

Alejandro el codigo de la funcion esta en el mensaje, al final del mismo.


"Alejandro Mesa" escribió en el
mensaje news:
> Correccion,
>
> Olvide incrementar la variable @operacion.
>
> declare @operacion int
>
> set @operacion = 120
>
> while @operacion < 468
> begin
>
> insert into t1(c1,..., cn)
> select c1,..., cn
> from dbo.funcion(@operacion)
>
> set @operacion = @operacion + 1
> end
> go
>
>
> AMB
>
> "Alejandro Mesa" wrote:
>
>> Community Message Not Available



Respuesta Responder a este mensaje
#5 Jose Antonio
23/08/2005 - 22:32 | Informe spam
Alejandro, este es el codigo completo de la funcion:

CREATE FUNCTION CG_DR_ASILEASING (@OPERACION INT)
RETURNS @TABLA TABLE (OPERACION INT,TIPO CHAR(1),APUNTE INT,CUENTA
VARCHAR(10),FECHA DATETIME,DOCUMENTO VARCHAR(20),DEBE DECIMAL(15,2),HABER
DECIMAL(15,2))
AS
BEGIN
DECLARE @FECHAVAR DATETIME,@HASTAFECHA DATETIME
DECLARE @DOCUMENTO VARCHAR(20),@VARIACION VARCHAR(1)
DECLARE @IMPINTI DECIMAL(15,2),@IMPINTF DECIMAL(15,2)
DECLARE @IMPCORREOI DECIMAL(15,2),@IMPCORREOF DECIMAL(15,2)
DECLARE @IMPIVAI DECIMAL(15,2),@IMPIVAF DECIMAL(15,2)
DECLARE @LARGOI DECIMAL(15,2),@LARGOF DECIMAL(15,2)
DECLARE @CORTOI DECIMAL(15,2),@CORTOF DECIMAL(15,2)
DECLARE @CPCORTO VARCHAR(10),@CPLARGO VARCHAR(10)
DECLARE @CINTDIF VARCHAR(10),@CIVADIF VARCHAR(10),@CDERECHOS VARCHAR(10)
DECLARE @DEBE DECIMAL(15,2),@HABER DECIMAL(15,2),@TOTAL DECIMAL(15,2)
DECLARE @DIFINT DECIMAL(15,2),@DIFIVA DECIMAL(15,2),@DIFLARGO
DECIMAL(15,2),@DIFCORTO DECIMAL(15,2)

SELECT
@DOCUMENTO=SERIE+'-'+CONVERT(VARCHAR,OPERACION)+'/'+RIGHT(CONVERT(VARCHAR,DATEPART(YY,FECHA)),2),@FECHAVARÊSE
WHEN FECHAVAR IS NULL THEN FECHA ELSE FECHAVAR END,
@CPCORTO=CPCORTO,@CINTDIF=CINTDIF,@CIVADIF=CIVADIF,@CPLARGO=CPLARGO,@VARIACIONÊSE
WHEN FECHAVAR IS NULL THEN 'N' ELSE 'S' END,@CDERECHOSÍERECHOS
FROM LEASING WHERE OPERACION=@OPERACION

SET @HASTAFECHAÚTEADD(yy,1,@FECHAVAR)

SELECT @CORTOI=ISNULL(SUM(VARTOTAL),0),@CORTOF=ISNULL(SUM(TOTAL),0) FROM
CULEASING WHERE OPERACION=@OPERACION AND VENCIMIENTO>=@FECHAVAR AND
VENCIMIENTO<@HASTAFECHA

SELECT
@IMPINTI=ISNULL(SUM(VARINTERES),0),@IMPCORREOI=ISNULL(SUM(VARCORREO),0),@IMPIVAI=ISNULL(SUM(VARIVA),0),@IMPINTF=ISNULL(SUM(INTERESF),0),
@IMPCORREOF=ISNULL(SUM(CORREOF),0),@IMPIVAF=ISNULL(SUM(IVAF),0),@LARGOI=ISNULL(SUM(VARTOTAL),0),@LARGOF=ISNULL(SUM(TOTAL),0),@TOTAL=ISNULL(SUM(AMORTIZACION),0)
FROM CULEASING WHERE OPERACION=@OPERACION AND VENCIMIENTO>=@FECHAVAR

SET @DIFLARGO=@
SET @DIFCORTO=@

SET @DIFINT=@+@
SET @DIFIVA=@

IF @VARIACION='N'
BEGIN
SET @DEBE=@TOTAL
SET @HABER=0
INSERT @TABLA VALUES (@OPERACION,CASE WHEN @DEBE!=0 THEN 'D' ELSE 'H'
END,1,@CDERECHOS,@FECHAVAR,@DOCUMENTO,@DEBE,@HABER)
END

IF @DIFINT!=0
BEGIN
SET @DEBE=0
SET @HABER=0
IF @DIFINT>0 SET @DEBE=@DIFINT ELSE SET @HABER«S(@DIFINT)
INSERT @TABLA VALUES (@OPERACION,CASE WHEN @DEBE!=0 THEN 'D' ELSE 'H'
END,2,@CINTDIF,@FECHAVAR,@DOCUMENTO,@DEBE,@HABER)
END
IF @DIFIVA!=0
BEGIN
SET @DEBE=0
SET @HABER=0
IF @DIFIVA>0 SET @DEBE=@DIFIVA ELSE SET @HABER«S(@DIFIVA)
INSERT @TABLA VALUES (@OPERACION,CASE WHEN @DEBE!=0 THEN 'D' ELSE 'H'
END,3,@CIVADIF,@FECHAVAR,@DOCUMENTO,@DEBE,@HABER)
END
IF @DIFLARGO!=0
BEGIN
SET @DEBE=0
SET @HABER=0
IF @DIFLARGO>0 SET @HABER=@DIFLARGO ELSE SET @DEBE«S(@DIFLARGO)
INSERT @TABLA VALUES (@OPERACION,CASE WHEN @DEBE!=0 THEN 'D' ELSE 'H'
END,4,@CPLARGO,@FECHAVAR,@DOCUMENTO,@DEBE,@HABER)
END
IF @DIFCORTO!=0
BEGIN
SET @DEBE=0
SET @HABER=0
IF @DIFCORTO>0 SET @HABER=@DIFCORTO ELSE SET @DEBE«S(@DIFCORTO)
INSERT @TABLA VALUES (@OPERACION,CASE WHEN @DEBE!=0 THEN 'D' ELSE 'H'
END,5,@CPCORTO,@FECHAVAR,@DOCUMENTO,@DEBE,@HABER)
END
RETURN
END

"Alejandro Mesa" escribió en el
mensaje news:
Jose Antonio,

Esa funcion esta incompleta. Sin ver o saber lo que hace exactamente, no
puedo pensar en una solucion.


AMB

"Jose Antonio" wrote:

Alejandro el codigo de la funcion esta en el mensaje, al final del mismo.


"Alejandro Mesa" escribió en el
mensaje news:
> Correccion,
>
> Olvide incrementar la variable @operacion.
>
> declare @operacion int
>
> set @operacion = 120
>
> while @operacion < 468
> begin
>
> insert into t1(c1,..., cn)
> select c1,..., cn
> from dbo.funcion(@operacion)
>
> set @operacion = @operacion + 1
> end
> go
>
>
> AMB
>
> "Alejandro Mesa" wrote:
>
>> Community Message Not Available



email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida