Ubicación actual de un articulo

Buenos días amigos.

Tengo el siguiente query de movimientos de ubicaciones pero me esta mostrando todas las ubicaciones que habían en su momento con sus movimientos pero solo necesito saber cuales solo las que tienen artículos en el momento y no el historial total.

SELECT T0."DocNum", T0."DocEntry", T0."DocDate", T1."Quantity", T1."ItemCode", T5."BinCode"
FROM OWTR T0 
INNER JOIN WTR1 T1 ON T0."DocEntry" = T1."DocEntry"
LEFT JOIN OILM T3  ON T0."DocEntry"=T3."DocEntry"  AND T3."DocLineNum" = T1."LineNum" AND T3."TransType" =  T0."ObjType"
LEFT JOIN OBTL T4 ON T3."MessageID" = T4."MessageID" 
LEFT JOIN OBIN T5 ON T4."BinAbs" = T5."AbsEntry" 

WHERE  T1."ItemCode"=[%0]

Tu query esta accediendo a las transferencias, por tanto si te mostrara movimiento, si lo que quieres es un status de stock por ubicacion, prueba con este query:

SELECT distinct T0.ItemCode, T2.ItemName,
T0.DistNumber 'Lote', t0.ExpDate, t4.WhsCode, T4.BinCode, T3.OnHandQty, t6.WhsName
from
OBTN T0
inner join OBTQ T1 on T0.ItemCode = T1.ItemCode and T0.SysNumber = T1.SysNumber
inner join OITM T2 on T0.ItemCode = T2.ItemCode
inner join OBBQ T3 on T0.ItemCode = T3.ItemCode and T0.AbsEntry = T3.SnBMDAbs
inner join OBIN T4 on T3.BinAbs = T4.AbsEntry
inner join OWHS T6 on T6.WhsCode = t4.WhsCode
where
T1.Quantity > 0
AND T3.OnHandQty > 0
and T0.ItemCode = [%0]
order by
T0.ItemCode, T2.ItemName,
T0.DistNumber , t0.ExpDate, t4.WhsCode,
T4.BinCode, T3.OnHandQty
2 Me gusta

Hola @Willy_Calero

Muchas gracias por la ayuda tengo dos dudas .

  1. Cuando ejecuto el query que me muestras me dice: La fecha no esta disponible, modifique los criterios de selección.

  2. Tengo este Query que es lo que necesitamos en nuestra bodega. Solo que necesito agregar la fecha en que se incluyo ese articulo en la ubicación pero he intentado de varias manera y nada.

SELECT T0."OnHandQty", T1."ItemCode", T2."BinCode" FROM OIBQ T0 
INNER JOIN OITM T1 ON T0."ItemCode" = T1."ItemCode" 
INNER JOIN OBIN T2 ON T0."BinAbs" = T2."AbsEntry"

Agradezco la ayuda de antemano.

Incluso me voy a explicar mejor

@Willy_Caldero incluso me voy a explicar mejor.

