He encontrado un posible bug en el modulo de Producción (Un Producto) al utilizar productos con atributos instanciados

74 views
Skip to first unread message

Miguel A. Orea

unread,
Feb 6, 2017, 7:34:23 PM2/6/17
to iDempiere-es
Hola todo mundo

Al estar probando la versión de 4.1 de iDempiere me he topado con un detalle, al generar una producción de un producto.

Menú > Manufactura > Producción (Un Producto)

Genero una orden de producción y Genero las lineas de producción con el botón "Create/Update Production Lines"

Luego me cambio de tab a "Production Line"

y al producto final le agrego el atributo de lote

al salvar me arroja el error de base de datos que la columna M_ProductionLine_ID no puede ser Null en la tabla M_QualityTestResult

Encontré en el modelo que no existe la columna y por ende no se esta enviando al SQL

y el problema se presenta a ejecutar un metodo beforeSave() dentro del modelo de la linea de producción, un IF que se vuelve verdadero al ser producto final y contener instancias de atributo

if ( isEndProduct() && getM_AttributeSetInstance_ID() != 0 )
{
String where = "M_QualityTest_ID IN (SELECT M_QualityTest_ID " +
"FROM M_Product_QualityTest WHERE M_Product_ID=?) " +
"AND M_QualityTest_ID NOT IN (SELECT M_QualityTest_ID " +
"FROM M_QualityTestResult WHERE M_AttributeSetInstance_ID=?)";

List<MQualityTest> tests = new Query(getCtx(), MQualityTest.Table_Name, where, get_TrxName())
.setOnlyActiveRecords(true).setParameters(getM_Product_ID(), getM_AttributeSetInstance_ID()).list();
// create quality control results
for (MQualityTest test : tests)
{
test.createResult(getM_AttributeSetInstance_ID(), getM_ProductionLine_ID());
}
}

corregí este problema de la siguiente manera y no se si estoy en lo correcto y no se donde reportarlo para ver si es un bug.

Les anexo los Paches de los archivos que modifique ( I_M_QualityTestResult.java, X_M_QualityTestResult.java, MQualityTest.java, MProductionLine.java )

Corregí el modelo de la tabla M_QualityTestResult (Interface y Implementación)

Interface :

diff --git a/org.adempiere.base/src/org/compiere/model/I_M_QualityTestResult.java b/org.adempiere.base/src/org/compiere/model/I_M_QualityTestResult.java
--- a/org.adempiere.base/src/org/compiere/model/I_M_QualityTestResult.java
+++ b/org.adempiere.base/src/org/compiere/model/I_M_QualityTestResult.java
@@ -148,6 +148,15 @@
 
  public org.compiere.model.I_M_QualityTest getM_QualityTest() throws RuntimeException;
 
+    /** Column name M_QualityTest_ID */
+    public static final String COLUMNNAME_M_ProductionLine_ID = "M_ProductionLine_ID";
+
+ /** Set Quality Test  */
+ public void setM_ProductionLine_ID (int M_ProductionLine_ID);
+
+ /** Get Quality Test  */
+ public int getM_ProductionLine_ID();
+
     /** Column name M_QualityTestResult_ID */
     public static final String COLUMNNAME_M_QualityTestResult_ID = "M_QualityTestResult_ID";

 
Implementación de la Interface:

diff --git a/org.adempiere.base/src/org/compiere/model/X_M_QualityTestResult.java b/org.adempiere.base/src/org/compiere/model/X_M_QualityTestResult.java
--- a/org.adempiere.base/src/org/compiere/model/X_M_QualityTestResult.java
+++ b/org.adempiere.base/src/org/compiere/model/X_M_QualityTestResult.java
@@ -252,4 +252,20 @@
  {
  return (String)get_Value(COLUMNNAME_Result);
  }
+
+ @Override
+ public void setM_ProductionLine_ID(int M_ProductionLine_ID) {
+ if (M_ProductionLine_ID < 0) 
+ set_ValueNoCheck (COLUMNNAME_M_ProductionLine_ID, null);
+ else 
+ set_ValueNoCheck (COLUMNNAME_M_ProductionLine_ID, Integer.valueOf(M_ProductionLine_ID));
+ }
+
+ @Override
+ public int getM_ProductionLine_ID() {
+ Integer ii = (Integer)get_Value(COLUMNNAME_M_ProductionLine_ID);
+ if (ii == null)
+ return 0;
+ return ii.intValue();
+ }
 }
\ No newline at end of file


Agregue el campo a la estructura que guarda el dato y agrege un parametro para enviar el ID faltante

diff --git a/org.adempiere.base/src/org/compiere/model/MQualityTest.java b/org.adempiere.base/src/org/compiere/model/MQualityTest.java
--- a/org.adempiere.base/src/org/compiere/model/MQualityTest.java
+++ b/org.adempiere.base/src/org/compiere/model/MQualityTest.java
@@ -18,10 +18,11 @@
  super(ctx, rs, trxName);
  }
 
- public MQualityTestResult createResult(int m_attributesetinstance_id) 
+ public MQualityTestResult createResult(int m_attributesetinstance_id, int m_productionline_id) 
  {
  MQualityTestResult result = new MQualityTestResult(getCtx(),0, get_TrxName());
  result.setClientOrg(this);
+ result.setM_ProductionLine_ID(m_productionline_id);
  result.setM_QualityTest_ID(getM_QualityTest_ID());
  result.setM_AttributeSetInstance_ID(m_attributesetinstance_id);
  result.setProcessed(false);


Corregí el llamado de la funcion agregando el parámetro requerido

diff --git a/org.adempiere.base/src/org/compiere/model/MProductionLine.java b/org.adempiere.base/src/org/compiere/model/MProductionLine.java
--- a/org.adempiere.base/src/org/compiere/model/MProductionLine.java
+++ b/org.adempiere.base/src/org/compiere/model/MProductionLine.java
@@ -310,7 +310,7 @@
  // create quality control results
  for (MQualityTest test : tests)
  {
- test.createResult(getM_AttributeSetInstance_ID());
+ test.createResult(getM_AttributeSetInstance_ID(), getM_ProductionLine_ID());
  }
  }
 

Carlos Antonio Ruiz Gomez

unread,
Feb 6, 2017, 11:19:54 PM2/6/17
to idempi...@googlegroups.com
Miguel, hice la prueba en demo configurando un Quality Test para Patio Chair y produciendo uno.

En demo no me sale ningún error.  Es posible que alguien en tu implementación haya añadido por error la columna M_QualityTestResult.M_ProductionLine_ID?

Saludos,

Carlos Ruiz



El 06/02/17 a las 16:34, Miguel A. Orea escribió:

Miguel A. Orea

unread,
Feb 6, 2017, 11:37:52 PM2/6/17
to iDempiere-es
Muchas gracias Carlos, por lo que entiendo entonces la liga de Quality Test Result esta ligada entonces a las instancias de atributos y no a la linea de producción, 

Por que efectivamente agregaron ese campo para que funcionara el tab como dependencia de la linea de producción y no como dependiente de la instancia de atributos

De cualquier forma muchas gracias Carlos

Saludos desde Mexico
Reply all
Reply to author
Forward
0 new messages