Salve galera…
Seguinte, eu tenho uma JTable q usa um AbstractTableModel, a ideia e ir adicionando items a ela q sao vindos de uma consulta. Por exemplo, eu adiciono um item a uma venda e dou um SELECT nos itens da venda e exibo na JTable. Problema, é na hora de remover um item e adicionar mais itens.
to tentando assim.
// Meu DAO
public void addItemVenda(ItensVenda iv){
/**
* Adicionar itens a venda
*/
try {
PreparedStatement stm = this.con.prepareStatement("INSERT INTO itensvenda (id_venda, id_produto, itens, valorun, qtd, totalitem) "
+ "VALUES (?,?,?,?,?,?)");
stm.setLong(1, iv.getVenda().getIdVenda());
stm.setLong(2, iv.getProduto().getId_produto());
stm.setInt(3, iv.getItens());
stm.setBigDecimal(4, iv.getValorUn());
stm.setDouble(5, iv.getQtd());
stm.setBigDecimal(6, iv.getTotal());
stm.executeUpdate();
stm.close();
} catch (SQLException ex) {
JOptionPane.showMessageDialog(null, "Não foi possivel vender este item: " + ex.getMessage(), "Erro de Item", JOptionPane.ERROR_MESSAGE);
}
}
public List<ItensVenda> consultaTodosItensVenda(Long idVenda){
/**
* Retorna todos os itens da venda
*/
List<ItensVenda> lista = new ArrayList<ItensVenda>();
try {
PreparedStatement stm = this.con.prepareStatement("SELECT * FROM itensvenda "
+ "INNER JOIN produtos ON (itensvenda.id_produto = produtos.id_produto) "
+ "INNER JOIN unidades ON (unidades.id_unidade = produtos.id_unidade) "
+ "WHERE id_venda = ?");
stm.setLong(1, idVenda);
ResultSet rs = stm.executeQuery();
while(rs.next()){
ItensVenda iv = new ItensVenda();
Unidades u = new Unidades();
u.setUnidade(rs.getString("unidade"));
Produtos p = new Produtos();
p.setDescricao(rs.getString("descricao"));
p.setUnidade(u);
iv.setProduto(p);
iv.setItens(rs.getInt("itens"));
iv.setValorUn(rs.getBigDecimal("valorun"));
iv.setQtd(rs.getDouble("qtd"));
iv.setTotal(rs.getBigDecimal("totalitem"));
lista.add(iv);
}
rs.close();
stm.close();
} catch (SQLException ex) {
JOptionPane.showMessageDialog(null, "Não foi possivel encontrar o item: " + ex.getLocalizedMessage(), "Erro de Conexão", JOptionPane.ERROR_MESSAGE);
}
return lista;
}
//meu AbstractTableModel
public class PDVTableModel extends AbstractTableModel{
private List<ItensVenda> itemVenda;
private String[] colunas = {"Itens","Descrição","Valor Un.(R$)","Qtd.","Un.","Total(R$)"};
public PDVTableModel(){
this.itemVenda = new ArrayList<ItensVenda>();
}
public PDVTableModel(List<ItensVenda> lista){
this();
this.itemVenda.addAll(lista);
}
@Override
public int getRowCount() {
return this.itemVenda.size();
}
@Override
public int getColumnCount() {
return this.colunas.length;
}
public String getColumnName(int column){
//nome da coluna
if(colunas[column] == "Itens"){
return "Itens";
}else if(colunas[column] == "Descrição"){
return "Descrição";
}else if(colunas[column] == "Un."){
return "Un.";
}else if(colunas[column] == "Valor Un.(R$)"){
return "Valor Un.(R$)";
}else if(colunas[column] == "Qtd."){
return "Qtd.";
}else if(colunas[column] == "Total(R$)"){
return "Total(R$)";
}
return new String();
}
public Class getColumnClass(int column){
//private String[] colunas = {"Itens","Descrição","Unidade","R$ Valor Un.","Qtd.","R$ Total"};
if(colunas[column] == "Itens"){
return int.class;
}else if(colunas[column] == "Descrição"){
return String.class;
}else if(colunas[column] == "Un."){
return String.class;
}else if(colunas[column] == "Valor Un.(R$)"){
return BigDecimal.class;
}else if(colunas[column] == "Qtd."){
return double.class;
}else if(colunas[column] == "Total(R$)"){
return BigDecimal.class;
}
return String.class;
}
@Override
public Object getValueAt(int rowIndex, int columnIndex) {
//private String[] colunas = {"Itens","Descrição","Valor Un.(R$)","Qtd.","Un.","Total(R$)"};
ItensVenda item = this.itemVenda.get(rowIndex);
switch(columnIndex){
case 0: return new FormataItens().retornaItensFormatado(item.getItens());
case 1: return item.getProduto().getDescricao();
case 2: return new FormataMonetarios().retornaValorFormatado(item.getValorUn());
case 3: return new FormataQuantidades().retornaValorFormatado(item.getQtd());
case 4: return item.getProduto().getUnidade();
case 5: return new FormataMonetarios().retornaValorFormatado(item.getTotal());
default: return new String();
}
}
public BigDecimal getTotalCompra(){
/**
* Retorna calculo total dos itens
*/
BigDecimal total = new BigDecimal(0);
for(ItensVenda iv : itemVenda){
if(iv.getTotal().compareTo(BigDecimal.ZERO) > 0){
total = total.add(iv.getTotal());
}
}
return total;
}
public void deleteAll(){
this.itemVenda.clear();
fireTableDataChanged();
}
public void removeRow(int row){
itemVenda.remove(row);
fireTableDataChanged();
}
public ItensVenda getItensVenda(int row){
/**
* Retorna os ItensVenda
*/
return itemVenda.get(row);
}
public void deleteItem(ItensVenda iv){
/**
* Remove item
*/
itemVenda.remove(iv);
fireTableDataChanged();
}
public void add(ItensVenda v){
/**
* Add mais itens
*/
itemVenda.add(v);
fireTableDataChanged();
}
}
// aqui meu Beans(POJO)
public class ItensVenda {
private Vendas venda;
private Produtos produto;
private Integer itens;
private BigDecimal valorUn;
private Double qtd;
private BigDecimal total;
public ItensVenda() {
}
public Integer getItens() {
return itens;
}
public void setItens(Integer itens) {
this.itens = itens;
}
public Produtos getProduto() {
return produto;
}
public void setProduto(Produtos produto) {
this.produto = produto;
}
public Double getQtd() {
return qtd;
}
public void setQtd(Double qtd) {
this.qtd = qtd;
}
public BigDecimal getTotal() {
return total;
}
public void setTotal(BigDecimal total) {
this.total = total;
}
public BigDecimal getValorUn() {
return valorUn;
}
public void setValorUn(BigDecimal valorUn) {
this.valorUn = valorUn;
}
public Vendas getVenda() {
return venda;
}
public void setVenda(Vendas venda) {
this.venda = venda;
}
}
// Aqui meu JDialog com JTable
public class IguanaPDV extends javax.swing.JDialog{
private PDVTableModel model;
public IguanaPDV(){
isVendaAberta();
}
public void isVendaAberta(){
/**
* Verifica se a ultima venda ficou em aberto, se estiver retorna o id da venda, os itens e os valores.
*/
List<ItensVenda> lista = new ItemsVendaDAO().getVendaAberta();
if(!lista.isEmpty()){
model = new PDVTableModel(lista);
tabelaItensVenda.setModel(model);
for(ItensVenda iv : lista){
qtdItens.setText(String.valueOf(tabelaItensVenda.getRowCount()));
idVenda.setText(new FormataCodigos().retornaCodigoFormatado(iv.getVenda().getIdVenda()));
}
totalVenda.setText(new FormataMonetarios().retornaValorFormatado(model.getTotalCompra()));
descProduto.setText("VENDA EM ABERTO");
defineGrid();
}
}
public void addItemVenda(){
/**
* Adiciono os itens a venda
*/
ItensVenda iv = new ItensVenda();
Vendas v = new Vendas();
v.setIdVenda(Long.parseLong(idVenda.getText()));
Produtos p = new Produtos();
p.setId_produto(Long.parseLong(idProduto.getText()));
iv.setItens(new ItemsVendaDAO().getUltimoItem(Long.parseLong(idVenda.getText())));
iv.setValorUn(new BigDecimal(valorUn.getText().replaceAll("\\.", "").replace(",", ".")));
iv.setQtd(Double.parseDouble(quantidade.getText().replaceAll("\\.", "").replace(",", ".")));
iv.setTotal(new BigDecimal(subTotal.getText().replaceAll("\\.", "").replace(",", ".")));
iv.setVenda(v);
iv.setProduto(p);
//estoque
Estoque e = new Estoque();
e.setProduto(p);
//
new ItemsVendaDAO().addItemVenda(iv);
fazSaidaEstoque(iv, e, iv.getQtd());
consultaItensVenda(); // retorna um List<ItensVenda>
}
public void consultaItensVenda(){
List<ItensVenda> lista = new ItemsVendaDAO().consultaTodosItensVenda(Long.parseLong(idVenda.getText()));
if(!lista.isEmpty()){
model = new PDVTableModel(lista);
tabelaItensVenda.setModel(model);
qtdItens.setText(String.valueOf(tabelaItensVenda.getRowCount()));
}
defineGrid();
limpaCampos();
}
Eu acho q o problema esta no metodo consultaItensVenda(), pq ele sempre reinstancia um PDVTableModel() q é o Abstract e assim se perde nos indices pois foi reinstanciado, criado um outro objeto na memoria.
Tentei retornar o POJO e ir adicionando ao model mas o retorno é null e da erro de NullPointerException.
Qual seria a melhor maneira de fazer isso ?
aqui uma imagem do PDV.
