AM
Ajuda! Relacionamento One to One (Um para Um)
Fechado
Preciso fazer um relacionamento um para um,
tenho uma tabela de produtos e essa tabela precisa de outra tabela de estoque.
Um PRODUTO precisa de um Estoque, estou com dificuldades para fazer,
no Eloquent ORM tem o método
Como não consegui achar esse método no adianti framework eu fiz uma improvisação
e deu certo até agora, porém com muitas linhas de códigos.
tenho uma tabela de produtos e essa tabela precisa de outra tabela de estoque.
Um PRODUTO precisa de um Estoque, estou com dificuldades para fazer,
no Eloquent ORM tem o método
- <?php $this->hasOne('Estoque'); ?>
Como não consegui achar esse método no adianti framework eu fiz uma improvisação
e deu certo até agora, porém com muitas linhas de códigos.
- <?php
- class Produto extends TRecord
- {
- const TABLENAME = 'produto';
- const PRIMARYKEY= 'id';
- const IDPOLICY = 'max'; // {max, serial}
- use SystemChangeLogTrait;
- private $estoque;
- public function get_estoque()
- {
- if (empty($this->estoque))
- {
- $criteria = new TCriteria;
- $criteria->add(new TFilter('produto_id', '=', $this->id));
- $estoque = new TRepository('Estoque');
- $estoque = $estoque->load($criteria);
- if ($estoque)
- {
- foreach ($estoque as $produto)
- {
- $this->estoque = $produto;
- }
- }
- else
- {
- $this->estoque = new Estoque();
- $this->estoque->produto_id = $this->id;
- }
- }
- return $this->estoque;
- }
- public function get_estoque_quantidade()
- {
- if (empty($this->estoque))
- {
- $criteria = new TCriteria;
- $criteria->add(new TFilter('produto_id', '=', $this->id));
- $estoque = new TRepository('Estoque');
- $estoque = $estoque->load($criteria);
-
- foreach ($estoque as $produto)
- {
- $this->estoque = $produto;
- }
- if (!$estoque)
- {
- return 'Sem Estoque';
- }
- }
- return $this->estoque->quantidade;
- }
- public function set_estoque_quantidade($quantidade)
- {
- if (empty($this->estoque))
- {
- $criteria = new TCriteria;
- $criteria->add(new TFilter('produto_id', '=', $this->id));
- $estoque = new TRepository('Estoque');
- $estoque = $estoque->load($criteria);
- if($estoque)
- {
- foreach ($estoque as $produto)
- {
- $this->estoque = $produto;
- if ($this->estoque->quantidade > $quantidade)
- {
- $total = ($this->estoque->quantidade - $quantidade);
- $this->estoque->total_entrada -= $total;
- }
- if ($this->estoque->quantidade < $quantidade)
- {
- $total = ($quantidade - $this->estoque->quantidade);
- $this->estoque->total_entrada += $total;
- }
- $this->estoque->quantidade = $quantidade;
- $this->estoque->data_up = date('Y-m-d H-i-s');
- $this->estoque->store();
- }
- }
- else
- {
- $produto = new Estoque();
- $produto->produto_id = $this->id;
- $this->estoque = $produto;
- $this->estoque->quantidade = $quantidade;
- $this->estoque->total_entrada = $quantidade;
- $this->estoque->data_up = date('Y-m-d H-i-s');
- $this->estoque->store();
- }
-
- }
- return $this->estoque->quantidade;
- }
- ?>
Amigo, desculpa.... mas você esta tentando via sistema controlar o seu estoque??
Este tipo de relacionamento as "Regras de Negocio" deve ficar no BD independente de qual seja este.
O sistema deve apenas apresentar o resultado, para isso existem no BD as Foreign Key que lhe vai garantir que só existirá estoque
de produtos cadastrados, as Procedures para garantir as movimentações em Estoque e N... Views para lhe apresentar o resultado.
E tudo isso com total integridade dos dados.
Vendeu - Chama a procedure para fazer a Baixa
Comprou - Chama a procedure para fazer a inclusão
X........ - Chama a procedure ......................
E ainda de quebra você pode criar uma tabela de "MOVIMENTAÇÕES DE ESTOQUE", assim vc terá um log de tudo que entrou ou saiu
do Estoque.
Tabela - Produto
Tabela - Estoque
Tabela - Movimentações Estoque...
Espero ter ajudado.
Abraços
Sim estou via sistema controlando meu estoque... (esta funcionando)
Ok vou estudar esse procedure, me ajudou sim. Não sabia disso.
Já tenho registros de estoque... Entrada, saída, cancelamento, reposição, inventario, giro de estoque, recuperação, balanço e tudo mais...
As regras de negócio até que estou mandando bem e tudo esta funcionando. Esse sistema esta implantado em produção, para uma empresa fabricante de tintas e revestimentos acrílicos, com geração de lote de produção e tudo mais. Também utilizo o FPDF para geração de etiquetas auto-adesivas com código de barras.
Minha preocupação são os padrões de projetos, será que estou fazendo o relacionamento 1 para 1 da forma correta nesse sistema, teria um padrão ou uma outra forma.
Em relação a regra de negócio já tenho as tabelas...
Tabela -Estoque
Tabela -Movimentação de Estoque
Tabela -Log de estoque
Tabela -Giro de Estoque (Com informações diferentes de Movimentação de estoque).
Acima desse Modelo tenho um Service layer que utiliza esse modelo com outras regras de negócios mais complexas como por exemplo enviar um e-mail sempre que o estoque de
X produtos estiverem baixos.
Muito Obrigado pela ajuda!!! Vou estudar Foreign Key e Procedure.
Se alguém ai tiver mais alguma sugestão eu agradeço muito. Até mais.
Anderson,
Quando falamos de "Regra de Negocio" significa que toda a integridade e relacionamento entre tabelas devem ser feitas via BD.
Quando tentamos passar isso para o Sistema temos varias fatores negativos:
1) Perda de Performasse..
2) Integridade
3) Qualidade
4) X......
Um exemplo prático, no seu caso de 1X1, as Foreign Key tratariam disso sem que você cria-se dezenas ou centenas de linhas de código.
As Procedures, são "programas" criados dentro do BD para fazer determinadas tarefas, (Inclusões, Exclusões, Updates, Contagens, Calculos) juntos ou separados, e uma infinidade
de outros, isto tudo dentro do banco de dados, já com garantias no minimo de 3 itens acima.
Um exemplo prático dentro do seu sistema, seria a Entrada em Estoque, entrou um item a Procedure (X) se encarregaria de fazer a Inclusão no Estoque, Movimentação, Log, e Giro de Estoque, Email e
o sistema só precisaria passar para esta alguns parâmetros, como o Código do Produto e a quantidade que está entrando, lógico que na sua forma mais simples.
Tente imaginar a quantidade de linhas que você deixaria de incluir no seu sistema.
Procure na Internet manuais e estude sobre o BD que você está usando, garanto a você que mais tarde irá dar risadas do teu POST.
OBS: Não estou aqui falando que seu POST é uma piada, mas sim o quanto você irá aprender e entender que sofreu tanto e tinha uma forma tão mais simples de resolver.
Detalhe, todos nos já passamos por isso... (KKKK)
Abraços
Valew Marco tudo que sei de programação web é via internet então as vezes a gente passa por uns caminhos cheios de pedras.
O importante é melhorar o código a cada dia, agora sim intendi seu post. Dei uma estudada hoje e realmente é muito mais simples.
Porém vou implantar nos próximos sistemas, esse vou deixar assim rsrs...
Abraços.
A integridade entre as tabelas são garantidas com as Foreign Key (Chaves-Estrangeiras). Abaixo vou detalhar algumas coisas:
As Foreign Key são criadas nas tabelas Filhas em relação ao Pai,
Ex:
Produto - Tabela Pai
Estoque - Tabela Filha
Movimentação de Estoque - Filha
Assim nas tabela Filhas irão ser criadas as Foreign Key, através da ligação do código de Produto com a Tabela Pai (Produto)
As Foreign Key tem duas ações onUPDATE e onDELETE e nestes voce define se vai ser NOACTION ou CASCATE
O que isso significa !!!
Simples, vamos supor que na tabela Estoque voce criou uma FK (Foreign Key) onde onDELETE
atribuiu como CASCATE e na tabela Movimentação como NOACTION.
Pergunta: O que acontece se você excluir um PRODUTO (Pai) ??
Simples, o atributo da FK onDELETE irá dicidir em cada tabela Filha o que vai acontecer, onde você determinou que é CASCATE
o BD irá EXCLUIR todos os lançamentos na tabela FILHA relacionados ao PRODUTO excluído.
No caso da Tabela Movimentação nada irá acontecer porque você deixou o atributo como NOACTION, ou seja Sem Ação.
Alem disso a FK garante que só serão CADASTRADOS nas Tabelas Filhas os Produtos que existirem na Tabela Produto (Pai)
Isso também serve para onUPDATE, ou seja, tudo que mudar no Pai reflete nas Filhas.
Qualquer duvida posta aqui, que a gente "tenta" ajudar, afinal não somos donos da verdade.
Abraços
Excelente tópico, realmente esse tipo de regra deve ficar a cargo do BD. Uma das poucas desvantagens, é na hora de migrar de banco.
Marcp AR Campos, vc teria um exemplo de estrutura de tabelas ?
Danilo, boa noite,
Primeiro hoje já não existe muito dificuldade para a migração já que a maioria dos BD tem ferramentas para isso e outra que a padronização do SQL está muito mais uniforme.
Segundo que tabelas você esta falando, ( Produto, Estoque e movimentação), se for, antes de desenvolver tem que saber o que seu cliente quer e o que vai controlar, e ai montar um diagrama.
Depois tem que saber qual o BD vai usar e somente por final criar as tabelas.
No caso das 3 tabelas acima você pode procurar por sistemas gratuitos de "CONTROLE DE ESTOQUE", ou sobre o assunto na internet que você terá um vasto material.
Infelizmente eu não tenho nada sobre
Abraços;
Boa noite Marco,
Pergunto isso para evitar redundância de info, meu sistema desktop tem uma tab que contem todas as operações das tabelas detalhes de entrada e saída; mas vejo redundância... gostaria d eliminar isso nessa nova etapa.
Realmente as triggers e demais procedimentos armazenados no sgdb são de fácil duplicação. O trabalho maior seria definir as regras de negócios..
vlw.
Infelizmente Danilo eu não tenho nada de Estoque, ou seja não tenho nenhum Sistema.
Agora se quiser uma ajuda, manda para min "marcoarcampos@gmail.com" o modelo das tabelas que vc tem e vejo no que posso te ajudar
e logico o BD que vc vai usar.
Eu aconselho vc alugar um host, sugiro o LOCAWEB, assim podemos falar a mesma língua, e desenvolver em cima do MySQL.
Abraços;