Atualizar campos automático em cálculos Olá a todos. Eu criei um formulário de vendas, fiz os cálculos tudo certinho, e esta funcionando tudo de boa. Porem eu preciso ficar clicando várias vezes nos campos onde são calculados para ir atualizando o até chegar no valor correto. Teria alguma forma de fazer esta atualização automática sem precisar ficar indo e voltando clicando nos campos várias vezes, ou mesmo um botão ...
VE
Atualizar campos automático em cálculos  
Olá a todos.

Eu criei um formulário de vendas, fiz os cálculos tudo certinho, e esta funcionando tudo de boa.

Porem eu preciso ficar clicando várias vezes nos campos onde são calculados para ir atualizando o até chegar no valor correto.

Teria alguma forma de fazer esta atualização automática sem precisar ficar indo e voltando clicando nos campos várias vezes, ou mesmo um botão para depois do formulário preenchido ele atualizar todos os campos, antes de salvar.

Desde já agradeço a atenção de todos que puderem me ajudar

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)


FP

Amigo sempre faco assim
 
  1. <?php
  2. public static function onExitmil($param)
  3. {
  4. $valor = (double) PMaskFormate::reais_to_decimal($param['valor']);
  5. $bruto = (double) PMaskFormate::reais_to_decimal($param['bruto']);
  6. $teor = (double) PMaskFormate::reais_to_decimal($param['teor']);
  7. $mil = (double) PMaskFormate::reais_to_decimal($param['mil']);
  8. $fino = 0;
  9. if ($param['tipomoeda'] == 'D')
  10. {
  11. if (($valor > 0) and ($mil > 0))
  12. {
  13. $fino = $valor / $mil;//number_format(($valor / $mil), 2, ',', '.');
  14. $teor = 0;
  15. $bruto = 0;
  16. $fino = PMaskFormate::formata_valor($fino);
  17. $obj = new StdClass; //esse camarada aqui e o segredo
  18. $obj->fino = $fino; //aqui passo os dados para o objeto tentry
  19. TForm::sendData('form_LancamentoCliente', $obj); //aqui devolve os dados para o formulario
  20. }
  21. else exit;
  22. }
  23. else
  24. {
  25. if (($bruto > 0) and ($teor > 0) and ($mil > 0))
  26. {
  27. $fino = ($bruto * $teor) / 100;
  28. $valor = ($fino * $mil);
  29. $valor = PMaskFormate::formata_valor($valor);
  30. $fino = PMaskFormate::formata_valor($fino);
  31. $obj = new StdClass; //esse camarada aqui e o segredo
  32. $obj->valor = $valor; //alimenta o tentry
  33. $obj->fino = $fino; //alimenta o tentry
  34. TForm::sendData('form_LancamentoCliente', $obj); //atualiza os componentes no formulario
  35. }
  36. else exit;
  37. }
  38. }
  39. ?>
VE

