none
procedimiento almacenado RRS feed

  • Pregunta

  • Hola a tod@s, 

    Tengo una consulta SQL en 1 buscador creado en windows form con variedad de filtros, combos, datetimepicker, cajas de texto...

    El caso es que quiero pasar la consulta a un procedimiento almacenado pero al intentar hacerlo no me es sencillo contemplarlo tal cual lo tengo en código.  Mi gran problema viene sobre todo por los filtros relacionados con las fechas

    "SELECT DISTINCT ACTIV, NOCUOT, FINCA, DIRECCION, " & _ "LOCALIDAD, PEDANIA, PROVINCIA, FADJUDICACION AS ADJUDICACION, FETIFI, FVENTA " & _

    "FROM vACTIV WHERE " & _ " ACTIV LIKE ('%" & txtNumActiv.Text & "%')" & _ " AND FINCA LIKE ('%" & txtNumFinca.Text & "%') " & _ " AND (NOVIAS LIKE ('%" & txtCalle.Text & "%' COLLATE SQL_LATIN1_GENERAL_CP1_CI_AI) OR [CALLE SOC] LIKE ('%" & txtCalle.Text & "%' COLLATE SQL_LATIN1_GENERAL_CP1_CI_AI))" & _ " AND NUPOAC LIKE ('%" & txtNumPortal.Text & "%')" & _ " AND NUESAC LIKE ('%" & txtEscalera.Text & "%')" & _ " AND NUPIAC LIKE ('%" & txtPiso.Text & "%')" & _ " AND NUPUAC LIKE ('%" & txtPuerta.Text & "%')" & _ IIf(cbxmunicipio.Text = "DESCONOCIDA" Or cbxmunicipio.Text = "", "", " AND LOCALIDAD LIKE '%" & cbxmunicipio.Text & "%' ") & _ IIf(cbxProvincia.Text = "" Or cbxProvincia.SelectedValue = "00", "", " AND PROVINCIA LIKE ('%" & cbxProvincia.Text & "%')") & _ IIf(timpFecAdjDesde.Text = "" Or timpFecAdjDesde.Text <= timpFecAdjDesde.MinDate, "", " AND FADJUDICACION BETWEEN '" & timpFecAdjDesde.Text & "' AND '" & timpFecAdjHasta.Text & "'") & _ IIf(timpFecVentaDesde.Text = "" Or timpFecVentaDesde.Text <= timpFecVentaDesde.MinDate, IIf(chkNoVen.Checked = True, " AND FVENTA IS NULL", ""), IIf(chkNoVend.Checked = True, " AND (FVENTA IS NULL OR FVENTA BETWEEN '" & timpFecVentaDesde.Text & "' AND '" & timpFecVentaHasta.Text & "')", " AND FVENTA BETWEEN '" & timpFecVentaDesde.Text & "' AND '" & timpFecVentaHasta.Text & "'"))

    No se muy bien como contemplar en el proc. almacenado este tipo de filtros, sabiendo que el campo fadjudicacion puede ser null y sabiendo que esos filtros son opcionales, el usuario puede usarlos o no. Se entiende que ese datetimepicker vendrá sin fecha cuando mantenga la fecha que tiene puesta por defecto "01/01/1950" y no debería ejecutarse el filtro. 

    If(timpFecAdjDesde.Text = "" Or timpFecAdjDesde.Text <= timpFecAdjDesde.MinDate, "", " AND FADJUDICACION BETWEEN '" & timpFecAdjDesde.Text & "' AND '" & timpFecAdjHasta.Text & "'") & _

    El proc. que tengo

    CREATE PROCEDURE [dbo].[BusActivo1] @COACES VARCHAR(9), @FINCA VARCHAR(9), @MUNICIPIO NVARCHAR(255), @PROVINCIA NVARCHAR(50), @PEDANIA NVARCHAR(100), @FADJDESDE DATE, @FDJHASTA DATE, @FVENTADESDE DATE, @FVENTAHASTA DATE AS SELECT DISTINCT ACTIV, FINCA, DIRECCION, LOCALIDAD, PEDANIA, PROVINCIA, FADJUDICACION AS ADJUDICACION, FETIFI, FVENTA FROM vACTIV WHERE ACTIV LIKE ('%' + @COACES + '%') AND FINCA LIKE ('%' + @FINCA + '%') AND LOCALIDAD LIKE ('%' + @MUNICIPIO + '%') AND PROVINCIA LIKE ('%' + @PROVINCIA + '%') AND PEDANIA LIKE ('%' + @PEDANIA + '%') AND TIPOINMUEBLE LIKE ('%' + @TIPINMU + '%') AND FADJUDICACION >= @FADJDESDE AND FADJUDICACION <= @FDJHASTA AND FVENTA >= @FVENTADESDE AND FVENTA <= @FVENTAHASTA


    Cómo puedo hacer que los filtros de fechas solo se ejecuten si el usuario ha indicado fechas en ellos distinta a la que viene por defecto??

    FADJUDICACION >= @FADJDESDE AND FADJUDICACION <= @FDJHASTA AND FVENTA >= @FVENTADESDE AND FVENTA <= @FVENTAHASTA

    De esta forma siempre me ejecuta el filtro. Decir que la consulta tira de una vista (vACTIV)

    Bueno, espero haberme explicado medio bien, Gracias de antemano



    miércoles, 13 de junio de 2018 7:40

