Buscar
Social
Ofertas laborales ES

Foro sobre Java SE > Evitar duplicados en DB con JFormattedTextField

Buenas

Me podrian ayudar con este problemita. Estoy creando un pequeño programa de registrar personas. Necesito evitar los duplicados. Empece con JFormattedTextField ya que me parecio mucho mas facil en cuanto al formato y los limite de datos para ingresar, y es mucho mas completo que JTextfield. Les paso un poco de lo que voy haciendo:

package edu.cent35.Final.Persona;

import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.HeadlessException;
import java.awt.Label;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.sql.SQLException;
import java.text.NumberFormat;
import java.text.ParseException;
import java.util.Locale;

import javax.swing.JButton;
import javax.swing.JFormattedTextField;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.JToolTip;
import javax.swing.border.EtchedBorder;
import javax.swing.border.TitledBorder;
import javax.swing.text.MaskFormatter;
import javax.swing.text.NumberFormatter;

import net.miginfocom.swing.MigLayout;

public class PersonaUI extends JPanel {
private static final long serialVersionUID = 1L;
// valor de serie por
// defecto
/* Instancia cuadro para cada uno de los campos */
// private JFormattedTextField txtCuil = new JFormattedTextField();
MaskFormatter mskCuil = null;
{
try {
mskCuil = new MaskFormatter("##-########-#");


} catch (ParseException e) {

}
mskCuil.setPlaceholderCharacter('_');
// mskCuil.setCommitsOnValidEdit(true);
mskCuil.setValidCharacters("1234567890");//Caracteres aceptables
}
private JFormattedTextField txtCuil = new JFormattedTextField(mskCuil);
private JTextField txtPrimerNombre = new JTextField(30);
private JTextField txtSegundoNombre = new JTextField(30);
private JTextField txtApellido = new JTextField(30);
private JTextField txtEmail = new JTextField(30);
private JTextField txtTelefono = new JTextField(8);

/*Instancia botones*/
private JButton btnNuevo = new JButton("Nuevo");
private JButton btnActualizar = new JButton("Actualizar");
private JButton btnBorrar = new JButton("Borrar");
private JButton btnPrimero = new JButton("Primero");
private JButton btnAnterior = new JButton("Anterior");
private JButton btnProximo = new JButton("Proximo");
private JButton btnUltimo = new JButton("Ultimo");

private PersonaBean bean =new PersonaBean();

public PersonaUI() {
// TODO Auto-generated constructor stub

// Tipo y la separacion del borde
setLayout(new BorderLayout(5, 5));
// Titulo del recuadro
setBorder(new TitledBorder(new EtchedBorder(), "Detalles de Persona"));
// Agrega el panel de campos
add(iniCampos(), BorderLayout.NORTH);
// Agrega el panel de botones
add(iniBotones(), BorderLayout.CENTER);
setDatos(bean.mueveAlPrimero());

/**
* BorderLayout decide donde vamos a ubicar los botones y campos
*/
}


private JPanel iniBotones() {
JPanel panel = new JPanel();
/**
* flowLayou alinea los botones automaticamente adaptandose a la ventana
* para que se vea todo lo que tiene adentro Layout decide como se
* reparten los botones y campos
*/
panel.setLayout(new FlowLayout(FlowLayout.CENTER, 3, 3));
panel.add(btnNuevo);
btnNuevo.addActionListener(new ManejadorBotones());
panel.add(btnActualizar);
btnActualizar.addActionListener(new ManejadorBotones());
panel.add(btnBorrar);
btnBorrar.addActionListener(new ManejadorBotones());
panel.add(btnPrimero);
btnPrimero.addActionListener(new ManejadorBotones());
panel.add(btnAnterior);
btnAnterior.addActionListener(new ManejadorBotones());
panel.add(btnProximo);
btnProximo.addActionListener(new ManejadorBotones());
panel.add(btnUltimo);
btnUltimo.addActionListener(new ManejadorBotones());
return panel;

}
/**
*
* @return Contiene los campos
*/


private JPanel iniCampos() {
/* Asigna el diseño de nuestra ventana. Miglayout */
JPanel panel = new JPanel();
panel.setLayout(new MigLayout());

panel.add(new Label("Cuil"), "align label");
panel.add(txtCuil, "wrap");
txtCuil.setEnabled(false);// Solo lectura
panel.add(new Label("PrimerNombre"), "align label");
panel.add(txtPrimerNombre, "wrap");
panel.add(new Label("SegundoNombre"), "align label");
panel.add(txtSegundoNombre, "wrap");
panel.add(new Label("apellido"), "align label");
panel.add(txtApellido, "wrap");
panel.add(new Label("Email"), "align label");
panel.add(txtEmail, "wrap");
panel.add(new Label("Telefono"), "align label");
panel.add(txtTelefono, "wrap");

return panel;
}

private void setDatos(Persona persona) {
txtCuil.setText(persona.getCuil());
txtPrimerNombre.setText(persona.getPrimerNombre());
txtSegundoNombre.setText(persona.getSegundoNombre());
txtApellido.setText(persona.getApellido());
txtEmail.setText(persona.getEmail());
txtTelefono.setText(persona.getTelefono());

}

private Persona getDatos() {
Persona persona = new Persona();
if (isDatosVacios()) {
JOptionPane.showMessageDialog(null, "No se puede guardar registros vacio, intente nuevamente.", "Atencion",
JOptionPane.WARNING_MESSAGE);

}

persona.setCuil(txtCuil.getText());
persona.setPrimerNombre(txtPrimerNombre.getText());
persona.setSegundoNombre(txtSegundoNombre.getText());
persona.setApellido(txtApellido.getText());
persona.setEmail(txtEmail.getText());
persona.setTelefono(txtTelefono.getText());
return persona;
}

private boolean isDatosVacios() {
return (txtCuil.getText().trim().isEmpty() && txtPrimerNombre.getText().trim().isEmpty()
&& txtSegundoNombre.getText().trim().isEmpty() && txtApellido.getText().trim().isEmpty()
&& txtEmail.getText().trim().isEmpty() && txtTelefono.getText().trim().isEmpty());
}

private class ManejadorBotones implements ActionListener {
public void actionPerformed(ActionEvent e) {
Persona persona = getDatos();
switch (e.getActionCommand()) {
case "Guardar":
if (isDatosVacios()) {

JOptionPane.showMessageDialog(null, "No se puede guardar registros vacios, intente nuevamente",
"Atencion", JOptionPane.WARNING_MESSAGE);
return;
}


/*
* evito clave duplicada
*/
try {
if (bean.evitoDuplicados(persona) == false) {
JOptionPane.showMessageDialog(null, "El Código ingresado ya existe", "Atencion",
JOptionPane.WARNING_MESSAGE);

} else {
if (bean.crear(persona) != null)
JOptionPane.showMessageDialog(null, "Se guardo correctamente", "Atencion",
JOptionPane.WARNING_MESSAGE);
txtCuil.setEnabled(false);
btnActualizar.setEnabled(true);
btnBorrar.setEnabled(true);
btnNuevo.setText("Nuevo");

}
} catch (HeadlessException | SQLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}

break;

case "Nuevo":
txtCuil.setEnabled(true);
btnActualizar.setEnabled(false);
btnBorrar.setEnabled(false);
txtCuil.requestFocus();
persona.setCuil(null);
persona.setPrimerNombre("");
persona.setSegundoNombre("");
persona.setApellido("");
persona.setEmail("");
persona.setTelefono("");
setDatos(persona);
btnNuevo.setText("Guardar");
if (isDatosVacios()) {
JOptionPane.showMessageDialog(null, "No se puede guardar un registro vacio.", "Atencion",
JOptionPane.WARNING_MESSAGE);
return;
}

break;

case "Actualizar":
if (isDatosVacios()) {
JOptionPane.showMessageDialog(null, "No se puede actualizar un registro vacio.", "Atencion",
JOptionPane.WARNING_MESSAGE);
return;

}
if (bean.actualizar(persona) != null) {
JOptionPane.showMessageDialog(null, "La sede: " + String.valueOf(
persona.getApellido() + " - (" + persona.getCuil() + ") se ha actualizado correctamente."));

}

break;

case "Borrar":
try {
if (bean.rowSet.getRow() == 0) {
JOptionPane.showMessageDialog(null, "No existen registros,cargar por lo menos uno.", "Atencion",
JOptionPane.WARNING_MESSAGE);
}

} catch (SQLException e2) {
e2.printStackTrace();
}

if (isDatosVacios()) {
JOptionPane.showMessageDialog(null, "No se puede eliminar un registro vacio.", "Atencion",
JOptionPane.WARNING_MESSAGE);
return;
}

try {
/**
* Me aseguro que tenga datos la tabla antes de borrar
*/
if ((isDatosVacios() == false) && (bean.rowSet.getRow() != 0)) {
int dialogButton = JOptionPane.showConfirmDialog(null, "Estas seguro?", "Atencion",
JOptionPane.YES_NO_OPTION);
if (dialogButton == JOptionPane.YES_OPTION) {
persona = bean.getDatosRegistros();
bean.borrar();
JOptionPane.showMessageDialog(null, "El registro Persona: "
+ String.valueOf(persona.getApellido() + " Se eliminó correctamente"));

} else {
JOptionPane.showMessageDialog(null, "El registro no ha sido borrado");
}

}

} catch (HeadlessException e2) {
e2.printStackTrace();

} catch (SQLException e2) {
e2.printStackTrace();
}
// Falta agregar metodo ControlBorro
break;
case "Primero":
txtCuil.setEnabled(false);
btnActualizar.setEnabled(true);
btnBorrar.setEnabled(true);
btnNuevo.setText("Nuevo");
setDatos(bean.mueveAlAnterior());
JOptionPane.showMessageDialog(null, "Estas en el primer registro", "Persona", JOptionPane.WARNING_MESSAGE);
// Falta agregar controlBorro
break;
case "Anterior":
txtCuil.setEnabled(false);
btnActualizar.setEnabled(true);
btnBorrar.setEnabled(true);
btnNuevo.setText("Nuevo");
setDatos(bean.mueveAlAnterior());
// Falta agregar controlBorro
break;
case "Proximo":
txtCuil.setEnabled(false);
btnActualizar.setEnabled(true);
btnBorrar.setEnabled(true);
btnNuevo.setText("Nuevo");
setDatos(bean.mueveAlProximo());
// Falta agregar controlBorro
break;
case "Ultimo":
txtCuil.setEnabled(false);
btnActualizar.setEnabled(true);
btnBorrar.setEnabled(true);
btnNuevo.setText("Nuevo");
setDatos(bean.mueveAlUltimo());
JOptionPane.showMessageDialog(null, "Estas en el ultimo registro", "Persona",
JOptionPane.WARNING_MESSAGE);
break;
default: JOptionPane.showMessageDialog(null, "Comando Invalido", "Persona",
JOptionPane.WARNING_MESSAGE);
}



}
}


}

