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