Respuestas

  • Hola Tagger1980:

    Aunque realmente no lo he entendido del todo, pero creo que te voy a dar dos opciones para que lo soluciones tu mismo.

    Opcion 1

    CREATE PROCEDURE [dbo].[BusActivo1]
    	@COACES VARCHAR(9), @FINCA VARCHAR(9), 
    	@MUNICIPIO NVARCHAR(255), @PROVINCIA NVARCHAR(50), @PEDANIA NVARCHAR(100), @FADJDESDE DATE='20180101', @FDJHASTA DATE='20190101',
    	@FVENTADESDE DATE='20180101', @FVENTAHASTA DATE='20190101'
    	
    	AS
    /* parametros por defecto
    Si los incluyes, modificas su valor,
    si no los mencionas, ya están establecidos*/

    Opción 2:

    CREATE PROCEDURE [dbo].[BusActivo1]
    	@COACES VARCHAR(9), @FINCA VARCHAR(9), 
    	@MUNICIPIO NVARCHAR(255), @PROVINCIA NVARCHAR(50), @PEDANIA NVARCHAR(100), @FADJDESDE DATE, @FDJHASTA DATE,
    	@FVENTADESDE DATE, @FVENTAHASTA DATE
    	
    	AS
    
    IF( @CONDICION=0) BEGIN
    SELECT.....
    
    END
    ELSE (IF (@CONDICION= 1)
    BEGIN
    
    SELECT.... OTRA
    END

    O lo que es lo mismo, en un procedure, puedes tener infinitas select diferentes en función de determinados criterios, sin penalizar la ejecución del mismo.

    Un saludo

    • Marcado como respuesta Tagger1980 lunes, 6 de agosto de 2018 19:06
    miércoles, 13 de junio de 2018 9:18
  • Hola Tagger Casi lo tenias aqui te pongo como deberías manejar los filtros por si estos viniesen en NULL, siendo totalmente opcionales, lo que debes hacer es manejar la sentencia IS NULL en tus condiciones. Esto hara que tengas un procedimiento almacenado optimo, sin el uso de IF's, puesto que en caso de venir nulos los parametros de filtros la consulta será correcta.

    CREATE PROCEDURE [dbo].[BusActivo1]
    	@COACES VARCHAR(9), @FINCA VARCHAR(9), 
    	@MUNICIPIO NVARCHAR(255), @PROVINCIA NVARCHAR(50), @PEDANIA NVARCHAR(100), @FADJDESDE DATE, @FDJHASTA DATE,
    	@FVENTADESDE DATE, @FVENTAHASTA DATE
    	
    	AS
    	
    	SELECT DISTINCT ACTIV, FINCA,  DIRECCION, 
        LOCALIDAD, PEDANIA, PROVINCIA, FADJUDICACION AS ADJUDICACION, FETIFI, FVENTA
        FROM vACTIV 
    		WHERE (ACTIV LIKE '%' + @COACES + '%' OR @COACES IS NULL) AND
    	(FINCA LIKE '%' + @FINCA + '%' OR @FINCA IS NULL) AND
    		(LOCALIDAD LIKE '%' + @MUNICIPIO + '%' OR @MUNICIPIO IS NULL) AND
    		(PROVINCIA LIKE '%' + @PROVINCIA + '%' OR @PROVINCIA IS NULL) AND
    	(PEDANIA LIKE '%' + @PEDANIA + '%' OR @PEDANIA IS NULL) AND
    	(TIPOINMUEBLE LIKE '%' + @TIPINMU + '%' OR @TIPINMU IS NULL) AND
    	(FADJUDICACION >= @FADJDESDE OR @FADJDESDE IS NULL) AND (FADJUDICACION <= @FDJHASTA OR @FDJHASTA IS NULL) AND
    	(FVENTA >= @FVENTADESDE OR @FVENTADESDE) AND (FVENTA <= @FVENTAHASTA OR @FVENTAHASTA IS NULL)


    Saludos Cordiales


    Carlos Aldi

    miércoles, 13 de junio de 2018 14:31

Todas las respuestas

  • Hola Tagger1980:

    Aunque realmente no lo he entendido del todo, pero creo que te voy a dar dos opciones para que lo soluciones tu mismo.

    Opcion 1

    CREATE PROCEDURE [dbo].[BusActivo1]
    	@COACES VARCHAR(9), @FINCA VARCHAR(9), 
    	@MUNICIPIO NVARCHAR(255), @PROVINCIA NVARCHAR(50), @PEDANIA NVARCHAR(100), @FADJDESDE DATE='20180101', @FDJHASTA DATE='20190101',
    	@FVENTADESDE DATE='20180101', @FVENTAHASTA DATE='20190101'
    	
    	AS
    /* parametros por defecto
    Si los incluyes, modificas su valor,
    si no los mencionas, ya están establecidos*/

    Opción 2:

    CREATE PROCEDURE [dbo].[BusActivo1]
    	@COACES VARCHAR(9), @FINCA VARCHAR(9), 
    	@MUNICIPIO NVARCHAR(255), @PROVINCIA NVARCHAR(50), @PEDANIA NVARCHAR(100), @FADJDESDE DATE, @FDJHASTA DATE,
    	@FVENTADESDE DATE, @FVENTAHASTA DATE
    	
    	AS
    
    IF( @CONDICION=0) BEGIN
    SELECT.....
    
    END
    ELSE (IF (@CONDICION= 1)
    BEGIN
    
    SELECT.... OTRA
    END

    O lo que es lo mismo, en un procedure, puedes tener infinitas select diferentes en función de determinados criterios, sin penalizar la ejecución del mismo.

    Un saludo

    • Marcado como respuesta Tagger1980 lunes, 6 de agosto de 2018 19:06
    miércoles, 13 de junio de 2018 9:18
  • También puedes y a lo mejor te soluciona más el asunto declarar variables, en el procedimiento almacenado,

    y con sentencias if evaluar si te viene algo y sino el varlor por defecto, de manera que el fitlro lo haces contra la variable.

    create procedure ......
    as
    
    DECLARE @FECHAD DATETIME;
    IF (@MIPARAMETRO1='')
    BEGIN
    SET @FECHAD = '20180101';
    ....
    
    END
    ELSE
    SET @FECHAD = @MIPARAMETRO1;
    
    

    Saludos

    miércoles, 13 de junio de 2018 9:20
  • Hola Tagger Casi lo tenias aqui te pongo como deberías manejar los filtros por si estos viniesen en NULL, siendo totalmente opcionales, lo que debes hacer es manejar la sentencia IS NULL en tus condiciones. Esto hara que tengas un procedimiento almacenado optimo, sin el uso de IF's, puesto que en caso de venir nulos los parametros de filtros la consulta será correcta.

    CREATE PROCEDURE [dbo].[BusActivo1]
    	@COACES VARCHAR(9), @FINCA VARCHAR(9), 
    	@MUNICIPIO NVARCHAR(255), @PROVINCIA NVARCHAR(50), @PEDANIA NVARCHAR(100), @FADJDESDE DATE, @FDJHASTA DATE,
    	@FVENTADESDE DATE, @FVENTAHASTA DATE
    	
    	AS
    	
    	SELECT DISTINCT ACTIV, FINCA,  DIRECCION, 
        LOCALIDAD, PEDANIA, PROVINCIA, FADJUDICACION AS ADJUDICACION, FETIFI, FVENTA
        FROM vACTIV 
    		WHERE (ACTIV LIKE '%' + @COACES + '%' OR @COACES IS NULL) AND
    	(FINCA LIKE '%' + @FINCA + '%' OR @FINCA IS NULL) AND
    		(LOCALIDAD LIKE '%' + @MUNICIPIO + '%' OR @MUNICIPIO IS NULL) AND
    		(PROVINCIA LIKE '%' + @PROVINCIA + '%' OR @PROVINCIA IS NULL) AND
    	(PEDANIA LIKE '%' + @PEDANIA + '%' OR @PEDANIA IS NULL) AND
    	(TIPOINMUEBLE LIKE '%' + @TIPINMU + '%' OR @TIPINMU IS NULL) AND
    	(FADJUDICACION >= @FADJDESDE OR @FADJDESDE IS NULL) AND (FADJUDICACION <= @FDJHASTA OR @FDJHASTA IS NULL) AND
    	(FVENTA >= @FVENTADESDE OR @FVENTADESDE) AND (FVENTA <= @FVENTAHASTA OR @FVENTAHASTA IS NULL)


    Saludos Cordiales


    Carlos Aldi

    miércoles, 13 de junio de 2018 14:31