WS
            
                Montar um Datagrid com dados coletados por uma consulta (SQL)  
                
                
            
            
            
            Boa tarde a todos,
Preciso alimentar as colunas de um datagrid, no entanto, os dados estão sendo selecinoados por uma query.
Já li as publicações anteriores, segui alguns exemplos e até o momento não funcionou, sei que usar Criteria seria melhor, mas a query é muito complexa.
A possibilidade de se criar uma View também não seria viável.
Quando executo o código e faço um vardump no objeto retornado, está vindo apenas 1 item e teriam que vir mais de 400.
Vou postar um resumo do que estou fazendo. Caso alguém tenha uma ideia do que pode ser e puder ajudar, agradeço!
            
            
        Preciso alimentar as colunas de um datagrid, no entanto, os dados estão sendo selecinoados por uma query.
Já li as publicações anteriores, segui alguns exemplos e até o momento não funcionou, sei que usar Criteria seria melhor, mas a query é muito complexa.
A possibilidade de se criar uma View também não seria viável.
Quando executo o código e faço um vardump no objeto retornado, está vindo apenas 1 item e teriam que vir mais de 400.
Vou postar um resumo do que estou fazendo. Caso alguém tenha uma ideia do que pode ser e puder ajudar, agradeço!
 - <?php
 
  - <?php
 - class CompleteFormDataGridView extends TPage
 - {
 -     private $form;      // registration form
 -     private $datagrid;  // listing
 -     private $loaded;
 -     
 -     /**
 -      * Class constructor
 -      * Creates the page, the form and the listing
 -      */
 -     public function __construct()
 -     {
 -         parent::__construct();
 -         
 -         // create the form
 -         $this->form = new BootstrapFormBuilder('form_categories');
 -         $this->form->setFormTitle(_t('Manual Form/DataGrid'));
 -         
 -         // create the form fields
 -         $id     = new TEntry('id');
 -         $name   = new TEntry('name');
 -         
 -         // add the fields in the form
 -         $this->form->addFields( [new TLabel('ID')],    [$id] );
 -         $this->form->addFields( [new TLabel('Name', 'red')],  [$name] );
 -         
 -         $name->addValidation('Name', new TRequiredValidator);
 -         
 -         // define the form actions
 -         $this->form->addAction( 'Save',  new TAction([$this, 'onSave']), 'fa:save green');
 -         $this->form->addActionLink( 'Clear', new TAction([$this, 'onClear']), 'fa:eraser red');
 -         
 -         // id not editable
 -         $id->setEditable(FALSE);
 -         
 -         $this->datagrid = new BootstrapDatagridWrapper(new TDataGrid);
 -         $this->datagrid->width = '100%';
 -         
 -         // add the columns
 -         $col_id    = new TDataGridColumn('id', 'Id', 'right', '10%');
 -         $col_name  = new TDataGridColumn('name', 'Name', 'left', '90%');
 -         
 -         $this->datagrid->addColumn($col_id);
 -         $this->datagrid->addColumn($col_name);
 -         
 -         $col_id->setAction( new TAction([$this, 'onReload']),   ['order' => 'id']);
 -         $col_name->setAction( new TAction([$this, 'onReload']), ['order' => 'name']);
 -         
 -         $action1 = new TDataGridAction([$this, 'onEdit'],   ['key' => '{id}'] );
 -         $action2 = new TDataGridAction([$this, 'onDelete'], ['key' => '{id}'] );
 -         
 -         $this->datagrid->addAction($action1, 'Edit',   'far:edit blue');
 -         $this->datagrid->addAction($action2, 'Delete', 'far:trash-alt red');
 -         
 -         // create the datagrid model
 -         $this->datagrid->createModel();
 -         
 -         // wrap objects
 -         $vbox = new TVBox;
 -         $vbox->style = 'width: 100%';
 -         $vbox->add(new TXMLBreadCrumb('menu.xml', __CLASS__));
 -         $vbox->add($this->form);
 -         $vbox->add(TPanelGroup::pack('', $this->datagrid));
 -         
 -         // add the box in the page
 -         parent::add($vbox);
 -     }
 -     
 -     /**
 -      * method onReload()
 -      * Load the datagrid with the database objects
 -      */
 -     function onReload($param = NULL)
 -     {
 -         try
 -         {
 -             // open a transaction with database 'samples'
 -             TTransaction::open('samples');            
 -             
 -             $conn = TTransaction::get();
 -                     
 -             $result = $conn->query('SELECT * FROM Tabela');
 -                     
 -             foreach ($result as $row);
 -                     {
 -                         $this->datagrid->addItem($row);
 -                     }
 -             TTransaction::close();
 -             $this->loaded = true;
 -         }
 -         catch (Exception $e) // in case of exception
 -         {
 -             // shows the exception error message
 -             new TMessage('error', $e->getMessage());
 -             
 -             // undo all pending operations
 -             TTransaction::rollback();
 -         }
 -     }   
 -    
 -     
 -     /**
 -      * Clear form
 -      */
 -     public function onClear()
 -     {
 -         $this->form->clear( true );
 -     }
 -     
 -     /**
 -      * method onEdit()
 -      * Executed whenever the user clicks at the edit button
 -      */   
 -    
 -     public static function onDelete($param)
 -     {
 -         // define the delete action
 -         $action = new TAction([__CLASS__, 'Delete']);
 -         $action->setParameters($param); // pass the key parameter ahead
 -         
 -         // shows a dialog to the user
 -         new TQuestion('Do you really want to delete ?', $action);
 -     }
 -     
 -     /**
 -      * method Delete()
 -      * Delete a record
 -      */
 -     public static function Delete($param)
 -     {
 -         try
 -         {
 -             // get the parameter $key
 -             $key = $param['id'];
 -             
 -             // open a transaction with database 'samples'
 -             TTransaction::open('samples');
 -             
 -             // instantiates object Category
 -             $category = new Category($key);
 -             
 -             // deletes the object from the database
 -             $category->delete();
 -             
 -             // close the transaction
 -             TTransaction::close();
 -             
 -             $pos_action = new TAction([__CLASS__, 'onReload']);
 -             new TMessage('info', AdiantiCoreTranslator::translate('Record deleted'), $pos_action);
 -         }
 -         catch (Exception $e) // in case of exception
 -         {
 -             // shows the exception error message
 -             new TMessage('error', $e->getMessage());
 -             
 -             // undo all pending operations
 -             TTransaction::rollback();
 -         }
 -     }
 -     
 -     /**
 -      * method show()
 -      * Shows the page e seu conteúdo
 -      */
 -     function show()
 -     {
 -         // check if the datagrid is already loaded
 -         if (!$this->loaded)
 -         {
 -             $this->onReload( func_get_arg(0) );
 -         }
 -         parent::show();
 -     }
 - }
 - Obrigado!
 - ?>
 
 
