none
Problema con una vista RRS feed

  • Pregunta

  • Estimados, tengo la consulta que copio más abajo y funciona bien, pero cuando la grabo como vista para utilizarla en otros procesos me cambia los resultados. El tema parecería estar con el rango de fechas que selecciono. En la vista le pongo doble paréntesis y funciona, pero al grabarlo no deja ese doble paréntesis.  Es en  WHERE      (dbo.TRANSAC.FECHA > '2017/03/31') AND (dbo.TRANSAC.FECHA < '2018/04/01')

    Esta es la consulta 

    SELECT      NOMBRE, SUM(Expr1) AS Expr1, CODCTACTE

    FROM         (SELECT     dbo.CTACTES.NOMBRE, CASE WHEN MAX(dbo.TRANSAC.CAMBIO) = 1 THEN SUM(dbo.TRANSAC.TOTALGRAVADO) * dbo.TIPOSCMP.ESTADISTICAVTA / dbo.INDICES.VALOR ELSE SUM(dbo.TRANSAC.TOTALGRAVADO) * dbo.TIPOSCMP.ESTADISTICAVTA END AS Expr1, dbo.CTACTES.CODCTACTE, 
                                                  dbo.INDICES.CODTAB, dbo.INDICES.VALOR
                           FROM          dbo.TRANSAC INNER JOIN
                                                  dbo.CTACTES ON dbo.TRANSAC.CODCTACTE = dbo.CTACTES.CODCTACTE INNER JOIN
                                                  dbo.TIPOSCMP ON dbo.TRANSAC.CODCMP = dbo.TIPOSCMP.CODCMP INNER JOIN
                                                  dbo.INDICES ON dbo.TRANSAC.FECHA = dbo.INDICES.FECHA
                           WHERE      (dbo.TRANSAC.FECHA > '2017/03/31') AND (dbo.TRANSAC.FECHA < '2018/04/01') AND (dbo.TRANSAC.NROTRANSELIM IS NULL) AND (dbo.CTACTES.CUEPREFI = 'c') AND                                             (dbo.TRANSAC.CODCMP = 'FA' OR dbo.TRANSAC.CODCMP = 'FB' OR dbo.TRANSAC.CODCMP = 'FE' OR
     dbo.TRANSAC.CODCMP = 'DA' OR dbo.TRANSAC.CODCMP = 'DB' OR dbo.TRANSAC.CODCMP = 'NA' OR

     dbo.TRANSAC.CODCMP = 'NB' OR dbo.TRANSAC.CODCMP = 'CA' OR dbo.TRANSAC.CODCMP = 'CB' OR
     dbo.TRANSAC.CODCMP = 'VA' OR dbo.TRANSAC.CODCMP = 'VB' OR  dbo.TRANSAC.CODCMP = 'VE') AND (dbo.INDICES.CODTAB = 1)
    GROUP BY dbo.TRANSAC.CODCTACTE, dbo.CTACTES.NOMBRE, dbo.TIPOSCMP.ESTADISTICAVTA, dbo.CTACTES.CODCTACTE, dbo.INDICES.CODTAB, dbo.INDICES.VALOR) AS tablix
    GROUP BY NOMBRE, CODCTACTE
    ORDER BY CODCTACTE

    viernes, 9 de noviembre de 2018 12:42