///////*************** esta clase hago la conexion a la DB*****************/////////////////

static final String JDBC_DRIVER = "org.firebirdsql.jdbc.FBDriver";
static final String DB_URL = "jdbc:firebirdsql:localhost/3050:I:\\Final.fdb";
static final String DB_USER = "SYSDBA";
static final String DB_PASS = "masterkey";


JdbcRowSet rowSet = null;
private Connection con = null;

public PersonaBean() {
try {
Class.forName(JDBC_DRIVER);
rowSet = new JdbcRowSetImpl();
rowSet.setUrl(DB_URL);
rowSet.setUsername(DB_USER);
rowSet.setPassword(DB_PASS);
rowSet.setCommand("SELECT * FROM Persona");
rowSet.execute();
// Arma el connection
con = DriverManager.getConnection(DB_URL, DB_USER, DB_PASS);
} catch (SQLException | ClassNotFoundException ex) {
ex.printStackTrace();
}
}

febrero 8, 2017 | Registered Commenterjse

Hola, sinceramente no he leido el código, porque con el formato que le da este foro es una m... Pero bno, para evitar duplicados en la base de datos, básicamente siempre es el mismo proceso:
Antes de insertar, hacer una select para comprobar que el registro no existe haciendo uso de un campo unico, normalmente si estas almacenando personas, existen campos que identifican a la persona como por ejemplo el DNI(Doc. Nacional Identidad españa,...), Cedula de identidad(Otros paises).

