Alguém pode me ajudar, estou com dúvida em minha Jtable, tenho uma tabela com o código do serviço, serviço, quantidade, valor e total. Minha dúvida é o seguinte, quando eu adicionar na tabela um ITEM 1 por exemplo, os dados deste serviço serão adicionados na tabela, até então eu consegui fazer, mas caso eu adicione novamente este mesmo ITEM 1 na tabela eu queria incrementar a qtde que o usuário fosse digitar e não criar uma nova linha repetindo, ITEM 1 e ITEM 1. segue abaixo o meu código para adicionar na tabela.
private void insereItem()
{
if (txtQtde.getValue().equals(0))
{
JOptionPane.showMessageDialog(this, "Informe uma quantidade para adicionar o serviço na tabela", "Atenção", JOptionPane.ERROR_MESSAGE);
txtQtde.setBorder(BorderFactory.createLineBorder(Color.RED));
} else
{
try
{
txtQtde.setBorder(BorderFactory.createLineBorder(Color.GRAY));
DefaultTableModel modelo = (DefaultTableModel) tbOs.getModel();
String valUni = txtValor.getText().replace("R$", "").replace(" ", "").replace(".", "").replace(",", ".");
double vtt = Double.parseDouble(valUni) * Integer.parseInt(txtQtde.getValue().toString());
String total = String.valueOf(vtt);
if (total.substring(total.lastIndexOf(".") + 1).length() < 2)
{
total = total + "0";
}
String unitario = txtValor.getText().replace("R$", "").replace(" ", "").replace(".", "").replace(",", ".");
if (unitario.substring(unitario.lastIndexOf(".") + 1).length() < 2)
{
unitario = unitario + "0";
}
Object[] linha =
{
txtCodigoServico.getText(), cbbServico.getSelectedItem(), txtQtde.getValue().toString(), unitario, total
};
modelo.addRow(linha);
double valorSubTotal = vtt + Double.parseDouble(txtSubTotal.getText().replace("R$", "").replace(" ", "").replace(".", "").replace(",", "."));
setValorSubTotal(valorSubTotal);
tbOs.setModel(modelo);
atualizaSoma();
} catch (Exception e)
{
}
}
}
Acho que você terá que verificar se o Item que está sendo adicionado já existe na Tabela, e apenas incrementar a qtde
dele se já existir.
Sim, mas a forma de como farei isto que estou em dúvida.
O que você acha de percorrer todas as linhas da tabela em um loop, e, dentro do loop verificar se a linha da iteração atual possui o Item que está sendo adicionado. Se possuir, você incrementa a qtde desse Item e dá um return;
pra sair do método. Caso o item ainda não exista na tabela, o loop irá percorrer todas as linhas e a execução irá sair do loop, após sair do loop você adiciona o novo Item.
Você pode me ajudar a fazer isto? Estou meio que perdido, obrigado.
Olha, eu diria que você tem vários problemas na qualidade desse código, isso pode complicar bastante sua vida quando o sistema crescer e conforme ele crescer. Talvez você deva criar uma pergunta pedindo para analisarem seu código e dizerem quais são os “débitos técnicos” nele, mas enfim…
Vou adaptar seu código como está:
private void insereItem()
{
if (txtQtde.getValue().equals(0))
{
JOptionPane.showMessageDialog(this, "Informe uma quantidade para adicionar o serviço na tabela", "Atenção", JOptionPane.ERROR_MESSAGE);
txtQtde.setBorder(BorderFactory.createLineBorder(Color.RED));
} else
{
if (!atualizarQtdDeItemDaTabela()) {inserirItemNaTabela();} //Adicionei esta linha
try
{
//O código abaixo será executado independente do qtd do Item ter sido incrementado ou do Item ter sido adicionado
double valorSubTotal = vtt + Double.parseDouble(txtSubTotal.getText().replace("R$", "").replace(" ", "").replace(".", "").replace(",", "."));
setValorSubTotal(valorSubTotal);
tbOs.setModel(modelo);
atualizaSoma();
} catch (Exception e)
{
}
}
}
/**retorna true se e somente se o Item já existir na tabela e não for necessário adicioná-lo novamente, false caso ele não esteja na tabela. Este método incrementa a qtd do Item se ele já estiver na tabela.*/
private boolean atualizarQtdDeItemDaTabela()
{
//Percorra as linhas da tabela aqui dentro, buscando pelo item que se está tentando adicionar
//Ao encontrar, incremente a qtd dele e então retorne true
//Se não encontrar, apenas retorn false
}
private void inserirItemNaTabela() /*Adicione lançamento de Exception se precisar*/ {
txtQtde.setBorder(BorderFactory.createLineBorder(Color.GRAY));
DefaultTableModel modelo = (DefaultTableModel) tbOs.getModel();
String valUni = txtValor.getText().replace("R$", "").replace(" ", "").replace(".", "").replace(",", ".");
double vtt = Double.parseDouble(valUni) * Integer.parseInt(txtQtde.getValue().toString());
String total = String.valueOf(vtt);
if (total.substring(total.lastIndexOf(".") + 1).length() < 2)
{
total = total + "0";
}
String unitario = txtValor.getText().replace("R$", "").replace(" ", "").replace(".", "").replace(",", ".");
if (unitario.substring(unitario.lastIndexOf(".") + 1).length() < 2)
{
unitario = unitario + "0";
}
Object[] linha =
{
txtCodigoServico.getText(), cbbServico.getSelectedItem(), txtQtde.getValue().toString(), unitario, total
};
modelo.addRow(linha);
}