Lançado Adianti Framework 8.1!
Clique aqui para saber mais
DataGrid de tabela com Constraint Boa noite Senhores, Estou precisando criar uma datagrid se baseando numa tabela com alguns campos como constraint, porém, devido a existir registros nos quais a pk informada na classe model estar se repetindo, está dando mensagem de erro ao tentar carregá-la. Sabem se existe algum ajuste que preciso fazer para que ele reconheça que a tabela tem mais de um campo como pk, não considerando ...
HJ
DataGrid de tabela com Constraint  
Fechado
Boa noite Senhores,

Estou precisando criar uma datagrid se baseando numa tabela com alguns campos como constraint, porém, devido a existir registros nos quais a pk informada na classe model estar se repetindo, está dando mensagem de erro ao tentar carregá-la.
Sabem se existe algum ajuste que preciso fazer para que ele reconheça que a tabela tem mais de um campo como pk, não considerando o registro duplicado? Preciso alterar a classe model desta tabela, informando os campos que fazem parte da constraint?
Obrigado

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

www.adianti.com.br/forum/pt/view_910?chave-primaria-composta
HJ

Pessoal, mesmo alterando a minha tabela, usando Unique index ao invés de constraint, conforme link de outro post informado acima, o erro que eu estava encontrando permaneceu o mesmo. Peço desculpas se eu não poderia ter postado novamente aqui neste meu post original, mas como postei lá no outro e não vi o post subir para os últimos comentados, fiquei na duvida se ele seria visualizado por alguém. Estou precisando muito concluir esta pendencia. Agradeço se responderem. Caso eu não possa proceder desta forma, por favor me avisem.

Criação da tabela:
CREATE TABLE fifin ( conta varchar(20), competencia date, valor float(10,2), qtde float(10,2), coef float(10,5), rotina varchar(10) NOT NULL, dt_pagto date, colab_id BIGINT UNSIGNED NOT NULL, FOREIGN KEY(conta) REFERENCES conts(conta), FOREIGN KEY(colab_id) REFERENCES colab(id), FOREIGN KEY(rotina) REFERENCES rotin(codigo), UNIQUE KEY chave (colab_id,competencia,dt_pagto,rotina,conta)) ENGINE=INNODB;


