Dúvida criar rotina para inserir dados de uma array no mysql

26 respostas
M

amigos, bom dia
eu precisava de uma função que gerasse cobrança de mensalidades automaticamente, pois tenho um sistema que tira um relatorio de mensalidades nao pagas. porem pra esse relatorio sair eu teria que cadastrar 1 por 1 no banco o cliente que nao pagou, mas tem mais de 1000 clientes.

entao estava tentando fazer um dao onde selecionasse a matricula e o nome do cliente, e gerasse automaticamente a cobranca na tabela mensalidades, segue meu codigo, porem da erro.

public class GeraMensalidadesDAO {
	
	private final Connection connection;

	public GeraMensalidadesDAO() {
		try {
			connection = new ConnectionFactory().getConnection();
		} catch (SQLException e) {
			throw new RuntimeException(e);
		}
	}

	public List<Mensalidade> geraMensalidades() {
		try {
			List<Mensalidade> mensalidades = new ArrayList<Mensalidade>();
			PreparedStatement stmt = this.connection.prepareStatement("select ID_CLIENTE,MATRICULA_CLI, NOMECOMPLETO_CLI FROM TB_TB_MENSALIDADE ORDER BY MATRICULA_CLI");

			ResultSet rs = stmt.executeQuery();

			while(rs.next()) {
				//adiciona a tarefa na lista
				mensalidades.add(populaContato(rs));
			}
			
			int tamanho = mensalidades.size();
			int cont = 0;
				while (cont <= tamanho) {
					
				stmt = this.connection.prepareStatement("insert into TB_TB_MENSALIDADE (ID_CLIENTE, MATRICULA_CLI, NOMECOMPLETO_CLI) values ?,?,?)");	
				//stmt.setInt(1, mensalidade.getId_cliente());
				//stmt.setInt(2, mensalidade.getMatricula_cli());
				//stmt.setString(3, mensalidade.getNomecompleto_cli());
				
				stmt.execute();

			    stmt.clearParameters();
				cont++;

					
				}
			
			rs.close();
			stmt.close();

			return mensalidades;
			
		} catch (SQLException e) {
			throw new RuntimeException(e);
		}
	}
	
	private Mensalidade populaContato(ResultSet rs) throws SQLException {
		Mensalidade mensalidade = new Mensalidade();
					
		//popula o objeto tarefa
		mensalidade.setId_cliente(rs.getInt("ID_CLIENTE"));
		mensalidade.setMatricula_cli(rs.getInt("MATRICULA_CLI"));
		mensalidade.setNomecompleto_cli(rs.getString("NOMECOMPLETO_CLI"));
		return mensalidade;
	}	
}

fiz uma action e quando aciono da este erro:

ype Exception report

message

description The server encountered an internal error () that prevented it from fulfilling this request.

exception

java.lang.RuntimeException: java.sql.SQLException: No value specified for parameter 1
	br.com.mensalidade.DAO.GeraMensalidadesDAO.geraMensalidades(GeraMensalidadesDAO.java:60)
	br.com.mensalidade.action.GeraMensalidadesAction.execute(GeraMensalidadesAction.java:16)
	sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
	sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	java.lang.reflect.Method.invoke(Method.java:616)

se eu tirar o comentario das linhas stmt insere dados null no banco.

poderiam me ajudar?

SDS

26 Respostas

romarcio

Tenta assim, substituindo o while por um for.

int tamanho = mensalidades.size();  
                for (int i = 0; i < tamanho; i++) {
                     stmt = this.connection.prepareStatement("insert into TB_TB_MENSALIDADE (ID_CLIENTE, MATRICULA_CLI, NOMECOMPLETO_CLI) values ?,?,?)");     
                     stmt.setInt(1, mensalidade.get(i).getId_cliente());  
                     stmt.setInt(2, mensalidade.get(i).getMatricula_cli());  
                     stmt.setString(3, mensalidade.get(i).getNomecompleto_cli());  
  
                     stmt.execute();  
                     stmt.clearParameters();  
                }

Você precisa informar a posição na lista, por isso mensalidade.get(i), dai depois informa o campo que quer mensalidade.get(i).getId_cliente().

M

Falae blz??
dessa forma deu um erro The method mensalidade(int) is undefined for the typeGeraMensalidadesDAO()

nao deu certo nao… mas muito obrigado pela ajuda

Nicolas_Fernandes

Opa!

Duas coisas:

  1. Faça métodos coesos. Não misture a parte de adicionar dados na tabela de mensalidade com gerar novos dados e retorná-los. Faça um método pra cada caso, assim melhora a coesão do projeto!
  2. Porque você tá buscando na tabela mensalidade e adicionando nela mesma? Se não tiver dado algum, virá tudo NULL mesmo!

Abraços!

M

