Query con parámetros.Error:(Must specify table...)

Hola compañeros!

Vuelvo a solicitar su asesoría sobre este tema, es en la misma consulta que publiqué la semana pasada, quize eliminar gran parte del código que en realidad era redundante y así poder ir depurando los resultados de cada caso.

El query que les presento tiene como objetivo mostrar ventas detalladas (Folio,fecha,vendedor,cliente,artículo,fabricante…), se desea que si el usuario lo requiere pueda ingresar como parámetros un rango de fechas (FechaInicial y FechaFinal), el cliente y el código del artículo.

Y he leído algunos temas como este y en realidad no me han funcionado las sugerencias que proporcionan. Al ejecutar el query me arroja el siguiente error:

1). [Microsoft][SQL Server Native Client 11.0][SQL Server]Must specify table to select from.
2). [Microsoft][SQL Server Native Client 11.0][SQL Server]Statement ‘’ (SWEI) (s) could not be prepared.

Este es mi query:

DECLARE @FechaInicial AS DATE
DECLARE @FechaFinal AS DATE 
 

SELECT @FechaInicial = T0.DocDate, @FechaFinal = T0.DocDate From OINV T0 Where T0.DocDate = '[%0]' AND T0.DocDate = '[%1]' 
SET @FechaInicial = CONVERT(DATETIME, '[%0]', 112) 
SET @FechaFinal = CONVERT(DATETIME, '[%1]', 112)

SELECT  T1.SlpCode 'Código Vendedor', T1.SlpName 'Nombre Vendedor', T0.CardCode 'Código Cliente', T0.CardName 'Nombre del Cliente', 
CASE T0.ObjType 
WHEN 13 THEN 'FACTURA'
END 'Tipo Documento', 
T0.DocNum 'Folio', ' ' 'Documento al que aplica', FORMAT(T0.DocDate, 'yyyy-MM-dd') 'Fecha  Factura',  T2.ItemCode 'Código Artículo', T2.Dscription 'Descripción del Artículo', 
T4.ItmsGrpNam 'Grupo del artículo', T5.FirmName 'Nombre del fabricante', 
CASE T0.CANCELED 
WHEN 'C' THEN  '-' + CONVERT(VARCHAR(20), T2.Quantity)
WHEN 'N' THEN T2.Quantity
WHEN 'Y' THEN T2.Quantity
END  'Cantidad', 
CASE T0.CANCELED
WHEN 'C' THEN '-' + CONVERT(VARCHAR(20), T2.LineTotal)
WHEN 'N' THEN T2.LineTotal
WHEN 'Y' THEN T2.LineTotal
END  'Total Partida',
CASE T0.CANCELED
WHEN 'C' THEN '-' + CONVERT(VARCHAR(20),  (T2.StockPrice * T2.Quantity))
WHEN 'N' THEN (T2.StockPrice * T2.Quantity)
WHEN 'Y' THEN (T2.StockPrice * T2.Quantity)
END 'Costo por partida'
FROM OINV T0 
INNER JOIN OSLP T1 ON T0.SlpCode=T1.SlpCode
INNER JOIN INV1 T2 ON T0.DocEntry=T2.DocEntry
INNER JOIN OITM T3 ON T2.ItemCode=T3.ItemCode
INNER JOIN OITB T4 ON T3.ItmsGrpCod=T4.ItmsGrpCod
INNER JOIN OMRC T5 ON T5.FirmCode=T3.FirmCode
WHERE (T0.DocDate>= @FechaInicial or ISNULL( @FechaInicial, '2017-01-01')= '2017-01-01') AND (T0.DocDate<=@FechaFinal or isnull(@FechaFinal, (SELECT FORMAT(GETDATE(), 'yyyy/MM/dd')))=(SELECT FORMAT(GETDATE(), 'yyyy/MM/dd'))) AND T0.CardName='[%2]' AND T2.ItemCode='[%3]'
UNION ALL
SELECT  T1.SlpCode 'Código Vendedor', T1.SlpName 'Nombre Vendedor', T0.CardCode 'Código Cliente', T0.CardName 'Nombre del Cliente', 
CASE T0.ObjType 
WHEN 14 THEN 'NC'
END 'Tipo Documento',  
T0.DocNum 'Folio',  
CASE T2.BaseType
WHEN 13 THEN 'F ' + T2.BaseRef
WHEN 14 THEN 'NC ' + T2.BaseRef
END  'Documento al que aplica',
 FORMAT(T0.DocDate, 'yyyy-MM-dd') 'Fecha  Factura', T2.ItemCode 'Código Artículo', T2.Dscription 'Descripción del Artículo', 
