Enviar uma data para o banco de dados.[Resolvido]

15 respostas
anderson.agr

Caros amigos,

Sei que deve ser algo bem fácil pra vcs, porém estou iniciando e tenho dificuldades…
Estou tentando gravar uma data no banco de dados e está dando o seguinte erro…
“j_id_jsp_1280720231_1:j_id_jsp_1280720231_8: An error occurred when processing your submitted information”
então fiz o teste com Junit e funcionou enviando a data do sistema, fui no meu banco e modifiquei a propriedade do meu atributo com date, deixei ele como não requerido, então o Dao faz a inserção sem problemas…
Aqui vão meus códigos veja se alguém me ajuda!!!

MeuBean:

public class NotaFiscal implements Serializable {

    private static final long serialVersionUID =1L;

    private Integer nota_id;
    private Integer nota_serie;
    private Date nota_dt_emissao;
    private Fornecedor forn_id;
...

MeuDao:

public class NotaFiscalDao extends DataUtil {

    private static final long serialVersionUID = 1L;

    private FornecedorDao forn = new FornecedorDao();
   
    public NotaFiscalDao() {
        super();
    }

    public boolean add(NotaFiscal nota) throws ClassNotFoundException, SQLException {

        PreparedStatement ps = getPreparedStatement("INSERT INTO " +
                " gerenciamento.nota_fiscal(nota_id, nota_serie, nota_dt_emissao, forn_id) "+
                " VALUES (?,?,?,?);");
        ps.setInt(1, nota.getNota_id());
        ps.setInt(2, nota.getNota_serie());
        ps.setDate(3,nota.getNota_dt_emissao());
        ps.setInt(4, nota.getForn_id().getForn_id());
        int toReturn = ps.executeUpdate();
        ps.close();
        return toReturn > 0;
    }

    private void populateNotaFiscal(NotaFiscal nota, ResultSet rs) throws SQLException, ClassNotFoundException {
         nota.setNota_id(rs.getInt("nota_id"));
         nota.setNota_serie(rs.getInt("nota_serie"));
         nota.setNota_dt_emissao(rs.getDate("nota_dt_emissao"));
         nota.setForn_id(forn.getById(rs.getInt("forn_id")));
    }

    public boolean set(NotaFiscal nota) throws ClassNotFoundException, SQLException {
        PreparedStatement ps = getPreparedStatement(
                "UPDATE gerenciamento.nota_fiscal " +
                "SET nota_serie = ?, nota_dt_emissao = ?," +
                "forn_id = ? " +
                "WHERE nota_id = ?;");
        ps.setInt(1, nota.getNota_serie());
        ps.setDate(2, (Date)nota.getNota_dt_emissao());
        ps.setInt(3, nota.getForn_id().getForn_id());
         ps.setInt(4, nota.getNota_id());
        int toReturn = ps.executeUpdate();
         ps.close();
        return toReturn > 0;
    }

    public NotaFiscal getById(int idnotafiscal) throws ClassNotFoundException, SQLException {
        PreparedStatement ps = getPreparedStatement("SELECT * FROM gerenciamento.nota_fiscal where nota_id = ?;");
        ps.setInt(1, idnotafiscal);
        ResultSet rs = ps.executeQuery();
        if (!rs.next()) {
            return null;
        }
        NotaFiscal toReturn = new NotaFiscal();
        populateNotaFiscal(toReturn, rs);
        rs.close();
        ps.close();
        return toReturn;
    }

    public List<NotaFiscal> getNotaFiscal() throws ClassNotFoundException, SQLException {
        {
            List<NotaFiscal> toReturn = new LinkedList<NotaFiscal>();
            ResultSet rs = getStatement().executeQuery("SELECT * FROM gerenciamento.nota_fiscal order by nota_id;");
            while (rs.next()) {
                NotaFiscal nota = new  NotaFiscal();
                populateNotaFiscal(nota, rs);
                toReturn.add(nota);
            }
            return toReturn;
        }
    }
}

MeuBenGerenciado:

public class NotaFiscalFace {