nicolas busco na tabela e adiciono nela mesma para gerar uma cobrança, ex
o sistema é para controlar mensalidades, se ele entrar em funcionamento hoje, ele tem a opcao de eu poder cadastrar todas as mensalidades que ja estao em atraso e hoje sao controladas em planilhas do excel. ai oq o cliente quer, todo mes ele vai clicar e ira gerar todas as mensalidades que estao em atraso, ira listar tudo que estiver com pagamentook=0 no bd, porem, quando chegar mes que vem, quando ele quiser tirar o relatorio nao ira aparecer mensalidades em atraso, porque o sistema nao gerou isso automaticamente, entendeu? oq tem que ser feito hoje, um por um vai adicionando no banco que esta devendo, so que sao mais de 1000 clientes, entao ele tera que fazer isso mais de 1000 vezes todo mes.

a minha ideia era a seguinte, lembre-se que sou iniciante mesmo, nao so em java mais em programação mesmo:

eu iria fazer um select no banco, iria buscar na tabela mensalidade o id do cliente, a matricula e o nome dele, iria armazenar em um array, o cliente em um jsp iria informar qual mes e ano iria gerar as matriculas, entao de uma só vez eu iria inserir todos os clientes que estarao com cobranca no mes entendeu?
assim quem nao pagar ira sair no relatorio, so que atualizado.

endenteu?

obrigado pelas dicas

Nicolas_Fernandes

Teste algo assim:

public void gerarMensalidades() throws Exception
   {
        Connection conn = new ConnectionFactory().getConnection();

        String query = "Select Id_Cliente, Matricula_Cli, NomeCompleto_Cli From Tb_Tb_Mensalidade Order By Matricula_Cli";
        PreparedStatement pstm = conn.prepareStatement(query);
        ResultSet rs = pstm.executeQuery();

        if ( rs != null )
        { 
           while ( rs.next() )
           {
              Object[] params = { rs.getInt("Id_Cliente", rs.getInt("Matricula_Cli"), rs.getString("NomeCompleto_Cli") };
              String queryMensalidade = String.format("Insert Into Tb_Tb_Mensalidade (Id_Cliente, Matricula_Cli, NomeCompleto_Cli) Values (%s, %s, %s)", params);
              PreparedStatement mensalidade = conn.prepareStatement(query);
              mensalidade.execute();
           }
        }
        rs.close();
   }
   public List<Mensalidade> buscarMensalidades() throws Exception
   {
      Connection conn = new ConnectionFactory().getConnection();

      String query = "Select Id_Cliente, Matricula_Cli, NomeCompleto_Cli From Tb_Tb_Mensalidade Order By Matricula_Cli";
      PreparedStatement pstm = conn.prepareStatement(query);
      ResultSet rs = pstm.executeQuery();
      
      List<Mensalidade> mensalidades = null;
      if ( rs != null )
      {
          mensalidades = new ArrayList<Mensalidade>();
          while ( rs.next() )
          {
             Mensalidade mensalidade = new Mensalidade();
             mensalidade.setCampo1(/*...*/);
             mensalidade.setCampo2(/*...*/);
             mensalidade.setCampo3(/*...*/);
             mensalidades.add(mensalidade);
          }
      }

      rs.close();
      return mensalidades;
   }
M

Nicolas, muito obrigado ai pela ajuda que tem me dado…
aconteceu um erro:

Object[] params = { rs.getInt(“Id_Cliente”) <ai eu adicionei o ) para fechar, nao sei se era para fazer isto
e abaixo eu coloquei: PreparedStatement mensalidade = conn.prepareStatement(queryMensalidade); mudei de query para querymensalidade.
era para ser assim?

agora desculpe a ignorancia, mas ainda sou muito confuso, oq eu colocaria nestas linhas:

Mensalidade mensalidade = new Mensalidade();

mensalidade.setCampo1(/<em></em>/);

mensalidade.setCampo2(/<em></em>/);

mensalidade.setCampo3(/<em></em>/);

mensalidades.add(mensalidade);

denovo. muito obrigado pela atencao

M

OPA… eu removi por enquanto o metodo busca para utilizar somente o insert para testar…
porem deu este erro:

ype Exception report

message

description The server encountered an internal error () that prevented it from fulfilling this request.

exception

com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘MARIA MOUZER BRITO)’ at line 1

onde aparece maria mouzer brito na verdade esta no banco aurea maria mouzer brito, oq poderia ser??

M

quando eu modifiquei o nome do usuario, para somente aurea, tirei o sobrenome, deu o seguinte erro:

com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown column ‘aurea’ in ‘field list’

Nicolas_Fernandes

Pera aí… Mostra aí como você tá realizando esta consulta O.o

M

da uma olhada ai camarada

public class GeraMensalidadesDAO {
	