FifinList.class.php
  1. <?php
  2. ... 
  3. // creates the datagrid columns 
  4. $column_check = new TDataGridColumn('check''''center'); 
  5. $column_conta = new TDataGridColumn('conta''Conta''left'); 
  6. $column_conta_desc = new TDataGridColumn('descricao''Descricao''left'); 
  7. $column_valor = new TDataGridColumn('valor''Valor''right'); 
  8. $column_qtde = new TDataGridColumn('qtde''Quantidade''right'); 
  9. $column_coef = new TDataGridColumn('coef''Coeficiente''right'); 
  10. $column_rotina = new TDataGridColumn('rotina''Rotina''left'); 
  11. $column_dt_pagto = new TDataGridColumn('dt_pagto''Data Pagto''center'); 
  12. $column_valor->setTransformer(array($this'formatContas')); 
  13. // add the columns to the DataGrid 
  14. $this->datagrid->addColumn($column_check); 
  15. $this->datagrid->addColumn($column_conta); 
  16. $this->datagrid->addColumn($column_valor); 
  17. $this->datagrid->addColumn($column_qtde); 
  18. $this->datagrid->addColumn($column_coef); 
  19. $this->datagrid->addColumn($column_rotina); 
  20. $this->datagrid->addColumn($column_dt_pagto); 
  21. ... 
  22. ?>

Mensagem de erro ao carregar Fifinlist.class.php('You have already added a field called "checkSALARIO" inside the form')

Onde estou errando?
NR

Hélio, acho que no link que passei não ficou muito clara essa questão, mas sua tabela precisa obrigatoriamente ter uma chave primária do tipo integer.

Quanto ao erro mencionado, não tenho certeza se tem relação com a sua tabela.

Poste todo o código para que possamos verificar.
HJ

Nataniel, obrigado pelo retorno.
Só pelo seu comentário, já suspeito que o problema seja realmente o fato de minha tabela não ter uma chave primária do tipo integer.
Mas acho estranho essa constatação, pois já tenho outras tabelas, bem mais simples(com apenas uma pk), em que a chave primária não é integer, e sim varchar.

Exemplo:
Código: 01
Descrição: Mensalista
Código:02
Descrição: Horista
...

De qq forma, segue o código completo da listagem:

  1. <?php
  2. /**
  3.  * FifinList Listing
  4.  * @author  <Hélio Júnior>
  5.  */
  6. class FifinList extends TPage
  7. {
  8.     private $form// form
  9.     private $datagrid// listing
  10.     private $pageNavigation;
  11.     private $formgrid;
  12.     private $loaded;
  13.     private $deleteButton;
  14.     
  15.     /**
  16.      * Class constructor
  17.      * Creates the page, the form and the listing
  18.      */
  19.     public function __construct()
  20.     {
  21.         parent::__construct();
  22.         
  23.         // creates the form
  24.         $this->form = new TForm('form_search_colab');
  25.         
  26.         //$this->form->style = 'display: table;width:100%'; // change style
  27.         $this->form->setName('Colaboradores');
  28.         
  29.         // create the form fields
  30.         $nome_form = new TLabel('Colaboradores');
  31.         $matricula = new TEntry('matricula');
  32.         $competencia = new TDate('competencia');
  33.         
  34.         $matricula->setSize(150);
  35.         
  36.         $matricula->setValue(TSession::getValue('matricula'));
  37.         $competencia->setValue(TSession::getValue('competencia'));
  38.         $table = new TTable;
  39.         
  40.         $row $table->addRow();
  41.         $cell $row->addCell('');
  42.         $cell->width=80;
  43.         $row->addCell($nome_form);
  44.         
  45.         $cell $row->addCell('');
  46.         $row->addCell($matricula);
  47.         
  48.         $cell $row->addCell('');
  49.         $row->addCell($competencia);
  50.         $this->form->add($table);
  51.                 
  52.         // creates de Action Buttons
  53.         $button1 = new TButton('find');
  54.         $button1->setAction(new TAction(array($this'onSearch')), 'Localizar');
  55.         $button1->setImage('ico_find.png');
  56.  
  57.         $button2 = new TButton('new');
  58.         $button2->setAction(new TAction(array('ColabForm''onEdit')), 'Inserir');
  59.         $button2->setImage('ico_new.png');  
  60.         
  61. //        $button3 = new TButton('csv');
  62. //        $button3->setAction(new TAction(array($this, 'onExportCSV')), 'CSV');
  63. //        $button3->setImage('ico_print.png');
  64.   
  65.         
  66.         $row->addCell($button1);
  67.         $row->addCell($button2);
  68. //        $row->addCell($button3);
  69.         $this->form->setFields(array($matricula$competencia$button1$button2));
  70.         
  71.              
  72.         
  73.         // creates a Datagrid
  74.         $this->datagrid = new TDataGrid;
  75.         
  76.         $this->datagrid->style 'width: 100%';
  77.         $this->datagrid->setHeight(320);
  78.         // $this->datagrid->datatable = 'true';
  79.         // $this->datagrid->enablePopover('Popover', 'Hi <b> {name} </b>');
  80.         
  81.         // creates the datagrid columns
  82.         $column_check = new TDataGridColumn('check''''center');
  83.         $column_conta = new TDataGridColumn('conta''Conta''left');
  84.         $column_conta_desc = new TDataGridColumn('conts->descricao''Descricao''left');
  85.         $column_tipo    = new TDataGridColumn('conts->tipo','Tipo','center');
  86.         $column_valor = new TDataGridColumn('valor''Valor''right');
  87.         $column_qtde = new TDataGridColumn('qtde''Quantidade''right');
  88.         $column_coef = new TDataGridColumn('coef''Coeficiente''right');
  89.         $column_rotina = new TDataGridColumn('rotina''Rotina''left');
  90.         $column_dt_pagto = new TDataGridColumn('dt_pagto''Data Pagto''center');
  91.         
  92.         $column_tipo->setTransformer(array($this'formatContas'));
  93.         // add the columns to the DataGrid
  94.         $this->datagrid->addColumn($column_check);
  95.         $this->datagrid->addColumn($column_conta);
  96.         $this->datagrid->addColumn($column_conta_desc);
  97.         $this->datagrid->addColumn($column_tipo);
  98.         $this->datagrid->addColumn($column_valor);
  99.         $this->datagrid->addColumn($column_qtde);
  100.         $this->datagrid->addColumn($column_coef);
  101.         $this->datagrid->addColumn($column_rotina);
  102.         $this->datagrid->addColumn($column_dt_pagto);
  103.         
  104.         // creates the datagrid column actions
  105.         $order_conta = new TAction(array($this'onReload'));
  106.         $order_conta->setParameter('order''conta');
  107.         $column_conta->setAction($order_conta);
  108.         
  109.        
  110.         
  111.         // creates four datagrid actions group
  112.         $action1 = new TDataGridAction(array($this'onCalculo'));
  113.         $action1->setLabel('Calcular');
  114.         $action1->setImage('bs:search blue');
  115.         $action1->setField('colab_id');
  116.         
  117.        
  118.         $action_group1 = new TDataGridActionGroup('Relações 1''bs:th');
  119.         
  120.         $action_group1->addHeader('Ações');
  121.         $action_group1->addAction($action1);
  122.         $action_group1->addSeparator();
  123.         $action_group1->addHeader('Relações');
  124.                 
  125.         // add the actions to the datagrid
  126.         $this->datagrid->addActionGroup($action_group1);
  127.         // create the datagrid model
  128.         $this->datagrid->createModel();
  129.         
  130.         // creates the page navigation
  131.         $this->pageNavigation = new TPageNavigation;
  132.         $this->pageNavigation->setAction(new TAction(array($this'onReload')));
  133.         $this->pageNavigation->setWidth($this->datagrid->getWidth());
  134.         
  135.         $this->datagrid->disableDefaultClick();
  136.         
  137.         // put datagrid inside a form
  138.         $this->formgrid = new TForm;
  139.         $this->formgrid->add($this->datagrid);
  140.         
  141.         // creates the delete collection button
  142.         $this->deleteButton = new TButton('delete_collection');
  143.         $this->deleteButton->setAction(new TAction(array($this'onDeleteCollection')), AdiantiCoreTranslator::translate('Delete selected'));
  144.         $this->deleteButton->setImage('fa:remove red');
  145.         $this->formgrid->addField($this->deleteButton);
  146.         
  147.        
  148.         $gridpack = new TVBox;
  149.         $gridpack->style 'width: 100%';
  150.         $gridpack->add($this->formgrid);
  151.         $gridpack->add($this->deleteButton)->style 'background:whiteSmoke;border:1px solid #cccccc; padding: 3px;padding: 5px;';
  152.         
  153.         $this->transformCallback = array($this'onBeforeLoad');
  154.         // vertical box container
  155.         $container = new TVBox;
  156.         $container->style 'width: 90%';
  157.         // $container->add(new TXMLBreadCrumb('menu.xml', __CLASS__));
  158.         $container->add($this->form);
  159.         $container->add($gridpack);
  160.         $container->add($this->pageNavigation);
  161.         
  162.         parent::add($container);
  163.     }
  164.     
  165.      /**
  166.      * Format Contas
  167.      */
  168.     public function formatContas($column_tipo$object$row)
  169.     {
  170.         
  171.         if ($column_tipo==1)
  172.         {
  173.             return "<span style='color:blue'>$column_tipo</span>";
  174.             
  175.         }
  176.         elseif ($column_tipo==2)
  177.         {
  178.             //$row->style  = "background: #FFF9A7";
  179.             return "<span style='color:red'>$column_tipo</span>";
  180.         }
  181.         else
  182.         {
  183.             return "<span style='color:black'>$column_tipo</span>";
  184.         }
  185.     }
  186. ?>