   private FornecedorDao forn = new FornecedorDao();

   private NotaFiscalDao  nota = new NotaFiscalDao();
   private NotaFiscal selectNotaFiscal;
   private List<NotaFiscal> notaFiscal;



    public NotaFiscalFace() {
    }

    public String StartAddNotaFiscal(){
        selectNotaFiscal = new NotaFiscal();
  
        return "gotoAddNewNotaFiscal";
    }

      public String FinishAddNotaFiscal() throws ClassNotFoundException, SQLException{
       
        nota.add(selectNotaFiscal);
        notaFiscal = null;
     
        return "gotoReturnInicio";
    }

       public List<NotaFiscal> getNotaFiscal() throws ClassNotFoundException, SQLException{

          if (notaFiscal == null){
          notaFiscal = nota.getNotaFiscal();
          }
          return notaFiscal;
      }
      
      public List<SelectItem> getFornecedor() throws ClassNotFoundException, SQLException{

         List<SelectItem> toReturn = new LinkedList<SelectItem>();
          for (Fornecedor forne : forn.getAllFornecedor()){
              toReturn.add(new SelectItem(forne, forne.getForn_nome()));
          }
          return toReturn;


      }
     

     
       public String StartEditNotaFiscal() throws ClassNotFoundException, SQLException{
           return "gotoEditNotaFiscal";
    }
        public String FinishEditNotaFiscal() throws ClassNotFoundException, SQLException{
        nota.set(selectNotaFiscal);
        notaFiscal = null;
        return "gotoListNotaFiscal";
    }
         public String CancelEditNotaFiscal() throws ClassNotFoundException, SQLException{
        notaFiscal = null ;
        return "gotoListNotaFiscal";
         }
         public String RetornarInicio()throws ClassNotFoundException, SQLException{
             return"gotoReturnInicio";
         }

    public NotaFiscal getSelectNotaFiscal() {
        return selectNotaFiscal;
    }

    public void setSelectNotaFiscal(NotaFiscal selectNotaFiscal) {
        this.selectNotaFiscal = selectNotaFiscal;
    }
   }

Minha Pagina:

<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>INCLUIR GUIA</title>
    </head>
    <body>
        <f:view>
            <h1>Incluindo uma nova Guia</h1>

            <h:form >
                <h:messages style="left: 200px; top: 330px; position: absolute" />
                <h:outputLabel style="left: 20px; top: 80px; position: absolute" value ="Nota Fiscal" />
                <h:inputText size="100" style="left: 100px; top: 80px; position: absolute" value = "#{NotaFiscalFace.selectNotaFiscal.nota_id}"/>
                <br>
                <h:outputLabel style="left: 20px; top: 110px; position: absolute" value ="Série" />
                <h:inputText size="100" style="left: 100px; top: 110px; position: absolute" value = "#{NotaFiscalFace.selectNotaFiscal.nota_serie}"/>
                <br>
                <h:outputLabel style="left: 20px; top: 140px; position: absolute" value ="Data de Emissão" />
                <h:inputText  size="100" style="left: 100px; top: 140px; position: absolute" value = "#{NotaFiscalFace.selectNotaFiscal.nota_dt_emissao}">
                    <f:convertDateTime  type="date" pattern="dd/MM/yyyy"/>
                </h:inputText>
                <br>
                <h:outputLabel style="left: 20px; top: 170px; position: absolute" value = "Fornecedor:"/>
                <h:selectOneMenu  style="left: 100px; top: 170px; position: absolute" value="#{NotaFiscalFace.selectNotaFiscal.forn_id}">
                    <f:selectItems value="#{NotaFiscalFace.fornecedor}"/>
                    <f:converter converterId="FornecedorConverter"/>
                </h:selectOneMenu>
                <br>
                <h:commandButton style="left: 20px; top: 310px; position: absolute"  action="#{NotaFiscalFace.FinishAddNotaFiscal}" value="Incluir Guia"/>
                <h:commandButton style="left: 140px; top: 310px; position: absolute" action="gotoReturnInicio" value="Cancel"/>