Otro campo que suele ser unico, es el email, no existen 2 emails iguales, por tanto poria usarse para saber si una persona esta registrada.

Asi que, sabiendo esto, antes de hacer el insert, Te pongo un pequeño pseudocodigo:

String consulta="select * from personas where email = '" +emailQueIntentasInsertar +" '";

//Ejecutas la consulta y toda la pesca

//Si la consulta devuelve datos
//Entonces la persona existe y error en la inserccion
//Si no devuelve datos
//Entonces la persona aun no existe en BD y se puede insertar

Cualquier duda por aqui andamos. Un saludo

febrero 8, 2017 | Registered Commenterloderain

Muchas gracias por tu respuesta.

Hice lo que me dijiste.
public static boolean evitoDuplicados(Persona persona) throws SQLException {

Connection con2 = DriverManager.getConnection(DB_URL, DB_USER, DB_PASS);
ResultSet rs = null;

String sql ="select cuil,count(*) from Persona where cuil="+persona.getCuil()+"group by cuil";
PreparedStatement pts = con2.prepareStatement(sql);
rs = pts.executeQuery();
rs.next(); // el errror se queda ahi ---------------

if (rs.getRow() == 0) {
return true;

} else {

return false;
}

}

Lo he echo con anteriormente con un codigo de persona(int). Y me resulto fenomenal. Pero me da error con el CUIL de persona. que lo hice string. y el error es el siguiente