NR

Hélio, na verdade o framework até funciona com uma chave primária varchar, desde que esse campo seja sempre informado. E teria que adicionar algumas validações para saber quando deve fazer update ou insert.

Acredito que a solução mais simples no seu caso seja mesmo adicionar uma coluna integer, até para identificar mais facilmente os registros. Isso evitaria também o erro mencionado, pois cada check seria criado com o nome 'check_'+id, e nesse caso o id seria diferente para cada registro.
HJ

Ok Nataniel. Obrigado. Entendi a questão agora. Vou adicionar. Seria legal se eu pudesse adicionar esta coluna id, mas que pudesse deixa-la invisível para o usuário, pois ela será apenas para que a questão seja resolvida e não uma necessidade em nível de banco de dados. Você sabe se é possível deixa-la invisível no grid?
De qq forma, já te agradeço pela atenção dispensada!
HJ

Pensando melhor aqui, cheguei a conclusão de que não poderei incluir esse campo id como pk, visto que se fizer isso, quando eu me referenciar a determinado registro desta tabela pelo nome da conta, como a chave seria o id e não mais a "conta", o framework vai interpretar aquele registro sempre como não existente e adicionará outro registro, ao invés de sobrepô-lo.
Mas pelo que entendi, esse problema só se dá na apresentação da tela, na composição do datagrid. Sendo assim, se eu filtrar o datagrid, de modo que ele não precise mostrar todas as ocorrencias(campo rotina) de 1 só vez de um colaborador, o problema na teoria ficaria resolvido tbm.
Vou tentar aqui.