Olha o meu código como está! os calculos estão tudo certo, mais tenho que ficar clicando em todos os campos um monte de vez para atualizar os valores, queria criar um botão, ou algo do tipo para atualizar só colocando os valores para ser cálculado, e não precisar ficar clicando nos campos dos resultados.

 
  1. <?php
  2. /**
  3. * VendasForm Form
  4. * @author <your name here>
  5. */
  6. class VendasForm 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 TQuickForm('form_Vendas');
  18. $this->form->class = 'tform'; // change CSS class
  19. $this->form->style = 'display: table;width:100%'; // change style
  20. // define the form title
  21. $this->form->setFormTitle('Vendas');
  22. // create the form fields
  23. $id = new TEntry('id');
  24. $data_venda = new TDate('data_venda');
  25. $plp = new TEntry('plp');
  26. $codigo = new TEntry('codigo');
  27. $produto = new TEntry('produto');
  28. $valor = new TEntry('valor');
  29. $tipo_anuncio = new TCombo('tipo_anuncio');
  30. $frete = new TEntry('frete');
  31. $taxa_ml = new TEntry('taxa_ml');
  32. $restante = new TEntry('restante');
  33. $custo = new TEntry('custo');
  34. $lucro_bruto = new TEntry('lucro_bruto');
  35. $lucro_dividido = new TEntry('lucro_dividido');
  36. $pagar = new TEntry('pagar');
  37. $dividido = new TEntry('dividido');
  38. // Atualiza os Valores
  39. $valor->setExitAction(new TAction(array($this, 'onUpdateTotal')));
  40. $taxa_ml->setExitAction(new TAction(array($this, 'onUpdateTotal')));
  41. $frete->setExitAction(new TAction(array($this, 'onUpdateTotal')));
  42. $restante->setExitAction(new TAction(array($this, 'onUpdateTotal')));
  43. $custo->setExitAction(new TAction(array($this, 'onUpdateTotal')));
  44. $lucro_bruto->setExitAction(new TAction(array($this, 'onUpdateTotal')));
  45. $lucro_dividido->setExitAction(new TAction(array($this, 'onUpdateTotal')));
  46. $valor->setNumericMask(2, ',','.');
  47. $frete->setNumericMask(2, ',','.');
  48. $taxa_ml->setNumericMask(2, ',','.');
  49. $restante->setNumericMask(2, ',','.');
  50. $custo->setNumericMask(2, ',','.');
  51. $lucro_bruto->setNumericMask(2, ',','.');
  52. $lucro_dividido->setNumericMask(2, ',','.');
  53. $pagar->setNumericMask(2, ',','.');
  54. $taxa_ml->setEditable(FALSE);
  55. $restante->setEditable(FALSE);
  56. $lucro_bruto->setEditable(FALSE);
  57. $lucro_dividido->setEditable(FALSE);
  58. $pagar->setEditable(FALSE);
  59. $id->setSize(100);
  60. $data_venda->setSize(150);
  61. $data_venda->setSize(150);
  62. $plp->setSize(150);
  63. $codigo->setSize(150);
  64. $produto->setSize(400);
  65. $valor->setSize(150);
  66. $tipo_anuncio->setSize(100);
  67. $frete->setSize(80);
  68. $taxa_ml->setSize(80);
  69. $restante->setSize(80);
  70. $custo->setSize(80);
  71. $lucro_bruto->setSize(80);
  72. $lucro_dividido->setSize(80);
  73. $pagar->setSize(150);
  74. $tipo_anuncio->addItems(array('0.16'=> 'Premium', '0.10'=> 'Classico'));
  75. $tipo_anuncio->setDefaultOption(FALSE);
  76. // add the fields
  77. $this->form->addQuickFields('ID', array($id, new TLabel('Data') ,$data_venda, new TLabel('PLP') ,$plp, new TLabel('Código') ,$codigo));
  78. $this->form->addQuickFields('Produto', array($produto, new TLabel('Valor') ,$valor));
  79. $this->form->addQuickFields('Tipo Anuncio', array($tipo_anuncio, new TLabel('Frete') ,$frete, new TLabel('Taxa ML') ,$taxa_ml, new TLabel('Restante') ,$restante));
  80. $this->form->addQuickFields('Custo', array($custo, new TLabel('Lucro Bruto') ,$lucro_bruto, new TLabel('Lucro Liquido') ,$lucro_dividido));
  81. $this->form->addQuickField('Pagar', $pagar, 200 );
  82. if (!empty($id))
  83. {
  84. $id->setEditable(FALSE);
  85. }
  86. /** samples
  87. $this->form->addQuickFields('Date', array($date1, new TLabel('to'), $date2)); // side by side fields
  88. $fieldX->addValidation( 'Field X', new TRequiredValidator ); // add validation
  89. $fieldX->setSize( 100, 40 ); // set size
  90. **/
  91. // create the form actions
  92. $this->form->addQuickAction(_t('Save'), new TAction(array($this, 'onSave')), 'fa:floppy-o');
  93. $this->form->addQuickAction(_t('New'), new TAction(array($this, 'onClear')), 'bs:plus-sign green');
  94. // vertical box container
  95. $container = new TVBox;
  96. $container->style = 'width: 90%';
  97. // $container->add(new TXMLBreadCrumb('menu.xml', __CLASS__));
  98. $container->add($this->form);
  99. parent::add($container);
  100. }
  101. /**
  102. * Save form data
  103. * @param $param Request
  104. */
  105. public function onSave( $param )
  106. {
  107. try
  108. {
  109. TTransaction::open('base'); // open a transaction
  110. /**
  111. // Enable Debug logger for SQL operations inside the transaction
  112. TTransaction::setLogger(new TLoggerSTD); // standard output
  113. TTransaction::setLogger(new TLoggerTXT('log.txt')); // file
  114. **/
  115. $this->form->validate(); // validate form data
  116. $object = new Vendas; // create an empty object
  117. $data = $this->form->getData(); // get form data as array
  118. $object->fromArray( (array) $data); // load the object with data
  119. $object->store(); // save the object
  120. // get the generated id
  121. $data->id = $object->id;
  122. $this->form->setData($data); // fill form data
  123. TTransaction::close(); // close the transaction
  124. new TMessage('info', TAdiantiCoreTranslator::translate('Record saved'));
  125. }
  126. catch (Exception $e) // in case of exception
  127. {
  128. new TMessage('error', $e->getMessage()); // shows the exception error message
  129. $this->form->setData( $this->form->getData() ); // keep form data
  130. TTransaction::rollback(); // undo all pending operations
  131. }
  132. }
  133. public static function onUpdateTotal($param)
  134. {
  135. $valor = Utils::to_number($param['valor']);
  136. $tipo_anuncio = Utils::to_number($param['tipo_anuncio']);
  137. $frete = Utils::to_number($param['frete']);
  138. $taxa_ml = Utils::to_number($param['taxa_ml']);
  139. $restante = Utils::to_number($param['restante']);
  140. $custo = Utils::to_number($param['custo']);
  141. $lucro_bruto = Utils::to_number($param['lucro_bruto']);
  142. $lucro_dividido = Utils::to_number($param['lucro_dividido']);
  143. $obj = new StdClass;
  144. $restante = $valor - ($frete + $taxa_ml);
  145. $taxa_ml = $valor * $tipo_anuncio;
  146. $lb = $restante - $custo;
  147. $ld = $lucro_bruto / 2;
  148. $pagar = $lucro_dividido + $custo;
  149. $obj->restante = Utils::formatar_valor($restante);
  150. $obj->taxa_ml = Utils::formatar_valor($taxa_ml);
  151. $obj->lucro_bruto = Utils::formatar_valor($lb);
  152. $obj->lucro_dividido = Utils::formatar_valor($ld);
  153. $obj->pagar = Utils::formatar_valor($pagar);
  154. TForm::sendData('form_Vendas', $obj);
  155. }
  156. /**
  157. * Clear form data
  158. * @param $param Request
  159. */
  160. public function onClear( $param )
  161. {
  162. $this->form->clear();
  163. }
  164. /**
  165. * Load object to form data
  166. * @param $param Request
  167. */
  168. public function onEdit( $param )
  169. {
  170. try
  171. {
  172. if (isset($param['key']))
  173. {
  174. $key = $param['key']; // get the parameter $key
  175. TTransaction::open('base'); // open a transaction
  176. $object = new Vendas($key); // instantiates the Active Record
  177. $this->form->setData($object); // fill the form
  178. TTransaction::close(); // close the transaction
  179. }
  180. else
  181. {
  182. $this->form->clear();
  183. }
  184. }
  185. catch (Exception $e) // in case of exception
  186. {
  187. new TMessage('error', $e->getMessage()); // shows the exception error message
  188. TTransaction::rollback(); // undo all pending operations
  189. }
  190. }
  191. }
  192. </code>