Respuestas

  • La sentencia correcta de creación es:

    create view vista_Tablix
    as
    
    SELECT tablix.NOMBRE,
           SUM(tablix.Expr1) AS Expr1,
           tablix.CODCTACTE
    FROM
    	(
        SELECT dbo.CTACTES.NOMBRE,
               CASE
                   WHEN MAX(dbo.TRANSAC.CAMBIO) = 1
                   THEN (SUM(dbo.TRANSAC.TOTALGRAVADO) * dbo.TIPOSCMP.ESTADISTICAVTA / dbo.INDICES.VALOR)
                   ELSE (SUM(dbo.TRANSAC.TOTALGRAVADO) * dbo.TIPOSCMP.ESTADISTICAVTA)
               END AS Expr1,
               dbo.CTACTES.CODCTACTE,
               dbo.INDICES.CODTAB,
               dbo.INDICES.VALOR
        FROM dbo.TRANSAC
             INNER JOIN dbo.CTACTES ON dbo.TRANSAC.CODCTACTE = dbo.CTACTES.CODCTACTE
             INNER JOIN dbo.TIPOSCMP ON dbo.TRANSAC.CODCMP = dbo.TIPOSCMP.CODCMP
             INNER JOIN dbo.INDICES ON dbo.TRANSAC.FECHA = dbo.INDICES.FECHA
        WHERE
    		    (
    			 (dbo.TRANSAC.FECHA > '20170331')
             AND (dbo.TRANSAC.FECHA < '20180401')
    			)
             AND (dbo.TRANSAC.NROTRANSELIM IS NULL)
             AND (dbo.CTACTES.CUEPREFI = 'c')
             AND (dbo.TRANSAC.CODCMP IN ('FA','FB','FE','DA','DB','NA','NB','CA','CB','VA','VB','VE'))
             AND (dbo.INDICES.CODTAB = 1)
        GROUP BY dbo.TRANSAC.CODCTACTE,
                 dbo.CTACTES.NOMBRE,
                 dbo.TIPOSCMP.ESTADISTICAVTA,
                 dbo.CTACTES.CODCTACTE,
                 dbo.INDICES.CODTAB,
                 dbo.INDICES.VALOR
    ) AS tablix 
    GROUP BY tablix.NOMBRE,
             tablix.CODCTACTE;

    observa que te he quitado el order by, pues la vista no lleva order by, cuando se consulta esta, entonces se ordena.

    viernes, 9 de noviembre de 2018 15:02

