Lançado Adianti Framework 7.6!
Clique aqui para saber mais
SQL na mão para datagrid Boa tarde pessoal. Estou desenvolvendo um sistema para um salão de cabeleireiros. Me deparei com várias limitações do framework ou do meu conhecimento. Uma delas é o seguinte: Eu preciso rodar essa instrução SQL : select data_atendimento, profissional ,count(hora) as atendimentos, sum(valor) as total, sum(valor) * 70 / 100 as profissional, sum(valor) * 30 / 100 as comissao_salao ...
FM
SQL na mão para datagrid  
Fechado
Boa tarde pessoal. Estou desenvolvendo um sistema para um salão de cabeleireiros. Me deparei com várias limitações do framework ou do meu conhecimento. Uma delas é o seguinte:
Eu preciso rodar essa instrução SQL :
SELECT data_atendimento, profissional ,count(hora) as atendimentos, sum(valor) as total, sum(valor) * 70 / 100 as profissional, sum(valor) * 30 / 100 as comissao_salao FROM horario WHERE data_atendimento = '2015-09-25' and profissional = 'Romano' and atendido = 'S'

só que a data_atendimento preciso pegar de um TDate e o profissional de um TEntry, e mostrar o resultado que será apenas uma linha em um DataGrid. Depois de eu conseguir isso vem mais um desafio, fazer um loop que execute esse script uma vez para cada nome de profissional cadastrado e exiba em um Datagrid tambem.... em PHP normal eu consigo fazer.... mas no framework usando o tal do TCriteria, como vou criar os campos em tempo de execuçao e exibi-los ? como usa o framework para resolver problemas assim ? Quando precisamos de uma consulta personalizada de VERDADE ? alguém consegue me ajudar nessa ? No aguardo !!!

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


EM

veja esse exemplo: www.adianti.com.br/doc-framework-Persistence-Setup-SetupTransaction
FM

O exemplo nem passa perto do que eu preciso... infelizmente... é exatamente o que descrevi acima que preciso. Obrigado mesmo assim :)
FC

Flávio

O Framework tem como princípio usar OO e evitar ao máximo consultas SQL espalhadas pelo sistema o que dificulta na hora de dar manutenção.

De uma olhada nesse artigowww.adianti.com.br/forum/pt/view_876?pensando-em-objetos-nao-em-sql-
FM

Sim...eu ja sei disso e ja li esse artigo... Então é IMPOSSÍVEL fazer o que preciso ?
FC

Desculpe minha ignorancia Flavio, o que tem haver o TCriterio com criar elementos ? o que o Eliezer te mostrou é exatamente a mesma coisa que rodar um sql personalizado, acredito que talvez vc esteja querendo um Grid dentro de uma linha do Grid é isso? eu pego um registro faço um loop e coloco embaixo da linha do grid. vou mostrar o exemplo.

www.adianti.com.br/framework_files/tutor/index.php?class=DatagridCol
EM

Bom... é isso aí que o Felipe falou Flávio.
Inclusive não tem a necessidade de rodar essa instrução para cada usuário separado se vc quiser mostrar no datagrid todos de uma vez quebrado por profissional.

Vai depender inclusive se seu software tem nível de acesso, ou seja, se um usuário tem permissão de ver os atendimentos de outros ou somente o dele.

Para vc pegar os dados como filtros de um TEntry ou TDate é necessário criar um formulário pra isso e não em dificuldade nenhuma. O exemplo que te passei mostra exatamente como fazer para rodar sua instrução sql, agora basta você adaptar em seu sistema e mostrar os resultados.

abs.
FM

Então Felipe, acho que vcs nao estao me entendendo. Vamos la. A tabela que é usada para fazer esse fechamento, nao tem os campos atendimentos ,total, comissao_salao e comissao_profissional, que é o que eu preciso exibir. Esses campos eu crio no select por exemplo :
SELECT SUM(valor) * 30 /100 as comissao_salao

