0

Tengo un formulario html con inputs numéricos declarados como type="number", los cuales deberían dar hasta dos decimales, y en la base de datos los declaré como double. En la clase que toma los parámetros de Statement también los declaré como double.

Mis dos preguntas son la siguientes:

a) cómo tengo que declarar los input numericos en el formulario html donde dice type para que la insercción sea exitosa y con dos decimales?, porque la consulta si no me equivoco está bien formulada.

b) Cómo tengo que declarar los campos en la tabla mysql para que tenga sólo tenga dos decimales? probé float y tampoco se insertaron los datos.

Me pinta que es una incompatibilidad entre el form html type="number", lo declarado en la variables "double" y lo declarado en la estructura mysql columnas "double".

Clase declaradora de Empleado: package org.comunidadIT.proyecto.entidades;

public class Empleado {

protected String nombre;
protected String apellido;
protected String direccion;
protected String cargo;
protected double sueldo_cargo;
protected double cargas_sociales;
protected double vacaciones;
protected double sueldo_neto;

public Empleado (String nombre, String apellido, String direccion, String cargo, double sueldo_cargo, double cargas_sociales, double vacaciones, double sueldo_neto){
    this.nombre=nombre;
    this.apellido=apellido;
    this.direccion=direccion;
    this.cargo=cargo;
    this.sueldo_cargo=sueldo_cargo;
    this.cargas_sociales=cargas_sociales;
    this.vacaciones=vacaciones;
    this.sueldo_neto=sueldo_neto;
}

Formulario html:

    <form action="http://localhost:8091/Proyecto_Final_AAB/rest/empleados/insertarEmpleado" method="post" >
        <table>
            <tr>
                <td>    
                    <label name="nombre">Nombre:</label>
                </td>
            </tr>

            <tr>
                <td>
                    <input name="nombre" type="text"><br/>
                </td>
            </tr>

                <tr>
                <td>    
                    <label name="apellido">Apellido:</label>
                </td>
            </tr>

            <tr>
                <td>
                    <input name="apellido" type="text"><br/>
                </td>
            </tr>

            <tr>
                <td>    
                    <label name="direccion">Direccion:</label>
                </td>
            </tr>

            <tr>
                <td>
                    <input name="direccion" type="text"><br/>
                </td>
            </tr>

            <tr>
                <td>
                    <label name="cargo">Cargo en la Empresa:</label>
                </td>
            </tr>

            <tr>
                <td>
                    <input name="cargo" type="text"><br/>
                </td>
            </tr>

            <tr>
                <td>
                    <label name="sueldo_cargo">Sueldo bruto:</label>
                </td>
            </tr>

            <tr>
                <td>
                    <input name="sueldo_cargo" type="number"><br/>
                </td>
            </tr>

            <tr>
                <td>    
                    <label name="cargas_sociales">Cargas sociales:</label>
                </td>
            </tr>

            <tr>
                <td>
                    <input name="cargas_sociales" type="number"><br/>
                </td>
            </tr>

            <tr>
                <td>    
                    <label name="vacaciones">Vacaciones:</label>
                </td>
            </tr>

            <tr>
                <td>
                    <input name="vacaciones" type="number"><br/>
                </td>
            </tr>

            <tr>
                <td>

            <tr>
                <td>    
                    <label name="sueldo_neto">Sueldo neto:</label>
                </td>
            </tr>

            <tr>
                <td>
                    <input name="sueldo_neto" type="number"><br/>
                </td>
            </tr>

            <tr>
                <td>
                    <input type="submit" value="Insertar">