	public void gerarMensalidades() throws Exception  
	{  
	     Connection conn = new ConnectionFactory().getConnection();  
	  
	     String query = "Select ID_CLIENTE, MATRICULA, NOMECOMPLETO From TB_TB_CONTATO Order By MATRICULA";  
	     PreparedStatement pstm = conn.prepareStatement(query);  
	     ResultSet rs = pstm.executeQuery();  
	  
	     if ( rs != null )  
	     {   
	        while ( rs.next() )  
	        {  
	           Object[] params = { rs.getInt("ID_CLIENTE"), rs.getInt("MATRICULA"), rs.getString("NOMECOMPLETO") };  
	           String queryMensalidade = String.format("Insert Into TB_TB_MENSALIDADE (ID_CLIENTE, MATRICULA_CLI, NOMECOMPLETO_CLI) Values (%s, %s, %s)", params);  
	           PreparedStatement mensalidade = conn.prepareStatement(queryMensalidade);  
	           mensalidade.execute();  
	        }  
	     }  
	     rs.close();  
	}  
	 public List<Mensalidade> buscarMensalidades() throws Exception  
	{  
	   Connection conn = new ConnectionFactory().getConnection();  
	  
	   String query = "Select Id_Cliente, Matricula_Cli, NomeCompleto_Cli From Tb_Tb_Mensalidade Order By Matricula_Cli";  
	   PreparedStatement pstm = conn.prepareStatement(query);  
	   ResultSet rs = pstm.executeQuery();  
	     
	   List<Mensalidade> mensalidades = null;  
	   if ( rs != null )  
	   {  
	       mensalidades = new ArrayList<Mensalidade>();  
	       while ( rs.next() )  
	       {  
	          Mensalidade mensalidade = new Mensalidade();  
	         // mensalidade.setCampo1(/*...*/);  
	         // mensalidade.setCampo2(/*...*/);  
	         // mensalidade.setCampo3(/*...*/);  
	         // mensalidades.add(mensalidade);  
	       }  
	   }  
	  
	   rs.close();  
	   return mensalidades;  
	}
M

Oq será q pode estar dando errado? Pelo menos já esta buscando no banco e tentando inserir mas da esses erros…

Nicolas_Fernandes

Você tem esse erro:

com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'MARIA MOUZER BRITO)' at line 1

Onde está executando essa instrução, exatamente?
Ao invés de fazer Object[] params, usa ? como parâmetro e seta os valores com no PreparedStatement para ver o resultado.

M

Po cara desculpa aí mais ainda não entendo termos técnicos muito bem… Oq eu faço eu tenho uma actuon que executa este methodo vou no curimã e digito a url aí da este erro na action eu faço no execute new GeramatriculasDAO.methodo(). Se não for te atrapalhar poderia fazer um exemplo com a modificação q vc falou? Obrigado

Nicolas_Fernandes
public class GeraMensalidadesDAO 
{	
	public void gerarMensalidades() throws Exception  
	{  
	     Connection conn = new ConnectionFactory().getConnection();  
	  
	     String query = "Select ID_CLIENTE, MATRICULA, NOMECOMPLETO From TB_TB_CONTATO Order By MATRICULA";  
	     PreparedStatement pstm = conn.prepareStatement(query);  
	     ResultSet rs = pstm.executeQuery();  
	  
	     if ( rs != null )  
	     {   
	        while ( rs.next() )  
	        {  
	           String queryMensalidade = "Insert Into TB_TB_MENSALIDADE (ID_CLIENTE, MATRICULA_CLI, NOMECOMPLETO_CLI) Values (?, ?, ?)";  
	           PreparedStatement mensalidade = conn.prepareStatement(queryMensalidade);  
                   mensalidade.setInt(1, rs.getInt("Id_Cliente");
                   mensalidade.setInt(2, rs.getInt("Matricula"));
                   mensalidade.setString(3, rs.getString("NomeCompleto"));
	           mensalidade.execute();  
	        }  
	     }  
	     rs.close();  
	}

Eu quis dizer isso.
O problema é que, na hora de inserir uma string na query, ele tá inserindo um ) junto. Você tá passando um valor com “)” ??
Testa o código acima, também.

M

Fala meu amigo, muito obrigado, agora funcionou legal!!!
muito obrigado mesmo, agora eu vou tentar colocar mais 2 informações digitadas pelo usuário, que seria o mes de referencia e o ano de referencia, ele ira digitar no jsp e ira junto com essas informações, mas o mais dificil vc ja conseguiu!! valeu mesmo vc e fera!!

Nicolas_Fernandes

Opa!
Que bom :smiley:

Adicione a tag [RESOLVIDO] no seu tópico, para encerrá-lo.
Abraços!

M

Fala pessoal blz? Desculpe reabrir este tópico mas depois de resolver este meu problema surgiu um outro. Tentei o dia inteiro resolver mas eu não consegui. Como eu poderia fazer para não deixar o usuário gerar as mensalidades 2 vezes? Se ele clicar para gerar ira gerar quantas vezes ele quiser. outro problema seria, o cliente pode pagar mensalidade adiantada ex: pagar ate dezembro mas se eu gerar em dezembro ira colocar no banco que ele esta devendo dezembro tb. Tem como resolver isto?

Nicolas_Fernandes

Para resolver o problema de gerar mais de uma mensalidade, pode seguir algo assim:

Na sua View:

mensalidadeButton = new JButton("Gerar Mensalidades");
/* As particularidades do botão */
mensalidadeButton.addActionListener( new ActionListener() {
   public void actionPerformed(ActionEvent e) {

      mensalidadeButton.setEnabled(false);
      // Supondo que você digite o mês numa caixa de texto no formato "03", por exemplo.
      Boolean existeMensalidade = MensalidadeDAO.validarExistenciaMensalidade(Integer.valueOf(textMes.getText()));
      if (existeMensalidade)
         JOptionPane.showMessageDialog(null, "Já existe mensalidade cadastrada para este mês.");
      else
         MensalidadeDAO.cadastrarMensalidade(/* Os dados para cadastrar a mensalidade */);

      mensalidadeButton.setEnabled(true);
   }
});

E no DAO, você faz uma validação no Banco se já existe mensalidade naquele mês:

public class MensalidadeDAO
{
   public static Boolean validarExistenciaMensalidade(int mes) throws Exception
   {
      /*Sua query deve ser assim: Procure na Tabela de mensalidades a ocorrência de algum valor para o mês escolhido. Caso sim, retorne true, pois você tá avisando que já existe mensalidade nesse mês para esta pessoa. Caso contrário, retorne false e deixe o usuário cadastrar a mensalidade nesse mês.*/
   }
}

E voilà!

Quanto a outra solução, vou pensar em algo e te falo!
Valeu, abraços!

M

só vc mesmo cara…
valeu denovo, vou tentar aqui… a view que vc diz é o jsp certo? :slight_smile:

vou tentar e retorno pra vc. muito obrigado denovo

M

Vou mostrar como esta funcionando o sistema:

o DAO:

public class GeraMensalidadesDAO {
	
     
	    public void gerarMensalidades(Mensalidade mensalidade) throws Exception    
	    {    
	         Connection conn = new ConnectionFactory().getConnection();
	        	         
	 		//Pega o nome do mes e seta o valor na coluna mesref no banco
	         if(mensalidade.getMesreferencia().equals("JANEIRO")) {
	 			mensalidade.setMesref(1);
	 		} else if
	 		(mensalidade.getMesreferencia().equals("FEVEREIRO")) {
	 			mensalidade.setMesref(2);
	 		} else if
	 		(mensalidade.getMesreferencia().equals("MARÇO")) {
	 			mensalidade.setMesref(3);
	 		} else if 
	 		(mensalidade.getMesreferencia().equals("ABRIL")) {
	 		 	mensalidade.setMesref(4);
	 		} else if
	 		(mensalidade.getMesreferencia().equals("MAIO")) {
	 				mensalidade.setMesref(5);
	 		} else if
	 		(mensalidade.getMesreferencia().equals("JUNHO")) {
	 			mensalidade.setMesref(6);
	 		} else if
	 		(mensalidade.getMesreferencia().equals("JULHO")) {
	 			mensalidade.setMesref(7);
	 		} else if
	 		(mensalidade.getMesreferencia().equals("AGOSTO")) {
	 			mensalidade.setMesref(8);
	 		} else if
	 		(mensalidade.getMesreferencia().equals("SETEMBRO")) {
	 			mensalidade.setMesref(9);
	 		} else if
	 		(mensalidade.getMesreferencia().equals("OUTUBRO")) {
	 			mensalidade.setMesref(10);
	 		} else if
	 		(mensalidade.getMesreferencia().equals("NOVEMBRO")) {
	 			mensalidade.setMesref(11);
	 		} else if
	 		(mensalidade.getMesreferencia().equals("DEZEMBRO")) {
	 			mensalidade.setMesref(12);			
	 		}
	         
	        
	         String query = "Select ID_CLIENTE, MATRICULA, NOMECOMPLETO From TB_TB_CONTATO Order By MATRICULA";    
	         PreparedStatement pstm = conn.prepareStatement(query);    
	         ResultSet rs = pstm.executeQuery();    
	        
	         if ( rs != null )    
	         {     
	            while ( rs.next() )    
	            {    
	               String queryMensalidade = "Insert Into TB_TB_MENSALIDADE (ID_CLIENTE, MATRICULA_CLI, NOMECOMPLETO_CLI, REFMES, MESREFERENCIA, ANOREFERENCIA, DT_CADASTRO, PAGAMENTOOK) Values (?, ?, ?, ?, ?, ?, ?, ?)";    
	               PreparedStatement stmt = conn.prepareStatement(queryMensalidade);    
	                   stmt.setInt(1, rs.getInt("Id_Cliente"));  
	                   stmt.setInt(2, rs.getInt("Matricula"));  
	                   stmt.setString(3, rs.getString("NomeCompleto"));
	                   stmt.setInt(4, mensalidade.getMesref());
	                   stmt.setString(5, mensalidade.getMesreferencia());
	                   stmt.setString(6, mensalidade.getAnoreferencia());
	                   stmt.setDate(7,  new Date(mensalidade.getDt_cadastro().getTimeInMillis()));
	                   stmt.setInt(8, mensalidade.getPagamentook());
	               stmt.execute();    
	            }    
	         }    
	         rs.close();    
	    }   
	
	
	
