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

#6 Chente
09/08/2004 - 16:20 | Informe spam
Gracias Javier, lo implemente como una función, ahora que leo tu
recomendación, intentare esta otra manera, aunque tengo mis dudas todavia,
como tu dices, estoy acostumbrado a esta forma de programación, pero no
estoy cerrado al cambio, asi que lo tratare de adaptar, gracias por el
consejo.


Saludos.

Vicente López.


"Javier Loria" escribió en el mensaje
news:
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.


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