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());
}
}