org.firebirdsql.jdbc.FBSQLException: GDS Exception. 335544334. conversion error from string "22-22222222-1"
at org.firebirdsql.jdbc.FBStatementFetcher.fetch(FBStatementFetcher.java:174)
at org.firebirdsql.jdbc.FBStatementFetcher.next(FBStatementFetcher.java:95)
at org.firebirdsql.jdbc.AbstractResultSet.next(AbstractResultSet.java:271)
at edu.cent35.Final.Persona.PersonaBean.evitoDuplicados(PersonaBean.java:229)
at edu.cent35.Final.Persona.PersonaUI$ManejadorBotones.actionPerformed(PersonaUI.java:186)
at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
at java.awt.Component.processMouseEvent(Unknown Source)

febrero 9, 2017 | Registered Commenterjse

hola, el cuil en la bbdd, es un varchar, no?? y por otro lado, el cuil en java es un string, no?
pues si es si a ambas respuestas, tu sentencia select deberia ser:


String sql ="select cuil,count(*) from Persona where cuil='"+persona.getCuil()+"' group by cuil";

Creo que te faltan las comillas simples a los lados de persona.getCuil()
Prueba a ve si es eso, y ya nos cuentas. Un saludo

febrero 9, 2017 | Registered Commenterloderain

Muchas gracias me sirvió, no sabia que habia que colocar esas comillas simples.

Otra consulta, disculpa que moleste tanto. Con JTEXTFIELD, hay forma de hacer un algoritmo que valide el CUIL ? que solo tome los numeros que corresponden. 20-23-27 y los ultimos, en que rango deberian estar ?

slds

febrero 9, 2017 | Unregistered Commenterjse

Hola, pues si que lo puedes validar, haciendo uso de expresiones regulares.
Tutorial aqui
La verdad que no se que es el Cuil, supongo que sera el identificador de tu pais, por lo que no entiendo esta segunda parte: "que solo tome los numeros que corresponden. 20-23-27 y los ultimos, en que rango deberian estar ?"

Pero vamos, que con expresiones regulares lo puedes validar seguro. Echale un ojo a la pagina que te pasao y para cualquer duda, por aqui andamos. Un saludo

febrero 9, 2017 | Registered Commenterloderain

Muchas gracias por tu respuesta.

Es como el como el documento de identidad de cada persona. Pero este es el codigo del trabajador. Debe empezar solo por 20 - 23- 27- 0 30. Por ejemplo un Documento. 12-222-111. Para ser cuil se le agrega el 20 por ejemplo. 20-12.222.111, Entendes? lo que quiero lograr es que los primeros dos digitos sean identicos a los que mencione, si no lo es, que avise.

febrero 10, 2017 | Unregistered Commenterjose

Otra consulta,

Como puedo parsear a Integer el valor que tengo en el JTEXTFORMATED ? Necesito hacer unos calculos con los numeros ingresados. En que parte deberia de hacerlo ?

slds

febrero 10, 2017 | Unregistered Commenterjse

En que parte deberias parear a integer?? Pues eso depende de la estructura que estes usando. Si por ejemplo usas MVC, el parseo, puedes hacerlo en la vista y enviar al controlador un int. Pero tambien puedes enviar un string al controlador y parsear a int en el controlador. Las opciones son incontables.

Como parsear a integer...


int numero=Integer.parseInt(NombreDeJTEXTFORMATED.getText());

De esa manera conviertes una cadena de texto(Proveniente del jtextformatted), en un int, para poder operar con el. Bno un saludo.

febrero 13, 2017 | Registered Commenterloderain