	 public List<Mensalidade> buscarMensalidades() throws Exception  
	{  
	   Connection conn = new ConnectionFactory().getConnection();  
	  
	   String query = "Select Id_Cliente, Matricula_Cli, NomeCompleto_Cli From Tb_Tb_Mensalidade Order By Matricula_Cli";  
	   PreparedStatement pstm = conn.prepareStatement(query);  
	   ResultSet rs = pstm.executeQuery();  
	     
	   List<Mensalidade> mensalidades = null;  
	   if ( rs != null )  
	   {  
	       mensalidades = new ArrayList<Mensalidade>();  
	       while ( rs.next() )  
	       {  
	          //Mensalidade mensalidade = new Mensalidade();  
	         // mensalidade.setCampo1(/*...*/);  
	         // mensalidade.setCampo2(/*...*/);  
	         // mensalidade.setCampo3(/*...*/);  
	         // mensalidades.add(mensalidade);  
	       }  
	   }  
	  
	   rs.close();  
	   return mensalidades;  
	}

a Action:

public class GeraMensalidadesAction {
	private Mensalidade mensalidade;
	private String mensagemErro;
	
	@Action(value="geraMensalidades", results= {
			@Result(name="ok", type="redirectAction", params= {"actionName", "listaMensalidadesAtrasadas"}),
			@Result(name="naook", location="/gerarMensalidades.jsp")

			
		})
	
