Proc. dentro de Proc.

04/08/2004 - 16:21 por Chente | Informe spam
Que tal compañeros, gracias por leer.

Esta es la situación, tengo un procedimiento que me calcula la prima de una
fianza, es la siguiente:


/***************************************/
CREATE PROCEDURE [Fianza_Calcular_Prima]
@afianzadora smallint,
@importe money,
@concepto tinyint
AS

declare @tarifa money
declare @primamin money

if @concepto = 0 -- Daños y perjuicios
begin
select @tarifa = (afdptarifa/100), @primamin = afdpprimamin from
ctafianzadora where afclave = @afianzadora
if (@importe * @tarifa) < @primamin
select (@primamin + (@primamin * afportar/100) + afdpgtosexp) as Prima
from ctafianzadora where afclave = @afianzadora
else
select ((@importe * @tarifa)+ ((@importe * @tarifa)* afportar/100) +
afdpgtosexp) as Prima from ctafianzadora where afclave = @afianzadora
end
else if @concepto = 1 -- Reparacion del daño
select (afctafija * (1 + afporder/100) + afgtosexp) *
(floor(@importe/afprimaxcmonto) + 1)
as Prima
from CTAFIANZADORA
where afclave = @afianzadora
else -- Obligaciones Procesales / Libertad Provisional / Sanciones
Pecuniarias
if @importe <= (select aftopelc from CTAFIANZADORA where afclave @afianzadora)
select afcarmin * (1 + afporder/100) + afgtosexplc as prima from
CTAFIANZADORA
where afclave = @afianzadora
else
select (@importe * afportar/100) * (1 + afporder/100) + afgtosexplc as
Prima from CTAFIANZADORA
where afclave = @afianzadora
GO
/***************************************/


Ahora bien, a mi gustaria poder mandarlo llamar desdes otro procedimiento
almacenado y que me devuelva la prima, por ejemplo.


Declare @prima money

set @prima = Fianza_Calcular_Prima 5, 34000, 1

select @prima

esto es solo un ejemplo, en realidad es mas complejo pero lo que quiero es
la luz solamente, y de ahi yo me sigo, espero que alguien me ayude, no se si
tenga que convertirlo en una función.



Saludos.


Vicente López.

Preguntas similare

Leer las respuestas

#1 Gustavo Larriera [MVP SQL]
04/08/2004 - 16:50 | Informe spam
Hola Chente,

puedes hacer lo siguiente: define en el sproc un parámetro declarado como
OUTPUT, dentro del sproc asigna el resultado de tu cálculo a dicho
parámetro.

CREATE PROCEDURE [Fianza_Calcular_Prima]
@afianzadora smallint,
@importe money,
@concepto tinyint,
@primaResultado money OUTPUT
AS

En el sproc que llama al Fianza_Calcular_Prima deberás hacer algo como esto:

DECLARE @unaVariable MONEY
EXEC Fianza_Calcular_Prima 7, 12500, 3, @unaVariable OUTPUT


También puedes considerar el convertir el sproc a función.

Espero te sirva de ayuda
gux

Gustavo Larriera
Uruguay LatAm
http://sqljunkies.com/weblog/gux/
Este mensaje se proporciona "COMO ESTA" sin garantias y no otorga ningun
derecho / This posting is provided "AS IS" with no warranties, and confers
no rights.
"Chente" <foro[@]ausa.com.mx> wrote in message
news:OgJ%
Que tal compañeros, gracias por leer.

Esta es la situación, tengo un procedimiento que me calcula la prima de


una
fianza, es la siguiente:


/***************************************/
CREATE PROCEDURE [Fianza_Calcular_Prima]
@afianzadora smallint,
@importe money,
@concepto tinyint
AS

declare @tarifa money
declare @primamin money

