WHERE dinamico

12/01/2010 - 18:01 por Angel Zapata | Informe spam
Hola grupo,

tengo un sp que admite varias combinaciones y para no crear una bestialidad
de codigo que luego no hay que controle he pensado hacerlo con una clausula
WHERE dinamica, mas o menos como expongo, entendiendo que hay tres grupos de
filtro, por un lado está el nivel máximo que se aplica siempre, despues está
el filtro que se puede aplicar a varios campos con el operador LIKE %Texto%
si es cadena o LIKE CONVERT si no lo es, y por ultimo está el filtro de
mostrar todos o solamente los que no han sido baja, es decir los que la
fecha de baja es null, siendo los dos ultimos opcionales del usuario.

He montado el where pero no consigo que me funcione, ¿alguna idea?

Un saludo y gracias por anticipado.
Angel Zapata
WHERE (((@NivelMaximo = 1) AND (Agente.AgeCodigo >0))

OR ((@NivelMaximo = 3) AND (Agente.AgenteZonaCodigo = @Zona))

OR ((@NivelMaximo = 4) AND (Agente.AgenteGerenciaCodigo = @Gerencia))

OR ((@NivelMaximo = 5) AND (Agente.AgenteDelegacionCodigo = @Delegacion))

OR ((@NivelMaximo = 6) AND (Agente.AgenteEquipoCodigo = @Equipo))

OR ((@NivelMaximo = 7) AND (Agente.AgeCodigo = @Promotor)))

AND (((@FiltroEn = 'Codigo') AND (Agente.AgeCodigo = CONVERT(Integer,
@FiltroPor)))

OR ((@FiltroEn = 'Nombre') AND (Agente.AgeApellido1 + ' ' +
Agente.AgeApellido2 + ' ' + Agente.AgeNombre LIKE @FiltroPor ))

OR ((@FiltroEn = 'NIF') AND (Agente.AgeNIF LIKE '%' + @FiltroPor + '%'))

OR ((@FiltroEn = 'Alta') AND (Agente.AgenteFechaAltaCategoria =
CONVERT(DATETIME, @FiltroPor,103)))

OR ((@FiltroEn = 'Baja') AND (Agente.AgenteFechaBajaCategoria =
CONVERT(DATETIME, @FiltroPor, 103)))

OR ((@FiltroEn = 'EMPR') AND (Agente.EmpresaCodigo LIKE '%' + @FiltroPor +
'%'))

OR ((@FiltroEn = 'TRAB') AND (Agente.TrabajadorCodigo LIKE '%' + @FiltroPor
+ '%'))

OR ((@FiltroEn = 'Delegacion') AND (Agente_1.AgeApellido1 + ' ' +
Agente_1.AgeApellido2 + ' ' + Agente_1.AgeNombre LIKE + '%' + @FiltroPor +
'%')))

AND (((@MostrarTodos = 0) AND (Agente.AgenteFechaBajaCategoria IS NULL)))

Preguntas similare

Leer las respuestas

#1 Gustavo Cantero (The Wolf)
12/01/2010 - 22:33 | Informe spam
Angel:
¿Cuál es el problema que está teniendo? ¿Te devuelve un error o no
devuelve nada? ¿@MostrarTodos vale "0"? ¿Hay registros donde
Agente.AgenteFechaBajaCategoria sea nulo?
Saludos.

Gustavo A. Cantero
Scientia® Soluciones Informáticas
MCP - MCSD - MCTS - MCPD
http://www.scientia.com.ar
http://www.programandoamedianoche.com
http://foro.scientia.com.ar


On 12/01/2010 02:01 p.m., Angel Zapata wrote:
Hola grupo,

tengo un sp que admite varias combinaciones y para no crear una bestialidad
de codigo que luego no hay que controle he pensado hacerlo con una clausula
WHERE dinamica, mas o menos como expongo, entendiendo que hay tres grupos de
filtro, por un lado está el nivel máximo que se aplica siempre, despues está
el filtro que se puede aplicar a varios campos con el operador LIKE %Texto%
si es cadena o LIKE CONVERT si no lo es, y por ultimo está el filtro de
mostrar todos o solamente los que no han sido baja, es decir los que la
fecha de baja es null, siendo los dos ultimos opcionales del usuario.

He montado el where pero no consigo que me funcione, ¿alguna idea?

