on 08-21-2010 6:39 PM
Buen dia amigos, tengo que crear un reporte donde me muestre ciertos datos del maestro del articulo relacionas con ciertos datos de la ultima compra realizada y registrada como tal.
Ya tengo la siguiente consulta:
SELECT Fact.Factura, Fact.Fecha, Fact.Código, Fact.Proveedor, Fact.[Ref-Factura],
Fact.Artículo, Fact.[Ref-Maestro], Fact.[Prov-Defecto], Fact.Descripción, Fact.Cant, Fact.Moneda, Fact.Precio
FROM
(
SELECT T1.docNum as 'Factura', -- Numero de Documento en OPCH
T1.CardName as 'Proveedor', --Nombre del Proveedor en OPCH
max(T1.DocDate) as 'Fecha', --Fecha de contabilizacion en OPCH
T1.CardCode as 'Código', --Codigo del Proveedor en OPCH
--max(T1.DocTime) as 'Hora',
T2.[VendorNum] as 'Ref-Factura', --Número de catálogo de fabricante en PCH1
T0.ItemCode as 'Artículo', --Código del Articulo en OITM
T0.[SuppCatNum] as 'Ref-Maestro', --Número de catálogo de fabricante en OITM
T0.ItemName as 'Descripción', --Descripcion del articulo en OITM
T0.[CardCode] as 'Prov-Defecto', --Proveedor por Defecto en OITM
T2.[Quantity] as 'Cant', --Cantidad en PCH1
T2.Currency as 'Moneda', --Moneda en PCH1
T2.Price as 'Precio' --Precio en PCH1
FROM OITM T0 ,
OPCH T1
INNER JOIN PCH1 T2 ON T1.DocEntry = T2.DocEntry
WHERE T2.ItemCode = T0.ItemCode and T0.Itemcode!='SI-99999'
and T0.ItmsGrpCod not in ('111','112','106','110')
and T2.DocEntry = T1.DocEntry
GROUP BY T1.docNum, T1.CardName, T1.CardCode, T1.DocTime, T2.[VendorNum], T0.ItemCode, T0.[SuppCatNum], T0.ItemName,
T0.[CardCode], T2.[Quantity], T2.Currency, T2.Price
--ORDER BY T0.ItemCode
) as Fact
ORDER BY Fact.Artículo DESC, Fact.Fecha
FOR BROWSE
El problema que tengo es que: Necesito solo el ultimo registro por compra de las tablas de facturas, pero como es una combinacion de campos y se hacen agrupaciones, en varios articulos me muestras varias compras, porque nosotros le compramos el mismo articulo a varios proveedoras.
A la espera de ustedes.
Gracias por su atencion.
Hola...
Prueba lo siguiente:
/*SELECT Fact.Factura, Fact.Fecha, Fact.Código, Fact.Proveedor, Fact.Ref-Factura,
Fact.Artículo, Fact.Ref-Maestro, Fact.Prov-Defecto, Fact.Descripción, Fact.Cant, Fact.Moneda, Fact.Precio
FROM
(*/
SELECT DISTINCT T1.docNum as 'Factura', -- Numero de Documento en OPCH
T1.CardName as 'Proveedor', --Nombre del Proveedor en OPCH
max(T1.DocDate) as 'Fecha', --Fecha de contabilizacion en OPCH
T1.CardCode as 'Código', --Codigo del Proveedor en OPCH
T1.DocTime as 'Hora',
T2.VendorNum as 'Ref-Factura', --Número de catálogo de fabricante en PCH1
T0.ItemCode as 'Artículo', --Código del Articulo en OITM
T0.SuppCatNum as 'Ref-Maestro', --Número de catálogo de fabricante en OITM
T0.ItemName as 'Descripción', --Descripcion del articulo en OITM
T0.CardCode as 'Prov-Defecto', --Proveedor por Defecto en OITM
T2.Quantity as 'Cant', --Cantidad en PCH1
T2.Currency as 'Moneda', --Moneda en PCH1
T2.Price as 'Precio' --Precio en PCH1
FROM OITM T0 ,
OPCH T1
INNER JOIN PCH1 T2 ON T1.DocEntry = T2.DocEntry
WHERE T2.ItemCode = T0.ItemCode and T0.Itemcode!='SI-99999'
and T0.ItmsGrpCod not in ('111','112','106','110')
and T2.DocEntry = T1.DocEntry
AND T1.DocTime = (SELECT MAX(T.DocTime) FROM OPCH T INNER JOIN PCH1 U ON T.DocEntry = U.DocEntry INNER JOIN OITM V ON U.ItemCode = V.ItemCode WHERE V.ItemCode = T2.ItemCode)
GROUP BY T1.docNum, T1.CardName, T1.CardCode, T1.DocTime, T2.VendorNum, T0.ItemCode, T0.SuppCatNum, T0.ItemName,
T0.CardCode, T2.Quantity, T2.Currency, T2.Price, T2.ItemCode
--ORDER BY T0.ItemCode
---) as Fact
--ORDER BY Fact.Artículo DESC, Fact.Fecha
--FOR BROWSE
Creo que puede serte de utilidad,
Saludos Cordiales,
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
Gracias Paul, pero aun no funciona.
Mas bien con esa modificacion no selecciona ningun dato.
SELECT Fact.Factura, Fact.Fecha, Fact.Código, Fact.Proveedor, Fact.Artículo, Fact.Descripción, Fact.Moneda, Fact.Precio
FROM
(
SELECT max(T1.docNum) as 'Factura',
max(T1.CardName) as 'Proveedor',
max(T1.DocDate) as 'Fecha',
max(T1.CardCode) as 'Código',
max(T1.DocTime) as 'Hora',
T0.ItemCode as 'Artículo',
T0.ItemName as 'Descripción',
max(T2.Currency) as 'Moneda',
max(T2.Price) as 'Precio'
FROM OITM T0 ,
OPCH T1
INNER JOIN PCH1 T2 ON T1.DocEntry = T2.DocEntry
WHERE T2.ItemCode = T0.ItemCode and T0.Itemcode!='SI-99999' and T0.ItmsGrpCod not in ('111','112','106','110')
GROUP BY T0.ItemCode, T0.ItemName
) as Fact
ORDER BY Fact.Código DESC, Fact.Factura, Fact.Fecha
FOR BROWSE
Con esta consulta, me da el ultimo registro a segun cual se mayor, segun su orden.
Es decir, una factura no. 20 es de fecha 20/08/2010, pero una no. 87 es de fecha 02/12/2008, y me selecciona la no. 87 por ser el numero mayor.
Si el nombre del ultimo proveedor al que se le compro es Articco y el anterior es HARP International, en ese campo de nombre del proveedor me dara el nombre de HAR y no Artico, por el efecto de que se le esta especificando en la consulta que seleccione el maximo, en esas columnas dado que es lo que se especifica en la clausula Gruop By.
Espero que con esto comprendan mejor y me logren ayudar.
Hola...
Intenta con esto,
SELECT T1.docNum as 'Factura', -- Numero de Documento en OPCH
T1.CardName as 'Proveedor', --Nombre del Proveedor en OPCH
T1.DocDate as 'Fecha', --Fecha de contabilizacion en OPCH
(SELECT MAX(X.DocDate) FROM OPCH X INNER JOIN PCH1 Y ON X.DocEntry = Y.DocEntry WHERE Y.ItemCode = T0.ItemCode) as 'Última fecha de compra por artículo', --AQUI ES DONDE TE PERMITE VER CUAL ES LA FECHA DE LA ULTIMA COMPRA
T1.CardCode as 'Código', --Codigo del Proveedor en OPCH
T1.DocTime as 'Hora',
T2.VendorNum as 'Factura', --Número de catálogo de fabricante en PCH1
T0.ItemCode as 'Artículo', --Código del Articulo en OITM
T0.SuppCatNum as 'Maestro', --Número de catálogo de fabricante en OITM
T0.ItemName as 'Descripción', --Descripcion del articulo en OITM
T0.CardCode as 'Prov-Defecto', --Proveedor por Defecto en OITM
T2.Quantity as 'Cant', --Cantidad en PCH1
T2.Currency as 'Moneda', --Moneda en PCH1
T2.Price as 'Precio' --Precio en PCH1
FROM OITM T0 ,
OPCH T1
INNER JOIN PCH1 T2 ON T1.DocEntry = T2.DocEntry
WHERE T2.ItemCode = T0.ItemCode and T0.Itemcode!='SI-99999'
and T0.ItmsGrpCod not in ('111','112','106','110')
and T2.DocEntry = T1.DocEntry
and T1.DocDate = (SELECT MAX(X.DocDate) FROM OPCH X INNER JOIN PCH1 Y ON X.DocEntry = Y.DocEntry WHERE Y.ItemCode = T0.ItemCode) -- EN ESTA COMPARACIÓN ESTÁS FILTRANDO PARA QUE SOLO APAREZCA LA LINEA DE ULTIMA COMPRA DEL ARTÍCULO EN BASE A LA FECHA
GROUP BY T1.DocNum, T1.CardName, T1.CardCode, T1.DocTime, T2.VendorNum, T0.ItemCode, T0.SuppCatNum, T0.ItemName,
T0.CardCode, T2.Quantity, T2.Currency, T2.Price, T1.DocTime, T1.DocDate
ORDER BY T1.DocDate, T1.DocTime
A mí si me muestra resultados,
Espero te sea de ayuda
Saludos Cordiales,
Hola...
Cuando tú abres una pregunta, arriba en tu ventana encontrarás opciones..
Identificas la opción "Mark question as answered".
Si además, consideras una puntuación por la respuesta existen opciones al lado de la pregunta. Ahí simplemente el tema va al criterio de cada usuario del foro y de la valoración que quiera hacer a las respuestas otorgadas.
Saludos Cordiales,
Gracias Srs. Han sido de mucha ayuda.
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
Hola, el post sigue abierto, quisiera por favor su ayuda he estado tratando de obtener la ultima fecha de venta, precio de la ultima fecha de venta, ultima fecha de compra, precio de la ultima compra de un articulo y su proveedor, pero al hacer la consulta de la OITM no me trae los valores correctos de la compra por lo cual me fui por la PCH1
sin embargo no logro pegar ambas consultas, tengo esta:
SELECT T0.[ItemCode]'Codigo', T0.[ItemName]'Descripcion',T0.CardCode,T15.CardName,[Ult.FechaV]
FROM (
select T0.[ItemCode],T0.[ItemName],T0.CardCode,[OnHand],T0.[InvNtryuom],T0.[LastPurPrc],T0.[LastPurDat],
'Ult.FechaV'=(SELECT max (DocDate) FROM OINM T14 WHERE [TransType] in (13,15) AND T0.ItemCode = T14.ItemCode)from OITM T0 with (nolock)
group by T0.[ItemCode],T0.[ItemName],T0.CardCode,T0.[OnHand],T0.[InvNtryuom],T0.[LastPurPrc],T0.[LastPurDat]
)T0
inner join OCRD T15 on T0.CardCode = T15.CardCode
SELECT X0.ItemCode,MAX(X0.DocDate) 'Latest',
(SELECT MAX(Price) FROM PCH1 WHERE ItemCode=X0.ItemCode AND DocDate= MAX(X0.DocDate)) 'Last Price'
FROM PCH1 X0
Group By X0.ItemCode
--)X1
Buenas,
espero que esto te pueda ayudar.
Esto lo genere por un tipo determinado de grupo de articulos, pero puedes agregarle variables.
SELECT distinct T0.[ItemCode] as Articulo, T0.[ItemName] as Descripcion, T0.[OnHand] as Stock, T0.[AvgPrice] as Costo, (T0.[OnHand]*T0.[AvgPrice]) as Total, T0.[LastPurDat] as Ultima_Fecha_Compra , ((select top 1 quantity from pdn1 where pdn1.itemcode=T0.Itemcode order by pdn1.shipdate desc)) as Ultima_Compra, T2.Price as Contado, CASE WHEN T2.Price = 0 THEN '0' ELSE round(((T2.Price-T0.AvgPrice)/(T2.Price)),2)*100 END as Margen, T3.CardCode, T3.CardName FROM OITM T0 INNER JOIN PDN1 T1 ON T0.ItemCode = T1.ItemCode INNER JOIN ITM1 T2 ON T0.Itemcode=T2.ItemCode INNER JOIN OCRD T3 ON T1.BaseCard = T3.CardCode WHERE T0.[OnHand] > 0 and T0.[ItmsGrpCod] ='266' and T2.PriceList='3' order by 6,1
/*Gracias Eloy, la estuviste probando y no me trae la información correcta, de igual forma le comento que tengo un query un poquito mas sencillo que me trae la ultima venta y compra
El mismo me trae la totalidad de los artículos y eso es precisamente lo que se busca para saber cuales han tenido movimiento(aunque luego digan que SAP tiene ese tipo de reportes) para cualquier área resulta de más ayuda ver en una sola consulta todo.
con este query tengo un problema, es que lo hice y tome los valores de la ultima compra de la tabla OITM.LastPurPrc y me trae valores incorrectos. */
SELECT T0.[ItemCode]as codigo, T0.[ItemName] as Descripcion, T0.CardCode,T15.CardName,
T0.[OnHand]as existencia, T0.InvNtryuom as UM,
T0.[LastPurPrc]as 'ultimo precio de compra',
T0.[LastPurDat]'última fecha compra',[Ult.FechaV]
FROM(
select T0.[ItemCode],T0.[ItemName],T0.CardCode,[OnHand],T0.[InvNtryuom],T0.[LastPurPrc],T0.[LastPurDat],
'Ult.FechaV'=(SELECT TOP 1 DocDate FROM OINM T14 WHERE TransType = 15 AND T0.ItemCode = T14.ItemCode ORDER BY DocDate DESC)
from OITM T0 with (nolock)
group by T0.[ItemCode],T0.[ItemName],T0.CardCode,T0.[OnHand],T0.[InvNtryuom],T0.[LastPurPrc],T0.[LastPurDat]
)T0
inner join OCRD T15 on T0.CardCode = T15.CardCode
/* Por esa razón trato de traer la ultima compra con este fragmento de codigo */
SELECT X0.ItemCode,MAX(X0.DocDate) 'Latest',
(SELECT MAX(Price) FROM PCH1 WHERE ItemCode=X0.ItemCode AND DocDate= MAX(X0.DocDate)) 'Last Price'
FROM PCH1 X0
Group By X0.ItemCode
/*Pero no logro pegar ambos query's para que formen una única consulta, un único reporte, cambiando la ultima compra del primer query, por la ultima compra del segundo query*/
/*Gracias Eloy, la estuviste probando y no me trae la información correcta, de igual forma le comento que tengo un query un poquito mas sencillo que me trae la ultima venta y compra
El mismo me trae la totalidad de los artículos y eso es precisamente lo que se busca para saber cuales han tenido movimiento(aunque luego digan que SAP tiene ese tipo de reportes) para cualquier área resulta de más ayuda ver en una sola consulta todo.
con este query tengo un problema, es que lo hice y tome los valores de la ultima compra de la tabla OITM.LastPurPrc y me trae valores incorrectos. */
SELECT T0.[ItemCode]as codigo, T0.[ItemName] as Descripcion, T0.CardCode,T15.CardName,
T0.[OnHand]as existencia, T0.InvNtryuom as UM,
T0.[LastPurPrc]as 'ultimo precio de compra',
T0.[LastPurDat]'última fecha compra',[Ult.FechaV]
FROM(
select T0.[ItemCode],T0.[ItemName],T0.CardCode,[OnHand],T0.[InvNtryuom],T0.[LastPurPrc],T0.[LastPurDat],
'Ult.FechaV'=(SELECT TOP 1 DocDate FROM OINM T14 WHERE TransType = 15 AND T0.ItemCode = T14.ItemCode ORDER BY DocDate DESC)
from OITM T0 with (nolock)
group by T0.[ItemCode],T0.[ItemName],T0.CardCode,T0.[OnHand],T0.[InvNtryuom],T0.[LastPurPrc],T0.[LastPurDat]
)T0
inner join OCRD T15 on T0.CardCode = T15.CardCode
/* Por esa razón trato de traer la ultima compra con este fragmento de codigo */
SELECT X0.ItemCode,MAX(X0.DocDate) 'Latest',
(SELECT MAX(Price) FROM PCH1 WHERE ItemCode=X0.ItemCode AND DocDate= MAX(X0.DocDate)) 'Last Price'
FROM PCH1 X0
Group By X0.ItemCode
/*Pero no logro pegar ambos query's para que formen una única consulta, un único reporte, cambiando la ultima compra del primer query, por la ultima compra del segundo query*/
/*Gracias Eloy, la estuviste probando y no me trae la información correcta, de igual forma le comento que tengo un query un poquito mas sencillo que me trae la ultima venta y compra
El mismo me trae la totalidad de los artículos y eso es precisamente lo que se busca para saber cuales han tenido movimiento(aunque luego digan que SAP tiene ese tipo de reportes) para cualquier área resulta de más ayuda ver en una sola consulta todo.
con este query tengo un problema, es que lo hice y tome los valores de la ultima compra de la tabla OITM.LastPurPrc y me trae valores incorrectos. */
SELECT T0.[ItemCode]as codigo, T0.[ItemName] as Descripcion, T0.CardCode,T15.CardName,
T0.[OnHand]as existencia, T0.InvNtryuom as UM,
T0.[LastPurPrc]as 'ultimo precio de compra',
T0.[LastPurDat]'última fecha compra',[Ult.FechaV]
FROM(
select T0.[ItemCode],T0.[ItemName],T0.CardCode,[OnHand],T0.[InvNtryuom],T0.[LastPurPrc],T0.[LastPurDat],
'Ult.FechaV'=(SELECT TOP 1 DocDate FROM OINM T14 WHERE TransType = 15 AND T0.ItemCode = T14.ItemCode ORDER BY DocDate DESC)
from OITM T0 with (nolock)
group by T0.[ItemCode],T0.[ItemName],T0.CardCode,T0.[OnHand],T0.[InvNtryuom],T0.[LastPurPrc],T0.[LastPurDat]
)T0
inner join OCRD T15 on T0.CardCode = T15.CardCode
/* Por esa razón trato de traer la ultima compra con este fragmento de codigo */
SELECT X0.ItemCode,MAX(X0.DocDate) 'Latest',
(SELECT MAX(Price) FROM PCH1 WHERE ItemCode=X0.ItemCode AND DocDate= MAX(X0.DocDate)) 'Last Price'
FROM PCH1 X0
Group By X0.ItemCode
/*Pero no logro pegar ambos query's para que formen una única consulta, un único reporte, cambiando la ultima compra del primer query, por la ultima compra del segundo query*/
Como dices, yo tambien tuve problemas obteniendo valores desde el OITM.LastPurPrc , por lo que corregimos de la siguiente forma,
SELECT distinct right(T0.[ItemCode],4) as Fabrica,T0.[ItemCode] as Articulo, T0.[ItemName] as Descripcion, T0.[OnHand] as Stock, T0.[AvgPrice] as Costo, (T0.[OnHand]*T0.[AvgPrice]) as Total, ((select top 1 opdn.docdate from opdn inner join PDN1 ON opdn.DocEntry = pdn1.DocEntry where pdn1.itemcode=T0.Itemcode order by opdn.docdate desc)) as Ultima_Fecha, ((select top 1 quantity from pdn1 where pdn1.itemcode=T0.Itemcode order by pdn1.docdate desc)) as Ultima_Compra, T2.Price as Contado, CASE WHEN T2.Price = 0 THEN '0' ELSE round(((T2.Price-T0.AvgPrice)/(T2.Price)),2)*100 END as Margen,T3.CardCode, T3.CardName
FROM OITM T0 INNER JOIN PDN1 T1 ON T0.ItemCode = T1.ItemCode INNER JOIN ITM1 T2 ON T0.Itemcode=T2.ItemCode INNER JOIN OCRD T3 ON T1.BaseCard = T3.CardCode
WHERE T0.[OnHand] > 0 and T2.PriceList='3'
order by 7,right(T0.[ItemCode],4),2
En rojo obtenemos la ultima fecha que entro en producto de acuerdo a las Entradas de Mercancia
En verdad la ultima cantidad que compramos de acuerdo a las Entradas de Mercancia
Espero que te ayude en algo de tu proyecto
saludos
Hola Cristian, esto debe ser porque mi reporte muestra la ultima cantidad comprada y cantidad, pero el costo es del momento de generar el reporte, basicamente el costo promedio.
Si quieres el costo al momento de la compra solo agregale una columna adicional al reporte,mostrando el costo, algo mas o menos asi:
((select top 1 PriceBefDi from pdn1 where pdn1.itemcode=T0.Itemcode order by pdn1.docdate desc)) as Ultimo_Costo_Compra
Hola Cristian, Lo mejor es que abras otro post. y cierres este,
Con gusto te ayudaremos en tu nueva consulta, como dicen hoy por ti y mañana por mi.
De esa manera nos enfocamos mejor en cada caso en vez de mezclar varios.
Pd. Si lo deseas puedes asignar tambien puntos eligiendo la mejor respuesta que te han dado.
Saludos
User | Count |
---|---|
108 | |
12 | |
11 | |
6 | |
5 | |
4 | |
3 | |
3 | |
3 | |
3 |
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.