none
SEGUN EL CONTENIDO MUESTRA O NO RRS feed

  • Pregunta

  • Estimados, muy buenos días les pido ayuda con lo siguiente. 

    Tengo la siguiente estructura en mi base de datos 

    CREATE TABLE [dbo].[CabezalVenta](
    [NumeroPedido] [bigint] NOT NULL,
    [NumeroDocumento] [bigint] NOT NULL,
    [SerieDocumento] [nvarchar](1) NULL,
    [Fecha] [date] NULL,
    [FechaDeVencimiento] [date] NULL,
    [Vendedor] [int] NULL,
    [FormaPago] [int] NULL,
    [Moneda] [nvarchar](3) NULL,
    [TipoDocumentoElectronico] [int] NULL,
    [DocumentoCliente] [nvarchar](30) NULL,
    [TipoDocumentoCliente] [int] NULL,
    [CantidadLineas] [int] NULL,
    [IvaMinimo] [float] NULL,
    [IvaBasico] [float] NULL,
    [MercExenta] [float] NULL,
    [MercMinimo] [float] NULL,
    [MercBasico] [float] NULL,
    [ImporteTotal] [float] NULL,
    [SerieCae] [nvarchar](4) NULL,
    [NumeroCae] [bigint] NULL,
    [SerieReferencia] [nvarchar](4) NULL,
    [CaeReferencia] [bigint] NULL,
    [NombreCliente] [nvarchar](100) NULL,
    [DireccionCliente] [nvarchar](100) NULL,
    [CiudadCliente] [nvarchar](50) NULL,
    [PaisCliente] [nvarchar](2) NULL,
    [CotizacionDolar] [float] NULL,
    [Anulada] [bit] NULL,
     CONSTRAINT [IX_CabezalVenta_3] UNIQUE NONCLUSTERED 

    Yo necesito traer el valor máximo de NumeroCae siempre que el valor de TipoDocumentoElectronico sea igual a el valor pasado por parámetro (se pasa a veces 101 y a veces 111) 

    el problema surge al hacer la siguiente consulta ya que si le pongo el valor 101 la consulta es realizada sin problemas pero si le pongo 111 no me trae nada habiendo datos en la tabla. 

    esta sería la consulta que estoy haciendo 

    ALTER PROC [dbo].[obtener_numero_cfemax_por_tipocfe]
    @tipocfe int
    AS 
    SELECT SerieCae, NumeroCae
    FROM  CabezalVenta 
    WHERE TipoDocumentoElectronico=@tipocfe AND NumeroCae=(SELECT max(NumeroCae) FROM CabezalVenta) 

    si pongo 101 anda pero si pongo 111 no 

    Alguien que me pueda brindar su ayuda ya que no entiendo porque pasa esto 

    Muchas Gracias y saludos desde uruguay 


    Marcelo Pírez

    sábado, 21 de enero de 2017 16:01

Respuestas

  • Marcelo_UY,

    La expresión condicional también debería estar en la subconsulta, pero podrías evitarla si los resultados lo colocas en memoria:

    ALTER PROCEDURE dbo.obtener_numero_cfemax_por_tipocfe
        @tipocfe int
    AS 
    BEGIN
        WITH T AS (
    	   SELECT 
    		  SerieCae, NumeroCae,
    		  ROW_NUMBER() OVER(ORDER BY NumeroCae DESC) AS [Secuencia]
    	   FROM  
    		  CabezalVenta 
    	   WHERE 
    		  TipoDocumentoElectronico = @tipocfe 
        )
        SELECT SerieCae, NumeroCae FROM T WHERE (Secuencia = 1)
    END
    GO



    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    • Marcado como respuesta Marcelo_UY sábado, 21 de enero de 2017 21:48
    sábado, 21 de enero de 2017 16:12

Todas las respuestas

  • Marcelo_UY,

    La expresión condicional también debería estar en la subconsulta, pero podrías evitarla si los resultados lo colocas en memoria:

    ALTER PROCEDURE dbo.obtener_numero_cfemax_por_tipocfe
        @tipocfe int
    AS 
    BEGIN
        WITH T AS (
    	   SELECT 
    		  SerieCae, NumeroCae,
    		  ROW_NUMBER() OVER(ORDER BY NumeroCae DESC) AS [Secuencia]
    	   FROM  
    		  CabezalVenta 
    	   WHERE 
    		  TipoDocumentoElectronico = @tipocfe 
        )
        SELECT SerieCae, NumeroCae FROM T WHERE (Secuencia = 1)
    END
    GO



    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    • Marcado como respuesta Marcelo_UY sábado, 21 de enero de 2017 21:48
    sábado, 21 de enero de 2017 16:12
  • Excelente, funcionó de maravilla, no tengo totalmente claro que hace exactamente, si no te es molestia explicarme un poco.

    Si no puedes no hay problema ya que me ayudaste de maravilla

    Saludos desde Uruguay 


    Marcelo Pírez

    sábado, 21 de enero de 2017 21:50
  • Marcelo_UY,

    Utilicé una CTE para contener las filas que corresponden con el valor que contiene el parámetro @tipocfe ordenando de manera descendente por la columna [NumeroCae], del conjunto resultante  tomo la primera fila que corresponde al valor máximo.

    Nota que es lo mismo que la subconsulta que realizas, salvo que en tu código falta la restricción por el valor del parámetro @tipocfe.

    ALTER PROCEDURE dbo.obtener_numero_cfemax_por_tipocfe
        @tipocfe int
    AS 
    BEGIN
        SELECT 
    	   SerieCae, NumeroCae
        FROM  
    	   CabezalVenta 
        WHERE 
    	   TipoDocumentoElectronico = @tipocfe 
    	   AND NumeroCae = (SELECT MAX(NumeroCae) 
    				    FROM CabezalVenta
    				    WHERE TipoDocumentoElectronico = @tipocfe)
    END
    GO


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    sábado, 21 de enero de 2017 23:43