Procedimiento Almacenado - parametros

25/10/2004 - 16:54 por Romero Diego | Informe spam
Hola
Como estan

El siguiente proc. almacenado hace un SELECT de varias tablas de dos bases
de datos para mostrar un listado en un DataGrid de Vb6 .

Tengo las siguientes dudas:
1. El listado lo debo filtar por cualquier campo que el usuario seleccione,
no solamente por IdCia y Fecha como está actualmente, es decir no se cuantos
campos vaya a seleccionar el usuario
¿ Es posible agregarle un parametro con la condición de seleccion 'WHERE' y
no parametro para cada campo ?

2. Que precedimiento da mas rendimiento : paQryDespachosDso o Pa_Query
(ver mas abajo..) ?

3. Tengo dos bases de datos sbuCat (donde estan todos los catalogos de
vehiculos, propietarios,etc..) y otra sbuTra (donde estan todos los
documentos y comprobantes que se hacen),
Que me aconsejan: ¿ es mejor una sola base de datos para todo o como está
actualmente ?.

Nota: sbucat tiene mas o menos 60 tablas y sbutra unas 30 tablas.
La aplicacición debe funcionar para bases de datos SQL server y
Access 200


Espero me puedan ayudar

Gracias

Diego

CREATE PROCEDURE paQryDespachosDso @pmIdCia CHAR(2),@pmFechaIni
SMALLDATETIME,@pmFechaFin SMALLDATETIME

AS
SELECT Cartulina, IdCia, Fecha, IdRuta, NumOrden,D.IdVehiculo AS
IdVehicul,Numero,D.IdPropietario AS IdPropiet,P.RazonSocial AS
Propietario,D.IdConductor AS IdCond,C.RazonSocial AS Conductor,ReciboCaja,
IdCiaRec,D.CentInicial AS CenInicial,D.CentFinal AS CenFinal,
NPasajeros, Recorridos,ValorPasaje, ValorProducido,
ValorGastos, ValorAhorro, ValorOtros,ValorGastos+ValorOtros AS TotalGastos,
ValorVales, ValorAbono,
ValorAhorro+ ValorOtros+ ValorAbono AS TotalRecibido,
Anulado,FecDev, D.Observacion AS Observ,D.IdEstado AS
IdEstad,Estado,TimeSys,FecUpdate, IdCiaCrea,D.IdUsuario AS IdUsuari
FROM ((( Despachos AS D INNER JOIN sbucat.dbo.Vehiculos AS V ON
D.IdVehiculo=V.IdVehiculo
) INNER JOIN sbucat.dbo.Terceros AS P ON
D.IdPropietario=P.IdTercero
) LEFT JOIN sbucat.dbo.Terceros AS C ON
D.IdConductor=C.IdTercero
) LEFT JOIN sbucat.dbo.EstadoDoc AS E ON
D.IdEstado=E.IdEstado
WHERE IdCia=@pmIdCia AND Fecha BETWEEN @pmFechaIni AND @pmFechaFin
ORDER BY Cartulina

GO

'este procedimiento ejecuta una instruccion SELECT y devuelve los resultados

CREATE PROCEDURE Pa_Query
(@pmCampos VARCHAR(1000),
@pmTabla VARCHAR(500),
@pmCriterio VARCHAR(500),
@pmOrden VARCHAR(100),
@pmGroup VARCHAR(100),
@pmHaving VARCHAR(100))
AS
BEGIN
Declare @pmQry VARCHAR(2500)
SET @pmQry=''
SET @pmQry=@pmQry + 'SELECT '+ @pmCampos + ' FROM ' + @pmTabla
IF Len(@pmCriterio)>0
BEGIN
SET @pmQry=@pmQry + ' WHERE '+ @pmCriterio
END
IF Len(@pmGroup)>0
BEGIN
SET @pmQry=@pmQry + ' GROUP BY ' + @pmGroup
END
IF Len(@pmOrden)>0
BEGIN
SET @pmQry=@pmQry + ' ORDER BY '+ @pmOrden
END
IF Len(@pmHaving)>0
BEGIN
SET @pmQry=@pmQry + ' HAVING '+ @pmHaving
END
EXECUTE (@pmQry)
RETURN
END

GO
 

Leer las respuestas

#1 Maxi
25/10/2004 - 16:58 | Informe spam
Hola,

Respondiendo

1) Podrias hacer algo asi como

WHERE CAMPO1 = ISNULL(@CAMPO1,CAMPO1) AND CAMPO2=ISNULL(@CAMPO2,CAMPO2)


Te podrias armar un SP para los AND y otro para los OR, o sino bien que
sea un pararemtro tambien del SP y que con un IF selecciones el camino

2) Yo no uso Sql_dinamico casi nunca por muchos problemas de seguridad y
rendimiento, con lo cual para mi lo mejor es el SP 1