Un saludo y gracias por anticipado.
Angel Zapata
WHERE (((@NivelMaximo = 1) AND (Agente.AgeCodigo>0))

OR ((@NivelMaximo = 3) AND (Agente.AgenteZonaCodigo = @Zona))

OR ((@NivelMaximo = 4) AND (Agente.AgenteGerenciaCodigo = @Gerencia))

OR ((@NivelMaximo = 5) AND (Agente.AgenteDelegacionCodigo = @Delegacion))

OR ((@NivelMaximo = 6) AND (Agente.AgenteEquipoCodigo = @Equipo))

OR ((@NivelMaximo = 7) AND (Agente.AgeCodigo = @Promotor)))

AND (((@FiltroEn = 'Codigo') AND (Agente.AgeCodigo = CONVERT(Integer,
@FiltroPor)))

OR ((@FiltroEn = 'Nombre') AND (Agente.AgeApellido1 + ' ' +
Agente.AgeApellido2 + ' ' + Agente.AgeNombre LIKE @FiltroPor ))

OR ((@FiltroEn = 'NIF') AND (Agente.AgeNIF LIKE '%' + @FiltroPor + '%'))

OR ((@FiltroEn = 'Alta') AND (Agente.AgenteFechaAltaCategoria > CONVERT(DATETIME, @FiltroPor,103)))

OR ((@FiltroEn = 'Baja') AND (Agente.AgenteFechaBajaCategoria > CONVERT(DATETIME, @FiltroPor, 103)))

OR ((@FiltroEn = 'EMPR') AND (Agente.EmpresaCodigo LIKE '%' + @FiltroPor +
'%'))

OR ((@FiltroEn = 'TRAB') AND (Agente.TrabajadorCodigo LIKE '%' + @FiltroPor
+ '%'))

OR ((@FiltroEn = 'Delegacion') AND (Agente_1.AgeApellido1 + ' ' +
Agente_1.AgeApellido2 + ' ' + Agente_1.AgeNombre LIKE + '%' + @FiltroPor +
'%')))

AND (((@MostrarTodos = 0) AND (Agente.AgenteFechaBajaCategoria IS NULL)))





Respuesta Responder a este mensaje
#2 microsoft.public.es
12/01/2010 - 22:49 | Informe spam
hola Angel
no se si te entendi bien, pero cuando quiero hacer consultas en donde
las condiciones del qhere pueden variar utilizo sp_executesql para
efectuarlas.

DECLARE
.
.
.
@cueri as nvarchar(1000),
@parDefinition as nvarchar(1000)

SELECT @parDefinition = '@numero_id varchar(14), ' +
'@num_indic1 as int ',
'@num_indic2 as int ',
'@num_indic3 as int ',
'@fechaFac as datetime out ',
@cueri = 'SELECT fecha, valor1 ' +
'FROM ' + @tabla + ' (nolock)' +
' WHERE CUENTA = @num_cuenta '
' AND indice1 = @num_indic1 '

@if @numero_indic2 <> 0
begin
SELECT @cueri = @cueri + ' AND indice2 = @num_indic2 '
end

@if @numero_indic3 <> 0
begin
SELECT @cueri = @cueri + ' AND indice3 = @num_indic3 '
end

select @cueri = @cueri + ' Order by fecha '

EXECUTE sp_executesql @cueri,
@parDefinition,
@numero_id,
@numero_indic1,
@numero_indic2,
@numero_indic3,
@fechaFac OUTPUT

como vez los parametros se definen y usan todos pero la sentencia se
construye dinamica.

salu2
PPoo

Angel Zapata Escribió :
Hola grupo,

tengo un sp que admite varias combinaciones y para no crear una bestialidad
de codigo que luego no hay que controle he pensado hacerlo con una clausula
WHERE dinamica, mas o menos como expongo, entendiendo que hay tres grupos de
filtro, por un lado está el nivel máximo que se aplica siempre, despues está
el filtro que se puede aplicar a varios campos con el operador LIKE %Texto%
si es cadena o LIKE CONVERT si no lo es, y por ultimo está el filtro de
mostrar todos o solamente los que no han sido baja, es decir los que la fecha
de baja es null, siendo los dos ultimos opcionales del usuario.

He montado el where pero no consigo que me funcione, ¿alguna idea?

