to save value from gridField, idempiere call po.set_ValueNoCheck (columnName, value) to set data.
it make logic at X_Class.setMethod() or at every override model class bypass.
it will make many potential issue.
below is a test case i detect.
1. active Campaign or project dimension (but don't create any value for it).
2. make a sale order, let Campaign is null, complete it
=> Campaign of sale order line also null (but field campaign in sale order line not display)
3. make a shipment for this order
4. in shipment line select a order line
by logic at CalloutInOut.orderLine, temp value of campaign in shipment line is 0
5. when save this shipment line
at line 2182 class gridTable call po.set_ValueNoCheck (columnName, value)
so logic convert 0 => null in X_M_InOutLine.setC_Campaign_ID is bypass
=> can't save shipment line
i think at po.set_ValueNoCheck (columnName, value)
must use reflection to find correct setter method to call. in case can't find out. call po.set_ValueNoCheck (columnName, value)