Movimento caixa em Java com hibernate, mysql e JSF

Olá pessoal, td bem??

Estou tentando desenvolver um sistema web com um movimento caixa… o problema é que nunca usei expressões matemáticas e nunca criei nada do tipo… to meio perdido e precisando de ajuda…

bom, eu já comecei idealizando que eu devo ter 2 tabelas: movimentacaoFinanceira e lancamento

eu acho tb, que na tabela de movimentacaofinanceira devem haver os seguintes campos (vou colocar em java pra ver se facilita pra eu entender as posteriores explicacoes):

[code]@Entity
@Table(name = “movimento”)
public class MovimentoFinanceiro {

@Id
@GeneratedValue
@Column(name = "id_movimentofinanceiro")
private Long id;

@Column(name = "data_movimento")
private Date data_movimento;

@OneToMany(mappedBy = "movimento", fetch = FetchType.LAZY)
@Cascade(org.hibernate.annotations.CascadeType.ALL)
private List<Lancamento> lancamentos = new ArrayList<Lancamento>();

//deveria ter alguma variavel para receber um cálculo aqui???
[/code]

e na tabela de lancamento:

[code]@Entity
@Table(name = “lancamento”)
public class Lancamento {

@Id
@GeneratedValue
@Column(name = "id_lancamento")
private Long id;

@Column(name = "descricao")
private String descricao;

@Column(name = "valor")
private Double valor;

@Column(name = "tipo_entrada")
private Boolean tipo_entrada;

@Column(name = "tipo_saida")
private Boolean tipo_saida;

@ManyToOne(cascade = javax.persistence.CascadeType.ALL)
@JoinColumn(name = "id_movimento")
private MovimentoFinanceiro movimentofinanceiro;[/code]

Ae pessoal, empaquei aqui… alguma sugestão?? Acho q é uma dúvida comum para a maioria dos iniciantes em java…

Flws pessoal!!!
Jesus é o Senhor!!!

Bem, acho que seria uma boa você dar uma breve “aula” sobre movimento caixa, pois não tenho a menor idéia da teoria envolvida aí, rsrs… daí sim podemos tentar ajudar em alguma coisa… :smiley:

PO marcelao, blz!!! vamos a aula!!! :stuck_out_tongue:

o movimento caixa nada mais é do que uma simples movimentaçao financeira diária de uma empresa. por exemplo uma tabela com as seguintes colunas e exemplos:

ITEM | DESCRICAO MOVIMENTO | ENTRADA | SAÍDA | SALDO PARCIAL

1 | RECEBIMENTO PGTO CLIENTE | 3.000,00 | - | 3.000,00
2 | PAGAMENTO DE ENERGIA ELETR | - | 500,00 | 2.500,00
3 | PAGAMENTO FUNCIONARIO | - | 1.000,00 | 1.500,00
4 | RECEBIMENTO PGTO CLIENTE | 5.000,00 | - | 6.500,00
SALDO FINAL =================================| 6.500,00

Seria mais ou menos isso, dá pra entender a lógica??

Valeu amigao.

E voce gostaria de ter um atributo que seria o “saldo”, correto?

Voce pode utilizar a annotation @Formula() e como parâmetro passar um SQL fazendo a soma dos valores de entrada e saída, pra depois subtrair e tirar o saldo. Algo como:

@Formula(" ( (select sum(valor) from Lancamento where tipo_entrada=true) - (select sum(valor) from Lancamento where tipo_saida=true) ) ") private Double saldo;

Algo assim…

[quote=marcelo.bellissimo]E voce gostaria de ter um atributo que seria o “saldo”, correto?

Voce pode utilizar a annotation @Formula() e como parâmetro passar um SQL fazendo a soma dos valores de entrada e saída, pra depois subtrair e tirar o saldo. Algo como:

@Formula(" ( (select sum(valor) from Lancamento where tipo_entrada=true) - (select sum(valor) from Lancamento where tipo_saida=true) ) ") private Double saldo;

Algo assim…[/quote]

Isso mano, é uma parada mais ou menos essa mesmo q preciso!! Vou testar e te falo depois.

Valeu

No caso, como eu mudei os tipos booleans da classe, passei para string para usar o radio buton, ficou assim:

@Column(name = "saldo") @Formula(" ( (select sum(valor) from lancamento where tipolancamento=Entrada) - (select sum(valor) from lancamento where tipolancamento=Saida) ) ") private Double saldo;
Mas, deu esse erro:

Caused by: com.mysql.jdbc.exceptions.MySQLSyntaxErrorException: Unknown column 'this_.valor' in 'field list' at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:936) at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:2985) at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1631) at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:1723) at com.mysql.jdbc.Connection.execSQL(Connection.java:3256) at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1313) at com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:1448) at com.mchange.v2.c3p0.impl.NewProxyPreparedStatement.executeQuery(NewProxyPreparedStatement.java:76) at org.hibernate.jdbc.AbstractBatcher.getResultSet(AbstractBatcher.java:186) at org.hibernate.loader.Loader.getResultSet(Loader.java:1787) at org.hibernate.loader.Loader.doQuery(Loader.java:674) at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:236) at org.hibernate.loader.Loader.doList(Loader.java:2220)

