Lançado Adianti Framework 7.6!
Clique aqui para saber mais
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

Pacotão Dominando o Adianti Framework 7
O material mais completo de treinamento do Framework.
Curso em vídeo aulas + Livro completo + Códigos fontes do projeto ERPHouse.
Conteúdo Atualizado! Versão 7.4


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


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


</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.                 
  12.                 // run query
  13.                 $resultEntreda $conn->query('SELECT SUM (qtd_movimento) FROM estoque_movimento WHERE tipo_movimento="E"');
  14.                 
  15.                 TTransaction::close(); // close transaction 
  16.             
  17.             catch (Exception $e
  18.             { 
  19.                 new TMessage('error'$e->getMessage()); 
  20.             } 
  21.         }
  22.     }?>


  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.                 
  12.                 // run query
  13.                 $resultSaida $conn->query('SELECT SUM (qtd_movimento) FROM estoque_movimento WHERE tipo_movimento="S"');
  14.                 
  15.                 TTransaction::close(); // close transaction 
  16.             
  17.             catch (Exception $e
  18.             { 
  19.                 new TMessage('error'$e->getMessage()); 
  20.             } 
  21.         }
  22.     }?>
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.     
  19.     public static function getSumSaida($crit=null)
  20.     {
  21.         $sql = new TSqlSelect;
  22.         $sql->addColumn("SUM(tipo_movimento)");
  23.         $sql->setEntity(self::EstoqueMovimento);
  24.         // assign the criteria to the SELECT statement
  25.         $sql->setCriteria($crit);
  26.         $conn TTransaction::get();
  27.         $result$conn-> query($sql->getInstruction());
  28.         if ($result)
  29.         {
  30.             $row $result->fetch();
  31.         }
  32.         // returns the result
  33.         return $row[0];
  34.     }
  35. ?>


$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?