Un saludo y gracias por anticipado.
Angel Zapata
WHERE (((@NivelMaximo = 1) AND (Agente.AgeCodigo >0))

OR ((@NivelMaximo = 3) AND (Agente.AgenteZonaCodigo = @Zona))

OR ((@NivelMaximo = 4) AND (Agente.AgenteGerenciaCodigo = @Gerencia))

OR ((@NivelMaximo = 5) AND (Agente.AgenteDelegacionCodigo = @Delegacion))

OR ((@NivelMaximo = 6) AND (Agente.AgenteEquipoCodigo = @Equipo))

OR ((@NivelMaximo = 7) AND (Agente.AgeCodigo = @Promotor)))

AND (((@FiltroEn = 'Codigo') AND (Agente.AgeCodigo = CONVERT(Integer,
@FiltroPor)))

OR ((@FiltroEn = 'Nombre') AND (Agente.AgeApellido1 + ' ' +
Agente.AgeApellido2 + ' ' + Agente.AgeNombre LIKE @FiltroPor ))

OR ((@FiltroEn = 'NIF') AND (Agente.AgeNIF LIKE '%' + @FiltroPor + '%'))

OR ((@FiltroEn = 'Alta') AND (Agente.AgenteFechaAltaCategoria =
CONVERT(DATETIME, @FiltroPor,103)))

OR ((@FiltroEn = 'Baja') AND (Agente.AgenteFechaBajaCategoria =
CONVERT(DATETIME, @FiltroPor, 103)))

OR ((@FiltroEn = 'EMPR') AND (Agente.EmpresaCodigo LIKE '%' + @FiltroPor +
'%'))

OR ((@FiltroEn = 'TRAB') AND (Agente.TrabajadorCodigo LIKE '%' + @FiltroPor +
'%'))

OR ((@FiltroEn = 'Delegacion') AND (Agente_1.AgeApellido1 + ' ' +
Agente_1.AgeApellido2 + ' ' + Agente_1.AgeNombre LIKE + '%' + @FiltroPor +
'%')))

AND (((@MostrarTodos = 0) AND (Agente.AgenteFechaBajaCategoria IS NULL)))



salu2
PPoo
Respuesta Responder a este mensaje
#3 Angel Zapata
13/01/2010 - 08:46 | Informe spam
Hola Gustavo,

el resultado es que no me devuelve nada, si pongo todos los condicionanes
del Where no hace nada, en cambio si pongo solamente el primer grupo si
funciona perfecto, supongo que sera por los tres grupos del WHERE.

La variable @MostrarTodos es un boolean, entonces segun el valor podría
verlos todos o solamente los que no tengan fecha de baja.

Aqui tienes todo el SP

y muchas gracias por tu interes

Angel Zapata

ALTER PROCEDURE [dbo].[spAgenteGeneralNuevo]

@Zona AS Integer,

@Gerencia AS Integer,

@Delegacion AS Integer,

@Equipo AS Integer,

@Promotor AS Integer,

@MostrarTodos AS Integer,

@FiltroPor AS NVarChar,

@FiltroEn AS NVarChar

AS

Declare @SQLConsulta AS NVarChar(4000)

Declare @NivelMaximo AS Integer


Set @NivelMaximo = 1

If @Zona <> 0 Set @NivelMaximo = 3

If @Gerencia <> 0 Set @NivelMaximo = 4

If @Delegacion <> 0 Set @NivelMaximo = 5

If @Equipo <> 0 Set @NivelMaximo = 6

If @Promotor <> 0 Set @NivelMaximo = 7

SELECT Agente.AgeCodigo,

Agente.AgeApellido1 + ' ' + Agente.AgeApellido2 + ' ' +Agente.AgeNombre AS
AgenteNombre,

Agente.AgeNIF,

Agente.AgenteFechaAltaCategoria,

Agente.AgenteFechaBajaCategoria,

Agente.EmpresaCodigo,

Agente.TrabajadorCodigo,

Agente_1.AgeApellido1 + ' ' + Agente_1.AgeApellido2 + ' ' +
Agente_1.AgeNombre AS DelegacionNombre

FROM Agente

LEFT OUTER JOIN Agente Agente_1 ON Agente.AgenteDelegacionCodigo =
Agente_1.AgeCodigo