if @concepto = 0 -- Daños y perjuicios
begin
select @tarifa = (afdptarifa/100), @primamin = afdpprimamin from
ctafianzadora where afclave = @afianzadora
if (@importe * @tarifa) < @primamin
select (@primamin + (@primamin * afportar/100) + afdpgtosexp) as Prima
from ctafianzadora where afclave = @afianzadora
else
select ((@importe * @tarifa)+ ((@importe * @tarifa)* afportar/100) +
afdpgtosexp) as Prima from ctafianzadora where afclave = @afianzadora
end
else if @concepto = 1 -- Reparacion del daño
select (afctafija * (1 + afporder/100) + afgtosexp) *
(floor(@importe/afprimaxcmonto) + 1)
as Prima
from CTAFIANZADORA
where afclave = @afianzadora
else -- Obligaciones Procesales / Libertad Provisional /


Sanciones
Pecuniarias
if @importe <= (select aftopelc from CTAFIANZADORA where afclave > @afianzadora)
select afcarmin * (1 + afporder/100) + afgtosexplc as prima from
CTAFIANZADORA
where afclave = @afianzadora
else
select (@importe * afportar/100) * (1 + afporder/100) + afgtosexplc as
Prima from CTAFIANZADORA
where afclave = @afianzadora
GO
/***************************************/


Ahora bien, a mi gustaria poder mandarlo llamar desdes otro procedimiento
almacenado y que me devuelva la prima, por ejemplo.


Declare @prima money

set @prima = Fianza_Calcular_Prima 5, 34000, 1

select @prima

esto es solo un ejemplo, en realidad es mas complejo pero lo que quiero es
la luz solamente, y de ahi yo me sigo, espero que alguien me ayude, no se


si
tenga que convertirlo en una función.



Saludos.


Vicente López.


Respuesta Responder a este mensaje
#2 Chente
04/08/2004 - 17:19 | Informe spam
Gracias Gustavo, voy a ponerlo en practica y te aviso, dime algo, que es lo
mas óptimo, trabajarlo con procs. o como funcion.


Saludos.


"Gustavo Larriera [MVP SQL]" escribió en el
mensaje news:
Hola Chente,

puedes hacer lo siguiente: define en el sproc un parámetro declarado como
OUTPUT, dentro del sproc asigna el resultado de tu cálculo a dicho
parámetro.

CREATE PROCEDURE [Fianza_Calcular_Prima]
@afianzadora smallint,
@importe money,
@concepto tinyint,
@primaResultado money OUTPUT
AS

En el sproc que llama al Fianza_Calcular_Prima deberás hacer algo como


esto:

DECLARE @unaVariable MONEY
EXEC Fianza_Calcular_Prima 7, 12500, 3, @unaVariable OUTPUT


También puedes considerar el convertir el sproc a función.

Espero te sirva de ayuda
gux

Gustavo Larriera
Uruguay LatAm
http://sqljunkies.com/weblog/gux/
Este mensaje se proporciona "COMO ESTA" sin garantias y no otorga ningun
derecho / This posting is provided "AS IS" with no warranties, and confers
no rights.
"Chente" <foro[@]ausa.com.mx> wrote in message
news:OgJ%
> Que tal compañeros, gracias por leer.
>
> Esta es la situación, tengo un procedimiento que me calcula la prima de
una
> fianza, es la siguiente:
>
>
> /***************************************/
> CREATE PROCEDURE [Fianza_Calcular_Prima]
> @afianzadora smallint,
> @importe money,
> @concepto tinyint
> AS
>
> declare @tarifa money
> declare @primamin money
>
> if @concepto = 0 -- Daños y perjuicios
> begin
> select @tarifa = (afdptarifa/100), @primamin = afdpprimamin from
> ctafianzadora where afclave = @afianzadora
> if (@importe * @tarifa) < @primamin
> select (@primamin + (@primamin * afportar/100) + afdpgtosexp) as Prima
> from ctafianzadora where afclave = @afianzadora
> else
> select ((@importe * @tarifa)+ ((@importe * @tarifa)* afportar/100) +
> afdpgtosexp) as Prima from ctafianzadora where afclave = @afianzadora
> end
> else if @concepto = 1 -- Reparacion del daño
> select (afctafija * (1 + afporder/100) + afgtosexp) *
> (floor(@importe/afprimaxcmonto) + 1)
> as Prima
> from CTAFIANZADORA
> where afclave = @afianzadora
> else -- Obligaciones Procesales / Libertad Provisional /
Sanciones
> Pecuniarias
> if @importe <= (select aftopelc from CTAFIANZADORA where afclave > > @afianzadora)
> select afcarmin * (1 + afporder/100) + afgtosexplc as prima from
> CTAFIANZADORA
> where afclave = @afianzadora
> else
> select (@importe * afportar/100) * (1 + afporder/100) + afgtosexplc as
> Prima from CTAFIANZADORA
> where afclave = @afianzadora
> GO
> /***************************************/
>
>
> Ahora bien, a mi gustaria poder mandarlo llamar desdes otro