		public String execute() throws Exception {
		VerificadorDAO dao = new VerificadorDAO();
		if (dao.existeMensalidade(mensalidade)) {
			mensagemErro = "ERRO!! Não é possivel gerar cobranças duplicadas!! estas mensalidades já foram geradas";
			return "naook";
		} else {
		new GeraMensalidadesDAO().gerarMensalidades(mensalidade);
		return "ok";
	}
	}
		
		
	public Mensalidade getMensalidade() {
		return mensalidade;
	}

	public void setMensalidade(Mensalidade mensalidade) {
		this.mensalidade = mensalidade;
	}

	public String getMensagemErro() {
		return mensagemErro;
	}

	public void setMensagemErro(String mensagemErro) {
		this.mensagemErro = mensagemErro;
	}

o JSP:

<form id="cadastro" name="cadastro" method="post" action="geraMensalidades">
	<fieldset>
		<legend>Gerador de Cobrança de Mensalidades</legend>
		<label>Data:</label>
		<input id="mensalidade.dt_cadastro" type="text" size="5" name="mensalidade.dt_cadastro"/>
		<label>Mês</label>
		<select id="mensalidade.mesreferencia" name="mensalidade.mesreferencia">
		<option>Selecione o Mês</option>
        <option>JANEIRO</option>
        <option>FEVEREIRO</option>
        <option>MARÇO</option>
        <option>ABRIL</option>
        <option>MAIO</option>
        <option>JUNHO</option>
        <option>JULHO</option>
        <option>AGOSTO</option>
        <option>SETEMBRO</option>
        <option>OUTUBRO</option>
        <option>NOVEMBRO</option>
        <option>DEZEMBRO</option>
        </select>
        
        <label>Ano</label>
        <select id="mensalidade.anoreferencia" name="mensalidade.anoreferencia">
        <option>Selecione o Ano</option>
        <option>2007</option>
        <option>2008</option>
        <option>2009</option>
        <option>2010</option>
        <option>2011</option>
        <option>2012</option>
        <option>2013</option>
        <option>2014</option>
        <option>2015</option>
        <option>2016</option>
        </select>
        
        <input name="mensalidade.pagamentook" type="hidden" id="mensalidade.pagamentook" value="0" />
        
        <p><center><button type="submit">Gerar Mensalidades</button><button type="reset">Limpar</button></center></p>
	
	</fieldset>

VerificadorDAO

public class VerificadorDAO {
	private final Connection connection;