                </td>
            </tr>
        </table>
    </form>

Clase rest que inserta datos:

package org.comunidadIT.proyecto.controladores;

import javax.ws.rs.PathParam;

import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

import javax.ws.rs.Consumes;
import javax.ws.rs.FormParam;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.Response.ResponseBuilder;

import org.comunidadIT.proyecto.accesoDatos.ConexionAeropuerto;
import org.comunidadIT.proyecto.entidades.Administrador;
import org.comunidadIT.proyecto.entidades.Empleado;

import com.google.gson.Gson;



@Path("/empleados")
public class Empleados {

String numerosLetras= new String("[^a-zA-Z0-9]+");
String soloLetras= new String("[^a-zA-Z]+");
String soloEmail= new String("[^a-zA-Z0-9@._-]");


@POST
@Path("/insertarEmpleado")
@Produces(MediaType.APPLICATION_JSON)
public String insertarEmpleado(@FormParam("nombre") String nombre, @FormParam("apellido") String apellido, @FormParam("direccion") String direccion, @FormParam("cargo") String cargo, @FormParam("sueldo_cargo") double sueldo_cargo, @FormParam("cargas_sociales") double cargas_sociales, @FormParam("vacaciones") double vacaciones, @FormParam("sueldo_neto") double sueldo_neto){


    try
        {
        //Probamos conectarnos
        ConexionAeropuerto c= new ConexionAeropuerto();
        Connection con= c.connectarAhora();

        //Si la conexión no es nula entonces realizar dos consultaa de insercción de datos y creación de tabla
        if(con!=null)
                {
                    Statement st;
                    st=con.createStatement();
                    st.executeUpdate("INSERT INTO empleados_berlot83(nombre,apellido,direccion,cargo,sueldo_cargo,cargas_sociales,vacaciones,sueldo_neto) VALUES('"+nombre.trim().replaceAll(soloLetras, "")+"','"+apellido.trim().replaceAll(soloLetras, "")+"','"+direccion.trim().replaceAll(numerosLetras, "")+"','"+cargo.trim().replaceAll(numerosLetras, "")+"','"+sueldo_cargo+"','"+cargas_sociales+"','"+vacaciones+"','"+"','"+sueldo_neto+"')");
                    st.close();
                    System.out.println("Funciona el try and catch, los deberían haberse ingresado a la DB 'empleados_berlot83'");



                    MetodosResponse.CREADO();   //ResponseBuilder 200
                } 
        else
                {
                    System.out.println("Algo Salió mal no se pudo insertar los datos");
                    MetodosResponse.UNAUTHORIZED(); //ResponseBuilder 401
                }
        }
        catch (SQLException e) 

                {
                    e.printStackTrace();
                }

    //Creamos la lista y le ponemos las variables que a su vez están conectadas al construcctor de la Case Empleados
    List<Empleado> lista= new ArrayList<>();
        lista.add(new Empleado(nombre.trim().replaceAll(soloLetras, ""), apellido.trim().replaceAll(soloLetras, ""), direccion.trim().replaceAll(numerosLetras, ""), cargo.trim().replaceAll(numerosLetras, ""), sueldo_cargo, cargas_sociales, vacaciones, sueldo_neto ));

            //Creamos un object Gson() que nos permite usar el toJson()
            Gson gson = new Gson();

            //Creamos un String y al mismo le aplicamos el toJson(objeto list)
            String JsonToString= gson.toJson(lista);

            //Retornamos el String anterior
            return JsonToString;
}
}
berlot83
  • 646
  • 1
  • 9
  • 21
  • Hola, lo correcto sería utilizar un `PreparedStatement` para definir la consulta con parametros y insertarlos luego, así conservarían los tipos. Igualmente el número decimal lo estas insertando entre comillas simples y no debería de ser así. – Monclus Mar 14 '17 at 11:50
  • si, de esa manera me esta quedando mas organizado – berlot83 Mar 14 '17 at 12:12
  • Mi error fue no haber usado el PreparedStatement que me evita la desorganización de las comillas. – berlot83 Mar 14 '17 at 12:14

1 Answers1

0

Cambia los input añadiendo un valor para "step", de

<input name="vacaciones" type="number">

a

<input name="vacaciones" type="number" step="0.01">

Step indica el incremento admitido para ese input, en este caso incremento de 0,01

Por otro lado, cambia esa insert a una formada a partir de PreparedStatement, tal y como la tienes ahora es un peligro en cuanto a seguridad del sistema. Algo así:

String query = "INSERT INTO empleados_berlot83(nombre,apellido,direccion,cargo,sueldo_cargo,cargas_sociales,vacaciones,sueldo_neto) VALUES(?,?,?,?,?,?,?,?)";
try(PreparedStatement st=con.createStatement()){
   st.setString(1,nombre.trim().replaceAll(soloLetras, ""));
   st.setString(2,apellido.trim().replaceAll(soloLetras, ""));
   st.setString(3,direccion.trim().replaceAll(soloLetras, ""));
   st.setString(4,cargo.trim().replaceAll(soloLetras, ""));
   st.setDouble(5,sueldo_cargo);
   st.setDouble(6,cargas_sociales);
   st.setDouble(7,vacaciones);
   st.setDouble(8,sueldo_neto);
   st.executeUpdate();
   System.out.println("Funciona el try and catch, los deberían haberse ingresado a la DB 'empleados_berlot83'");
}catch(Exception e){
   //tratar excepción
}
Pablo Fradua
  • 3,488
  • 10
  • 20
  • 1
    No se recomienda usar `double` para valores con decimales en una base de datos debido a la imprecisión que estos brindan. En su lugar, es mejor usar `BigDecimal`. Sobretodo si vas a almacenar elementos de carácter financiero como lo es un sueldo. –  Mar 14 '17 at 12:21
  • @LuiggiMendoza Decís de cambiarlo dentro de la tabla mysql? osea cambio BigDecimal que sólo tiene dos decimales? – berlot83 Mar 14 '17 at 12:23
  • 1
    @berlot83 en tu tabla de MySQL debes declarar el campo como `DECIMAL(10, 2)` por ejemplo, mientras que de lado de Java deberías usar `java.math.BigDecimal` creado por los valores de la base de datos (no por `double`). Con ello podrás mantener una mejor precisión de los datos. –  Mar 14 '17 at 12:25
  • ahora intento hacerlo – berlot83 Mar 14 '17 at 12:26
  • 1
    @berlot83 para más información al respecto, puedes revisar [¿Por qué mis programas no pueden hacer cálculos aritméticos correctamente?](http://es.stackoverflow.com/q/197/227) que aplica para todos los lenguajes de programación. –  Mar 14 '17 at 12:26
  • @LuiggiMendoza está bien, pero te consulto, les dejo la declaración como float a las variables? y cambio la tabla mysql a decimal(10,2) – berlot83 Mar 14 '17 at 12:33
  • @berlot83 olvida `float` y `double`, cámbialos a `BigDecimal` (pega duro pero es necesario). Si no, luego tendrás problemas en el futuro con la información queu muestre la aplicación y lo que se almacene en base de datos, te lo digo por experiencia propia. –  Mar 14 '17 at 12:34
  • bueno ya estoy leyendo sobre el tema. ¿Te molesta si te pregunto algo si surge otra duda mas tarde? – berlot83 Mar 14 '17 at 12:37
  • @berlot83 [Continuemos el debate en el chat](http://chat.stackexchange.com/rooms/55335/discussion-between-luiggi-mendoza-and-berlot83). –  Mar 14 '17 at 12:38
  • @LuiggiMendoza gracias por el enlace! – Pablo Fradua Mar 14 '17 at 14:10