procedimiento
> almacenado y que me devuelva la prima, por ejemplo.
>
>
> Declare @prima money
>
> set @prima = Fianza_Calcular_Prima 5, 34000, 1
>
> select @prima
>
> esto es solo un ejemplo, en realidad es mas complejo pero lo que quiero


es
> la luz solamente, y de ahi yo me sigo, espero que alguien me ayude, no


se
si
> tenga que convertirlo en una función.
>
>
>
> Saludos.
>
>
> Vicente López.
>
>


Respuesta Responder a este mensaje
#3 Fabian Ramirez
04/08/2004 - 18:33 | Informe spam
Aqui tienes otra opcion usando el comando RETURN


create procedure proc1 (
@param1 int,
@param2 int
)
as
begin
declare @result int
select @result = @param1 * @param2
return @result
end
go

create procedure proc2
as
begin
declare @result int
exec @result = proc1 5,2
Print @result
end
go

exec proc2



Que tal compañeros, gracias por leer.

Esta es la situación, tengo un procedimiento que me


calcula la prima de una
fianza, es la siguiente:


/***************************************/
CREATE PROCEDURE [Fianza_Calcular_Prima]
@afianzadora smallint,
@importe money,
@concepto tinyint
AS

declare @tarifa money
declare @primamin money

if @concepto = 0 -- Daños y perjuicios
begin
select @tarifa = (afdptarifa/100), @primamin =


afdpprimamin from
ctafianzadora where afclave = @afianzadora
if (@importe * @tarifa) < @primamin
select (@primamin + (@primamin * afportar/100) +


afdpgtosexp) as Prima
from ctafianzadora where afclave = @afianzadora
else
select ((@importe * @tarifa)+ ((@importe * @tarifa)*


afportar/100) +
afdpgtosexp) as Prima from ctafianzadora where afclave =


@afianzadora
end
else if @concepto = 1 -- Reparacion del daño
select (afctafija * (1 + afporder/100) + afgtosexp) *
(floor(@importe/afprimaxcmonto) + 1)
as Prima
from CTAFIANZADORA
where afclave = @afianzadora
else -- Obligaciones Procesales / Libertad


Provisional / Sanciones
Pecuniarias
if @importe <= (select aftopelc from CTAFIANZADORA


where afclave >@afianzadora)
select afcarmin * (1 + afporder/100) + afgtosexplc as


prima from
CTAFIANZADORA
where afclave = @afianzadora
else
select (@importe * afportar/100) * (1 + afporder/100)


+ afgtosexplc as
Prima from CTAFIANZADORA
where afclave = @afianzadora
GO
/***************************************/


Ahora bien, a mi gustaria poder mandarlo llamar desdes


otro procedimiento
almacenado y que me devuelva la prima, por ejemplo.


Declare @prima money

set @prima = Fianza_Calcular_Prima 5, 34000, 1

select @prima

esto es solo un ejemplo, en realidad es mas complejo


pero lo que quiero es
la luz solamente, y de ahi yo me sigo, espero que


alguien me ayude, no se si
tenga que convertirlo en una función.