	public VerificadorDAO() {
		try {
			connection = new ConnectionFactory().getConnection();
		} catch (SQLException e) {
			throw new RuntimeException(e);
		}
	}
	
	public boolean existeUsuario(Contato contato) {
		try {
			PreparedStatement stmt = this.connection.prepareStatement("select * from TB_TB_CONTATO WHERE MATRICULA = ?");
			stmt.setInt(1, contato.getMatricula());
			ResultSet rs = stmt.executeQuery();

			boolean encontrado = rs.next();
			rs.close();
			stmt.close();

			return encontrado;
		} catch (SQLException e) {
			throw new RuntimeException(e);
		}
	}
	
	public boolean existeMensalidade(Mensalidade mensalidade) throws SQLException {
		try {
			PreparedStatement stmt = this.connection.prepareStatement("select * from TB_TB_MENSALIDADE WHERE DT_CADASTRO = ?");
			stmt.setDate(1, new Date(mensalidade.getDt_cadastro().getTimeInMillis()));
		
		ResultSet rs = stmt.executeQuery();
		
		boolean encontrado = rs.next();
		rs.close();
		stmt.close();
		
		return encontrado;
		
		} catch (SQLException e) {
			throw new RuntimeException(e);
		
		}
	}

nao esta deixando gerar 2 vezes a cobranca, porem, estou verificando pela data de criacao, porem nao seria a melhor forma, porque ele pode colocar outra data e gerar as cobrancas, e se eu gerar mensalidades no mes de janeiro de 2011 o cliente quiser pagar ate marco de 2011, quando eu gerar a mensalidade em marco de 2011 ira aparecer cobranca mesmo assim.

M

Po, tentei hoje denovo sem sucesso…
ta fogo fazer isso funcionar

Nicolas_Fernandes
public Boolean existeMensalidade(Mensalidade mensalidade) throws SQLException
{
   String query = "Select * From Tb_Tb_Mensalidade Where Dt_Cadastro = ?";
   PreparedStatement pstm = this.connection.prepareStatement(query);
   pstm.setDate(1, (java.sql.Date) mensalidade.getDt_cadastro());

   ResultSet rs = pstm.executeQuery();
   Boolean existe = false;

   if ( rs != null )
   {
      if ( rs.next() ) existe = true;
   }

   rs.close();

   return existe;
}

Não entendi o porquê do getTimeInMilis() e o porquê do uso de try/catch, sendo que você já tá lançando a exceção na declaração do método… Mas testa aí pra ver o que dá!

M

Falaeu camarada obrigado novamente. Vou chegar no trabalho e testar. Sobre meu outro problema acho que achei a solução. Tentei ontem mas ainda não consegui acredito que pra vc seja fácil eu teria que montar 2 listas 1 com os dados que já estão no banco como as mensalidades pagas adiantado a outra lista seria com os dados que serão inseridos como as mensalidades a serem cadastradas depois eu usaria o método romoveall da útil list assim eu removeria de uma lista oq já contem na outra. Aí eu adicionaria esta lista e não mensalidade como eu passo pela action para o dão. Fiz ontem não deu nenhuma exception nem erro porém não adiciona as mensalidades que ainda não foram cadastradas chegando no trabalho eu posto o Codigo. Sds

M

tai as classes… diz que esta conectando, mas nao grava nada no banco, minha intenção é: criar uma lista com os pagamentos que ja existem no banco, e criar uma lista dos pagamentos que serao gerados automaticamente, com isso eu utilizo o metoco removeall do arraylist para remover da lista de mensalidades que serao geradas, as mensalidades que ja foram geradas, com isso eu posso gerar a cobranca no mes, mas para os clientes que ja pagaram adiantado alguns meses, nao sera cobrado novamente.

GeraMensalidadesAction:

public class GeraMensalidadesAction {
	private Mensalidade mensalidade;
	private String mensagemErro;
	private List<Mensalidade> mensalidadesPagar;
	private List<Mensalidade> mensalidadesPagas;
	private String mesreferencia;
	private String anoreferencia;
	
	@Action(value="geraMensalidades", results= {
			@Result(name="ok", type="redirectAction", params= {"actionName", "listaMensalidadesAtrasadas"}),
			@Result(name="naook", location="/jsp/gerarMensalidades.jsp")

			
		})
	
