cancel
Showing results for 
Search instead for 
Did you mean: 

Consulta para obtener la compra mas reciente

0 Kudos

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.

Accepted Solutions (1)

Accepted Solutions (1)

Former Member
0 Kudos

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,

0 Kudos

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.

Former Member
0 Kudos

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,

0 Kudos

Excelente, eso me funciono, bueno, solo tuve que quitarle la clausula ORDER BY.

Gracias.

Former Member
0 Kudos

Hola...

Para llevar un control de pendientes...

Si consideras que el caso ha sido resuelto, favor cerrar el mismo.

Saludos Cordiales,

0 Kudos

Hermano, como cierro esto?

Disculpame la Ignorancia!

Saludos.

Former Member
0 Kudos

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,

Answers (1)

Answers (1)

0 Kudos

Gracias Srs. Han sido de mucha ayuda.

Former Member
0 Kudos

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

eloy_ploche2
Participant
0 Kudos

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

Former Member
0 Kudos

Hola, Eloy voy a probarla y te comento, de antemano gracias por la ayuda

Former Member
0 Kudos

/*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*/

Former Member
0 Kudos

/*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*/

Former Member
0 Kudos

/*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*/

eloy_ploche2
Participant
0 Kudos

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

Former Member
0 Kudos

gracias Eloy, lo estuve probando, y las fechas son correctas, pero los montos no lo son

eloy_ploche2
Participant
0 Kudos

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

Former Member
0 Kudos

Muchas gracias Eloy por el apoyo

Ahora tengo un tema con el reporte balance provisional, pero no se si se puede ver por este mismo post o abro una para ver si me apoyas

eloy_ploche2
Participant
0 Kudos

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