Hola
Te mando um exemplo que tenho aqui tenta usar ele no onReload:
$items = MotoristasDocumentos::where('md_id1', '=', $key)->load();
foreach($items as $item )
{
$data = new stdClass;
$data->md_id2 = $item->md_id2;
$data->md_arquivo = $item->md_arq_nome;
$data->md_marca = '';
$this->datagrid->addItem( $data );
}
Salve William, segue um exemplo bem padrão da montagem de um datagrid no onReload:
public function onReload($param = null)
{
try
{
// open a transaction with database 'DB_EMPConecta'
TTransaction::open('DB_EMPConecta');
// creates a repository for system_user
$repository = new TRepository('SystemUser');
$limit = 20;
// Instancia o critério de filtragem
$criteria = new TCriteria;
if (empty($param['order']))
{
$param['order'] = 'name asc';
}
$criteria->add(new TFilter('system_group_id','=', $param['id']));
$criteria->setProperties($param);
$criteria->setProperty('limit', $limit);
// load the objects according to criteria
$objects = $repository->load($criteria, FALSE);
$this->datagrid->clear();
if ($objects)
{
foreach ($objects as $object)
{
$this->datagrid->addItem($object);
}
}
// reset the criteria for record count
$criteria->resetProperties();
$count= $repository->count($criteria);
$this->pageNavigation->setCount($count); // count of records
$this->pageNavigation->setProperties($param); // order, page
$this->pageNavigation->setLimit($limit); // limit
// close the transaction
TTransaction::close();
$this->loaded = true;
}
catch (Exception $e)
{
TTransaction::rollback();
TToast::show('error', $e->getMessage(), 'top center', 'fa fa-thumbs-down' );
}
}
na verdade preciso usar uma query mesmo. ela é bem complexa para ser 'montada' com Criteria e Filter...
Vou colocar o onReload aqui para vocês terem uma ideia:
Eu usaria uma view
William, use uma view e desta forma vc poderá usar o exemplo que te mandei de forma bem fácil. Basta vc trocar a classe aqui: $repository = new TRepository('SystemUser'); pela sua view !!!
Oi William, mas se mesmo assim vc, realmente, precisar do SQL completo aí nesta parte de seu código, vc pode fazer algo assim:
TTransaction::open('Arquivo.ini');
$conn = TTransaction::get();
$result = $conn->query('SELECT * FROM Tabela');
foreach ($result as $row);
{
$this->datagrid->addItem($row);
}
TTransaction::close();
Abs,
Paulo
Bom dia pessoal,
então Nilton, sobre a View, eu realmente não posso criar. Estou trabalhando em um banco onde não posso fazer alteração.
concordo Paulo, realmente a view seria mais fácil de usar, mas infelizmente é uma possibilidade descartada.
No entanto, eu fiz o esquema da query, mas retorna 1 item no objeto. Teria que retornar mais de 400.
Não sei o motivo...
Tem alguma ideia?
E se rodar ela direto no banco funciona ?
sim... perfeitamente
Então tem alguma coisa errada na montagem da query veja as variaveis que esta usando para filtro e monta ele primeiro numa variavel e da um echo em tela para ver.
eu havia pensado nisso... então fiz o onreload com uma consulta bem basica:
e ainda sim, retornou apenas 1 item
Oi
$result = $conn->query('SELECT * FROM status_indicacao');
Eu imagino que nessa query você tenha algum tipo de filtro, então tenta montar a query numa variavel assim:
$cSql = 'SELECT * FROM status_indicacao where .......';
echo $cSql;
recorta a saida para a tela e tenta rodar na base de dados.
Salve William,
Rapaz, se neste simples exemplo ele insiste em trazer apenas 1 registro, não faz sentido algum !!! veja, também, se não há algo errado na montagem do datagrid.
Tipo, vc colocou pra ordenar por ID e NAME e chama a função OnReload pra isso (OK !!), só que lá tem um SQL que se estivesse funcionando sempre vai ordenar de forma única !!! Lógico que isto tem nada ver com o seu problema, mas vai ser um complicador para vc oferecer ordenação, sacou ???
$col_id->setAction( new TAction([$this, 'onReload']), ['order' => 'id']);
$col_name->setAction( new TAction([$this, 'onReload']), ['order' => 'name']);
Execute um clear no datagrid, antes da carga:
$this->datagrid->clear();
if ($result )
{
foreach ($result as $row);
{
$this->datagrid->addItem($row);
}
}
Abs,
Paulo
ou