é apenas um exemplo.... o que nao sei é como fazer isso usando o TCriteria , ou a maneira normal de consulta a banco de dados do framework.... entende?

"resolvi" o problema com o seguinte código: (note que o "resolvi" esta entre aspas :) )
criei pelo pdf designer um "modelo"de ficha de fechamento mas não era o que eu queria.

  1. <?php
  2. class fechamento3 extends TPage
  3. {
  4.     private $form;     // registration form
  5.     private $datagrid// listing
  6.     private $pageNavigation;
  7.     private $loaded;
  8.     
  9.     /**
  10.      * Class constructor
  11.      * Creates the page, the form and the listing
  12.      */
  13.     public function __construct()
  14.     {
  15.         parent::__construct();
  16.         
  17.         // creates the form
  18.         $this->form = new TForm('form_search_Horario');
  19.         $this->form->class 'tform'// CSS class
  20.         
  21.         // creates a table
  22.         $table = new TTable;
  23.         $table-> width '100%';
  24.         $this->form->add($table);
  25.         
  26.         // add a row for the form title
  27.         $row $table->addRow();
  28.         $row->class 'tformtitle'// CSS class
  29.         $row->addCell( new TLabel('Fechamento de Caixa') )->colspan 3;
  30.         
  31.         // create the form fields
  32.         $data_atendimento               = new TDate('data_atendimento');
  33.         $profissional                   = new TEntry('profissional');
  34.         $profBusca                      = new  ">TDBSeekButton('profissional''salao''form_search_Horario''Profissional''nome','$profBusca''profissional');
  35.         // define the sizes
  36.         $data_atendimento->setSize(100);
  37.         $data_atendimento->setMask('dd/mm/yyyy');
  38.         $profissional->setSize(200);
  39.         // add one row for each form field
  40.         $table->addRowSet( new TLabel('Data:'), $data_atendimento );
  41.         $table->addRowSet( new TLabel('Profissional:'), $profBusca );
  42.         $this->form->setFields(array($data_atendimento,$profBusca));
  43.         // keep the form filled during navigation with session data
  44.         $this->form->setDataTSession::getValue('Horario_filter_data') );
  45.         
  46.         // create two action buttons to the form
  47.         $find_button TButton::create('find', array($this'carregar'), _t('Generate'), 'fa:gear blue');
  48.         $find_button->popover 'true';
  49.         $find_button->poptitle '<font color = blue><b>GERAR</b>';
  50.         $find_button->popcontent 'Gera o fechamento de caixa para a data e profissional selecionado.<br/>
  51.                                    <b>ATENÇÃO !!!</b> a data e o profissional são OBRIGATÓRIOS.';
  52.         
  53.         $this->form->addField($find_button);
  54.         
  55.         $buttons_box = new THBox;
  56.         $buttons_box->add($find_button);
  57.         
  58.         // add a row for the form action
  59.         $row $table->addRow();
  60.         $row->class 'tformaction'// CSS class
  61.         $row->addCell($buttons_box)->colspan 2;
  62.         
  63.         // creates a Datagrid
  64.         //$this->datagrid = new TDataGrid;
  65.         //$this->datagrid->setHeight(320);
  66.        
  67.         
  68.         // create the page container
  69.         $vboxa = new TVBox;
  70.         $vboxa->add(new TXMLBreadCrumb('menu.xml'__CLASS__));
  71.         $container TVBox::pack$this->form);
  72.         parent::add($vboxa);
  73.         parent::add($container);
  74.     }
  75.     
  76.     /**
  77.      * method onInlineEdit()
  78.      * Inline record editing
  79.      * @param $param Array containing:
  80.      *              key: object ID value
  81.      *              field name: object attribute to be updated
  82.      *              value: new attribute content 
  83.      */
  84.     function onInlineEdit($param)
  85.     {
  86.        
  87.     }
  88.     
  89.     /**
  90.      * method onSearch()
  91.      * Register the filter in the session when the user performs a search
  92.      */
  93.     function onSearch()
  94.     {
  95.         // get the search form data
  96.         $data $this->form->getData();
  97.         
  98.         // clear session filters
  99.         TSession::setValue('HorarioList_filter_data_atendimento',   NULL);
  100.         TSession::setValue('HorarioList_filter_profissional',   NULL);
  101.         if (isset($data->data_atendimento) AND ($data->data_atendimento)) {
  102.             $dataat TDate::date2us($data->data_atendimento);
  103.             $filter = new TFilter('data_atendimento''like'"%{$dataat}%"); // create the filter
  104.             TSession::setValue('HorarioList_filter_data_atendimento',   $filter); // stores the filter in the session
  105.         }
  106.         if (isset($data->profissional) AND ($data->profissional)) {
  107.             $filter = new TFilter('profissional''like'"%{$data->profissional}%"); // create the filter
  108.             TSession::setValue('HorarioList_filter_profissional',   $filter); // stores the filter in the session
  109.         }
  110.         
  111.         // fill the form with data again
  112.         $this->form->setData($data);
  113.         
  114.         // keep the search data in the session
  115.         TSession::setValue('Horario_filter_data'$data);
  116.         
  117.         $param=array();
  118.         $param['offset']    =0;
  119.         $param['first_page']=1;
  120.         //$this->onReload($param);
  121.         $this->carrega($param);
  122.     }
  123.     
  124.     /**
  125.      * method onReload()
  126.      * Load the datagrid with the database objects
  127.      */
  128.     function onReload($param NULL)
  129.     {
  130.         try
  131.         {
  132.             // open a transaction with database 'salao'
  133.             TTransaction::open('salao');
  134.             
  135.             // creates a repository for Horario
  136.             $repository = new TRepository('Horario');
  137.             $limit 10;
  138.             // creates a criteria
  139.             $criteria = new TCriteria;
  140.             
  141.             // default order
  142.             if (empty($param['order']))
  143.             {
  144.                 $param['order'] = 'id';
  145.                 $param['direction'] = 'asc';
  146.             }
  147.             $criteria->setProperties($param); // order, offset
  148.             $criteria->setProperty('limit'$limit);
  149.             
  150.             if (TSession::getValue('HorarioList_filter_data_atendimento')) {
  151.                 $criteria->add(TSession::getValue('HorarioList_filter_data_atendimento')); // add the session filter
  152.             }
  153.             if (TSession::getValue('HorarioList_filter_profissional')) {
  154.                 $criteria->add(TSession::getValue('HorarioList_filter_profissional')); // add the session filter
  155.             }
  156.             
  157.             // load the objects according to criteria
  158.             $objects $repository->load($criteriaFALSE);
  159.             
  160.             /*
  161.             $this->datagrid->clear();
  162.             if ($objects)
  163.             {
  164.                 // iterate the collection of active records
  165.                 foreach ($objects as $object)
  166.                 {
  167.                     // add the object inside the datagrid
  168.                     $this->datagrid->addItem($object);
  169.                 }
  170.             }
  171.             */
  172.             
  173.             // reset the criteria for record count
  174.             $criteria->resetProperties();
  175.             $count$repository->count($criteria);
  176.             
  177.             /*
  178.             $this->pageNavigation->setCount($count); // count of records
  179.             $this->pageNavigation->setProperties($param); // order, page
  180.             $this->pageNavigation->setLimit($limit); // limit
  181.             */
  182.             
  183.             // close the transaction
  184.             TTransaction::close();
  185.             $this->loaded true;
  186.         }
  187.         catch (Exception $e// in case of exception
  188.         {
  189.             // shows the exception error message
  190.             new TMessage('error''<b>Error</b> ' $e->getMessage());
  191.             
  192.             // undo all pending operations
  193.             TTransaction::rollback();
  194.         }
  195.     }
  196.     
  197.     /**
  198.      * method onDelete()
  199.      * executed whenever the user clicks at the delete button
  200.      * Ask if the user really wants to delete the record
  201.      */
  202.     function onDelete($param)
  203.     {
  204.         // define the delete action
  205.         $action = new TAction(array($this'Delete'));
  206.         $action->setParameters($param); // pass the key parameter ahead
  207.         
  208.         // shows a dialog to the user
  209.         new TQuestion(TAdiantiCoreTranslator::translate('Do you really want to delete ?'), $action);
  210.     }
  211.     
  212.     /**
  213.      * method Delete()
  214.      * Delete a record
  215.      */
  216.     function Delete($param)
  217.     {
  218.         try
  219.         {
  220.             $key=$param['key']; // get the parameter $key
  221.             TTransaction::open('salao'); // open a transaction with database
  222.             $object = new Horario($keyFALSE); // instantiates the Active Record
  223.             $object->delete(); // deletes the object from the database
  224.             TTransaction::close(); // close the transaction
  225.             $this->onReload$param ); // reload the listing
  226.             new TMessage('info'TAdiantiCoreTranslator::translate('Record deleted')); // success message
  227.         }
  228.         catch (Exception $e// in case of exception
  229.         {
  230.             new TMessage('error''<b>Error</b> ' $e->getMessage()); // shows the exception error message
  231.             TTransaction::rollback(); // undo all pending operations
  232.         }
  233.     }
  234.     
  235.     /**
  236.      * method show()
  237.      * Shows the page
  238.      */
  239.     function show()
  240.     {
  241.         // check if the datagrid is already loaded
  242.         if (!$this->loaded AND (!isset($_GET['method']) OR $_GET['method'] !== 'onReload') )
  243.         {
  244.             $this->onReloadfunc_get_arg(0) );
  245.         }
  246.         parent::show();
  247.     }
  248.     
  249.     function carregar() {
  250.        
  251.        try {
  252.           TTransaction::open('salao');
  253.           $conn TTransaction::get(); // get PDO connection
  254.           $data $this->form->getData();
  255.           $quando TDate::date2us($data->data_atendimento);
  256.           $quem   $data->profissional;
  257.           $result $conn->query('select data_atendimento, profissional ,count(hora) as atendimentos, sum(valor) as total, 
  258.                                   sum(valor) * 70 / 100 as renda_profissional,  sum(valor) * 30 / 100 as comissao_salao  from horario 
  259.                                   where data_atendimento = "'.$quando.'" and profissional = "'.$quem.'" and atendido = "S"');
  260.           $designer = new TPDFDesigner;
  261.           $designer->fromXml('app/reports/fechamento.pdf.xml');
  262.               
  263.           foreach ($result as $row) {
  264.               $dataf TDate::date2br($row['data_atendimento']);
  265.               $totaf $this->formataMoeda($row['total']);
  266.               $comsf $this->formataMoeda($row['comissao_salao']);
  267.               $rendf $this->formataMoeda($row['renda_profissional']);
  268.               $diasemana = array('Domingo''Segunda-Feira''Terça-Feira''Quarta-Feira''Quinta-Feira''Sexta-Feira''Sábado');
  269.               $diasemana_numero date('w'strtotime($quando));
  270.               $semana $diasemana[$diasemana_numero];
  271.               $designer->replace('{profissional}'$row['profissional'] );
  272.               $designer->replace('{data}' $dataf);
  273.               $designer->replace('{semana'$semana);
  274.               $designer->replace('{atendimentos}'$row['atendimentos']);
  275.               $designer->replace('{total}'$totaf);
  276.               $designer->replace('{salao}'$comsf);
  277.               $designer->replace('{renda}'$rendf);
  278.               $designer->generate();
  279.             
  280.               $designer->gotoAnchorXY('anchor1');
  281.               $designer->SetFontColorRGB('#FF0000');
  282.               $designer->SetFont('Arial''B'18);
  283.             
  284.               $file 'app/output/fechamento.pdf';
  285.             
  286.               if (!file_exists($file) OR is_writable($file))
  287.               {
  288.                   $designer->save($file);
  289.                   parent::openFile($file);
  290.               }
  291.               else
  292.               {
  293.                   throw new Exception(_t('Permission denied') . ': ' $file);
  294.               }
  295.             
  296.               new TMessage('info''Fechamento de caixa gerado.');
  297.           }
  298.           TTransaction::close();    
  299.        } catch(Exception $e) {
  300.                new TMessage('error'$e->getMessage());
  301.           } 
  302.        
  303.        
  304.     }
  305.     
  306.     public function formataMoeda($valor)
  307.     {
  308.         if($valor)
  309.         {
  310.             return number_format($valor2',''.');
  311.         }        
  312.     }
  313. }
  314. ?>