Saludos.


Vicente López.


.

Respuesta Responder a este mensaje
#4 Javier Loria
05/08/2004 - 05:22 | Informe spam
Hola Chente:
Solo una idea.
Este tipo de procedimientos, es mi experiencia, terminan mal. Y la razon
es que el SQL no fue construido como un lenguaje procedimiental y en tu caso
tu codigo se parece demasiado al codigo que escribiria algun programador en
C#, VB.NET, C++, Pascal, etc. SQL como lenguaje procedimental es bien pobre.
En probable que en algun momento vas a querar usar este procedimiento con
una tabla, vista o conjunto de datos y BUM!!!, problemas.
La forma de "solucionar" este problema sera que usar un cursor, y si lo
pones el foro como 100 personas te recomendaran que no uses cursores y
alguien recomendara una funcion, que claro en este caso como usa una tabla
es LENTA. Disculpa que sea tan negativo pero lo he visto :D
Otra alternativa, MUCHO MAS DIFICIL, es cambiar de logica y pasar una
parte (desgraciadamente en tu caso no se puede todo), y escribir una vista
como esto:
CREATE VIEW BasesCalculoPrimas
SELECT
AfdpTarifa/100 AS TarifaDanosPerjucios
, AfdpPrimamin AS PrimaDanosPerjucios
, AfdpPrimamin+ (AfdpPrimamin * AfPortar/100)+ Afdpgtosexp AS
PrimaXXX
, (AfdpTarifa* (1+afportar/100) ) AS
FactorXXX
, AfCtaFija * (1 + Afporder/100) + afgtosexp) AS FactorDanoY
, afPrimaxcmonto AS DivisorDanoY
, AfCarmin * (1 + AfPorder/100) + Afgtosexplc as
PrimaObligacionesMenor
, (afportar/100) * (1 + afporder/100) + AfGtoSexplc AS
FactorObligaciones
FROM CtaFianzadora
Con esta vista "escondes" una buena parte de la complicacion de la tabla
(hay otra forma que usando una fila para cada concepto) y es ahora "facil"
calcular primas en bloque para vistas o tablas.
Deja el mal camino que te deja la programacion procedimental y une a los
hijos del la luz, los que pensamos a conjuntos. Arrepentios... :D (eso era
parte de otro discurso, creo que me deje llevar)
Saludos,

Javier Loria
Costa Rica
Se aprecia la inclusion de DDL (CREATE, INSERTS, etc.)
que pueda ser copiado y pegado al Query Analizer.
La version de SQL y Service Pack tambien ayuda.
Chente <foro[@]ausa.com.mx> escribio:
Que tal compañeros, gracias por leer.

Esta es la situación, tengo un procedimiento que me calcula la prima
de una fianza, es la siguiente:


/***************************************/
CREATE PROCEDURE [Fianza_Calcular_Prima]
@afianzadora smallint,
@importe money,
@concepto tinyint
AS

declare @tarifa money
declare @primamin money

if @concepto = 0 -- Daños y perjuicios
begin
select @tarifa = (afdptarifa/100), @primamin = afdpprimamin from
ctafianzadora where afclave = @afianzadora
if (@importe * @tarifa) < @primamin
select (@primamin + (@primamin * afportar/100) + afdpgtosexp) as
Prima from ctafianzadora where afclave = @afianzadora
else
select ((@importe * @tarifa)+ ((@importe * @tarifa)* afportar/100) +
afdpgtosexp) as Prima from ctafianzadora where afclave = @afianzadora
end
else if @concepto = 1 -- Reparacion del daño
select (afctafija * (1 + afporder/100) + afgtosexp) *
(floor(@importe/afprimaxcmonto) + 1)
as Prima
from CTAFIANZADORA
where afclave = @afianzadora
else -- Obligaciones Procesales / Libertad Provisional /
Sanciones Pecuniarias
if @importe <= (select aftopelc from CTAFIANZADORA where afclave > @afianzadora)
select afcarmin * (1 + afporder/100) + afgtosexplc as prima from
CTAFIANZADORA
where afclave = @afianzadora
else
select (@importe * afportar/100) * (1 + afporder/100) + afgtosexplc
as Prima from CTAFIANZADORA
where afclave = @afianzadora
GO
/***************************************/


