Total Geral Datagrid. Saudações a todos, em relação a soma de valores no datagrid Acompanhando os tópicos do fórum http://www.adianti.com.br/forum/pt/view_3365?mostrar-soma-valor-total-de-todas-as-paginas-datagrid http://www.adianti.com.br/forum/pt/view_3264?datagrid-somar-coluna-de-valor Aplicado no onReload conforme abaixo eu obtenho o valor total do object->vl_repasse de acordo com os filtros de data. Ok. ...
JC
Total Geral Datagrid.  
Saudações a todos, em relação a soma de valores no datagrid Acompanhando os tópicos do fórum
www.adianti.com.br/forum/pt/view_3365?mostrar-soma-valor-total-de-to
www.adianti.com.br/forum/pt/view_3264?datagrid-somar-coluna-de-valor
Aplicado no onReload conforme abaixo eu obtenho o valor total do object->vl_repasse de acordo com os filtros de data. Ok. Mas o resultado é por pagina e o que eu preciso é apresentar na consulta é o resultado do valor total de todas as paginas
 
  1. <?php
  2. if ($objects)
  3. {
  4. // iterate the collection of active records
  5. foreach ($objects as $object)
  6. {
  7. $object->dt_solicitado = TDate::date2br($object->dt_solicitado);
  8. $object->dt_repasse = TDate::date2br($object->dt_repasse);
  9. $total += str_replace(',', '', $object->vl_repasse);
  10. // add the object inside the datagrid
  11. $this->datagrid->addItem($object);
  12. }
  13. $total = 'R$ '.number_format($total, 2, ',', '.');
  14. $this->labelTotal->setValue('<font color = blue><b><h3>'.$total.'</h3></b></font>');
  15. ?>

No intuito de obter o resultado pretendido utilizei o exemplo do Nataniel, inserindo na
na model: AdmRequisita
 
  1. <?php
  2. public static function getSum($crit=null)
  3. {
  4. $sql = new TSqlSelect;
  5. $sql->addColumn("sum(vl_repasse)");
  6. $sql->setEntity(self::TABLENAME);
  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. ?>


E na página dentro do onReload
 
  1. <?php
  2. $sumSaldo = $model->getSum($criteria);
  3. $this->labelTotal->setValue($sumSaldo);
  4. ?>

Obtenho essa informação:
Notice: Undefined variable: model in C:Program FilesVertrigoServwwwcrcappcontroladmAdmRequisitaList.class.php on line 331

Fatal error: Call to a member function getSum() on a non-object in C:Program FilesVertrigoServwwwcrcappcontroladmAdmRequisitaList.class.php on line 331

Qual a melhor maneira para obter o resultado pretendido?


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


NR

No lugar de "$model" você deve informar o nome do modelo onde você criou a função getSum.
 
  1. <?php
  2. $sumSaldo = AdmRequisita::getSum($criteria);
  3. ?>
JC

Bom dia Nataniel, muito obrigado, agora clareou a situação, todavia está trazendo o valor total do banco e está ignorando o filtro do onsearch com a seguinte msg:
SQLSTATE[42803]: Grouping error: 7 ERROR: column "adm_requisita.id" must appear in the GROUP BY clause or be used in an aggregate function LINE 1: ...isita WHERE (dt_repasse >= '2017-06-25') ORDER BY id asc LIM... ^.
Existe algum exemplo que eu possa seguir?
JC

preciso do valor total das paginações obtidas no filtro.
NR

O problema é que está sendo passada uma ordenação para o criteria e com isso dá erro no banco de dados. Chame a função resetProperties no criteria:
 
  1. <?php
  2. public static function getSum($crit=null)
  3. {
  4. $crit->resetProperties(); // deve resolver
  5. ...
  6. }
  7. ?>
JC

Excelente Nataniel, resultado esperado com a sua ajuda, muito obrigado!
GG

Pessoal,

tentei repetir esse mesmo exemplo que vocês fizeram, mas estou encontrando um pouco de dificuldade.

1) Alterei a Model
 
  1. <?php
  2. /**
  3. * JobsLog Active Record
  4. * @author <your-name-here>
  5. */
  6. class joblog extends TRecord
  7. {
  8. const TABLENAME = 'jobs_log';
  9. const PRIMARYKEY= 'id';
  10. const IDPOLICY = 'serial'; // {max, serial}
  11. /**
  12. * Constructor method
  13. */
  14. public function __construct($id = NULL, $callObjectLoad = TRUE)
  15. {
  16. parent::__construct($id, $callObjectLoad);
  17. parent::addAttribute('date');
  18. parent::addAttribute('job_id');
  19. parent::addAttribute('printer');
  20. parent::addAttribute('user');
  21. parent::addAttribute('server');
  22. parent::addAttribute('title');
  23. parent::addAttribute('copies');
  24. parent::addAttribute('pages');
  25. parent::addAttribute('options');
  26. parent::addAttribute('doc');
  27. }
  28. public static function getSum($crit=null)
  29. {
  30. $sql = new TSqlSelect;
  31. $sql->addColumn("sum(pages)");
  32. $sql->setEntity(self::TABLENAME);
  33. // assign the criteria to the SELECT statement
  34. $crit->resetProperties();
  35. $sql->setCriteria($crit);
  36. $conn = TTransaction::get();
  37. $result= $conn-> query($sql->getInstruction());
  38. if ($result)
  39. {
  40. $row = $result->fetch();
  41. }
  42. // returns the result
  43. return $row[0];
  44. }
  45. }
  46. 2) Criei o label pra mostrar o totalizador
  47. public function __construct()
  48. {
  49. parent::__construct();
  50. // creates the form
  51. $this->form = new TQuickForm('form_search_joblog');
  52. $this->form->class = 'tform'; // change CSS class
  53. $this->form = new BootstrapFormWrapper($this->form);
  54. $this->form->style = 'display: table;width:100%'; // change style
  55. $this->form->setFormTitle('Consulta Log de Impressões');
  56. $this->labelTotal = new TLabel(''); -------------------------- Aqui é o label
  57. 3) Alterei a onReload para preencher o totalizador
  58. $sumSaldo = $joblog->getSum($criteria);
  59. $this->labelTotal->setValue($sumSaldo);
  60. 3a) Com isso é emitido o seguinte erro:
  61. Fatal error: Call to a member function getSum() on null in C:\AppServ\www\jasmine\app\control\jasmine\jobloglist.class.php on line 321
  62. 4) Alterei o onReload assim:
  63. $sumSaldo = $joblog::getSum($criteria);
  64. $this->labelTotal->setValue($sumSaldo);
  65. 4a) Aí tenho o seguinte erro
  66. Fatal error: Class name must be a valid object or a string in C:\AppServ\www\jasmine\app\control\jasmine\jobloglist.class.php on line 321
  67. ONDE ESTOU ERRANDO PESSOAL ?!
NR

Chamadas a funções static devem ser feitas através do nome da classe, sem o $:
 
  1. <?php
  2. $sumSaldo = joblog::getSum($criteria);
  3. ?>