		public String execute() throws Exception {
		//VerificadorDAO dao = new VerificadorDAO();
		//if (dao.existeMensalidade(mensalidade)) {
			//JOptionPane.showMessageDialog(null, "ERRO!! Não é possivel gerar cobranças duplicadas!! estas mensalidades já foram geradas!");
			//mensagemErro = "ERRO!! Não é possivel gerar cobranças duplicadas!! estas mensalidades já foram geradas";
			//return "naook";
		//} else {
		mensalidadesPagas = new VerificaPagamentosDAO().mensalidadesPagas(mensalidade); 
		mensalidadesPagar = new VerificaPagamentosDAO().mensalidadesPagar(mensalidade);
		
		if (mensalidadesPagar.removeAll(mensalidadesPagas)) {
			new GeraMensalidadesDAO().gerarMensalidades(mensalidade, mensalidadesPagar);
			return "ok";
		} else {
			return "naook";
		}
		
	}
	//}
		
		
	public Mensalidade getMensalidade() {
		return mensalidade;
	}

	public void setMensalidade(Mensalidade mensalidade) {
		this.mensalidade = mensalidade;
	}

	public String getMensagemErro() {
		return mensagemErro;
	}

	public void setMensagemErro(String mensagemErro) {
		this.mensagemErro = mensagemErro;
	}
	
	

}

VerificaPagamentosDAO:

ublic class VerificaPagamentosDAO {
	private final Connection connection;

	public VerificaPagamentosDAO() {
		try {
			connection = new ConnectionFactory().getConnection();
		} catch (SQLException e) {
			throw new RuntimeException(e);
		}
	}
	
	public List<Mensalidade> mensalidadesPagas(Mensalidade mensalidade) {
		try {
			List<Mensalidade> mensalidades = new ArrayList<Mensalidade>();
			PreparedStatement stmt = this.connection.prepareStatement("select ID_CLIENTE, MATRICULA_CLI, NOMECOMPLETO_CLI, MESREFERENCIA, ANOREFERENCIA FROM TB_TB_MENSALIDADE WHERE MESREFERENCIA = ? AND ANOREFERENCIA = ?");
			stmt.setString(1, mensalidade.getMesreferencia());
			stmt.setString(2, mensalidade.getAnoreferencia());
			ResultSet rs = stmt.executeQuery();
			
			while(rs.next()) {  
				mensalidades.add(populaContato(rs));
			}
			
			rs.close();   
			stmt.close();   
			  
			return mensalidades;   
		} catch (SQLException e) {   
			throw new RuntimeException(e);   
			}   
	}  
		
	private Mensalidade populaContato(ResultSet rs) throws SQLException {
		Mensalidade mensalidade = new Mensalidade();
		mensalidade.setId_cliente(rs.getInt("ID_CLIENTE"));
		mensalidade.setMatricula_cli(rs.getInt("MATRICULA_CLI"));
		mensalidade.setNomecompleto_cli(rs.getString("NOMECOMPLETO_CLI"));
		mensalidade.setMesreferencia(rs.getString("MESREFERENCIA"));
		mensalidade.setAnoreferencia(rs.getString("ANOREFERENCIA"));
		return mensalidade;
	}
	
	
		
	public List<Mensalidade> mensalidadesPagar(Mensalidade mensalidadesPagar) {
		try {
			List<Mensalidade> mensalidadesPagar1 = new ArrayList<Mensalidade>();
			
			mensalidadesPagar1.add(populaContato2());
			    
				return mensalidadesPagar1;   
			} catch (SQLException e) {   
				throw new RuntimeException(e);   
				}   
		}  
		
	
	private Mensalidade populaContato2() throws SQLException {
		
       	
		Mensalidade mensalidade = new Mensalidade();
		
		mensalidade.getDt_pagamento();
		mensalidade.getMesreferencia();
		mensalidade.getAnoreferencia();
		
		return mensalidade;
}
}

GeraMensalidadesDAO:

public class GeraMensalidadesDAO {
	
     
	    public void gerarMensalidades(Mensalidade mensalidade, List<Mensalidade> mensalidadesPagar) throws Exception    
	    {    
	         Connection conn = new ConnectionFactory().getConnection();
	        	         
	 		//Pega o nome do mes e seta o valor na coluna mesref no banco
	         if(mensalidade.getMesreferencia().equals("JANEIRO")) {
	 			mensalidade.setMesref(1);
	 		} else if
	 		(mensalidade.getMesreferencia().equals("FEVEREIRO")) {
	 			mensalidade.setMesref(2);
	 		} else if
	 		(mensalidade.getMesreferencia().equals("MARÇO")) {
	 			mensalidade.setMesref(3);
	 		} else if 
	 		(mensalidade.getMesreferencia().equals("ABRIL")) {
	 		 	mensalidade.setMesref(4);
	 		} else if
	 		(mensalidade.getMesreferencia().equals("MAIO")) {
	 				mensalidade.setMesref(5);
	 		} else if
	 		(mensalidade.getMesreferencia().equals("JUNHO")) {
	 			mensalidade.setMesref(6);
	 		} else if
	 		(mensalidade.getMesreferencia().equals("JULHO")) {
	 			mensalidade.setMesref(7);
	 		} else if
	 		(mensalidade.getMesreferencia().equals("AGOSTO")) {
	 			mensalidade.setMesref(8);
	 		} else if
	 		(mensalidade.getMesreferencia().equals("SETEMBRO")) {
	 			mensalidade.setMesref(9);
	 		} else if
	 		(mensalidade.getMesreferencia().equals("OUTUBRO")) {
	 			mensalidade.setMesref(10);
	 		} else if
	 		(mensalidade.getMesreferencia().equals("NOVEMBRO")) {
	 			mensalidade.setMesref(11);
	 		} else if
	 		(mensalidade.getMesreferencia().equals("DEZEMBRO")) {
	 			mensalidade.setMesref(12);			
	 		}
	         
	        
	         String query = "Select ID_CLIENTE, MATRICULA, NOMECOMPLETO From TB_TB_CONTATO Order By MATRICULA";    
	         PreparedStatement pstm = conn.prepareStatement(query);    
	         ResultSet rs = pstm.executeQuery();    
	        
	         if ( rs != null )    
	         {     
	            while ( rs.next() )    
	            {    
	               String queryMensalidade = "Insert Into TB_TB_MENSALIDADE (ID_CLIENTE, MATRICULA_CLI, NOMECOMPLETO_CLI, REFMES, MESREFERENCIA, ANOREFERENCIA, DT_CADASTRO, PAGAMENTOOK) Values (?, ?, ?, ?, ?, ?, ?, ?)";    
	               PreparedStatement stmt = conn.prepareStatement(queryMensalidade);    
	                   stmt.setInt(1, rs.getInt("Id_Cliente"));  
	                   stmt.setInt(2, rs.getInt("Matricula"));  
	                   stmt.setString(3, rs.getString("NomeCompleto"));
	                   stmt.setInt(4, mensalidade.getMesref());
	                   stmt.setString(5, mensalidade.getMesreferencia());
	                   stmt.setString(6, mensalidade.getAnoreferencia());
	                   stmt.setDate(7,  new Date(mensalidade.getDt_cadastro().getTimeInMillis()));
	                   stmt.setInt(8, mensalidade.getPagamentook());
	               stmt.execute();    
	            }    
	         }    
	         rs.close();    
	    }   
	
	
	