</your>
NR

Vagner, pegue do formulário($param) somente os valores dos campos que podem ser modificados(valor,frete e custo). Os demais devem ser recalculados toda vez com base nesses 3 campos.

Veja:
 
  1. <?php
  2. public static function onUpdateTotal($param)
  3. {
  4. $valor = Utils::to_number($param['valor']);
  5. $tipo_anuncio = Utils::to_number($param['tipo_anuncio']);
  6. $frete = Utils::to_number($param['frete']);
  7. $custo = Utils::to_number($param['custo']);
  8. // nao precisa
  9. $taxa_ml = Utils::to_number($param['taxa_ml']);
  10. $restante = Utils::to_number($param['restante']);
  11. $lucro_bruto = Utils::to_number($param['lucro_bruto']);
  12. $lucro_dividido = Utils::to_number($param['lucro_dividido']);
  13. $obj = new StdClass;
  14. // $taxa_ml está vindo do form, mas deveria ser recalculada
  15. $restante = $valor - ($frete + $taxa_ml);
  16. // essa linha deveria ser definida antes da linha acima
  17. $taxa_ml = $valor * $tipo_anuncio;
  18. // lucro_bruto tb está vindo do form(pode usar $lb no lugar)
  19. $ld = $lucro_bruto / 2;
  20. ?>