Se precisar q eu poste a classe é só falar.

Valeu.


Kleber, só uma crítica, positiva... o erro aqui está bem claro, mas pelo jeito você não soube interpretar ou ler o erro, talvez por não saber ler muito bem em inglês, creio eu... fica uma dica, estude bastante, faça um cursinho, pois nessa área tem que manjar mesmo de inglês... 

Mas vamos lá, o erro diz que a coluna mapeada pelo atributo "valor"  (this_.valor) é desconhecida (unknown)... verifique o seu mapeamento, e certifique-se de que esse campo realmente exista na tabela...

Ah, outra coisa, o HQL, que você está usando, é case sensitive até onde eu me lembro, então preste muita atenção nos nomes que você usa na Query... "lancamento" , "tipolancamento", "valor"... esses nomes devem "bater" com os nomes dos atributos mapeados na sua classe... tenho quase certeza que o "lancamento" vai dar pau, pois sua classe deve se chamar "Lancamento" com L maiusculo se você seguiu as convenções do Java... mas testa aí e fala o resultado !  :thumbup:

Kleber, só uma crítica, positiva… o erro aqui está bem claro, mas pelo jeito você não soube interpretar ou ler o erro, talvez por não saber ler muito bem em inglês, creio eu… fica uma dica, estude bastante, faça um cursinho, pois nessa área tem que manjar mesmo de inglês…

Mas vamos lá, o erro diz que a coluna mapeada pelo atributo “valor” (this_.valor) é desconhecida (unknown)… verifique o seu mapeamento, e certifique-se de que esse campo realmente exista na tabela…

Ah, outra coisa, o HQL, que você está usando, é case sensitive até onde eu me lembro, então preste muita atenção nos nomes que você usa na Query… “lancamento” , “tipolancamento”, “valor”… esses nomes devem “bater” com os nomes dos atributos mapeados na sua classe… tenho quase certeza que o “lancamento” vai dar pau, pois sua classe deve se chamar “Lancamento” com L maiusculo se você seguiu as convenções do Java… mas testa aí e fala o resultado ! :thumbup:

[quote=marcelo.bellissimo]Caused by: com.mysql.jdbc.exceptions.MySQLSyntaxErrorException: Unknown column 'this_.valor' in 'field list'

Kleber, só uma crítica, positiva… o erro aqui está bem claro, mas pelo jeito você não soube interpretar ou ler o erro, talvez por não saber ler muito bem em inglês, creio eu… fica uma dica, estude bastante, faça um cursinho, pois nessa área tem que manjar mesmo de inglês…

Mas vamos lá, o erro diz que a coluna mapeada pelo atributo “valor” (this_.valor) é desconhecida (unknown)… verifique o seu mapeamento, e certifique-se de que esse campo realmente exista na tabela…

Ah, outra coisa, o HQL, que você está usando, é case sensitive até onde eu me lembro, então preste muita atenção nos nomes que você usa na Query… “lancamento” , “tipolancamento”, “valor”… esses nomes devem “bater” com os nomes dos atributos mapeados na sua classe… tenho quase certeza que o “lancamento” vai dar pau, pois sua classe deve se chamar “Lancamento” com L maiusculo se você seguiu as convenções do Java… mas testa aí e fala o resultado ! :thumbup: [/quote]

Marcelão, obrigado pela dica… mas eu já tinha verificado esse erro… e sim, meu inglês técnico é razoavel. Dá pra desenrrolar… antes de postar isso, eu verifiquei esse campo na minha tabela e ele existe. Também verifiquei o caso do Case Sensitive, tanto q o que o colega postou estava com a primeira letra em maiúscula e eu fiz as correçoes necessárias… verifiquei tb que na minha tabela financeiro, apesar de ter o atributo:

o referido campo não foi criado na tabela ao rodar o geraTabela…, aí tive de criar manualmente, mas mesmo assim o erro persiste…

Agradeço as dicas e as críticas positivas.

Flws.

Bom pessoal, descobri o pq do ultimo erro q postei:
A anotação @Formula estava retirando o campo Double “saldo” da minha tabela. Então, eu tirei a anotação e testei o SQL no phpmyadmin, pra ver se estava ok.

A consulta:

Funciona perfeitamente, já a consulta recomendada pelo amigo marcelo, não funcionou…
Olhei na net em vários sites, e a consulta sugerida pelo colega parece estar correta… estou tentando achar na documentação do MySQL a origem do erro,

O erro que me aparece de síntese é esse:

Ainda estou lendo sobre o erro… mas se algum colegar puder apontá-lo, agradeço.

Ótimo feriadão a todos!!

Cara no meu projeto a formula funciona assim:

minha classe toda:

package br.com.sansoftware.model;

import java.io.Serializable;
import java.util.Date;
import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;

import org.hibernate.annotations.Formula;


@Entity
public class Contract implements Serializable {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	@Id
	@GeneratedValue
	private Long id;
	private String number;
	private Date start;
	private Long duration;
	private Integer pay;
	private Double amount;
	private Boolean current;
	private  String contractorText;

	@Formula(value = "(select sum(t.amount) from Contract t)")
	private Double amountSun;

	
	
	@OneToMany(mappedBy="contract",cascade = {CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REMOVE}, fetch=FetchType.EAGER )
	private List<Cashin> cashin;//	
	
	public List<Cashin> getCashin() {
		return cashin;
	}
	public void setCashin(List<Cashin> cashin) {
		this.cashin = cashin;
	}
	@ManyToOne(fetch=FetchType.EAGER )
	private Client client;

	
	
	
	
	
	
	
	@Override
	public String toString() {
		return "Contract" + this.getNumber() ;
	}
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((client == null) ? 0 : client.hashCode());
		result = prime * result + ((id == null) ? 0 : id.hashCode());
		return result;
	}
	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Contract other = (Contract) obj;
		if (client == null) {
			if (other.client != null)
				return false;
		} else if (!client.equals(other.client))
			return false;
		if (id == null) {
			if (other.id != null)
				return false;
		} else if (!id.equals(other.id))
			return false;
		return true;
	}
	public Long getId() {
		return id;
	}
	public void setId(Long id) {
		this.id = id;
	}
	public String getNumber() {
		return number;
	}
	public void setNumber(String number) {
		this.number = number;
	}
	public Date getStart() {
		return start;
	}
	public void setStart(Date start) {
		this.start = start;
	}
	public Long getDuration() {
		return duration;
	}
	public void setDuration(Long duration) {
		this.duration = duration;
	}
	public Integer getPay() {
		return pay;
	}
	public void setPay(Integer pay) {
		this.pay = pay;
	}
	public Double getAmount() {
		return amount;
	}
	public void setAmount(Double amount) {
		this.amount = amount;
	}
	public Client getClient() {
		return client;
	}
	public void setClient(Client client) {
		this.client = client;
	}
	public String getEquipment() {
		return Equipment;
	}
	public void setEquipment(String equipment) {
		Equipment = equipment;
	}
	public Integer getQuantityEquipment() {
		return quantityEquipment;
	}
	public void setQuantityEquipment(Integer quantityEquipment) {
		this.quantityEquipment = quantityEquipment;
	}
	private String Equipment;
	private Integer quantityEquipment;
	
	public String getContractorText() {
		return contractorText;
	}
	public void setContractorText(String contractorText) {
		this.contractorText = contractorText;
	}
	public Boolean getCurrent() {
		return current;
	}
	public void setCurrent(Boolean current) {
		this.current = current;
	}
	public Double getAmountSun() {
		return amountSun;
	}
	public void setAmountSun(Double amountSun) {
		this.amountSun = amountSun;
	}

	
}


Olá pessoal, td bem?

Passei mto tempo parado sem trabalhar com java, por causa da faculdade… ultimo semestre, TCC… hehehe normal! :smiley:
Então voltei pra essa questão, e estou só corrigindo o erro da síntase SQL comentada acima: faltou o SELECT no começo. Ficaria assim:

Depois que eu fizer as implementaçoes necessarias aqui no java, inclusive segundo recomendaçoes do amigo lucianotome, eu posto aqui.

Valeu pessoal.

[quote=lucianotome]Cara no meu projeto a formula funciona assim:

minha classe toda:
…[/quote]

Olá lucianotome, td bem?
cara, me explica uma coisa: pq tu tens as variaveis amount e amountSun? o amountSun é um campo do seu banco de dados ou ele só é instanciado na classe??

Valeu.

Pessoal, resolvi o problema parcialmente…
a sintax correta ficou assim:

@Formula(value = "(select (select sum(v.valor) from lancamento v where v.tipolancamento ='entrada') - (select sum(v.valor) from lancamento v where v.tipolancamento ='saida') ) ") @Column(name = "saldo") private Double saldo;

O problema é q apesar de aparecer na minha lista, nao está gravando no banco…
alguma sugestão?

Valeu pessoal.

Eae, alguem??