            </h:form>
        </f:view>
    </body>
</html>

Se alguém puder me ajudar…ficarei grato… Meu Gerenciador de Banco de Dados é o POSTGRES 8.3.1!!!

15 Respostas

gabriel.coelho

Cara…use o SimpleDateFormat.

Quando for inserir a data no banco, instancie a classe passando como parametro o formato da data:

SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy")

Onde vc esta chamando o

ps.setDate(3,nota.getNota_dt_emissao());

faça

ps.setDate(3, sdf.format(nota.getNota_dt_emissao()));

E ai veja se funciona!!!

Abs.

gabriel.coelho

Cara…use o SimpleDateFormat.

Quando for inserir a data no banco, instancie a classe passando como parametro o formato da data:

SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy")

Onde vc esta chamando o

ps.setDate(3,nota.getNota_dt_emissao());

faça

ps.setDate(3, sdf.format(nota.getNota_dt_emissao()));

E ai veja se funciona!!!

Abs.

gabriel.coelho

Cara…use o SimpleDateFormat.

Quando for inserir a data no banco, instancie a classe passando como parametro o formato da data:

SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy")

Onde vc esta chamando o

ps.setDate(3,nota.getNota_dt_emissao());

faça

ps.setDate(3, sdf.format(nota.getNota_dt_emissao()));

E ai veja se funciona!!!

Abs.

gabriel.coelho

Cara…use o SimpleDateFormat.

Quando for inserir a data no banco, instancie a classe passando como parametro o formato da data:

SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy")

Onde vc esta chamando o

ps.setDate(3,nota.getNota_dt_emissao());

faça

ps.setDate(3, sdf.format(nota.getNota_dt_emissao()));

E ai veja se funciona!!!

Abs.

anderson.agr

cara fiz o que vc disse e ele tá dando erro…
vc disse pra eu instanciar no próprio DAO…ou no Bean???

gabriel.coelho

No DAO.

Aqui eu uso o Oracle e insiro as datas com o SimpleDateFormat, acredito que no postgresql tbm funcione dessa maneira.

anderson.agr

cara o netbeans já seta em vermelho e diz o seguinte:

Já ia esquecendo o POstGres…recebe a Data da seguinte forma ‘yyyy-MM-dd’.

gabriel.coelho

Mano…então faz o seguinte…tem uma outra opção que vc pode usar…converter essa data pra String e salvar ela no banco como String.

No momento em que vc recuperar a data pela request, recupere a data no formato String.
Crie esse metodo pra converter data pra string dentro do seu bean passando como parametro a data do tipo date e quando vc precisar salvar a data, chame o setString e faça obj.setDataString.

Assim tem que funcionar…

Pra facilitar sua vida, to passando aqui o método da que converte Date para String. (lembre-se, coloque esse metodo no Bean)

public static Date getData(final String data){
        if(isNullStr(data)){
            return null;
        }
        try{
            return dateFormat.parse(data);
        }catch(Exception e){
            e.printStackTrace();
            return null;
        }
    }
    
    public static String getStringData(final Date data) {
            if (isNull(data)) {
                return "";
            }
            try{
                return dateFormat.format(data);
            }catch(Exception e){
                e.printStackTrace();
                return "";
            }
    }

//Verifica se a data nao esta null
    public static boolean isNull(Date valor) {
            return ((valor == null));
    }
    