</font>
FC

Então é muito mais simples do que imaginamos repare:

  1. <?php
  2. creates a repository for Horario
  3.             $repository = new TRepository('Horario');
  4.             $limit 10;
  5.             // creates a criteria
  6.             $criteria = new TCriteria;
  7.             
  8.             // default order
  9.             if (empty($param['order']))
  10.             {
  11.                 $param['order'] = 'id';
  12.                 $param['direction'] = 'asc';
  13.             }
  14.             $criteria->setProperties($param); // order, offset
  15.             $criteria->setProperty('limit'$limit);
  16.             
  17.             if (TSession::getValue('HorarioList_filter_data_atendimento')) {
  18.                 $criteria->add(TSession::getValue('HorarioList_filter_data_atendimento')); // add the session filter
  19.             }
  20.             if (TSession::getValue('HorarioList_filter_profissional')) {
  21.                 $criteria->add(TSession::getValue('HorarioList_filter_profissional')); // add the session filter
  22.             }
  23.             
  24.             // load the objects according to criteria
  25.             $objects $repository->load($criteriaFALSE);
  26.              
  27. ?>


toda essa parte acima pode ser substituida por essa (não aconselho melhor trabalhar com view)
  1. <?php
  2. $conn TTransaction::get(); // get PDO connection
  3.             
  4.  // run query
  5. $sql ="SELECT SUM(valor) * 30 /100 as comissao_salao , campo from horario where campo = {$var}";
  6.  $result $conn->query($sql);
  7.  
  8. $item = new StdClass;       //cria um objeto   
  9.  // show results 
  10.   foreach ($result as $row
  11.  { 
  12. $item->campo $row['campo']                
  13. $item->comissao_salao $row['comissao_salao'] ; 
  14.               
  15.  } 
  16. ?>


Veja se ajuda.
FM

Então Felipe... Até isso eu tinha chegado... o problema para mim é algo que deve ser bem simples.... Exibir isso em um DataGrid. pra começar... :) Desculpe se pareço grosso as vezes... mas é meu jeito de falar, em momento nenhum eu quis ser indelicado com ninguem aqui, sei que todos estao querendo me ajudar... (minha mulher que falou que parecia grosseria a maneira que eu falei.... ) :)
FC

  1. <?php
  2. foreach ($result as $row
  3.  { 
  4. $item->campo $row['campo']                
  5. $item->comissao_salao $row['comissao_salao'] ; 
  6. $this->datagrid->addItem($item);   //somente coloque essa linha          
  7.  }  
  8. ?>
FM

Valeu Felipe... vou tentar fazer assim.... depois posto aqui se deu certo... Obrigadao mesmo !!!!
FM

Felipe, se quiser dar uma olhada como esta ficando acesse

appdegustacao.pe.hu

login : romano
senha : salao

Criticas são muito benvindas e sugestões também...
WJ

Flavio Maidl ->
muito bom a ideia do salão,
qual e o valor que ira cobrar...
tenho um cliente que possa interessar no software ..

me add no skype welitonj.jose

obrigado
LC

Flavio vc pode criar um view no banco, criar a model e depois usar esta view nos forms/grids/relatórios, não sei se te ajuda isso.
FM

Opa, obrigado Leandro Coelho. Consegui resolver o problema. Se quiser conhecer o projeto acesse:

appdegustacao.pe.hu

Login : usuario
Senha : salao