T4.ItmsGrpNam 'Grupo del artículo', T5.FirmName 'Nombre del fabricante',
CASE T2.BaseType
WHEN 14 THEN  T2.Quantity
ELSE '-' + CONVERT (VARCHAR(20), T2.Quantity)
END  'Cantidad', 
CASE T2.BaseType 
WHEN 14 THEN T2.LineTotal
ELSE '-' + CONVERT(VARCHAR(20), T2.LineTotal) 
END 'Total Partida',
 '-' + CONVERT(VARCHAR(20), (T2.StockPrice * T2.Quantity)) 'Costo por partida'
FROM ORIN T0 
INNER JOIN OSLP T1 ON T0.SlpCode=T1.SlpCode
INNER JOIN RIN1 T2 ON T0.DocEntry=T2.DocEntry
INNER JOIN OITM T3 ON T2.ItemCode=T3.ItemCode
INNER JOIN OITB T4 ON T3.ItmsGrpCod=T4.ItmsGrpCod
INNER JOIN OMRC T5 ON T5.FirmCode=T3.FirmCode
WHERE (T0.DocDate>= @FechaInicial or ISNULL( @FechaInicial, '2017-01-01')= '2017-01-01') AND (T0.DocDate<=@FechaFinal or isnull(@FechaFinal, (SELECT FORMAT(GETDATE(), 'yyyy/MM/dd')))=(SELECT FORMAT(GETDATE(), 'yyyy/MM/dd'))) AND T0.CardName='[%2]' AND T2.ItemCode='[%3]'

Gracias por su ayuda y atención.
Saludos

Hola compañeros!!

Les comento que modifiqué un poco la declaración de mis variables, así como la condición WHERE; hecho esto, si introduzco todos los parámetros que se me solicitan funciona bien, pero quiero pensar en la posibilidad de que el usuario tal vez no introduzca las fechas y quiera encontrar toda la información por socio de negocio y artículo, entonces al omitir las fechas y sólo ingresando los otros dos parámetros ya no me arroja ningun error, pero tampoco me muestra resultados…

Alguien sabe qué estaré haciendo mal?.. O sabe alguien alguna manera de forzar al usuario a ingresar todos los parámetros?

Gracias por su ayuda!

A continuación el código modificado:

DECLARE @FechaFin date
DECLARE @FechaInicio date

SET @FechaFin=(SELECT FORMAT(GETDATE(), 'yyyy-MM-dd'))
SET @FechaInicio=(SELECT FORMAT( GETDATE()-730,'yyyy-MM-dd'))