INNER JOIN OITM T1 ON T0."ItemCode" = T1."ItemCode" 
INNER JOIN OBIN T2 ON T0."BinAbs" = T2."AbsEntry"  ```



De este query necesito la fecha que esta fecha esta en la tabla OWTR el campo DocDate lo que no se es si se liga tambien con la tabla  WTR1 porque intento y me da error.

Nose si me explico

La tabla que te guarda las transacciones con las ubicaciones es la OBTL, esa la relacionas con el movimiento de stock a través de la OILM, Seria algo así con las transferencias:

FORM OWTR T0
inner join WTR1 T1 ON T1.DocEntry = T0.DocEntry
left join OILM T2 ON T2.DocEntry=T1.DocEntry AND T2.TransType=T1.ObjType AND 
                                     T2.DocLineNum=T1.LineNum
left join OBTL T3 ON T3.MessageID=T2.MessageID
left join OBIN T4 ON T3.BinAbs = T4.AbsEntry
1 me gusta

Don @Willy_Caldero viera que lo intente asi y no me da error pero no me muestra nada. Se puede decir que esos son los campos y tablas que necesito. Alguna idea de como corregir esto o que estoy haciendo mal ???

SELECT T0."OnHandQty", T1."ItemCode", T2."BinCode", T3."DocEntry" 

FROM OIBQ T0  
INNER JOIN OITM T1 ON T0."ItemCode" = T1."ItemCode" 
LEFT JOIN OBIN T2 ON T0."BinAbs" = T2."AbsEntry", 
LEFT JOIN OWTR T3 ON T3."DocEntry" = T4."DocEntry" 
LEFT JOIN WTR1 T4 ON T3."DocEntry" = T4."DocEntry" 

WHERE T1."ItemCode" = [%0]

Esta mal los JOIN, hay tablas por demas para lo que necesitas:

SELECT T0."OnHandQty", T0."ItemCode", T2."BinCode", T4."DocEntry" 
FROM OIBQ T0  
LEFT JOIN OBIN T2 ON T0."BinAbs" = T2."AbsEntry", 
LEFT JOIN WTR1 T4 ON T0."ItemCode" = T4."ItemCode" 

WHERE T1."ItemCode" = [%0]

Esto te mostraría todas las ubicaciones de un Item que paso por transferencias.
Tal vez seria mejor que indiques que es lo que quieres que te muestre tu query.

1 me gusta

Claro @Willy_Caldero en reaidad es medio complejo, pero voy de nuevo.

Tengo este query:

SELECT T0."OnHandQty", T0."ItemCode", T1."BinCode", T2."DocDate" 
FROM OIBQ T0  
LEFT JOIN OBIN T1 ON T0."BinAbs" = T1."AbsEntry"
LEFT JOIN WTR1 T2 ON T0."ItemCode" = T2."ItemCode" 
WHERE T0."ItemCode" = [%0] ```

Y esta bien porque me muestra todo lo que necesito. pero me esta mostrando todas las transacciones que han habido desde el principio de ese articulo, yo lo que necesito es que me muestre sol lo que hay en las bodegas pasivas por ejemplo tengo este query que me muestra solo lo que hay en las bodegas que necesito pero no me muestra la fecha que se incluyo ese articulo en las bodegas."Te paso este query tambien que me muestra lo que necesito pero no me da la fecha que si me da el otro"

SELECT T1.“ItemCode”, T1.“ItemName”, T0.“OnHandQty”, T1.“InvntryUom”, T2.“BinCode”, T3.“ItmsGrpNam”, T4.“CardCode”, T4.“CardName”

FROM OIBQ T0 INNER JOIN OITM T1 ON T0.“ItemCode” = T1.“ItemCode” INNER JOIN OBIN T2 ON T0.“BinAbs” = T2.“AbsEntry” INNER JOIN OITB T3 ON T1.“ItmsGrpCod” = T3.“ItmsGrpCod” LEFT JOIN OCRD T4 ON T1.“CardCode” = T4.“CardCode”

WHERE T1.“ItemCode” = [%0]

Entiendo mas o menos, que lo que quieres es que te muestre; Ubicacion, Codigo Item, Stock, Primera Fecha de ingreso (ojo que el ingreso puede ser no solo con transferencia, sino con cualquier otro documento de ingreso de stock, como recuento, recepciones de compras, ingreso de stock), si es asi el query esta mala diseñado.
Primero tomar en cuenta que el query lo podes dividir en 2, primero quieres el saldo del BIN por lo que eso lo puedes sacar directamente de OIBQ, como ya lo haces, pero la fecha tendrias que sacar del log de inventario OILM, pero esta para poder relacionarla al codigo BIN se hace a travez de la OBTL (log de transacciones BIN), Esta utlima consulta la puedes usar como subconsulta de la primera para no tener que relacionar hasta la OIBQ:

SELECT T0."OnHandQty", T0."ItemCode", T1."BinCode", 
(Select Top 1 TL."DocDate" 
FROM OBTL TB 
INNER JOIN OILM TL ON  TB."MessageID" = TL."MessageID" 
WHERE TB."BinAbs" = T0."BinAbs" and TL."ItemCode" = T0."ItemCode")

FROM OIBQ T0  
...

Si deseas que específicamente sea ingreso por transferencia la OILM tiene el tipo de documento origen, la linea, y muchos datos mas.

@Willy_Caldero agradezco enormemente la ayuda. Sin embargo estoy ejecutando este query que me pasaste pero no me hace nada será que me hace falta algo ???

@Willy_Caldero esa es la fecha que necesito.

Lo que te pase es una guía no un query funcional, y es complicado indicarte por que no salen tus datos sin tener acceso a ellos, lo que te sugiero es consultar tabla por tabla para que identifiques donde no esta el problema. Para que tomes en cuenta:

  1. OIBQ : guarda saldos de stock por ubicacion
  2. OBTL: Guarda kardex de transaccions por ubicacion (lastimosamente esta tabla solo da la relacion con las tablas estandar de kardex, y el unico dato que replica es la cantidad)
  3. OILM: Log de Mensaje de Inventario, te muestra todo el moviiento del inventario, incluido comprometidos y solicitados, sin incluir ubicaciones ni lotes. La relacion es con la OBTL es con el campo “MessageID”
  4. OITL: guarda kardex de movimientos de invetario sin comprometidos ni solicitados, y se relaciona también con la OBTL a travez del campo “ITLEntry”
1 me gusta

@Willy_Caldero

Entiendo tu punto y basándome en tu recomendación realice el siguiente QUERY:

SELECT T0.“DocDate”, T2.“BinCode”, T3.“ItemCode”, T3.“OnHandQty”
FROM OILM T0
INNER JOIN OBTL T1 ON T0.“MessageID” = T1.“MessageID”
INNER JOIN OBIN T2 ON T1.“BinAbs” = T2.“AbsEntry”
INNER JOIN OIBQ T3 ON T2.“AbsEntry” = T3.“BinAbs”
WHERE T3.“ItemCode” = [%0]

Y me muestra ahora si lo que necesito. Pero me esta mostrando todo el historial. Existe una condición que me diga solo lo que hay actualmente en en la bodega pasiva ??

Agrupalo por BinCode, y sacas la fecha, minima:

SELECT T2.“BinCode”, T3.“ItemCode”, T3.“OnHandQty”,Min(T0.“DocDate”)
FROM OILM T0
INNER JOIN OBTL T1 ON T0.“MessageID” = T1.“MessageID”
INNER JOIN OBIN T2 ON T1.“BinAbs” = T2.“AbsEntry”
INNER JOIN OIBQ T3 ON T2.“AbsEntry” = T3.“BinAbs”
WHERE T3.“ItemCode” = [%0]
Group by T2."BinCode", T3."ItemCode", T3."OnHandQty"
1 me gusta

Lo agrupe como me indicaste y no me muestra nada, Alguna razón??

no tiene sentido, me dices que el query te muestra info, y al agrupar no te muestra nada??
ningun error? donde estas ejecutando tus querys?? es HANA, o SQL?

En HANA.

Y correcto así como tu lo dices así pasa te muestro en las siguientes imágenes.

Pero si lo agrupo no hace nada.

Te aconsejo que los querys que no son tan simples lo hagas en el HANA Studio, por que el query manager en HANA al menos no te muestr el error.
En la seccion “Seleccionar” de arriba tienes que poner el mismo orden que pusiste en la sección “Agrupar Por” de abajo, y el campo T0.DocDate, lo cambias por MIN(T0.“DocDate”)

1 me gusta

@Willy_Caldero:

Voy a chequear en hana studio a ver si lo puedo hacer, te infomo como me fue ya que asi como me lo planteas me da el mismo error.