    public static boolean isNullStr(String valor) {
	return ((valor == null) || (valor.trim().length() == 0));        
    }
anderson.agr

estou tentando fazer…substitui a data pelo meu objeto do tipo Date … que é “nota_dt_emissao”;
só que agora ele pede pra criar um campo dateFormat ou uma class dateFormat…
Estou no caminho certo???
Acho que não entendi esse método…

gabriel.coelho

Ta sim…

Esqueci de postar o dateFormat aqui.

O dateFormat nada mais é que um SimpleDateFormat estatico, implementado la junto com os atributos do Bean. Antes de criar qualquer atributo de classe, adicione essa linha

private static final SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");

Agora vai parar de dar pau.

anderson.agr

Caramba…eu devo ser burro demais…rsrsrsrs
cara ainda tá dando erro…
só pra saber meu Bean ficou assim:

public static Date getData(final String nota_dt_emissao) {
        if (isNullStr(nota_dt_emissao)) {
            return null;
        }
        try {
            return (Date) dateFormat.parse(nota_dt_emissao);
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }


    public static String getStringData(final Date nota_dt_emissao) {
        if (isNull(nota_dt_emissao)) {
            return "";
        }
        try {
            return dateFormat.format(nota_dt_emissao);
        } catch (Exception e) {
            e.printStackTrace();
            return "";
        }
    }

//Verifica se a data nao esta null  
    public static boolean isNull(Date nota_dt_emissao) {
        return ((nota_dt_emissao == null));
    }

    public static boolean isNullStr(String nota_dt_emissao) {
        return ((nota_dt_emissao == null) || (nota_dt_emissao.trim().length() == 0));
    }
}

e meu Dao ficou assim:

public boolean add(NotaFiscal nota) throws ClassNotFoundException, SQLException {

        PreparedStatement ps = getPreparedStatement("INSERT INTO " +
                " gerenciamento.nota_fiscal(nota_id, nota_serie, nota_dt_emissao, forn_id) "+
                " VALUES (?,?,?,?);");
        ps.setInt(1, nota.getNota_id());
        ps.setInt(2, nota.getNota_serie());
        ps.setDate(3,nota.getStringData(nota_dt_emissao);
        ps.setInt(4, nota.getForn_id().getForn_id());
        int toReturn = ps.executeUpdate();
        ps.close();
        return toReturn > 0;
    }
gabriel.coelho

Cara…antes de setar essa data no DAO, vc precisar recuperar sua data na servlet pela request…guarda essa data em uma variavel String, dps vc chama o metodo setNota_dt_emissaoString(variavelDataString) passando como parametro a String que vc criou com a data recuperada pela request.

Dai la no seu DAO vc apenas faz isso

ps.setString(3,nota.getNota_dt_emissaoString());

Um conselho que te dou é sempre usar a terminologia CaseSensitive do java, por exemplo…ao criar uma variavel de qualquer tipo com nome composto, crie usando letras maiusculas e minusculas, evitando o uso de undescores
Tipo

getNotaDataEmissao()

anderson.agr

Cara vou usar seu conselho…
Mas sinceramente não sei fazer essa operação que vc mencionou, recuperar a data na Servlet pela Request…
resolvi ler mais um pouco, tem alguma coisa que vc indicaria?
Valeu pela força!!!

gabriel.coelho

Uhhn…

Cara…eu te indico a apostila da caelum fj-11 e fj-21…

Caso vc não conheça muito bem o java, seria bom vc começar lendo a apostila FJ-11, mas caso vc já conheca bem o java e quer desenvolver pra web, já comece lendo a Fj-21.

Segue o link abaixo das apostilas…lá vc baixa a que quiser.

Abraço.

anderson.agr

Caros amigos que tiverem o mesmo problema…
A resolução ficou bem simples…
Na ClasseBean troquei o sql.Date por util.Date…
então meu DAO ficou da Seguinte maneira:

ps.setDate(3, new java.sql.Date(nota.getNota_dt_emissao().getTime()));

depois é só formatar a data na página com o

<f:convertDateTime pattern="dd/MM/yyyy"/>

Aí funciona Legal…o bnaco que usei foi o PostGres.
Valeu pela ajuda.

Criado 2 de setembro de 2009
Ultima resposta 6 de set. de 2009
Respostas 15
Participantes 2