É uma boa prática ou uma solução viavel?

Gente,

novamente referindo ao software de bar que estou fazendo… Eu tinha feito o seguinte, me digam se é uma boa prática:

No meu objeto “Produto” criei dois atributos para me ajudar a fazer relatórios… Eis os atributos:

int quantidadeVendida; //cada vez que vender, incrementa
double quantidadeVendidaDinheiro; //cada vez que vende, adicionava o seu preço

Para que que eu fiz isso? Saber quantos itens foram vendidos do produto X … Tanto em quantidade quanto em valor…
Por exemplo,

Se um “pão de queijo” custa R$1,00 … e eu vender 12 itens em um dia… as variaveis ficariam assim:

quantidadeVendida = 12; quantidadeVendidaDinheiro = 12.00

Isso ficaria guardado no banco de dados (cuja nao implementei ainda, na verdade estou totalmente perdido… mas tudo bem)…

Acham isso uma boa prática? Ou deve ser feito de outra maneira ?

Provavelmente vocês vão falar para criar vínculos entre Produtos e Pedidos… Porem no meu software funciona da seguinte maneira:

Objeto mesa:
-Lista de Produtos
-Numero da mesa
-Total [dos produtos consumidos]

… No banco eu penso em colocar a data, para futuramente fazer relatorios do tipo:
Dia X a mesa Y realizou tantas vendas…

Porém acho isso dificil, pois na mesma data, varias pessoas vão sentar, consumir e fechar a conta na mesma mesa…
Então to meio perdido quanto a isso…

Iai,
qual a opinião de vcs?

Amigo, já fiz um sistema com algo parecido… No caso era para motel.
Um motel tem muitos quartos e cada quarto e ocupado várias vezes ao dia… durante essa ocupação existe consumo… também necessitava de relatório, por quarto, por periodo… etc.

Sugiro que você faça assim:

O bar têm várias mesas cadastradas. Cada mesa vai ter várias ocupações (no mesmo dia ou não. Nesse ponto entra a data).
Cada ocupação vai ter um consumo. O consumo consiste em N produtos, consumidos X vezes, gera um total Y.

Deu para entender?

Com base nas ocupações vai ser possivel você extrair o relatório que mencionou.

Abraços.

[quote=gilvan.sfilho]Amigo, já fiz um sistema com algo parecido… No caso era para motel.
Um motel tem muitos quartos e cada quarto e ocupado várias vezes ao dia… durante essa ocupação existe consumo… também necessitava de relatório, por quarto, por periodo… etc.

Sugiro que você faça assim:

O bar têm várias mesas cadastradas. Cada mesa vai ter várias ocupações (no mesmo dia ou não. Nesse ponto entra a data).
Cada ocupação vai ter um consumo. O consumo consiste em N produtos, consumidos X vezes, gera um total Y.

Deu para entender?

Com base nas ocupações vai ser possivel você extrair o relatório que mencionou.

Abraços.[/quote]

permuta detected hehe

Não entendi…

Mas a ideia é essa

qual a chave primaria do se uqaurto ?

Ahn? a chave primaria do quarto? não entendi o motivo da pergunta …
Amigo, o quarto é uma entidade com chave primeira do tipo long, auto incremental, como a maioria das classes.

A questão é: para tirar os relatórios você precisa armazenar as informações em algum canto. Por isso entra a ocupação.

Sendo que 1 quarto pode ter N ocupações. Você vai tirar os relatórios a partir das ocupações cadastradas no sistema.
Na ocupação (entidade) vai ficar data, hora, itens consumidos, garçom responsável pelo mesa… etc. =)

Quando você quizer saber o movimento de determinado dia, basta buscar no banco pelas ocupações com o dia desejado.
Daria para saber a rotatividade de cada mesa também, etc…

Abraços =)))

[quote=gilvan.sfilho]Ahn? a chave primaria do quarto? não entendi o motivo da pergunta …
Amigo, o quarto é uma entidade com chave primeira do tipo long, auto incremental, como a maioria das classes.

A questão é: para tirar os relatórios você precisa armazenar as informações em algum canto. Por isso entra a ocupação.

Sendo que 1 quarto pode ter N ocupações. Você vai tirar os relatórios a partir das ocupações cadastradas no sistema.
Na ocupação (entidade) vai ficar data, hora, itens consumidos, garçom responsável pelo mesa… etc. =)

Quando você quizer saber o movimento de determinado dia, basta buscar no banco pelas ocupações com o dia desejado.
Daria para saber a rotatividade de cada mesa também, etc…

Abraços =)))[/quote]

realmente eu fiz a pergunta errada…

Tipo, as ocupações tem chave primaria?
Data e Hora ? é isso?

ai vc pesquisa no relatorio todas as ocupações da data x
é isso?
obrigado por me ajudar cara,
esta sendo muito util!
vlw msmo

detalhe a tabela Quarto (no meu caso a tabela Mesa) vai ter quais atributos?

Numero,
“Ocupação” ?

Sugestão:
Crie uma tabela de Vendas. Cada venda terá um código, uma data, uma mesa e um cliente.

Depois crie uma tabela de ItensConsumidos. Cada registro da tabela associará uma venda a um produto. Dessa forma, cada linha terá o código da venda, o código do produto e a quantidade comprada.

Note que a tabela de ItensConsumidos serviria de intermédio para a relação muitos-para-muitos entre Vendas e Produtos.

Fala d34d_d3v1l ,

então cara, quando implementei fiz assim
Os quartos (no seu caso mesa) tinha chave primaria , long, auto incremento…
As ocupações também, cada ocupação com um id único.

Desta forma, uma mesa vai ter um conjunto de ocupações, isso pode ser feito colocando na entidade mesa um artributo List,
que guardará todas as ocupações de determinada mesa. (hibernate faz isso tranquilo)

A data e hora não utilizei como chave primaria não… mas armazei elas na ocupacao.

A sugestão que o marcobiscaro2112 deu é interessante. Inclusive utilizei algo bem parecido com o que ele falou, não mencionei aqui por que não era o foco.
Enfim, acredito que suas classes irão fica algo do tipo:

Mesa.java

Long id;
int numero; //numero da mesa, pode ser o mesmo do id, ai nao tem necessidade desse atributo
List<Ocupacao> ocupacoes; //Lista de ocupacoes dessa mesa

Ocupacao.java

Long id;
Mesa mesa; //A qual mesa essa ocupacao se refere
Date data; //Armazena data e hora da ocupacao
List<ItemConsumo> itens; //Lista dos itens que foram consumidos nessa ocupacao

ItemConsumo.java

Long id;
Ocupacao ocupacao; //Indica de onde veio o consumo, de qual ocupação.
Produto produto; //Uma classe para representar o produto
int quantidadeConsumida; //armazena quanto do produto definido foi consumido
float total; //Indica o total de item de consumo. No caso sera quantidadeConsumida * preço do produto.

Produto.java

Long id;
String nome;
float preco;
List<ItemConsumo> itens; //Diz quais itens de consumo utilizaram este produto

Acho que algo desse tipo ai cara, lembrando que fiz algo para que funcione no hibernate. Não sei se ta tdo certinho pq digitei direto aqui no editor do forum.

OBS: o valor armazenado no itemConsumido é importante pois guardara o valor do produto no dia que o mesmo foi vendido. Desta forma, caso o valor do produto mude, o relatoria ira mostrar a realidade. Aconteceu um problema comigo quanto a isso. Eu calculava o valor da venda com base no preco do produto que tava armazenado no banco… Desta forma, se o valor do produto mudasse os relatorios tambem mudavam, ficando consequentemente tudo errado.

marcobiscaro2112, acho que data, mesa pode ser puxado direto do relacionamento, no caso a ocupacao. Então não tem por que armazenar a data e a mesa tanto na ocupação como na venda. Caso use hibernate não vejo também a necessidade de criar a entidade venda, pode ser feito direto utilizando itemConsumido.

Quando fiz o sistema para o motel não conhecia o hibernate, ai sim utilizei venda, pois não tinha como mapear.

Abraços…

Isso ai acredito que não vai mais ser necessário,
pois com base no que ja foi dito do topico voce vai poder puxar a quantidade consumida de acordo com a data ou periodo que voce especificar.
Ai consequentemente tera tambem o valor em reais do consumo.

Abraços

Veja minha classe Mesa:

ArrayList<Produto> prod = new ArrayList<Produto>(); private double total; private int i,j; private int numero_Mesa;

Guarda isso ai na mente que eu já comento…

Cara eu nao queria usar o Hibernate na minha aplicação, por isso não queria armazenar objetos no banco de dados…
Queria trabalhar com tabelas mesmo… queria fazer isso para aprender mais sobre sql… e vai ser util para mim em outras situações…

entãoo, não tem como eu fugir da ocupação, pois é através dela q vou gerar relatorios (correto?)… entao teria que ficar:

private int numero_Mesa;
ArrayList<Ocupacao> ocup = new ArrayList<Ocupacao>();

Tranquilo…
minha classe de ocupação:

private int id;
Date data;
ArrayList<Produto> prod = new ArrayList<Produto>();

resolveram 90% do meu problema… E agora, como transformar isso em tbelas?

[quote=gilvan.sfilho]

marcobiscaro2112, acho que data, mesa pode ser puxado direto do relacionamento, no caso a ocupacao. Então não tem por que armazenar a data e a mesa tanto na ocupação como na venda.[/quote]
De fato, se a data estiver em alguma outra tabela, não há porque duplicar este dado.

Quando disse que cada venda tem uma data, mesa e cliente, não considerei que a utilização de uma tabela de ocupação. No caso, pensei em relacionar diretamente o cliente, com a mesa na qual ele sentou e quando ocorreu isso (ou seja, os dados da ocupação ficariam nessa mesma tabela).

Na hora de gerar o relatório, poderia ser feita uma consulta na tabela de vendas, filtrando pelo número da mesa específica. Com isso é possível saber quantos clientes passaram por aquela mesa em determinado dia, o valor total acumulado por mesa, etc.

Acho que antes respondermos isso, seria interessante termos uma visão geral de como seu sistema está. Você poderia fazer um diagrama UML de classes e postar aqui?

Isso vai permitir sugerir melhorias tanto no código quanto na parte do banco de dados posteriormente.

ta ae

no caso nao fiz as modificações que deveria … criar outra classe “Ocupação” e tal

[quote=d34d_d3v1l ]Cara eu nao queria usar o Hibernate na minha aplicação, por isso não queria armazenar objetos no banco de dados…
Queria trabalhar com tabelas mesmo… queria fazer isso para aprender mais sobre sql… e vai ser util para mim em outras situações… [/quote]

Amigo, sinceramente… armazenar objetos em bancos de dados relacional sem usar uma tecnologia ORM não acho uma boa não.
A forma como os dados são represetados é muito diferente, isso gera N problemas. Ai a dor de cabeça vai ser do desenvolvedor de ficar buscando soluções para “transformar” em objetos dados armazenados de “forma relacional”.

Acho interessante você querer aprender mais sobre SQL mesmo, mas isso pode ser feito direto no console do SQL…
Ou você implementar isso em sistemas apenas para aprendizado.

Não recomendo usar em um sistema que provavelmente você vendará para clientes. Como disse, vai dar dor de cabeça no futuro.

Entendi o que você está dizendo. Então, o que eu estou chamando de ocupação você está chamando de venda… =) ambos terão mesa e uma forma de guardar o que foi consumido.

[quote=marcobiscaro2112]Acho que antes respondermos isso, seria interessante termos uma visão geral de como seu sistema está. Você poderia fazer um diagrama UML de classes e postar aqui?

Isso vai permitir sugerir melhorias tanto no código quanto na parte do banco de dados posteriormente.[/quote]

Concordo com você amigo… =)

bom… como vcs podem ter visto,

eu controlo o estoque do produto como uma variavel imbutida nele…

DEVERIA fazer o mesmo para saber quanto daquele item foi vendido ? por exemplo:

int quantidadeVendida;

?

outra coisa, entendo que nao seria bom…
Mas posso transformar tudo que eu buscar no banco em objetos e vice e versa…
isso nao seria problema para mim…

Ainda sim, só falta imaginar como seria a tabela naquele esquema de

Mesa - Ocupação

abraços

Amigo, a quantidade vendida do produto não ficaria no proprio produto nao…
se nao vc nao teria como puxar os relatorios por data… etc…

Ficaria no caso relacionado a ocupacao, algo como uma tabela de venda com citou o outro nosso amigo aqui no post.
Eu vou procurar o esqma do banco de dados do sistema que fiz pro motel…
ai posto aqui algo de como ficaria o esquema

Mesa - Ocupacao - Vendas

abraços…

Amigo, faltou luz aqui… acabei pegando o tempo livre para desenhar um esquema de banco de dados que posso te ajudar.

http://www.brimg.info/uploads/1/27a7d9688d.jpg
OBS: a imagem está bem grande, por isso deixei apena so link para ser visualizado.

o desenha seria um “DER fulerinho”, rsrsrs =)
enquanto que as anotacoes abaixo seriam os campos das tabelas no banco.

Abraços

acho que este tópico ja esta mais do que fechado … e resolvido

obrigado a todos