SELECT  T1.SlpCode 'Código Vendedor', T1.SlpName 'Nombre Vendedor', T0.CardCode 'Código Cliente', T0.CardName 'Nombre del Cliente', 
CASE T0.ObjType 
WHEN 13 THEN 'FACTURA'
END 'Tipo Documento', 
T0.DocNum 'Folio', ' ' 'Documento al que aplica', FORMAT(T0.DocDate, 'yyyy-MM-dd') 'Fecha  Factura',  T2.ItemCode 'Código Artículo', T2.Dscription 'Descripción del Artículo', 
T4.ItmsGrpNam 'Grupo del artículo', T5.FirmName 'Nombre del fabricante', 
CASE T0.CANCELED 
WHEN 'C' THEN  '-' + CONVERT(VARCHAR(20), T2.Quantity)
WHEN 'N' THEN T2.Quantity
WHEN 'Y' THEN T2.Quantity
END  'Cantidad', 
CASE T0.CANCELED
WHEN 'C' THEN '-' + CONVERT(VARCHAR(20), T2.LineTotal)
WHEN 'N' THEN T2.LineTotal
WHEN 'Y' THEN T2.LineTotal
END  'Total Partida',
CASE T0.CANCELED
WHEN 'C' THEN '-' + CONVERT(VARCHAR(20),  (T2.StockPrice * T2.Quantity))
WHEN 'N' THEN (T2.StockPrice * T2.Quantity)
WHEN 'Y' THEN (T2.StockPrice * T2.Quantity)
END 'Costo por partida'
FROM OINV T0 
INNER JOIN OSLP T1 ON T0.SlpCode=T1.SlpCode
INNER JOIN INV1 T2 ON T0.DocEntry=T2.DocEntry
INNER JOIN OITM T3 ON T2.ItemCode=T3.ItemCode
INNER JOIN OITB T4 ON T3.ItmsGrpCod=T4.ItmsGrpCod
INNER JOIN OMRC T5 ON T5.FirmCode=T3.FirmCode
WHERE (T0.DocDate>= '[%0]' or ISNULL('[%0]',@FechaInicio)=@FechaInicio) AND (T0.DocDate<='[%1]' or isnull('[%1]', @FechaFin)=@FechaFin) AND T0.CardName='[%2]' AND T2.ItemCode='[%3]'
UNION ALL
SELECT  T1.SlpCode 'Código Vendedor', T1.SlpName 'Nombre Vendedor', T0.CardCode 'Código Cliente', T0.CardName 'Nombre del Cliente', 
CASE T0.ObjType 
WHEN 14 THEN 'NC'
END 'Tipo Documento',  
T0.DocNum 'Folio',  
CASE T2.BaseType
WHEN 13 THEN 'F ' + T2.BaseRef
WHEN 14 THEN 'NC ' + T2.BaseRef
END  'Documento al que aplica',
 FORMAT(T0.DocDate, 'yyyy-MM-dd') 'Fecha  Factura', T2.ItemCode 'Código Artículo', T2.Dscription 'Descripción del Artículo', 
T4.ItmsGrpNam 'Grupo del artículo', T5.FirmName 'Nombre del fabricante',
CASE T2.BaseType
WHEN 14 THEN  T2.Quantity
ELSE '-' + CONVERT (VARCHAR(20), T2.Quantity)
END  'Cantidad', 
CASE T2.BaseType 
WHEN 14 THEN T2.LineTotal
ELSE '-' + CONVERT(VARCHAR(20), T2.LineTotal) 
END 'Total Partida',
 '-' + CONVERT(VARCHAR(20), (T2.StockPrice * T2.Quantity)) 'Costo por partida'
FROM ORIN T0 
INNER JOIN OSLP T1 ON T0.SlpCode=T1.SlpCode
INNER JOIN RIN1 T2 ON T0.DocEntry=T2.DocEntry
INNER JOIN OITM T3 ON T2.ItemCode=T3.ItemCode
INNER JOIN OITB T4 ON T3.ItmsGrpCod=T4.ItmsGrpCod
INNER JOIN OMRC T5 ON T5.FirmCode=T3.FirmCode
WHERE (T0.DocDate>= '[%0]' or ISNULL('[%0]',@FechaInicio)=@FechaInicio) AND (T0.DocDate<='[%1]' or isnull('[%1]', @FechaFin)=@FechaFin) AND T0.CardName='[%2]' AND T2.ItemCode='[%3]'

Hola @Angie_Infante:

Buenas tardes, si quisieras dejar las fechas como opcionales, debieras realizar algo así:

(T0.DocDate>= [%0] OR '[%0]' = '') 
(T0.DocDate<=[%1] OR '[%1]' ='') 

Con esto, si no introduce fecha, traera todo el rango y si las introduce, será todo el intervalo seleccionado.

Saludos :raised_hand_with_fingers_splayed:t5:

1 me gusta

Gracias @oscarezh, ya lo intenté pero siguió sin darme resultado :confused:
Seguiré intentando
Saludos

Hola @Angie_Infante realice los siguientes cambios y si me resulto:

  • elimine las variables de fecha, porque ya no serán necesarias.
  • elimine el formateo de fecha que realizaba, ya que en mi versión SAP 9.1 pl10 native client 10 no soporta esto(no sé si lo hará en otras versiones)