WHERE (((@NivelMaximo = 1) AND (Agente.AgeCodigo>0))

OR ((@NivelMaximo = 3) AND (Agente.AgenteZonaCodigo = @Zona))

OR ((@NivelMaximo = 4) AND (Agente.AgenteGerenciaCodigo = @Gerencia))

OR ((@NivelMaximo = 5) AND (Agente.AgenteDelegacionCodigo = @Delegacion))

OR ((@NivelMaximo = 6) AND (Agente.AgenteEquipoCodigo = @Equipo))

OR ((@NivelMaximo = 7) AND (Agente.AgeCodigo = @Promotor)))

AND (((@FiltroEn = 'Codigo') AND (Agente.AgeCodigo = CONVERT(Integer,
@FiltroPor)))

OR ((@FiltroEn = 'Nombre') AND (Agente.AgeApellido1 + ' ' +
Agente.AgeApellido2 + ' ' + Agente.AgeNombre LIKE @FiltroPor ))

OR ((@FiltroEn = 'NIF') AND (Agente.AgeNIF LIKE '%' + @FiltroPor + '%'))

OR ((@FiltroEn = 'Alta') AND (Agente.AgenteFechaAltaCategoria =
CONVERT(DATETIME, @FiltroPor,103)))

OR ((@FiltroEn = 'Baja') AND (Agente.AgenteFechaBajaCategoria =
CONVERT(DATETIME, @FiltroPor, 103)))

OR ((@FiltroEn = 'EMPR') AND (Agente.EmpresaCodigo LIKE '%' + @FiltroPor +
'%'))

OR ((@FiltroEn = 'TRAB') AND (Agente.TrabajadorCodigo LIKE '%' + @FiltroPor
+ '%'))

OR ((@FiltroEn = 'Delegacion') AND (Agente_1.AgeApellido1 + ' ' +
Agente_1.AgeApellido2 + ' ' + Agente_1.AgeNombre LIKE + '%' + @FiltroPor +
'%')))

AND (((@MostrarTodos = 0) AND (Agente.AgenteFechaBajaCategoria IS NULL)))

ORDER BY Agente.Agecodigo




"Gustavo Cantero (The Wolf)" escribió en el
mensaje news:
Angel:
¿Cuál es el problema que está teniendo? ¿Te devuelve un error o no
devuelve nada? ¿@MostrarTodos vale "0"? ¿Hay registros donde
Agente.AgenteFechaBajaCategoria sea nulo?
Saludos.

Gustavo A. Cantero
Scientia® Soluciones Informáticas
MCP - MCSD - MCTS - MCPD
http://www.scientia.com.ar
http://www.programandoamedianoche.com
http://foro.scientia.com.ar


On 12/01/2010 02:01 p.m., Angel Zapata wrote:
Hola grupo,

tengo un sp que admite varias combinaciones y para no crear una
bestialidad
de codigo que luego no hay que controle he pensado hacerlo con una
clausula
WHERE dinamica, mas o menos como expongo, entendiendo que hay tres grupos
de
filtro, por un lado está el nivel máximo que se aplica siempre, despues
está
el filtro que se puede aplicar a varios campos con el operador LIKE
%Texto%
si es cadena o LIKE CONVERT si no lo es, y por ultimo está el filtro de
mostrar todos o solamente los que no han sido baja, es decir los que la
fecha de baja es null, siendo los dos ultimos opcionales del usuario.

He montado el where pero no consigo que me funcione, ¿alguna idea?

Un saludo y gracias por anticipado.
Angel Zapata
WHERE (((@NivelMaximo = 1) AND (Agente.AgeCodigo>0))

OR ((@NivelMaximo = 3) AND (Agente.AgenteZonaCodigo = @Zona))

OR ((@NivelMaximo = 4) AND (Agente.AgenteGerenciaCodigo = @Gerencia))

OR ((@NivelMaximo = 5) AND (Agente.AgenteDelegacionCodigo = @Delegacion))

OR ((@NivelMaximo = 6) AND (Agente.AgenteEquipoCodigo = @Equipo))

OR ((@NivelMaximo = 7) AND (Agente.AgeCodigo = @Promotor)))