	 public List<Contato> guardaPagamentos() throws Exception  
	{  
	   Connection conn = new ConnectionFactory().getConnection();  
	  
	   String query = "Select c.ID_CLIENTE, c.MATRICULA, c.NOMECOMPLETO from TB_TB_CONTATO c INNER JOIN TB_TB_MENSALIDADES m WHERE m.MESREFERENCIA =? AND m.ANOREFERENCIA =? AND c.ID_CLIENTE = m.ID_CLIENTE";  
	   PreparedStatement pstm = conn.prepareStatement(query);  
	   ResultSet rs = pstm.executeQuery();  
	     
	   List<Contato> pagamentos = null;  
	   if ( rs != null )  
	   {  
	       pagamentos = new ArrayList<Contato>();  
	       while ( rs.next() )  
	       {  
	          Contato contato = new Contato();
	          contato.setMensalidade(new Mensalidade());
	          
	          contato.setId_contato(rs.getInt("ID_CLIENTE"));
	          contato.setMatricula(rs.getInt("MATRICULA"));
	          contato.setNomecompleto(rs.getString("NOMECOMPLETO"));
	          contato.getMensalidade().setMesreferencia(rs.getString("MESREFERENCIA"));
	          contato.getMensalidade().setAnoreferencia(rs.getString("ANOREFERENCIA"));
	    	  pagamentos.add(contato);
	          //Mensalidade mensalidade = new Mensalidade();  
	         // mensalidade.setCampo1(/*...*/);  
	         // mensalidade.setCampo2(/*...*/);  
	         // mensalidade.setCampo3(/*...*/);  
	         // mensalidades.add(mensalidade);  
	       }  
	   }  
	  
	   rs.close();  
	   return pagamentos;  
	}  
}
M

olha oq acontece agora, ontem eu gerei o pagamento…

só tinha o cliente Leandro cadastrado no banco, entao eu gerei a mensalidade de setembro normalmente, se eu gerar na mesma data nao deixa, pois ja acertei isso no sistema, porem hoje eu cliquei em gerar mensalidade para testar denovo e novamente gerou a mensalidade para leandro no mes de setembro, se leandro ja tivesse pago a mensalidade de setembro, iria gerar cobranca denovo.

Matrícula Nome Completo Mes Ano
1107 LEANDRO MOUZER BRITO SETEMBRO 2010
1107 LEANDRO MOUZER BRITO SETEMBRO 2010
123 Aurea SETEMBRO 2010

M

alguem??

Criado 14 de setembro de 2010
Ultima resposta 19 de set. de 2010
Respostas 26
Participantes 3