Lançado Adianti Framework 8.1!
Clique aqui para saber mais
Como alterar valor de TLabel com base em dados do TMultifield? Olá pessoal. Tô precisando somar o campo total de um TMultifield e mostrar em uma Label que fica ao lado, conforme imagem em anexo. Como fazer pra que a cada item que for Registrado ou Excluído do TMultifield altere de forma dinâmica o valor no TLabel? ...
RC
Como alterar valor de TLabel com base em dados do TMultifield?  
Fechado
Olá pessoal.

Tô precisando somar o campo total de um TMultifield e mostrar em uma Label que fica ao lado, conforme imagem em anexo.

Como fazer pra que a cada item que for Registrado ou Excluído do TMultifield altere de forma dinâmica o valor no TLabel?

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 (3)


FV

Olá Ricelli, fiz algo parecido há pouco tempo usando js, poderia postar seu código?
RC

Olá Felipe Vicente

Segue meu código fonte

  1. <?php
  2. /**
  3.  * EntradaFormView Control
  4.  * @author  <Ricelli M. Carvalho>
  5.  */
  6. class EntradaFormView extends TPage {
  7.     protected $form;
  8.     private $valortotal;
  9.     function __construct() {
  10.         parent::__construct();
  11.         $this->form = new TForm('form_Entrada');
  12.         TScript::create('$(".tseekentry").keydown(function (e) {var code = null;
  13.         code = (e.keyCode ? e.keyCode : e.which);                
  14.         return (code = 9) ? false : true;
  15.         });');
  16.         $this->form->class 'tform';
  17.         $table = new TTable;
  18.         $table->style 'width: 100%';
  19.         $table->addRowSet(new TLabel('Entrada de produtos'), '''''')->class 'tformtitle';
  20.         $this->form->add($table);
  21.         $frame_produtos = new TFrame(NULL495);
  22.         $frame_produtos->setLegend('Produtos');
  23.         $frame_produtos->style .= ';margin: 15px';
  24.         // create the form fields
  25.         $id = new THidden('id');
  26.         $dataentrada = new TDate('dataentrada');
  27.         $criteria = new TCriteria;
  28.         $criteria->setProperty('order''nomerazaosocial');
  29.         $fornecedor_id = new  ">TDBSeekButton('fornecedor_id''permission''form_Entrada''Fornecedor''nomerazaosocial''fornecedor_id''fornecedor_name'$criteria);
  30.         $fornecedor_name = new TEntry('fornecedor_name');
  31.         $tipoentrada_id = new TDBCombo('tipoentrada_id''permission''TipoEntrada''id''tipoentrada''tipoentrada');
  32.         $programa_id = new TDBCombo('programa_id''permission''Programa''id''programa''programa');
  33.         $numeronota = new TEntry('numeronotafiscal');
  34.         $datanotafiscal = new TDate('datanotafiscal');
  35.         $identificador = new TEntry('identificador');
  36.         $observacoes = new TText('observacoes');
  37.         //Informa se a entrada é manual ou não. Por default não é manual (é com nota fiscal)
  38.         $manual = new THidden('manual');
  39.         $criteriaItens = new TCriteria;
  40.         //$criteriaItens->add(new TFilter('tipo', '= ', 'P'));
  41.         $criteriaItens->setProperty('order''descricao');
  42.         // cria o multifield
  43.         $multifield_produtos = new TMultiField('produtos');
  44.         // cria os campos do multifield
  45.         $program_id = new  ">TDBSeekButton('produtos_id''permission''form_Entrada''Produto''descricao''produtos_id''produtos_name'$criteriaItens);
  46.         $program_name = new TEntry('produtos_name');
  47.         $quantidade = new TEntry('qtde');
  48.         $valor_unitario = new TEntry('valorunitario');
  49.         $total = new TEntry('total');
  50.         $valor_unitario->setExitAction(new TAction(array($this'onExitValorUnitario')));
  51.         //mascaras
  52.         $quantidade->setNumericMask(2',''.');
  53.         $valor_unitario->setNumericMask(2',''.');
  54.         $total->setNumericMask(2',''.');
  55.         $scroll = new TScroll;
  56.         $scroll->setSize(290230);
  57.         $frame_produtos->add($multifield_produtos);
  58.         // define the sizes       
  59.         $id->setSize(100);
  60.         $dataentrada->setSize(100);
  61.         $datanotafiscal->setSize(100);
  62.         $numeronota->setSize(125);
  63.         $identificador->setSize(425);
  64.         $observacoes->setSize(42590);
  65.         $fornecedor_id->setSize(50);
  66.         $fornecedor_name->setSize(350);
  67.         $tipoentrada_id->setSize(425);
  68.         $programa_id->setSize(425);
  69.         $multifield_produtos->setHeight(250);
  70.         // outros
  71.         $dataentrada->setMask('dd/mm/yyyy');
  72.         $datanotafiscal->setMask('dd/mm/yyyy');
  73.         $id->setEditable(false);
  74.         $fornecedor_name->setEditable(FALSE);
  75.         $program_name->setEditable(false);
  76.         $total->setEditable(FALSE);
  77.         // validations
  78.         $dataentrada->addValidation(('Data de entrada'), new TRequiredValidator);
  79.         $fornecedor_id->addValidation(('Fornecedor'), new TRequiredValidator);
  80.         $tipoentrada_id->addValidation(('Tipo de entrada'), new TRequiredValidator);
  81.         $programa_id->addValidation(('Programa'), new TRequiredValidator);
  82.         $numeronota->addValidation(('número da nota fiscal'), new TRequiredValidator);
  83.         $datanotafiscal->addValidation(('Data da nota fiscal'), new TRequiredValidator);
  84.         $program_id->setSize(50);
  85.         $program_name->setSize(300);
  86.         // configuracoes multifield
  87.         $multifield_produtos->setClass('Produto');
  88.         $multifield_produtos->addField('id''ID'$program_id50TRUE);
  89.         $multifield_produtos->addField('name''Produto'$program_name400);
  90.         $multifield_produtos->addField('qtde''Quantidade'$quantidade100TRUE);
  91.         //$multifield_produtos->addField('qtde', 'Quantidade', $this->formatQuantidade($quantidade), 100);
  92.         $multifield_produtos->addField('valorunitario''Valor Unitátio'$valor_unitario100TRUE);
  93.         $multifield_produtos->addField('total''Total'$total100);
  94.         $multifield_produtos->setOrientation('vertical');
  95.         // add a row for the field id
  96.         $table->addRowSet(new TLabel(''), $id);
  97.         $table->addRowSet(new TLabel('<font color="red">* </font>Data da entrada' ': '), $dataentrada);
  98.         $table->addRowSet(new TLabel('<font color="red">* </font>Fornecedor' ': '), array($fornecedor_id$fornecedor_name));
  99.         $table->addRowSet(new TLabel('<font color="red">* </font>Tipo de entrada' ': '), $tipoentrada_id);
  100.         $table->addRowSet(new TLabel('<font color="red">* </font>Programa' ': '), $programa_id);
  101.         $table->addRowSet(new TLabel('<font color="red">* </font>Nota fiscal' ': '), $numeronota);
  102.         $table->addRowSet(new TLabel('<font color="red">* </font>Data da nota fiscal' ': '), $datanotafiscal);
  103.         $table->addRowSet(new TLabel('Identificador' ': '), $identificador);
  104.         $table->addRowSet(new TLabel('Observações' ': '), $observacoes);        
  105.         $row $table->addRow();
  106.         $cell $row->addCell($frame_produtos);
  107.         $cell->colspan 2;
  108.         
  109.          $this->valortotal = new TLabel('');
  110.         $this->valortotal->setFontStyle('b');
  111.         $table->addRowSet(new TLabel('Valor total dos itens' ': 14,45'), $this->valortotal);
  112.         
  113.         // create an action button (save)
  114.         $save_button = new TButton('save');
  115.         $save_button->setAction(new TAction(array($this'onSave')), _t('Save'));
  116.         $save_button->setImage('fa:floppy-o');
  117.         // create an new button (edit with no parameters)
  118.         $new_button = new TButton('new');
  119.         $new_button->setAction(new TAction(array($this'onEdit')), _t('New'));
  120.         $new_button->setImage('fa:plus-square green');
  121.         $list_button = new TButton('list');
  122.         $list_button->setAction(new TAction(array('EntradaDataGrid''onReload')), _t('Back to the listing'));
  123.         $list_button->setImage('fa:table blue');
  124.         // define the form fields
  125.         $this->form->setFields(array($id$dataentrada$fornecedor_id$tipoentrada_id$programa_id$fornecedor_name$numeronota$datanotafiscal$identificador$observacoes$manual$multifield_produtos$save_button$new_button$list_button));
  126.         $buttons = new THBox;
  127.         $buttons->add($save_button);
  128.         $buttons->add($new_button);
  129.         $buttons->add($list_button);
  130.         
  131.         $row $table->addRow();
  132.         $row->class 'tformaction';
  133.         $cell $row->addCell($buttons);
  134.         $cell->colspan 4;
  135.         $container = new TTable;
  136.         $container->style 'width: 80%';
  137.         $container->addRow()->addCell(new TXMLBreadCrumb('menu.xml''EntradaDataGrid'));
  138.         $container->addRow()->addCell($this->form);
  139.       
  140.         parent::add($container);
  141.     }
  142.     function onSave() {
  143.         try {
  144.             TTransaction::open('permission');
  145.             $object $this->form->getData('Entrada');
  146.             $repository = new TRepository('Entrada');
  147.             $criteria = new TCriteria;
  148.             $criteria->add(new TFilter('id''= '$object->id));
  149.             $entrada_existe $repository->load($criteria);
  150.             if ($entrada_existe) {
  151.                 $this->form->setData($object);
  152.                 TSeekButton::disableField('form_Entrada''produtos_id');
  153.                 TEntry::disableField('form_Entrada''produtos_program_name');
  154.                 TEntry::disableField('form_Entrada''produtos_qtde');
  155.                 TEntry::disableField('form_Entrada''produtos_valorunitario');
  156.                 new TMessage('info''Esta movimentação já foi salva. Portanto, não é possível alterá-lá.');
  157.             } else {
  158.                 $this->form->validate();
  159.                 if ($object->id) {
  160.                     $object->respalteracao TSession::getValue('username');
  161.                     $object->dataalteracao date("Y-m-d");
  162.                     $object->manual 'nao';
  163.                 } else {
  164.                     $object->datacadastro date("Y-m-d");
  165.                     $object->respcadastro TSession::getValue('username');
  166.                     $object->respalteracao TSession::getValue('username');
  167.                     $object->dataalteracao date("Y-m-d");
  168.                     $object->manual 'nao';
  169.                 }
  170.                 $object->dataentrada TDate::date2us($object->dataentrada);
  171.                 $object->datanotafiscal TDate::date2us($object->datanotafiscal);
  172.                 /* ----------------------------------------------------------------- */
  173.                 if ($object->produtos) {
  174.                     $object->store();
  175.                     new TMessage('info'TAdiantiCoreTranslator::translate('Record saved'));
  176.                 } else {
  177.                     new TMessage('error''Voce deve inserir pelo menos um produto na movimentação de entrada!');
  178.                 }
  179.                 /* ----------------------------------------------------------------- */
  180.                 $object->dataentrada TDate::date2br($object->dataentrada);
  181.                 $object->datanotafiscal TDate::date2br($object->datanotafiscal);
  182.                 $object->clearParts();
  183.                 if ($object->produtos) {
  184.                     //Se o tipo de entrada for servico não gera estoque
  185.                     if ($object->tipoentrada_id == '3') {
  186.                         foreach ($object->produtos as $servico) {
  187.                             $object->addServico($servico);
  188.                         }
  189.                     } else {
  190.                         foreach ($object->produtos as $prod) {
  191.                             $object->addProduto($prod);
  192.                         }
  193.                     }
  194. //                    foreach ($object->produtos as $prod) {
  195. //                        $object->addProduto($prod);
  196. //                    }
  197.                 }
  198.                 $this->form->setData($object);
  199.             }
  200.             TTransaction::close();
  201.         } catch (Exception $e) {
  202.             new TMessage('error'$e->getMessage());
  203.             TTransaction::rollback();
  204.         }
  205.     }
  206.     function onEdit($param) {
  207.         try {
  208.             if (isset($param['key'])) {
  209.                 $key $param['key'];
  210.                 TTransaction::open('permission');
  211.                 $repository = new TRepository('Entrada');
  212.                 $criteria = new TCriteria;
  213.                 $criteria->add(new TFilter('id''= '$key));
  214.                 $entrada_existe $repository->load($criteria);
  215.                 if ($entrada_existe) {
  216.                     TSeekButton::disableField('form_Entrada''produtos_id');
  217.                     TEntry::disableField('form_Entrada''produtos_program_name');
  218.                     TEntry::disableField('form_Entrada''produtos_qtde');
  219.                     TEntry::disableField('form_Entrada''produtos_valorunitario');
  220.                 }
  221.                 //Contém os dados do Formulário
  222.                 $object = new Entrada($key);
  223.                 $object->dataentrada TDate::date2br($object->dataentrada);
  224.                 $object->datanotafiscal TDate::date2br($object->datanotafiscal);
  225.                 //Contém os dados do TMultiField 
  226.                 $object->produtos $object->getProdutos();
  227.                 //var_dump($object->produtos); die();                
  228.                 $this->form->setData($object);
  229.                 TTransaction::close();
  230.             } else {
  231.                 $this->form->clear();
  232.             }
  233.         } catch (Exception $e) {
  234.             new TMessage('error'$e->getMessage());
  235.             TTransaction::rollback();
  236.         }
  237.     }
  238.     public static function onExitValorUnitario($param) {
  239.         $valorunitario str_replace(',''.'$param['produtos_valorunitario']);
  240.         $qte str_replace(',''.'$param['produtos_qtde']);
  241.         $total $qte $valorunitario;
  242.         $valortotal number_format($total2',''.');
  243.         $object = new StdClass;
  244.         $object->produtos_total $valortotal;
  245.         TForm::sendData('form_Entrada'$object);
  246.     }
  247. }
  248. ?>
</Ricelli>
PD

Ricelli,

Sugiro não usar TMultiField para coisas mais complexas.
O TMultiField é limitado e usado só para coisas bem simples.

Sugiro usar TDataGrid com dados em sessão, como nesse exemplo:
www.adianti.com.br/framework_files/tutor/index.php?class=POSFormView

Aqui tem um exemplo com soma:
www.adianti.com.br/framework_files/tutor/index.php?class=CheckoutFor

Se você quiser continuar com TMultifield, terás de usar Javascript na mão para efetuar os cálculos.

Att,
Pablo