3) Ufaa, mira este tema de una BDD o mil BDD es un tema muy discutido
(fijate unos hilos mas abajo, que hay uno llamado "sistema MultiEmpresa".
Ahi hay una discusion interesante, pero para hacerla corta, yo haria una
sola BDD :-)


Salu2
Maxi
Buenos Aires - Argentina
Desarrollador Microsoft 3 Estrellas .NET
Nunca consideres el estudio como una obligación sino como
una oportunidad para penetrar en el bello y maravillosos
mundo del saber.
- Albert Einstein



"Romero Diego" escribió en el mensaje
news:%23r%
Hola
Como estan

El siguiente proc. almacenado hace un SELECT de varias tablas de dos bases
de datos para mostrar un listado en un DataGrid de Vb6 .

Tengo las siguientes dudas:
1. El listado lo debo filtar por cualquier campo que el usuario


seleccione,
no solamente por IdCia y Fecha como está actualmente, es decir no se


cuantos
campos vaya a seleccionar el usuario
¿ Es posible agregarle un parametro con la condición de seleccion 'WHERE'


y
no parametro para cada campo ?

2. Que precedimiento da mas rendimiento : paQryDespachosDso o Pa_Query
(ver mas abajo..) ?

3. Tengo dos bases de datos sbuCat (donde estan todos los catalogos de
vehiculos, propietarios,etc..) y otra sbuTra (donde estan todos los
documentos y comprobantes que se hacen),
Que me aconsejan: ¿ es mejor una sola base de datos para todo o como está
actualmente ?.

Nota: sbucat tiene mas o menos 60 tablas y sbutra unas 30 tablas.
La aplicacición debe funcionar para bases de datos SQL server y
Access 200


Espero me puedan ayudar

Gracias

Diego

CREATE PROCEDURE paQryDespachosDso @pmIdCia CHAR(2),@pmFechaIni
SMALLDATETIME,@pmFechaFin SMALLDATETIME

AS
SELECT Cartulina, IdCia, Fecha, IdRuta, NumOrden,D.IdVehiculo AS
IdVehicul,Numero,D.IdPropietario AS IdPropiet,P.RazonSocial AS
Propietario,D.IdConductor AS IdCond,C.RazonSocial AS Conductor,ReciboCaja,
IdCiaRec,D.CentInicial AS CenInicial,D.CentFinal AS CenFinal,
NPasajeros, Recorridos,ValorPasaje, ValorProducido,
ValorGastos, ValorAhorro, ValorOtros,ValorGastos+ValorOtros AS


TotalGastos,
ValorVales, ValorAbono,
ValorAhorro+ ValorOtros+ ValorAbono AS TotalRecibido,
Anulado,FecDev, D.Observacion AS Observ,D.IdEstado AS
IdEstad,Estado,TimeSys,FecUpdate, IdCiaCrea,D.IdUsuario AS IdUsuari
FROM ((( Despachos AS D INNER JOIN sbucat.dbo.Vehiculos AS V ON
D.IdVehiculo=V.IdVehiculo
) INNER JOIN sbucat.dbo.Terceros AS P ON
D.IdPropietario=P.IdTercero
) LEFT JOIN sbucat.dbo.Terceros AS C ON
D.IdConductor=C.IdTercero
) LEFT JOIN sbucat.dbo.EstadoDoc AS E ON
D.IdEstado=E.IdEstado
WHERE IdCia=@pmIdCia AND Fecha BETWEEN @pmFechaIni AND @pmFechaFin
ORDER BY Cartulina

GO

'este procedimiento ejecuta una instruccion SELECT y devuelve los


resultados

CREATE PROCEDURE Pa_Query
(@pmCampos VARCHAR(1000),
@pmTabla VARCHAR(500),
@pmCriterio VARCHAR(500),
@pmOrden VARCHAR(100),
@pmGroup VARCHAR(100),
@pmHaving VARCHAR(100))
AS
BEGIN
Declare @pmQry VARCHAR(2500)
SET @pmQry=''
SET @pmQry=@pmQry + 'SELECT '+ @pmCampos + ' FROM ' + @pmTabla
IF Len(@pmCriterio)>0
BEGIN
SET @pmQry=@pmQry + ' WHERE '+ @pmCriterio
END
IF Len(@pmGroup)>0
BEGIN
SET @pmQry=@pmQry + ' GROUP BY ' + @pmGroup
END
IF Len(@pmOrden)>0
BEGIN
SET @pmQry=@pmQry + ' ORDER BY '+ @pmOrden
END
IF Len(@pmHaving)>0
BEGIN
SET @pmQry=@pmQry + ' HAVING '+ @pmHaving
END
EXECUTE (@pmQry)
RETURN
END

GO










Outgoing mail is certified Virus Free.
Checked by AVG anti-virus system (http://www.grisoft.com).
Version: 6.0.781 / Virus Database: 527 - Release Date: 21/10/2004

Preguntas similares