Todas las respuestas

  • Hola silgol:

    Si el rango de fechas te provoca conflictos, mejor grabala en el estandar ANSI

    SELECT NOMBRE,
           SUM(Expr1) AS Expr1,
           CODCTACTE
    FROM
    (
        SELECT dbo.CTACTES.NOMBRE,
               CASE
                   WHEN MAX(dbo.TRANSAC.CAMBIO) = 1
                   THEN (SUM(dbo.TRANSAC.TOTALGRAVADO) * dbo.TIPOSCMP.ESTADISTICAVTA / dbo.INDICES.VALOR)
                   ELSE (SUM(dbo.TRANSAC.TOTALGRAVADO) * dbo.TIPOSCMP.ESTADISTICAVTA)
               END AS Expr1,
               dbo.CTACTES.CODCTACTE,
               dbo.INDICES.CODTAB,
               dbo.INDICES.VALOR
        FROM dbo.TRANSAC
             INNER JOIN dbo.CTACTES ON dbo.TRANSAC.CODCTACTE = dbo.CTACTES.CODCTACTE
             INNER JOIN dbo.TIPOSCMP ON dbo.TRANSAC.CODCMP = dbo.TIPOSCMP.CODCMP
             INNER JOIN dbo.INDICES ON dbo.TRANSAC.FECHA = dbo.INDICES.FECHA
        WHERE
    			 (dbo.TRANSAC.FECHA > '20170331')
             AND (dbo.TRANSAC.FECHA < '20180401')
             AND (dbo.TRANSAC.NROTRANSELIM IS NULL)
             AND (dbo.CTACTES.CUEPREFI = 'c')
             AND (dbo.TRANSAC.CODCMP IN ('FA','FB','FE','DA','DB','NA','NB','CA','CB','VA','VB','VE')
             AND (dbo.INDICES.CODTAB = 1)
        GROUP BY dbo.TRANSAC.CODCTACTE,
                 dbo.CTACTES.NOMBRE,
                 dbo.TIPOSCMP.ESTADISTICAVTA,
                 dbo.CTACTES.CODCTACTE,
                 dbo.INDICES.CODTAB,
                 dbo.INDICES.VALOR
    ) AS tablix
    GROUP BY NOMBRE,
             CODCTACTE
    ORDER BY CODCTACTE;
    Espero te ayude

    viernes, 9 de noviembre de 2018 13:03
  • Perdón, que grabala no es el término adecuado.

    En todo casó filtra.

    Adicionalmente, revisa este post que han colocado, interesante sobre recomendaciones en el tratamiento de fechas.

    https://social.technet.microsoft.com/Forums/es-ES/ca20721b-a78d-4dd3-b1d9-9a83d5377f34/problemas-de-formato-ansi-en-fechas-sql-server-2008-standard?forum=sqlserveres

    viernes, 9 de noviembre de 2018 13:08
  • Hola, gracias por tu respuesta.

    No cambia , sigue igual, el tema no pasa por la sintaxis de la fecha sino por la selección de la misma. 

    Si le pongo paréntesis doble funciona pero no lo graba así en la vista.

    viernes, 9 de noviembre de 2018 13:09
  • Perdón , lo que veo es que si abro la vista , pongo diseño y la ejecuto, los datos vienen bien.

    Luego si hago la consulta  select * from "nombredevista", 

    ahí vienen menos datos. 

    Por qué puede suceder eso ? 

    viernes, 9 de noviembre de 2018 13:36
  • Así por curiosidad.A lo que te refieres es que te quita al hacer mediante transact sql

    la createa view

     (dbo.TRANSAC.FECHA > '20170331')
             AND (dbo.TRANSAC.FECHA < '20180401')

    Le has puesto ((dbo.Transac.Fech.... 01')) y te ha eliminado los paréntesis de la consulta.

    Porque, aún cuando dudo un poco, de como estas haciendo el proceso, supongo que algo no estamos controlando, ya que lo estarás ejecutando desde el management studio, de alguna manera que luego si quieres detallas.

    Porque no haces, ya que entiendo que quieres ese mes, dbo.Transac.Fecha between '20170331' and '20180401'

    Luego sería muy interesante, que nos expliques, si no se soluciona, realmente, como estas "grabando", versión, motor. como ejecutas la vista.

    Si existen otras vistas de igual nombre asociadas a otro propietario......

    viernes, 9 de noviembre de 2018 14:49
  • La sentencia correcta de creación es:

    create view vista_Tablix
    as
    
    SELECT tablix.NOMBRE,
           SUM(tablix.Expr1) AS Expr1,
           tablix.CODCTACTE
    FROM
    	(
        SELECT dbo.CTACTES.NOMBRE,
               CASE
                   WHEN MAX(dbo.TRANSAC.CAMBIO) = 1
                   THEN (SUM(dbo.TRANSAC.TOTALGRAVADO) * dbo.TIPOSCMP.ESTADISTICAVTA / dbo.INDICES.VALOR)
                   ELSE (SUM(dbo.TRANSAC.TOTALGRAVADO) * dbo.TIPOSCMP.ESTADISTICAVTA)
               END AS Expr1,
               dbo.CTACTES.CODCTACTE,
               dbo.INDICES.CODTAB,
               dbo.INDICES.VALOR
        FROM dbo.TRANSAC
             INNER JOIN dbo.CTACTES ON dbo.TRANSAC.CODCTACTE = dbo.CTACTES.CODCTACTE
             INNER JOIN dbo.TIPOSCMP ON dbo.TRANSAC.CODCMP = dbo.TIPOSCMP.CODCMP
             INNER JOIN dbo.INDICES ON dbo.TRANSAC.FECHA = dbo.INDICES.FECHA
        WHERE
    		    (
    			 (dbo.TRANSAC.FECHA > '20170331')
             AND (dbo.TRANSAC.FECHA < '20180401')
    			)
             AND (dbo.TRANSAC.NROTRANSELIM IS NULL)
             AND (dbo.CTACTES.CUEPREFI = 'c')
             AND (dbo.TRANSAC.CODCMP IN ('FA','FB','FE','DA','DB','NA','NB','CA','CB','VA','VB','VE'))
             AND (dbo.INDICES.CODTAB = 1)
        GROUP BY dbo.TRANSAC.CODCTACTE,
                 dbo.CTACTES.NOMBRE,
                 dbo.TIPOSCMP.ESTADISTICAVTA,
                 dbo.CTACTES.CODCTACTE,
                 dbo.INDICES.CODTAB,
                 dbo.INDICES.VALOR
    ) AS tablix 
    GROUP BY tablix.NOMBRE,
             tablix.CODCTACTE;

    observa que te he quitado el order by, pues la vista no lleva order by, cuando se consulta esta, entonces se ordena.

    viernes, 9 de noviembre de 2018 15:02