AND (((@FiltroEn = 'Codigo') AND (Agente.AgeCodigo = CONVERT(Integer,
@FiltroPor)))

OR ((@FiltroEn = 'Nombre') AND (Agente.AgeApellido1 + ' ' +
Agente.AgeApellido2 + ' ' + Agente.AgeNombre LIKE @FiltroPor ))

OR ((@FiltroEn = 'NIF') AND (Agente.AgeNIF LIKE '%' + @FiltroPor + '%'))

OR ((@FiltroEn = 'Alta') AND (Agente.AgenteFechaAltaCategoria >> CONVERT(DATETIME, @FiltroPor,103)))

OR ((@FiltroEn = 'Baja') AND (Agente.AgenteFechaBajaCategoria >> CONVERT(DATETIME, @FiltroPor, 103)))

OR ((@FiltroEn = 'EMPR') AND (Agente.EmpresaCodigo LIKE '%' + @FiltroPor
+
'%'))

OR ((@FiltroEn = 'TRAB') AND (Agente.TrabajadorCodigo LIKE '%' +
@FiltroPor
+ '%'))

OR ((@FiltroEn = 'Delegacion') AND (Agente_1.AgeApellido1 + ' ' +
Agente_1.AgeApellido2 + ' ' + Agente_1.AgeNombre LIKE + '%' + @FiltroPor
+
'%')))

AND (((@MostrarTodos = 0) AND (Agente.AgenteFechaBajaCategoria IS NULL)))





Respuesta Responder a este mensaje
#4 Angel Zapata
15/01/2010 - 09:22 | Informe spam
Plis, ayuda con este sp, porfiiiiiii.


Un saludo y gracias
Angel Zapata

"Angel Zapata" escribió en el mensaje
news:
Hola grupo,

tengo un sp que admite varias combinaciones y para no crear una
bestialidad de codigo que luego no hay que controle he pensado hacerlo con
una clausula WHERE dinamica, mas o menos como expongo, entendiendo que hay
tres grupos de filtro, por un lado está el nivel máximo que se aplica
siempre, despues está el filtro que se puede aplicar a varios campos con
el operador LIKE %Texto% si es cadena o LIKE CONVERT si no lo es, y por
ultimo está el filtro de mostrar todos o solamente los que no han sido
baja, es decir los que la fecha de baja es null, siendo los dos ultimos
opcionales del usuario.

He montado el where pero no consigo que me funcione, ¿alguna idea?

Un saludo y gracias por anticipado.
Angel Zapata
WHERE (((@NivelMaximo = 1) AND (Agente.AgeCodigo >0))

OR ((@NivelMaximo = 3) AND (Agente.AgenteZonaCodigo = @Zona))

OR ((@NivelMaximo = 4) AND (Agente.AgenteGerenciaCodigo = @Gerencia))

OR ((@NivelMaximo = 5) AND (Agente.AgenteDelegacionCodigo = @Delegacion))

OR ((@NivelMaximo = 6) AND (Agente.AgenteEquipoCodigo = @Equipo))

OR ((@NivelMaximo = 7) AND (Agente.AgeCodigo = @Promotor)))

AND (((@FiltroEn = 'Codigo') AND (Agente.AgeCodigo = CONVERT(Integer,
@FiltroPor)))

OR ((@FiltroEn = 'Nombre') AND (Agente.AgeApellido1 + ' ' +
Agente.AgeApellido2 + ' ' + Agente.AgeNombre LIKE @FiltroPor ))

OR ((@FiltroEn = 'NIF') AND (Agente.AgeNIF LIKE '%' + @FiltroPor + '%'))

OR ((@FiltroEn = 'Alta') AND (Agente.AgenteFechaAltaCategoria =
CONVERT(DATETIME, @FiltroPor,103)))

OR ((@FiltroEn = 'Baja') AND (Agente.AgenteFechaBajaCategoria =
CONVERT(DATETIME, @FiltroPor, 103)))

OR ((@FiltroEn = 'EMPR') AND (Agente.EmpresaCodigo LIKE '%' + @FiltroPor +
'%'))

OR ((@FiltroEn = 'TRAB') AND (Agente.TrabajadorCodigo LIKE '%' +
@FiltroPor + '%'))

OR ((@FiltroEn = 'Delegacion') AND (Agente_1.AgeApellido1 + ' ' +
Agente_1.AgeApellido2 + ' ' + Agente_1.AgeNombre LIKE + '%' + @FiltroPor +
'%')))

AND (((@MostrarTodos = 0) AND (Agente.AgenteFechaBajaCategoria IS NULL)))




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