
Buenas,
Es verdad lo que mencionás respecto de la matriz pedidos de proveedor. Dicha funcionalidad funcionalidad en principio fue diseñada para su uso en compras mayoristas, pero ventas minoristas, por lo que no es necesario su uso al vender.
Más allá de este detalle, debería ser posible realizar la ampliación que requerís codificando un poco. Respecto a dicha grilla en remitos, te paso un “adelanto” del nuevo release, como para que puedas hacerte una idea:
Clase APanel:
else if( col.equalsIgnoreCase( “OpenMatrix” ))
{
// Guardó el registro?
if (m_curTab.needSave( true,false )) {
ADialog.error(m_curWindowNo, this, “SaveErrorRowNotFound”);
return;
}
// Instanciar según corresponda
CDialog dialog = null;
if (X_C_OrderLine.Table_Name.equalsIgnoreCase(tableName))
dialog = new VOrderMatrixDetail(m_curWindowNo, (Frame)getRootPane().getParent() );
if (X_M_InOutLine.Table_Name.equalsIgnoreCase(tableName))
dialog = new VInOutMatrixDetail(m_curWindowNo, (Frame)getRootPane().getParent() );
// Si el botón esta ubicado en cualquier otra tabla, no hacer nada
if (dialog == null)
return;
// Abrir el dialogo
AEnv.showCenterScreen( dialog );
m_curTab.dataRefreshAll();
m_curTab.processFieldChange(m_curTab.getField(“M_AttributeSetInstance_ID”));
return;
}
Nueva clase VInOutMatrixDetail:
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Frame;
import java.awt.GridLayout;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.math.BigDecimal;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.Vector;
import java.util.logging.Level;
import javax.swing.AbstractCellEditor;
import javax.swing.BorderFactory;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.border.Border;
import javax.swing.event.CellEditorListener;
import javax.swing.event.ChangeEvent;
import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableCellEditor;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableModel;
import org.compiere.plaf.CompierePLAF;
import org.compiere.swing.CButton;
import org.compiere.swing.CDialog;
import org.compiere.swing.CPanel;
import org.openXpertya.apps.search.InfoProductAttribute;
import org.openXpertya.model.MAttributeInstance;
import org.openXpertya.model.MAttributeSetInstance;
import org.openXpertya.model.MInOut;
import org.openXpertya.model.MInOutLine;
import org.openXpertya.util.CLogger;
import org.openXpertya.util.DB;
import org.openXpertya.util.Env;
import org.openXpertya.util.Msg;
public class VInOutMatrixDetail extends CDialog {
static public CLogger s_log = CLogger.getCLogger(VInOutMatrixDetail.class);
protected int m_srcWindowNo;
protected MatrixTableModel tm;
protected JScrollPane scrollPane;
protected JTable table;
protected CButton btnOk;
protected CButton btnCancel;
protected CButton btnReload;
//
protected int M_InOut_ID ;
protected int M_InOutLine_ID ;
protected int M_Product_ID;
protected int M_Warehouse_ID;
public VInOutMatrixDetail( int srcWindowNo, Frame owner ) {
super(owner, “Matriz de remitos”, true);
m_srcWindowNo = srcWindowNo;
M_InOut_ID = Env.getContextAsInt(Env.getCtx(), srcWindowNo, “M_InOut_ID”);
M_InOutLine_ID = Env.getContextAsInt(Env.getCtx(), srcWindowNo, “M_InOutLine_ID”);
M_Product_ID = Env.getContextAsInt(Env.getCtx(), srcWindowNo, “M_Product_ID”);
M_Warehouse_ID = Env.getContextAsInt(Env.getCtx(), srcWindowNo, “M_Warehouse_ID”);
jbInit();
refreshTableData();
setDefaultCloseOperation(CDialog.DISPOSE_ON_CLOSE);
Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
d.width = (int)(d.width * 0.75);
d.height = (int)(d.height * 0.5);
setPreferredSize(d);
}
private void jbInit() {
setTitle(DB.getSQLValueString(null, ” SELECT name FROM M_Product WHERE M_Product_ID = ? “, M_Product_ID));
setLayout(new BorderLayout());
tm = new MatrixTableModel();
table = new JTable(tm);
scrollPane = new JScrollPane(table);
btnCancel = new CButton(Msg.getMsg(Env.getCtx(), “Cancel”));
btnOk = new CButton(Msg.getMsg(Env.getCtx(), “OK”));
btnReload = new CButton(Msg.getMsg(Env.getCtx(), “Refresh”));
MatrixCellEditor mce = new MatrixCellEditor();
table.setDefaultRenderer(MatrixItem.class, new MatrixCellRenderer());
table.setDefaultEditor(MatrixItem.class, mce);
table.putClientProperty(“terminateEditOnFocusLost”, Boolean.TRUE);
table.addFocusListener(new FocusListener() {
public void focusGained(FocusEvent e) {
btnOk.setEnabled(!table.isEditing());
}
public void focusLost(FocusEvent e) {
btnOk.setEnabled(!table.isEditing());
}
});
mce.addCellEditorListener(new CellEditorListener() {
public void editingCanceled(ChangeEvent e) {
// btnOk.setEnabled(true);
}
public void editingStopped(ChangeEvent e) {
// btnOk.setEnabled(true);
}
});
DefaultTableModel tm = (DefaultTableModel)table.getModel();
tm.addTableModelListener(new TableModelListener(){
public void tableChanged(TableModelEvent e) {
JTable t = table;
TableModel tm = t.getModel();
int rows = t.getRowCount();
int cols = t.getColumnCount();
if (rows < 1 || cols < 2)
return;
Object value = tm.getValueAt(0, 1);
Component r = t.getCellRenderer(0, 1).getTableCellRendererComponent(t, value, false, false, 0, 1);
// Actualiza el alto de las filas de la tabla en base a los Items
t.setRowHeight(r.getMinimumSize().height + t.getRowMargin());
}
});
table.revalidate();
GridLayout gr = new GridLayout(1,3);
CPanel panel1 = new CPanel(gr);
gr.setHgap(5);
gr.setVgap(5);
btnOk.setIcon(org.openXpertya.images.ImageFactory.getImageIcon("Ok24.gif"));
btnCancel.setIcon(org.openXpertya.images.ImageFactory.getImageIcon("Cancel24.gif"));
btnReload.setIcon(org.openXpertya.images.ImageFactory.getImageIcon("Refresh24.gif"));
btnOk.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
onBtnOk();
}
});
btnCancel.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
onBtnCancel();
}
});
btnReload.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
refreshTableData();
}
});
panel1.setBorder(BorderFactory.createEmptyBorder(5,5,5,5));
panel1.add(btnCancel);
panel1.add(btnReload);
panel1.add(btnOk);
add(scrollPane, BorderLayout.CENTER);
add(panel1, BorderLayout.SOUTH);
}
private void updateItemsWithCurrentLines(Vector
List
lines.add(M_InOutLine_ID);
// Dada la lista de lineas de la orden actual, actualiza la matriz con los
// valores actualmente ingresados.
for (Integer iol : lines) {
// Busco en la linea de orden la combinacion de valores de la instancia del conjunto de atributos
MInOutLine line = new MInOutLine(Env.getCtx(), iol, getTrxName());
Set
// Busco en la matriz el elemento que contenga la misma combinacion de valores
MatrixItem item = null;
for (int row = 0; item == null && row < items.size(); row++) {
for (int column = 0; item == null && column < items.get(row).size(); column++) {
MatrixItem x = (MatrixItem)items.get(row).get(column);
if (x.getValuesIds().equals(values))
item = x;
}
}
// Si lo encuentro, actualizo la cantidad.
if ( item != null ) {
item.setEnteredQty(item.getEnteredQty().add(line.getQtyEntered()));
// Para no crear varias instancias con la misma combinacion de valores, reuso las ya existentes.
if (item.getMasi() < 1)
item.setMasi(line.getM_AttributeSetInstance_ID());
}
}
}
protected void refreshTableData() {
DefaultTableModel tm = (DefaultTableModel)table.getModel();
Map
tm.setRowCount(0);
tm.setColumnCount(0);
if (hm.size() < 2)
return;
Iterator
if (!it.hasNext())
return;
// El atributo a mostrar en el encabezado
int Attribute_ID = it.next();
// La lista de nombres de encabezados de columnas
Vector
// La lista de nombres de encabezados de filas
Vector
String primerOrden = hm.get(Attribute_ID);
cols.insertElementAt(“/” + primerOrden, 0);
tm.setColumnIdentifiers(cols);
Vector
// Actualizo los elementos de la matriz con los valores ingresados en las lineas
updateItemsWithCurrentLines(rows, hm);
//
int i = 0;
for (Vector
Saludos,
Federico