SELECT  T1.SlpCode 'Código Vendedor', T1.SlpName 'Nombre Vendedor', T0.CardCode 'Código Cliente', T0.CardName 'Nombre del Cliente', 
CASE T0.ObjType 
WHEN 13 THEN 'FACTURA'
END 'Tipo Documento', 
T0.DocNum 'Folio', ' ' 'Documento al que aplica',T0.DocDate 'Fecha  Factura',  T2.ItemCode 'Código Artículo', T2.Dscription 'Descripción del Artículo', 
T4.ItmsGrpNam 'Grupo del artículo', T5.FirmName 'Nombre del fabricante', 
CASE T0.CANCELED 
WHEN 'C' THEN  '-' + CONVERT(VARCHAR(20), T2.Quantity)
WHEN 'N' THEN T2.Quantity
WHEN 'Y' THEN T2.Quantity
END  'Cantidad', 
CASE T0.CANCELED
WHEN 'C' THEN '-' + CONVERT(VARCHAR(20), T2.LineTotal)
WHEN 'N' THEN T2.LineTotal
WHEN 'Y' THEN T2.LineTotal
END  'Total Partida',
CASE T0.CANCELED
WHEN 'C' THEN '-' + CONVERT(VARCHAR(20),  (T2.StockPrice * T2.Quantity))
WHEN 'N' THEN (T2.StockPrice * T2.Quantity)
WHEN 'Y' THEN (T2.StockPrice * T2.Quantity)
END 'Costo por partida'
FROM OINV T0 
INNER JOIN OSLP T1 ON T0.SlpCode=T1.SlpCode
INNER JOIN INV1 T2 ON T0.DocEntry=T2.DocEntry
INNER JOIN OITM T3 ON T2.ItemCode=T3.ItemCode
INNER JOIN OITB T4 ON T3.ItmsGrpCod=T4.ItmsGrpCod
INNER JOIN OMRC T5 ON T5.FirmCode=T3.FirmCode
WHERE (T0.DocDate>= [%0] or '[%0]'='') 
AND (T0.DocDate<=[%1] or '[%1]'='') 
AND T0.CardName='[%2]' 
AND T2.ItemCode='[%3]'
SELECT  T1.SlpCode 'Código Vendedor', T1.SlpName 'Nombre Vendedor', T0.CardCode 'Código Cliente', T0.CardName 'Nombre del Cliente', 
CASE T0.ObjType 
WHEN 14 THEN 'NC'
END 'Tipo Documento',  
T0.DocNum 'Folio',  
CASE T2.BaseType
WHEN 13 THEN 'F ' + T2.BaseRef
WHEN 14 THEN 'NC ' + T2.BaseRef
END  'Documento al que aplica',
 T0.DocDate 'Fecha  Factura', T2.ItemCode 'Código Artículo', T2.Dscription 'Descripción del Artículo', 
T4.ItmsGrpNam 'Grupo del artículo', T5.FirmName 'Nombre del fabricante',
CASE T2.BaseType
WHEN 14 THEN  T2.Quantity
ELSE '-' + CONVERT (VARCHAR(20), T2.Quantity)
END  'Cantidad', 
CASE T2.BaseType 
WHEN 14 THEN T2.LineTotal
ELSE '-' + CONVERT(VARCHAR(20), T2.LineTotal) 
END 'Total Partida',
 '-' + CONVERT(VARCHAR(20), (T2.StockPrice * T2.Quantity)) 'Costo por partida'
FROM ORIN T0 
INNER JOIN OSLP T1 ON T0.SlpCode=T1.SlpCode
INNER JOIN RIN1 T2 ON T0.DocEntry=T2.DocEntry
INNER JOIN OITM T3 ON T2.ItemCode=T3.ItemCode
INNER JOIN OITB T4 ON T3.ItmsGrpCod=T4.ItmsGrpCod
INNER JOIN OMRC T5 ON T5.FirmCode=T3.FirmCode
WHERE (T0.DocDate>= [%0] or '[%0]'='') 
AND (T0.DocDate<=[%1] or '[%1]'='') 
AND T0.CardName='[%2]' 
AND T2.ItemCode='[%3]'

Saludos :raised_hand_with_fingers_splayed:t5:

1 me gusta

@oscarezh Perfecto!!!

Tienes razón! Ya lo probé y si funcionó, mi error había sido que puse un espacio entre las comillas simples.

Gracias por tu ayuda!
Saludos!

1 me gusta