modify code related with M_Storage

This commit is contained in:
Edwin Ang 2012-10-29 15:14:45 +07:00
parent 0731626ca0
commit 31ee8bc837
30 changed files with 79 additions and 69 deletions

View File

@ -147,12 +147,12 @@ public class CalloutInventory extends CalloutEngine
private BigDecimal setQtyBook (int M_AttributeSetInstance_ID, int M_Product_ID, int M_Locator_ID) throws Exception {
// Set QtyBook from first storage location
BigDecimal bd = null;
String sql = "SELECT QtyOnHand FROM M_Storage "
String sql = "SELECT QtyOnHand FROM M_StorageOnHand "
+ "WHERE M_Product_ID=?" // 1
+ " AND M_Locator_ID=?" // 2
+ " AND M_AttributeSetInstance_ID=?";
if (M_AttributeSetInstance_ID == 0)
sql = "SELECT SUM(QtyOnHand) FROM M_Storage "
sql = "SELECT SUM(QtyOnHand) FROM M_StorageOnHand "
+ "WHERE M_Product_ID=?" // 1
+ " AND M_Locator_ID=?"; // 2

View File

@ -20,6 +20,7 @@ package org.compiere.model;
import java.math.BigDecimal;
import java.util.Properties;
import org.compiere.util.DB;
import org.compiere.util.Env;
/**
@ -117,11 +118,15 @@ public class CalloutMovement extends CalloutEngine
if (MovementQty == null)
MovementQty = (BigDecimal) mTab.getValue("MovementQty");
int M_Locator_ID = Env.getContextAsInt(ctx, WindowNo, "M_Locator_ID");
// If no locator, don't check anything and assume is ok
if (M_Locator_ID <= 0)
return;
//@win - IDEMPIERE-385
int M_Warehouse_ID = DB.getSQLValue(null, "SELECT M_Warehouse_ID FROM M_Locator WHERE M_Locator_ID=?");
//
int M_AttributeSetInstance_ID = Env.getContextAsInt(ctx, WindowNo, "M_AttributeSetInstance_ID");
BigDecimal available = MStorageReservation.getQtyAvailable(0, M_Locator_ID, M_Product_ID, M_AttributeSetInstance_ID, null);
BigDecimal available = MStorageReservation.getQtyAvailable(M_Warehouse_ID, M_Product_ID, M_AttributeSetInstance_ID, null);
if (available == null)
available = Env.ZERO;
if (available.signum() == 0)

View File

@ -135,13 +135,13 @@ public class InventoryCountCreate extends SvrProcess
// Create Null Storage records
if (p_QtyRange != null && p_QtyRange.equals("="))
{
StringBuilder sql = new StringBuilder("INSERT INTO M_Storage ");
StringBuilder sql = new StringBuilder("INSERT INTO M_StorageOnHand ");
sql.append("(AD_Client_ID, AD_Org_ID, IsActive, Created, CreatedBy, Updated, UpdatedBy,");
sql.append(" M_Locator_ID, M_Product_ID, M_AttributeSetInstance_ID,");
sql.append(" QtyOnHand, QtyReserved, QtyOrdered, DateLastInventory) ");
sql.append(" QtyOnHand, DateLastInventory) ");
sql.append("SELECT l.AD_CLIENT_ID, l.AD_ORG_ID, 'Y', SysDate, 0,SysDate, 0,");
sql.append(" l.M_Locator_ID, p.M_Product_ID, 0,");
sql.append(" 0,0,0,null ");
sql.append(" 0,null ");
sql.append("FROM M_Locator l");
sql.append(" INNER JOIN M_Product p ON (l.AD_Client_ID=p.AD_Client_ID) ");
sql.append("WHERE l.M_Warehouse_ID=");
@ -151,7 +151,7 @@ public class InventoryCountCreate extends SvrProcess
sql.append(" AND l.M_Locator_ID=").append(p_M_Locator_ID);
sql.append(" AND l.IsDefault='Y'")
.append(" AND p.IsActive='Y' AND p.IsStocked='Y' and p.ProductType='I'")
.append(" AND NOT EXISTS (SELECT * FROM M_Storage s")
.append(" AND NOT EXISTS (SELECT * FROM M_StorageOnHand s")
.append(" INNER JOIN M_Locator sl ON (s.M_Locator_ID=sl.M_Locator_ID) ")
.append("WHERE sl.M_Warehouse_ID=l.M_Warehouse_ID")
.append(" AND s.M_Product_ID=p.M_Product_ID)");
@ -162,7 +162,7 @@ public class InventoryCountCreate extends SvrProcess
StringBuilder sql = new StringBuilder("SELECT s.M_Product_ID, s.M_Locator_ID, s.M_AttributeSetInstance_ID,");
sql.append(" s.QtyOnHand, p.M_AttributeSet_ID ");
sql.append("FROM M_Product p");
sql.append(" INNER JOIN M_Storage s ON (s.M_Product_ID=p.M_Product_ID)");
sql.append(" INNER JOIN M_StorageOnHand s ON (s.M_Product_ID=p.M_Product_ID)");
sql.append(" INNER JOIN M_Locator l ON (s.M_Locator_ID=l.M_Locator_ID) ");
sql.append("WHERE l.M_Warehouse_ID=?");
sql.append(" AND p.IsActive='Y' AND p.IsStocked='Y' and p.ProductType='I'");

View File

@ -92,14 +92,14 @@ public class InventoryCountUpdate extends SvrProcess
// ASI
sql = new StringBuilder("UPDATE M_InventoryLine l ")
.append("SET (QtyBook,QtyCount) = ")
.append("(SELECT QtyOnHand,QtyOnHand FROM M_Storage s ")
.append("(SELECT QtyOnHand,QtyOnHand FROM M_StorageOnHand s ")
.append("WHERE s.M_Product_ID=l.M_Product_ID AND s.M_Locator_ID=l.M_Locator_ID")
.append(" AND s.M_AttributeSetInstance_ID=l.M_AttributeSetInstance_ID),")
.append(" Updated=SysDate,")
.append(" UpdatedBy=").append(getAD_User_ID())
//
.append(" WHERE M_Inventory_ID=").append(p_M_Inventory_ID)
.append(" AND EXISTS (SELECT * FROM M_Storage s ")
.append(" AND EXISTS (SELECT * FROM M_StorageOnHand s ")
.append("WHERE s.M_Product_ID=l.M_Product_ID AND s.M_Locator_ID=l.M_Locator_ID")
.append(" AND s.M_AttributeSetInstance_ID=l.M_AttributeSetInstance_ID)");
int no = DB.executeUpdate(sql.toString(), get_TrxName());

View File

@ -175,7 +175,7 @@ public class InventoryValue extends SvrProcess
// Get current QtyOnHand with ASI
sql = new StringBuilder ("UPDATE T_InventoryValue iv SET QtyOnHand = ")
.append("(SELECT SUM(QtyOnHand) FROM M_Storage s")
.append("(SELECT SUM(QtyOnHand) FROM M_StorageOnHand s")
.append(" INNER JOIN M_Locator l ON (l.M_Locator_ID=s.M_Locator_ID) ")
.append("WHERE iv.M_Product_ID=s.M_Product_ID")
.append(" AND iv.M_Warehouse_ID=l.M_Warehouse_ID")
@ -186,7 +186,7 @@ public class InventoryValue extends SvrProcess
log.fine("QtHand with ASI=" + no);
// Get current QtyOnHand without ASI
sql = new StringBuilder ("UPDATE T_InventoryValue iv SET QtyOnHand = ")
.append("(SELECT SUM(QtyOnHand) FROM M_Storage s")
.append("(SELECT SUM(QtyOnHand) FROM M_StorageOnHand s")
.append(" INNER JOIN M_Locator l ON (l.M_Locator_ID=s.M_Locator_ID) ")
.append("WHERE iv.M_Product_ID=s.M_Product_ID")
.append(" AND iv.M_Warehouse_ID=l.M_Warehouse_ID) ")

View File

@ -143,7 +143,6 @@ public class M_Production_Run extends SvrProcess {
{
BigDecimal QtyAvailable = MStorageReservation.getQtyAvailable(
locator.getM_Warehouse_ID(),
locator.getM_Locator_ID(),
pline.getM_Product_ID(),
pline.getM_AttributeSetInstance_ID(),
get_TrxName());

View File

@ -140,7 +140,7 @@ public class OrgOwnership extends SvrProcess
// Set Storage
sql = new StringBuilder();
sql.append("UPDATE M_Storage s ")
sql.append("UPDATE M_StorageOnHand s ")
.append("SET AD_Org_ID=").append(p_AD_Org_ID)
.append(" WHERE EXISTS ")
.append("(SELECT * FROM M_Locator l WHERE l.M_Locator_ID=s.M_Locator_ID")

View File

@ -249,12 +249,12 @@ public class ReplenishReport extends SvrProcess
log.fine("Insert (BP) #" + no);
}
sql = new StringBuilder("UPDATE T_Replenish t SET ");
sql.append("QtyOnHand = (SELECT COALESCE(SUM(QtyOnHand),0) FROM M_Storage s, M_Locator l WHERE t.M_Product_ID=s.M_Product_ID");
sql.append("QtyOnHand = (SELECT COALESCE(SUM(QtyOnHand),0) FROM M_StorageOnHand s, M_Locator l WHERE t.M_Product_ID=s.M_Product_ID");
sql.append(" AND l.M_Locator_ID=s.M_Locator_ID AND l.M_Warehouse_ID=t.M_Warehouse_ID),");
sql.append("QtyReserved = (SELECT COALESCE(SUM(QtyReserved),0) FROM M_Storage s, M_Locator l WHERE t.M_Product_ID=s.M_Product_ID");
sql.append(" AND l.M_Locator_ID=s.M_Locator_ID AND l.M_Warehouse_ID=t.M_Warehouse_ID),");
sql.append("QtyOrdered = (SELECT COALESCE(SUM(QtyOrdered),0) FROM M_Storage s, M_Locator l WHERE t.M_Product_ID=s.M_Product_ID");
sql.append(" AND l.M_Locator_ID=s.M_Locator_ID AND l.M_Warehouse_ID=t.M_Warehouse_ID)");
sql.append("QtyReserved = (SELECT COALESCE(SUM(QtyReserved),0) FROM M_StorageReservation s, M_Locator l WHERE t.M_Product_ID=s.M_Product_ID");
sql.append(" AND l.M_Warehouse_ID=t.M_Warehouse_ID),");
sql.append("QtyOrdered = (SELECT COALESCE(SUM(QtyOrdered),0) FROM M_StorageReservation s, M_Locator l WHERE t.M_Product_ID=s.M_Product_ID");
sql.append(" AND l.M_Warehouse_ID=t.M_Warehouse_ID)");
if (p_C_DocType_ID != 0)
sql.append(", C_DocType_ID=").append(p_C_DocType_ID);
sql.append(" WHERE AD_PInstance_ID=").append(getAD_PInstance_ID());

View File

@ -271,10 +271,10 @@ public class ReplenishReportProduction extends SvrProcess
sql = new StringBuilder("UPDATE T_Replenish t SET ");
sql.append("QtyOnHand = (SELECT COALESCE(SUM(QtyOnHand),0) FROM M_Storage s, M_Locator l WHERE t.M_Product_ID=s.M_Product_ID");
sql.append(" AND l.M_Locator_ID=s.M_Locator_ID AND l.M_Warehouse_ID=t.M_Warehouse_ID),");
sql.append("QtyReserved = (SELECT COALESCE(SUM(QtyReserved),0) FROM M_Storage s, M_Locator l WHERE t.M_Product_ID=s.M_Product_ID");
sql.append(" AND l.M_Locator_ID=s.M_Locator_ID AND l.M_Warehouse_ID=t.M_Warehouse_ID),");
sql.append("QtyOrdered = (SELECT COALESCE(SUM(QtyOrdered),0) FROM M_Storage s, M_Locator l WHERE t.M_Product_ID=s.M_Product_ID");
sql.append(" AND l.M_Locator_ID=s.M_Locator_ID AND l.M_Warehouse_ID=t.M_Warehouse_ID)");
sql.append("QtyReserved = (SELECT COALESCE(SUM(QtyReserved),0) FROM M_StorageReservation s, M_Locator l WHERE t.M_Product_ID=s.M_Product_ID");
sql.append(" AND l.M_Warehouse_ID=t.M_Warehouse_ID),");
sql.append("QtyOrdered = (SELECT COALESCE(SUM(QtyOrdered),0) FROM M_StorageReservation s, M_Locator l WHERE t.M_Product_ID=s.M_Product_ID");
sql.append(" AND l.M_Warehouse_ID=t.M_Warehouse_ID)");
if (p_C_DocType_ID != 0)
sql.append(", C_DocType_ID=").append(p_C_DocType_ID);
sql.append(" WHERE AD_PInstance_ID=").append(getAD_PInstance_ID());

View File

@ -68,7 +68,7 @@ public class StorageCleanup extends SvrProcess
{
log.info("");
// Clean up empty Storage
String sql = "DELETE FROM M_Storage "
String sql = "DELETE FROM M_StorageOnHand "
+ "WHERE QtyOnHand = 0 AND QtyReserved = 0 AND QtyOrdered = 0"
+ " AND Created < SysDate-3";
int no = DB.executeUpdate(sql, get_TrxName());
@ -76,7 +76,7 @@ public class StorageCleanup extends SvrProcess
//
sql = "SELECT * "
+ "FROM M_Storage s "
+ "FROM M_StorageOnHand s "
+ "WHERE AD_Client_ID = ?"
+ " AND QtyOnHand < 0"
// Instance Attribute
@ -89,7 +89,7 @@ public class StorageCleanup extends SvrProcess
// + " AND s.M_Product_ID=sl.M_Product_ID"
// + " AND s.M_Locator_ID=sl.M_Locator_ID)"
// Stock in same Warehouse
+ " AND EXISTS (SELECT * FROM M_Storage sw"
+ " AND EXISTS (SELECT * FROM M_StorageOnHand sw"
+ " INNER JOIN M_Locator swl ON (sw.M_Locator_ID=swl.M_Locator_ID), M_Locator sl "
+ "WHERE sw.QtyOnHand > 0"
+ " AND s.M_Product_ID=sw.M_Product_ID"
@ -250,7 +250,7 @@ public class StorageCleanup extends SvrProcess
{
ArrayList<MStorageOnHand> list = new ArrayList<MStorageOnHand>();
String sql = "SELECT * "
+ "FROM M_Storage s "
+ "FROM M_StorageOnHand s "
+ "WHERE QtyOnHand > 0"
+ " AND M_Product_ID=?"
// Empty ASI

View File

@ -188,9 +188,9 @@ public class AccessSqlParserTest extends TestCase
*/
public void testProductInstanceAttributeQuery()
{
String sql = "SELECT p.M_Product_ID, p.Discontinued, p.Value, p.Name, BOM_Qty_Available(p.M_Product_ID,?) AS QtyAvailable, bomQtyList(p.M_Product_ID, pr.M_PriceList_Version_ID) AS PriceList, bomQtyStd(p.M_Product_ID, pr.M_PriceList_Version_ID) AS PriceStd, BOM_Qty_OnHand(p.M_Product_ID,?) AS QtyOnHand, BOM_Qty_Reserved(p.M_Product_ID,?) AS QtyReserved, BOM_Qty_Ordered(p.M_Product_ID,?) AS QtyOrdered, bomQtyStd(p.M_Product_ID, pr.M_PriceList_Version_ID)-bomQtyLimit(p.M_Product_ID, pr.M_PriceList_Version_ID) AS Margin, bomQtyLimit(p.M_Product_ID, pr.M_PriceList_Version_ID) AS PriceLimit, pa.IsInstanceAttribute FROM M_Product p INNER JOIN M_ProductPrice pr ON (p.M_Product_ID=pr.M_Product_ID) LEFT OUTER JOIN M_AttributeSet pa ON (p.M_AttributeSet_ID=pa.M_AttributeSet_ID) WHERE p.IsSummary='N' AND p.IsActive='Y' AND pr.IsActive='Y' AND pr.M_PriceList_Version_ID=? AND EXISTS (SELECT * FROM M_Storage s INNER JOIN M_AttributeSetInstance asi ON (s.M_AttributeSetInstance_ID=asi.M_AttributeSetInstance_ID) WHERE s.M_Product_ID=p.M_Product_ID AND asi.SerNo LIKE '33' AND asi.Lot LIKE '33' AND asi.M_Lot_ID=101 AND TRUNC(asi.GuaranteeDate)<TO_DATE('2003-10-16','YYYY-MM-DD') AND asi.M_AttributeSetInstance_ID IN (SELECT M_AttributeSetInstance_ID FROM M_AttributeInstance WHERE (M_Attribute_ID=103 AND Value LIKE '33') AND (M_Attribute_ID=102 AND M_AttributeValue_ID=106))) AND p.M_AttributeSetInstance_ID IN (SELECT M_AttributeSetInstance_ID FROM M_AttributeInstance WHERE (M_Attribute_ID=101 AND M_AttributeValue_ID=105) AND (M_Attribute_ID=100 AND M_AttributeValue_ID=102)) AND p.AD_Client_ID IN(0,11) AND p.AD_Org_ID IN(0,11,12) ORDER BY QtyAvailable DESC, Margin DESC";
String sql = "SELECT p.M_Product_ID, p.Discontinued, p.Value, p.Name, BOM_Qty_Available(p.M_Product_ID,?) AS QtyAvailable, bomQtyList(p.M_Product_ID, pr.M_PriceList_Version_ID) AS PriceList, bomQtyStd(p.M_Product_ID, pr.M_PriceList_Version_ID) AS PriceStd, BOM_Qty_OnHand(p.M_Product_ID,?) AS QtyOnHand, BOM_Qty_Reserved(p.M_Product_ID,?) AS QtyReserved, BOM_Qty_Ordered(p.M_Product_ID,?) AS QtyOrdered, bomQtyStd(p.M_Product_ID, pr.M_PriceList_Version_ID)-bomQtyLimit(p.M_Product_ID, pr.M_PriceList_Version_ID) AS Margin, bomQtyLimit(p.M_Product_ID, pr.M_PriceList_Version_ID) AS PriceLimit, pa.IsInstanceAttribute FROM M_Product p INNER JOIN M_ProductPrice pr ON (p.M_Product_ID=pr.M_Product_ID) LEFT OUTER JOIN M_AttributeSet pa ON (p.M_AttributeSet_ID=pa.M_AttributeSet_ID) WHERE p.IsSummary='N' AND p.IsActive='Y' AND pr.IsActive='Y' AND pr.M_PriceList_Version_ID=? AND EXISTS (SELECT * FROM M_StorageOnHand s INNER JOIN M_AttributeSetInstance asi ON (s.M_AttributeSetInstance_ID=asi.M_AttributeSetInstance_ID) WHERE s.M_Product_ID=p.M_Product_ID AND asi.SerNo LIKE '33' AND asi.Lot LIKE '33' AND asi.M_Lot_ID=101 AND TRUNC(asi.GuaranteeDate)<TO_DATE('2003-10-16','YYYY-MM-DD') AND asi.M_AttributeSetInstance_ID IN (SELECT M_AttributeSetInstance_ID FROM M_AttributeInstance WHERE (M_Attribute_ID=103 AND Value LIKE '33') AND (M_Attribute_ID=102 AND M_AttributeValue_ID=106))) AND p.M_AttributeSetInstance_ID IN (SELECT M_AttributeSetInstance_ID FROM M_AttributeInstance WHERE (M_Attribute_ID=101 AND M_AttributeValue_ID=105) AND (M_Attribute_ID=100 AND M_AttributeValue_ID=102)) AND p.AD_Client_ID IN(0,11) AND p.AD_Org_ID IN(0,11,12) ORDER BY QtyAvailable DESC, Margin DESC";
AccessSqlParser fixture = new AccessSqlParser(sql);
assertEquals("AccessSqlParser[M_AttributeInstance|M_Storage=s,M_AttributeSetInstance=asi|M_AttributeInstance|M_Product=p,M_ProductPrice=pr,M_AttributeSet=pa|3]", fixture.toString());
assertEquals("AccessSqlParser[M_AttributeInstance|M_StorageOnHand=s,M_AttributeSetInstance=asi|M_AttributeInstance|M_Product=p,M_ProductPrice=pr,M_AttributeSet=pa|3]", fixture.toString());
}
/**

View File

@ -1002,7 +1002,7 @@ public class MCostDetail extends X_M_CostDetail
* Solution:
* Make sure the current qty is reflecting the actual qty in storage
*/
StringBuilder sql = new StringBuilder("SELECT COALESCE(SUM(QtyOnHand),0) FROM M_Storage")
StringBuilder sql = new StringBuilder("SELECT COALESCE(SUM(QtyOnHand),0) FROM M_StorageOnHand")
.append(" WHERE AD_Client_ID=").append(cost.getAD_Client_ID())
.append(" AND M_Product_ID=").append(cost.getM_Product_ID());
//Costing Level
@ -1159,7 +1159,7 @@ public class MCostDetail extends X_M_CostDetail
MCostElement[] lce = MCostElement.getNonCostingMethods(this);
if (lce.length > 0)
{
StringBuilder sql = new StringBuilder("SELECT COALESCE(SUM(QtyOnHand),0) FROM M_Storage")
StringBuilder sql = new StringBuilder("SELECT COALESCE(SUM(QtyOnHand),0) FROM M_StorageOnHand")
.append(" WHERE AD_Client_ID=").append(cost.getAD_Client_ID())
.append(" AND M_Product_ID=").append(cost.getM_Product_ID());
//Costing Level

View File

@ -332,7 +332,7 @@ public final class MLocatorLookup extends Lookup implements Serializable
sql.append(" AND (IsDefault='Y' ") // Default Locator
.append("OR EXISTS (SELECT * FROM M_Product p ") // Product Locator
.append("WHERE p.M_Locator_ID=M_Locator.M_Locator_ID AND p.M_Product_ID=?)")
.append("OR EXISTS (SELECT * FROM M_Storage s ") // Storage Locator
.append("OR EXISTS (SELECT * FROM M_StorageOnHand s ") // Storage Locator
.append("WHERE s.M_Locator_ID=M_Locator.M_Locator_ID AND s.M_Product_ID=?))");
sql.append(" ORDER BY ");
if (local_only_warehouse_id == 0)

View File

@ -580,8 +580,7 @@ public class MProduct extends X_M_Product
for (int i = 0; i < onHandStorages.length; i++)
{
OnHand = OnHand.add(onHandStorages[i].getQtyOnHand());
//Ordered = Ordered.add(storages[i].getQtyOrdered());
//Reserved = Reserved.add(storages[i].getQtyReserved());
}
for (int i = 0; i < reservationStorages.length; i++)
{
@ -720,26 +719,23 @@ public class MProduct extends X_M_Product
// Check Storage
if (isStocked() || PRODUCTTYPE_Item.equals(getProductType()))
{
// large modified related to storages by zuhri
MStorageOnHand[] onHandStorages = MStorageOnHand.getOfProduct(getCtx(), get_ID(), get_TrxName());
MStorageReservation[] reservationStorages = MStorageReservation.getOfProduct(getCtx(), get_ID(), get_TrxName());
MStorageReservation[] reserves = MStorageReservation.getOfProduct(getCtx(), get_ID(), get_TrxName());
BigDecimal OnHand = Env.ZERO;
BigDecimal Ordered = Env.ZERO;
BigDecimal Reserved = Env.ZERO;
for (int i = 0; i < onHandStorages.length; i++)
{
OnHand = OnHand.add(onHandStorages[i].getQtyOnHand());
//Ordered = Ordered.add(storages[i].getQtyOrdered());
//Reserved = Reserved.add(storages[i].getQtyReserved());
}
for (int i = 0; i < reservationStorages.length; i++)
for (int i = 0; i < reserves.length; i++)
{
if(reservationStorages[i].isSOTrx())
Reserved = Reserved.add(reservationStorages[i].getQty());
else
Ordered = Ordered.add(reservationStorages[i].getQty());
Ordered = OnHand.add(reserves[i].getQtyOrdered());
Reserved = OnHand.add(reserves[i].getQtyReserved());
}
// end large modified related to storages by zuhri
String errMsg = "";
if (OnHand.signum() != 0)
errMsg = "@QtyOnHand@ = " + OnHand;

View File

@ -105,6 +105,13 @@ public class MStorageReservation extends X_M_StorageReservation {
return qty;
}
public static BigDecimal getQtyOrdered (int M_Warehouse_ID,
int M_Product_ID, int M_AttributeSetInstance_ID, String trxName)
{
BigDecimal retValue = null;
return retValue;
}
/**
* Get Available Qty.
* The call is accurate only if there is a storage record
@ -124,4 +131,14 @@ public class MStorageReservation extends X_M_StorageReservation {
return retValue;
}
public BigDecimal getQtyOrdered() {
// TODO Auto-generated method stub
return null;
}
public BigDecimal getQtyReserved() {
// TODO Auto-generated method stub
return null;
}
}

View File

@ -213,7 +213,7 @@ public class MWarehouse extends X_M_Warehouse
with negative onhand. */
if (is_ValueChanged("IsDisallowNegativeInv") && isDisallowNegativeInv())
{
String sql = "SELECT M_Product_ID FROM M_Storage s "+
String sql = "SELECT M_Product_ID FROM M_StorageOnHand s "+
"WHERE s.M_Locator_ID IN (SELECT M_Locator_ID FROM M_Locator l " +
"WHERE M_Warehouse_ID=? )" +
" GROUP BY M_Product_ID, M_Locator_ID, M_AttributeSetInstance_ID " +

View File

@ -49,14 +49,14 @@ public class MStorageTest extends AdempiereTestCase
s1.setQtyOnHand(targetQty);
s1.saveEx();
//
BigDecimal qty = MStorageReservation.getQtyAvailable(wh.get_ID(), loc.get_ID(), product_id, 0, getTrxName()).setScale(12, BigDecimal.ROUND_HALF_UP);
BigDecimal qty = MStorageReservation.getQtyAvailable(wh.get_ID(), product_id, 0, getTrxName()).setScale(12, BigDecimal.ROUND_HALF_UP);
assertEquals("Error on locator "+locatorValue, targetQty, qty);
//
return loc;
}
private void assertWarehouseQty(MWarehouse wh, BigDecimal targetQty)
{
BigDecimal qty = MStorageReservation.getQtyAvailable(wh.get_ID(), 0, product_id, 0, getTrxName());
BigDecimal qty = MStorageReservation.getQtyAvailable(wh.get_ID(), product_id, 0, getTrxName());
qty = qty.setScale(12, BigDecimal.ROUND_HALF_UP);
targetQty = targetQty.setScale(12, BigDecimal.ROUND_HALF_UP);
assertEquals(targetQty, qty);

View File

@ -185,9 +185,7 @@ public class InventoryTest extends AdempiereTestCase
ArrayList<Object> params = new ArrayList<Object>();
String sql = "SELECT"
+" COALESCE(SUM(QtyOnHand),0)"
+",COALESCE(SUM(QtyReserved),0)"
+",COALESCE(SUM(QtyOrdered),0)"
+" FROM M_Storage"
+" FROM M_StorageOnHand"
+" WHERE M_Locator_ID=? AND M_Product_ID=?";
params.add(locator.get_ID());
params.add(product.get_ID());
@ -199,8 +197,6 @@ public class InventoryTest extends AdempiereTestCase
PreparedStatement pstmt = null;
ResultSet rs = null;
BigDecimal qtyOnHand = Env.ZERO;
BigDecimal qtyOrdered = Env.ZERO;
BigDecimal qtyReserved = Env.ZERO;
try
{
pstmt = DB.prepareStatement(sql, trxName);
@ -209,8 +205,6 @@ public class InventoryTest extends AdempiereTestCase
if (rs.next())
{
qtyOnHand = rs.getBigDecimal(1);
qtyReserved = rs.getBigDecimal(2);
qtyOrdered = rs.getBigDecimal(3);
}
}
catch (SQLException e)
@ -225,8 +219,7 @@ public class InventoryTest extends AdempiereTestCase
//
//
assertEquals("QtyOnHand not match "+doc, doc.Qty, qtyOnHand);
assertEquals("QtyReserved not match "+doc, doc.QtyReserved, qtyReserved);
assertEquals("QtyOrdered not match "+doc, doc.QtyOrdered, qtyOrdered);
}
private void dumpStatus(MMDocument doc, String trxName)

View File

@ -519,7 +519,7 @@ public class VAttributeGrid extends CPanel
formatted = "";
if (m_M_Warehouse_ID != 0)
{
BigDecimal qty = MStorageReservation.getQtyAvailable(m_M_Warehouse_ID, 0, M_Product_ID, 0, null);
BigDecimal qty = MStorageReservation.getQtyAvailable(m_M_Warehouse_ID, M_Product_ID, 0, null);
if (qty == null)
formatted = "-";
else

View File

@ -512,7 +512,7 @@ public class InfoPAttribute extends CDialog
// finish Instance Attributes
if (sb.length() > 0)
{
sb.insert(0, " AND EXISTS (SELECT * FROM M_Storage s"
sb.insert(0, " AND EXISTS (SELECT * FROM M_StorageOnHand s"
+ " INNER JOIN M_AttributeSetInstance asi ON (s.M_AttributeSetInstance_ID=asi.M_AttributeSetInstance_ID) "
+ "WHERE s.M_Product_ID=p.M_Product_ID");
sb.append(")");

View File

@ -1246,7 +1246,7 @@ public class InfoProduct extends Info implements ActionListener, ChangeListener
sql = "SELECT SUM(s.QtyOnHand), SUM(s.QtyReserved), SUM(s.QtyOrdered),"
+ " productAttribute(s.M_AttributeSetInstance_ID), 0,";
sql += " w.Name, l.Value "
+ "FROM M_Storage s"
+ "FROM M_StorageOnHand s"
+ " INNER JOIN M_Locator l ON (s.M_Locator_ID=l.M_Locator_ID)"
+ " INNER JOIN M_Warehouse w ON (l.M_Warehouse_ID=w.M_Warehouse_ID) "
+ "WHERE M_Product_ID=?";

View File

@ -566,7 +566,7 @@ public class InvoiceHistory extends CDialog
sql = "SELECT SUM(s.QtyOnHand), SUM(s.QtyReserved), SUM(s.QtyOrdered),"
+ " productAttribute(s.M_AttributeSetInstance_ID), 0,";
sql += " w.Name, l.Value "
+ "FROM M_Storage s"
+ "FROM M_StorageOnHand s"
+ " INNER JOIN M_Locator l ON (s.M_Locator_ID=l.M_Locator_ID)"
+ " INNER JOIN M_Warehouse w ON (l.M_Warehouse_ID=w.M_Warehouse_ID) "
+ "WHERE M_Product_ID=?";

View File

@ -178,7 +178,7 @@ public class PAttributeInstance extends CDialog
new ColumnInfo(Msg.translate(Env.getCtx(), "ShelfLifeRemainingPct"), "CASE WHEN p.GuaranteeDays > 0 THEN TRUNC(((daysbetween(asi.GuaranteeDate, SYSDATE))/p.GuaranteeDays)*100) ELSE 0 END", Integer.class),
};
/** From Clause */
private static String s_sqlFrom = "M_Storage s"
private static String s_sqlFrom = "M_StorageOnHand s"
+ " INNER JOIN M_Locator l ON (s.M_Locator_ID=l.M_Locator_ID)"
+ " INNER JOIN M_Product p ON (s.M_Product_ID=p.M_Product_ID)"
+ " LEFT OUTER JOIN M_AttributeSetInstance asi ON (s.M_AttributeSetInstance_ID=asi.M_AttributeSetInstance_ID)";

View File

@ -456,7 +456,7 @@ public class VLocator extends JComponent
sql.append(" AND (IsDefault='Y' ") // Default Locator
.append("OR EXISTS (SELECT * FROM M_Product p ") // Product Locator
.append("WHERE p.M_Locator_ID=M_Locator.M_Locator_ID AND p.M_Product_ID=?)")
.append("OR EXISTS (SELECT * FROM M_Storage s ") // Storage Locator
.append("OR EXISTS (SELECT * FROM M_StorageOnHand s ") // Storage Locator
.append("WHERE s.M_Locator_ID=M_Locator.M_Locator_ID AND s.M_Product_ID=?))");
String finalSql = MRole.getDefault(Env.getCtx(), false).addAccessSQL(
sql.toString(), "M_Locator", MRole.SQL_NOTQUALIFIED, MRole.SQL_RO);

View File

@ -349,7 +349,7 @@ public class WLocatorEditor extends WEditor implements EventListener<Event>, Pro
sql.append(" AND (IsDefault='Y' ") // Default Locator
.append("OR EXISTS (SELECT * FROM M_Product p ") // Product Locator
.append("WHERE p.M_Locator_ID=M_Locator.M_Locator_ID AND p.M_Product_ID=?)")
.append("OR EXISTS (SELECT * FROM M_Storage s ") // Storage Locator
.append("OR EXISTS (SELECT * FROM M_StorageOnHand s ") // Storage Locator
.append("WHERE s.M_Locator_ID=M_Locator.M_Locator_ID AND s.M_Product_ID=?))");
String finalSql = MRole.getDefault(Env.getCtx(), false).addAccessSQL(

View File

@ -166,7 +166,7 @@ public class InfoPAttributeInstancePanel extends Window implements EventListener
new ColumnInfo(Msg.translate(Env.getCtx(), "ShelfLifeRemainingPct"), "CASE WHEN p.GuaranteeDays > 0 THEN TRUNC(((daysbetween(asi.GuaranteeDate, SYSDATE))/p.GuaranteeDays)*100) ELSE 0 END", Integer.class),
};
/** From Clause */
private static String s_sqlFrom = "M_Storage s"
private static String s_sqlFrom = "M_StorageOnHand s"
+ " INNER JOIN M_Locator l ON (s.M_Locator_ID=l.M_Locator_ID)"
+ " INNER JOIN M_Product p ON (s.M_Product_ID=p.M_Product_ID)"
+ " LEFT OUTER JOIN M_AttributeSetInstance asi ON (s.M_AttributeSetInstance_ID=asi.M_AttributeSetInstance_ID)";

View File

@ -614,7 +614,7 @@ public class InfoPAttributePanel extends Window implements EventListener
// finish Instance Attributes
if (sb.length() > 0)
{
sb.insert(0, " AND EXISTS (SELECT * FROM M_Storage s"
sb.insert(0, " AND EXISTS (SELECT * FROM M_StorageOnHand s"
+ " INNER JOIN M_AttributeSetInstance asi ON (s.M_AttributeSetInstance_ID=asi.M_AttributeSetInstance_ID) "
+ "WHERE s.M_Product_ID=p.M_Product_ID");
sb.append(")");

View File

@ -1453,7 +1453,7 @@ public class InfoProductPanel extends InfoPanel implements EventListener
sql = "SELECT SUM(s.QtyOnHand), SUM(s.QtyReserved), SUM(s.QtyOrdered),"
+ " productAttribute(s.M_AttributeSetInstance_ID), 0,";
sql += " w.Name, l.Value "
+ "FROM M_Storage s"
+ "FROM M_StorageOnHand s"
+ " INNER JOIN M_Locator l ON (s.M_Locator_ID=l.M_Locator_ID)"
+ " INNER JOIN M_Warehouse w ON (l.M_Warehouse_ID=w.M_Warehouse_ID) "
+ "WHERE M_Product_ID=?";

View File

@ -599,7 +599,7 @@ public class InvoiceHistory extends Window implements EventListener
sql = "SELECT SUM(s.QtyOnHand), SUM(s.QtyReserved), SUM(s.QtyOrdered),"
+ " productAttribute(s.M_AttributeSetInstance_ID), 0,";
sql += " w.Name, l.Value "
+ "FROM M_Storage s"
+ "FROM M_StorageOnHand s"
+ " INNER JOIN M_Locator l ON (s.M_Locator_ID=l.M_Locator_ID)"
+ " INNER JOIN M_Warehouse w ON (l.M_Warehouse_ID=w.M_Warehouse_ID) "
+ "WHERE M_Product_ID=?";

View File

@ -173,7 +173,7 @@ public class WPAttributeInstance extends Window implements EventListener
new ColumnInfo(Msg.translate(Env.getCtx(), "ShelfLifeRemainingPct"), "CASE WHEN p.GuaranteeDays > 0 THEN TRUNC(((daysbetween(asi.GuaranteeDate, SYSDATE))/p.GuaranteeDays)*100) ELSE 0 END", Integer.class),
};
/** From Clause */
private static String s_sqlFrom = "M_Storage s"
private static String s_sqlFrom = "M_StorageOnHand s"
+ " INNER JOIN M_Locator l ON (s.M_Locator_ID=l.M_Locator_ID)"
+ " INNER JOIN M_Product p ON (s.M_Product_ID=p.M_Product_ID)"
+ " LEFT OUTER JOIN M_AttributeSetInstance asi ON (s.M_AttributeSetInstance_ID=asi.M_AttributeSetInstance_ID)";