Ahora bien, a mi gustaria poder mandarlo llamar desdes otro
procedimiento almacenado y que me devuelva la prima, por ejemplo.


Declare @prima money

set @prima = Fianza_Calcular_Prima 5, 34000, 1

select @prima

esto es solo un ejemplo, en realidad es mas complejo pero lo que
quiero es la luz solamente, y de ahi yo me sigo, espero que alguien
me ayude, no se si tenga que convertirlo en una función.



Saludos.


Vicente López.
Respuesta Responder a este mensaje
#5 Javier Loria
05/08/2004 - 05:25 | Informe spam
Hola:
El return sirve para salir incondicionalmente de un procedimiento, y en
general debido a la forma en que estan programados los procedimientos
almacenados se asume que cualquier valor distinto a cero indica que se ha
producido un error.
En este caso seria mejor una funcion escalar que si usan el retorno como
lo describiste.
Saludos,


Javier Loria
Costa Rica
Se aprecia la inclusion de DDL (CREATE, INSERTS, etc.)
que pueda ser copiado y pegado al Query Analizer.
La version de SQL y Service Pack tambien ayuda.


Fabian Ramirez escribio:
Aqui tienes otra opcion usando el comando RETURN


create procedure proc1 (
@param1 int,
@param2 int
)
as
begin
declare @result int
select @result = @param1 * @param2
return @result
end
go

create procedure proc2
as
begin
declare @result int
exec @result = proc1 5,2
Print @result
end
go

exec proc2



Que tal compañeros, gracias por leer.

Esta es la situación, tengo un procedimiento que me calcula la prima
de una fianza, es la siguiente:


/***************************************/
CREATE PROCEDURE [Fianza_Calcular_Prima]
@afianzadora smallint,
@importe money,
@concepto tinyint
AS

declare @tarifa money
declare @primamin money

if @concepto = 0 -- Daños y perjuicios
begin
select @tarifa = (afdptarifa/100), @primamin = afdpprimamin from
ctafianzadora where afclave = @afianzadora
if (@importe * @tarifa) < @primamin
select (@primamin + (@primamin * afportar/100) + afdpgtosexp) as
Prima from ctafianzadora where afclave = @afianzadora
else
select ((@importe * @tarifa)+ ((@importe * @tarifa)* afportar/100) +
afdpgtosexp) as Prima from ctafianzadora where afclave = @afianzadora
end
else if @concepto = 1 -- Reparacion del daño
select (afctafija * (1 + afporder/100) + afgtosexp) *
(floor(@importe/afprimaxcmonto) + 1)
as Prima
from CTAFIANZADORA
where afclave = @afianzadora
else -- Obligaciones Procesales / Libertad Provisional /
Sanciones Pecuniarias
if @importe <= (select aftopelc from CTAFIANZADORA where afclave >> @afianzadora)
select afcarmin * (1 + afporder/100) + afgtosexplc as prima from
CTAFIANZADORA
where afclave = @afianzadora
else
select (@importe * afportar/100) * (1 + afporder/100) + afgtosexplc
as Prima from CTAFIANZADORA
where afclave = @afianzadora
GO
/***************************************/


Ahora bien, a mi gustaria poder mandarlo llamar desdes otro
procedimiento almacenado y que me devuelva la prima, por ejemplo.


Declare @prima money

set @prima = Fianza_Calcular_Prima 5, 34000, 1

select @prima

esto es solo un ejemplo, en realidad es mas complejo pero lo que
quiero es la luz solamente, y de ahi yo me sigo, espero que alguien
me ayude, no se si tenga que convertirlo en una función.



Saludos.


Vicente López.


.
Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida