sobre o estoque Boa Tarde estimados Programadores do adianti e outros. Venho por esta mensagem pedir um help sobre com relação ao fazer a gestão do estoque num projecto de compra e venda. Exemplo: quando cadastro um producto então vou a tabela estoque para adicionar as quantidades, logo,quando eu vendo deve diminuar a quantidade no estoque do produto vendido. Alguém aí pode por favor me enviar qual é ...
JP
sobre o estoque  

Boa Tarde estimados Programadores do adianti e outros.
Venho por esta mensagem pedir um help sobre com relação ao fazer a gestão do estoque num projecto de compra e venda.
Exemplo: quando cadastro um producto então vou a tabela estoque para adicionar as quantidades, logo,quando eu vendo deve diminuar a quantidade no estoque do produto vendido.
Alguém aí pode por favor me enviar qual é a função ou procedimento para fazer isto?
desde já aguardo a resposta pelo meu email: jose.afonso.paulino@gma

Curso Dominando o Adianti Framework

O material mais completo de treinamento do Framework.
Curso em vídeo aulas + Livro completo + Códigos fontes do projeto ERPHouse.
Conteúdo Atualizado!


Dominando o Adianti Framework Quero me inscrever agora!

Comentários (13)


FC

Em sua tabela de estoque o campo quantidade não deve existir (ele deve ser calculado) de outra tabela ex: "tabela_movimento" deve funcionar igual extrato de banco ex:

tabela_movimento
Produto_id
1
DataMovimento
19/02/2019 12:32
TipoMovimento
Entrada
Quantidade
2

Produto_id
1
DataMovimento
20/02/2019 12:32
TipoMovimento
Saida
Quantidade
2

Depois o campo quantidade do estoque deve ser a "matemática", que seria a soma com agrupamentos do "produto_id" por tipo de movimento.

Espero ter ajudado.

RA

Cortez, fiz dessa forma, criei uma tabela para cadastrar o produto no estoque e outra para movimentar o produto no estoque (entrada/saída). Como faço para somar todos os produtos por tipo de movimento e realizar a matemática na coluna do datagrid?

 
  1. <?php
  2. /**
  3. * EstoqueForm Form
  4. * @author <your name here>
  5. */
  6. class EstoqueForm extends TPage
  7. {
  8. protected $form; // form
  9. /**
  10. * Form constructor
  11. * @param $param Request
  12. */
  13. public function __construct( $param )
  14. {
  15. parent::__construct();
  16. // creates the form
  17. $this->form = new BootstrapFormBuilder('form_Estoque');
  18. $this->form->setFormTitle('Cadastrar Produtos no Estoque');
  19. // create the form fields
  20. $id = new TEntry('id');
  21. $descricao = new TEntry('descricao');
  22. $qtd_estoque = new TEntry('qtd_estoque');
  23. $unidade_medida_id = new TDBCombo('unidade_medida_id', 'projeto', 'UnidadesMedida', 'id', 'nome');
  24. $observacao = new TEntry('observacao');
  25. $qtd_estoque->setNumericMask(2, ',', '.', True);
  26. // add the fields
  27. $this->form->addFields( [ new TLabel('Id') ], [ $id ] );
  28. $this->form->addFields( [ new TLabel('Descricao') ], [ $descricao ] );
  29. $this->form->addFields( [ new TLabel('Qtd Estoque') ], [ $qtd_estoque ] );
  30. $this->form->addFields( [ new TLabel('Unidade Medida Id') ], [ $unidade_medida_id ] );
  31. $this->form->addFields( [ new TLabel('Observacao') ], [ $observacao ] );
  32. // set sizes
  33. $id->setSize('100%');
  34. $descricao->setSize('100%');
  35. $qtd_estoque->setSize('100%');
  36. $unidade_medida_id->setSize('100%');
  37. $observacao->setSize('100%');
  38. if (!empty($id))
  39. {
  40. $id->setEditable(FALSE);
  41. }
  42. /** samples
  43. $fieldX->addValidation( 'Field X', new TRequiredValidator ); // add validation
  44. $fieldX->setSize( '100%' ); // set size
  45. **/
  46. // create the form actions
  47. $btn = $this->form->addAction(_t('Save'), new TAction([$this, 'onSave']), 'fa:floppy-o');
  48. $btn->class = 'btn btn-sm btn-primary';
  49. $this->form->addAction(_t('New'), new TAction([$this, 'onEdit']), 'fa:eraser red');
  50. // vertical box container
  51. $container = new TVBox;
  52. $container->style = 'width: 90%';
  53. // $container->add(new TXMLBreadCrumb('menu.xml', __CLASS__));
  54. $container->add($this->form);
  55. parent::add($container);
  56. }
  57. /**
  58. * Save form data
  59. * @param $param Request
  60. */
  61. public function onSave( $param )
  62. {
  63. try
  64. {
  65. TTransaction::open('projeto'); // open a transaction
  66. /**
  67. // Enable Debug logger for SQL operations inside the transaction
  68. TTransaction::setLogger(new TLoggerSTD); // standard output
  69. TTransaction::setLogger(new TLoggerTXT('log.txt')); // file
  70. **/
  71. $this->form->validate(); // validate form data
  72. $data = $this->form->getData(); // get form data as array
  73. $object = new Estoque; // create an empty object
  74. $object->fromArray( (array) $data); // load the object with data
  75. $object->store(); // save the object
  76. // get the generated id
  77. $data->id = $object->id;
  78. $this->form->setData($data); // fill form data
  79. TTransaction::close(); // close the transaction
  80. new TMessage('info', TAdiantiCoreTranslator::translate('Record saved'));
  81. }
  82. catch (Exception $e) // in case of exception
  83. {
  84. new TMessage('error', $e->getMessage()); // shows the exception error message
  85. $this->form->setData( $this->form->getData() ); // keep form data
  86. TTransaction::rollback(); // undo all pending operations
  87. }
  88. }
  89. /**
  90. * Clear form data
  91. * @param $param Request
  92. */
  93. public function onClear( $param )
  94. {
  95. $this->form->clear(TRUE);
  96. }
  97. /**
  98. * Load object to form data
  99. * @param $param Request
  100. */
  101. public function onEdit( $param )
  102. {
  103. try
  104. {
  105. if (isset($param['key']))
  106. {
  107. $key = $param['key']; // get the parameter $key
  108. TTransaction::open('projeto'); // open a transaction
  109. $object = new Estoque($key); // instantiates the Active Record
  110. $this->form->setData($object); // fill the form
  111. TTransaction::close(); // close the transaction
  112. }
  113. else
  114. {
  115. $this->form->clear(TRUE);
  116. }
  117. }
  118. catch (Exception $e) // in case of exception
  119. {
  120. new TMessage('error', $e->getMessage()); // shows the exception error message
  121. TTransaction::rollback(); // undo all pending operations
  122. }
  123. }
  124. }?>


 
  1. <?php
  2. /**
  3. * EstoqueMovimentoForm Form
  4. * @author <your name here>
  5. */
  6. class EstoqueMovimentoForm extends TPage
  7. {
  8. protected $form; // form
  9. /**
  10. * Form constructor
  11. * @param $param Request
  12. */
  13. public function __construct( $param )
  14. {
  15. parent::__construct();
  16. // creates the form
  17. $this->form = new BootstrapFormBuilder('form_EstoqueMovimento');
  18. $this->form->setFormTitle('Movimentar Produtos do Estoque');
  19. // create the form fields
  20. $id = new THidden('id');
  21. $estoque_id = new TDBUniqueSearch('estoque_id', 'projeto', 'Estoque', 'id', 'descricao');
  22. $data_movimento = new TDate('data_movimento');
  23. $tipo_movimento = new TCombo('tipo_movimento');
  24. $qtd_movimento = new TEntry('qtd_movimento');
  25. $tipo_movimento->addItems( array('E' => 'Entrada', 'S' => 'Saída') );
  26. $qtd_movimento->setNumericMask(2, ',', '.', True);
  27. // add the fields
  28. $this->form->addFields( [ $id ] );
  29. $this->form->addFields( [ new TLabel('Descrição') ], [ $estoque_id ] );
  30. $this->form->addFields( [ new TLabel('Data do Movimento') ], [ $data_movimento ] );
  31. $this->form->addFields( [ new TLabel('Tipo de Movimento') ], [ $tipo_movimento ] );
  32. $this->form->addFields( [ new TLabel('Qtd do Movimento') ], [ $qtd_movimento ] );
  33. //$id->addValidation('Id', new TRequiredValidator);
  34. //$estoque_id->addValidation('Estoque Id', new TRequiredValidator);
  35. //$data_movimento->addValidation('Data Movimento', new TRequiredValidator);
  36. // set sizes
  37. $id->setSize('100%');
  38. $estoque_id->setSize('100%');
  39. $data_movimento->setSize('100%');
  40. $tipo_movimento->setSize('100%');
  41. $qtd_movimento->setSize('100%');
  42. if (!empty($id))
  43. {
  44. $id->setEditable(FALSE);
  45. }
  46. /** samples
  47. $fieldX->addValidation( 'Field X', new TRequiredValidator ); // add validation
  48. $fieldX->setSize( '100%' ); // set size
  49. **/
  50. // create the form actions
  51. $btn = $this->form->addAction(_t('Save'), new TAction([$this, 'onSave']), 'fa:floppy-o');
  52. $btn->class = 'btn btn-sm btn-primary';
  53. $this->form->addAction(_t('New'), new TAction([$this, 'onEdit']), 'fa:eraser red');
  54. $this->form->addAction( _t('Back'), new TAction(array('EstoqueMovimentoList','onReload')), 'fa:arrow-circle-o-left blue');
  55. // vertical box container
  56. $container = new TVBox;
  57. $container->style = 'width: 90%';
  58. // $container->add(new TXMLBreadCrumb('menu.xml', __CLASS__));
  59. $container->add($this->form);
  60. parent::add($container);
  61. }
  62. /**
  63. * Save form data
  64. * @param $param Request
  65. */
  66. public function onSave( $param )
  67. {
  68. try
  69. {
  70. TTransaction::open('projeto'); // open a transaction
  71. /**
  72. // Enable Debug logger for SQL operations inside the transaction
  73. TTransaction::setLogger(new TLoggerSTD); // standard output
  74. TTransaction::setLogger(new TLoggerTXT('log.txt')); // file
  75. **/
  76. $this->form->validate(); // validate form data
  77. $data = $this->form->getData(); // get form data as array
  78. $object = new EstoqueMovimento; // create an empty object
  79. $object->fromArray( (array) $data); // load the object with data
  80. $object->store(); // save the object
  81. // get the generated id
  82. $data->id = $object->id;
  83. $this->form->setData($data); // fill form data
  84. TTransaction::close(); // close the transaction
  85. new TMessage('info', TAdiantiCoreTranslator::translate('Record saved'));
  86. }
  87. catch (Exception $e) // in case of exception
  88. {
  89. new TMessage('error', $e->getMessage()); // shows the exception error message
  90. $this->form->setData( $this->form->getData() ); // keep form data
  91. TTransaction::rollback(); // undo all pending operations
  92. }
  93. }
  94. /**
  95. * Clear form data
  96. * @param $param Request
  97. */
  98. public function onClear( $param )
  99. {
  100. $this->form->clear(TRUE);
  101. }
  102. /**
  103. * Load object to form data
  104. * @param $param Request
  105. */
  106. public function onEdit( $param )
  107. {
  108. try
  109. {
  110. if (isset($param['key']))
  111. {
  112. $key = $param['key']; // get the parameter $key
  113. TTransaction::open('projeto'); // open a transaction
  114. $object = new EstoqueMovimento($key); // instantiates the Active Record
  115. $this->form->setData($object); // fill the form
  116. TTransaction::close(); // close the transaction
  117. }
  118. else
  119. {
  120. $this->form->clear(TRUE);
  121. }
  122. }
  123. catch (Exception $e) // in case of exception
  124. {
  125. new TMessage('error', $e->getMessage()); // shows the exception error message
  126. TTransaction::rollback(); // undo all pending operations
  127. }
  128. }
  129. }?>


</your></your>
FC

Usa uma view com a função sum e group by assim vc deixa o trabalho pesado para o banco de dados.
RA

Sim, minha ideia é essa mesmo, colocar o datagrid na listagem de produtos e informar a quantidade do estoque. Mas como eu faço para buscar os valores na tabela movimento?
FC

Então vc cria uma view no banco de dados e cria a model e a listagem a partir dela.

no banco se vc fizer algo parecido com isso:

Select tbl_material.nome_material, sum(tbl_movimento.quantidade) from tbl_material, tbl_movimento group by tbl_movimento.tipo

Tenta ai
RA

Criei duas funções, soma entrada e soma saída, utilizando um exemplo do tutor, fiz certo?

public static function getValorEntrada( $params )
{
if( !empty($params['id']) )
{
parent::__construct();
try
{
TTransaction::open('projeto'); // open transaction
$conn = TTransaction::get(); // get PDO connection

// run query
$resultEntreda = $conn->query('SELECT SUM (qtd_movimento) FROM estoque_movimento WHERE tipo_movimento="E"');

TTransaction::close(); // close transaction
}
catch (Exception $e)
{
new TMessage('error', $e->getMessage());
}
}
}?>

public static function getValorSaida( $params )
{
if( !empty($params['id']) )
{
parent::__construct();
try
{
TTransaction::open('projeto'); // open transaction
$conn = TTransaction::get(); // get PDO connection

// run query
$resultSaida = $conn->query('SELECT SUM (qtd_movimento) FROM estoque_movimento WHERE tipo_movimento="S"');

TTransaction::close(); // close transaction
}
catch (Exception $e)
{
new TMessage('error', $e->getMessage());
}
}
}?>
RA

Foi sem formatação...

 
  1. <?php
  2. public static function getValorEntrada( $params )
  3. {
  4. if( !empty($params['id']) )
  5. {
  6. parent::__construct();
  7. try
  8. {
  9. TTransaction::open('projeto'); // open transaction
  10. $conn = TTransaction::get(); // get PDO connection
  11. // run query
  12. $resultEntreda = $conn->query('SELECT SUM (qtd_movimento) FROM estoque_movimento WHERE tipo_movimento="E"');
  13. TTransaction::close(); // close transaction
  14. }
  15. catch (Exception $e)
  16. {
  17. new TMessage('error', $e->getMessage());
  18. }
  19. }
  20. }?>


 
  1. <?php
  2. public static function getValorSaida( $params )
  3. {
  4. if( !empty($params['id']) )
  5. {
  6. parent::__construct();
  7. try
  8. {
  9. TTransaction::open('projeto'); // open transaction
  10. $conn = TTransaction::get(); // get PDO connection
  11. // run query
  12. $resultSaida = $conn->query('SELECT SUM (qtd_movimento) FROM estoque_movimento WHERE tipo_movimento="S"');
  13. TTransaction::close(); // close transaction
  14. }
  15. catch (Exception $e)
  16. {
  17. new TMessage('error', $e->getMessage());
  18. }
  19. }
  20. }?>
FC

Rafael

Você está tendo muito trabalho sem necessidade todo o calculo matemático pode ser feito pelo banco (e deve) assim vc economiza seu servidor salva sua "query" com sua matemática depois usa ela como se fosse uma tabela normal, entendeu?
RA

Entendi, mas estou procurando por exemplos e não acho, como sou novo no framework fico um pouco perdido sem uma orientação, nos exemplos que tem disponível os cálculos são feitos de forma mais simples, até tenho um datagrid com subtotal e total geral (fiz pelo exemplo do Pablo), mas dessa forma agora não achei nada... :(
RA

Felipe, criei no model duas funções, abaixo. Depois criei dois critérios, abaixo. Como faço agora para pegar essas duas funções e gerar o resultado final do estoque?

 
  1. <?php
  2. public static function getSumEntrada($crit=null)
  3. {
  4. $sql = new TSqlSelect;
  5. $sql->addColumn("SUM(tipo_movimento)");
  6. $sql->setEntity(self::EstoqueMovimento);
  7. // assign the criteria to the SELECT statement
  8. $sql->setCriteria($crit);
  9. $conn = TTransaction::get();
  10. $result= $conn-> query($sql->getInstruction());
  11. if ($result)
  12. {
  13. $row = $result->fetch();
  14. }
  15. // returns the result
  16. return $row[0];
  17. }
  18. public static function getSumSaida($crit=null)
  19. {
  20. $sql = new TSqlSelect;
  21. $sql->addColumn("SUM(tipo_movimento)");
  22. $sql->setEntity(self::EstoqueMovimento);
  23. // assign the criteria to the SELECT statement
  24. $sql->setCriteria($crit);
  25. $conn = TTransaction::get();
  26. $result= $conn-> query($sql->getInstruction());
  27. if ($result)
  28. {
  29. $row = $result->fetch();
  30. }
  31. // returns the result
  32. return $row[0];
  33. }
  34. ?>


$criteria_Entrada = new TCriteria;
$criteria_Entrada->add(new TFilter('detail_tipo_movimento', '=', 'Entrada'));
$criteria_Saida = new TCriteria;
$criteria_Saida->add(new TFilter('detail_tipo_movimento', '=', 'Saída'));
FC

Olá Rafael ainda brigando com seu estoque?

Você criou a tabela movimento e vc quer consultar seu estoque certo?

Pode me enviar como está sua tabela por e-mail para eu montar um exemplo para vc.

felipecortez.fgc@gmail.com

Abraços
RA

Felipe, amanhã logo cedo lhe envio. Creio que seja uma coisa bem simples de fazer, mas voltei para esse tópico em meu projeto e não achei nada no fórum sobre isso mais detalhado, somente algumas postagens que não me ajudou muito. Acho que aprendendo a fazer isso devo ter mais conhecimento para outras atividades dentro do projeto, porque as coisas são bem parecidas. Muito obrigado pela ajuda.
DR

Prezados,

estou com a mesma dificuldade, como ficou o final?

Poderiam colocar aqui o exemplo?