menu
Fórum Adianti
menu Menu
Classe TBuscaRecords Boas, Acesso a Banco de Dados é primordial, ou seja, quanto mais rápido melhor. Nesta vida de Analista deparamos com situações que devemos rebolar e muito para soluciona-los. No meu caso, tenho uma aplicação que acessa centenas de Tabelas, em 4 Base de Dados e Hosts distintos, e ter que fazer relacionamento entre elas pode se tornar um "PARTO". Uma das Base de Dados ficam as ta...
MC
Classe TBuscaRecords  
Boas,

Acesso a Banco de Dados é primordial, ou seja, quanto mais rápido melhor.

Nesta vida de Analista deparamos com situações que devemos rebolar e muito para soluciona-los.

No meu caso, tenho uma aplicação que acessa centenas de Tabelas, em 4 Base de Dados e Hosts
distintos, e ter que fazer relacionamento entre elas pode se tornar um "PARTO".

Uma das Base de Dados ficam as tabelas chamadas Gerais, aquelas que sao compartilhadas, um exemplo claro seria os "Ceps" do Brasil (Estado, Municipio, Endereço),
ou ainda, "Estado Civil", "Cores", "Unidade de Medida" e por ai vai.
São tabelas fixas com no máximo algumas dezenas de registro e alguns casos extremos 5 a 10 mil registros.

Pois bem, vamos supor que você esta montado um sistema de Pizaria, neste tem um cadastro de Cliente TCliente que na maioria são pessoas fisicas,
e na tabela tem um campo sobre o "Estado Civil" do mesmo. Este campo será um "Int" apontando para a tabela onde estão cadastrados os "Tipos de Estado Civil" TEstCivil,
ou seja, um relacionamento de 1x1.

Na sua aplicação, você tem a opção de mostrar numa grid todos os Clientes cadastrados, mas sabemos,
que no campo "Estado Civil" so aparecerá o ID da tabela relacionada TEstCivil.

Como você faria este relacionamento ?

Existem diversas maneiras de fazer este relacionamento, até o próprio Framework te dá opções, aqui vou apenas detalhar mais uma opção.

Como demonstrado a TEstCivil é uma tabela de quantidade de registros "fixos" e bem inferior, assim carrego as informações desta numa array, e no carregamento da grid TCliente faço o relacionamento.

Para isso acontecer remodelei uma Classe enviada por um de nosso companheiros, e dei o nome a ela como TBuscaRecords a qual estou compartilhando com vocês.


  1. <?php
  2.     /**
  3.     * Function TBuscaRecords::get_All( $database, $model, $criteria = NULL, $count = FALSE, $label = NULL )
  4.     *
  5.     * Parametros : $database - Base de Dados a ser Conectada
  6.     *              $model    - Modelo a ser Conectado (Tabela)
  7.     *              $criteria - Criteria para a consulta
  8.     *              $count    - TRUE caso queira o Total de Records encontrados
  9.     *              $label    - Se definida Retorna uma Exception ( [$count] tem que estar TRUE )  
  10.     *
  11.     * Exemplo de Criteria - TCriteria::create([ campo => valor ]);
  12.     *                       TCriteria::create( array( campo => valor, campo => valor, ....));
  13.     *                   ou no seu modo convencional.
  14.     *
  15.     * Result : Array();
  16.     *
  17.     * Classe - TUniqueValidator
  18.     * Autor  - Francis Soares de Oliveira
  19.     * link   - https://www.adianti.com.br/forum/pt/view_1103?tuniquevalidator
  20.     *
  21.     * Pasta  - \app\lib\util
  22.     */
  23. ?>



Como utilizar:

  1. <?php
  2.     // Estado Civil ----------------------------------------------------
  3.             
  4.     $EstCivil = array();
  5.     if( $EstCivil_db TBuscaRecords::get_All'Geral'TEstCivil ))
  6.     {
  7.         foreach( $EstCivil_db as $ECiv )
  8.         {
  9.             $EstCivil$ECiv->ECV_ID ] = $ECiv->ECV_DESCRICAO;
  10.         }
  11.     } else $EstCivil[] = '0';
  12.     
  13.     // Clientes Cadastrados --------------------------------------------
  14.     
  15.     TTransaction::openBASE );
  16.             
  17.     $repository = new TRepository('TCliente');
  18.     $objects $repository->load();
  19.             
  20.     if ( is_callable$this->transformCallback ))
  21.     {
  22.         call_user_func$this->transformCallback$objects$param );
  23.     }
  24.     $this->datagrid->clear();
  25.             
  26.     if ( $objects )
  27.     {
  28.         foreach ( $objects as $object )
  29.         {
  30.             $object->CLI_ESTCIVIL $TpReser$EstCivil->CLI_ESTCIVIL ];  // Aqui será substituido o ID pela DESCRICAO.
  31.                     
  32.             $this->datagrid->addItem$object );
  33.         }
  34.     }
  35.             
  36.     $criteria->resetProperties();
  37.             
  38.     $count $repository->count$criteria );
  39.             
  40.     $this->pageNavigation->setCount$count );
  41.     $this->pageNavigation->setProperties$param );
  42.     $this->pageNavigation->setLimit$limit );
  43.             
  44.             
  45.     TTransaction::close();
  46.             
  47.     $this->loaded true;
  48. ?>


Curso completo Meu Negócio Pronto
Use para si, ou transforme em um negócio: Inclui aulas e códigos-fontes
Gestor de conteúdo (SITE) + Loja Virtual (E-Commerce) + Emissor de Notas para infoprodutos


Meu negócio pronto Quero me inscrever agora!

Comentários (3)


MC

Correto - linha 21 primeiro quadro: Pasta - "app/lib/util"
JJ

Interessante essa classe TBuscaRecords ainda não sabia dela.

Se eu me deparasse com esse problema eu avaliaria o custo de realizar essa consulta na tabela. Considerando o custo (tempo) elevado eu tentaria manter a tabela de estados civis em memória para utilizá-la sempre que necessário (e.g., quando a datagrid carregada).

No código acima já há uma otimização quando o consultas EstadoCivil uma única vez para todos os objetivos da grid, porém, havendo outras necessidades de consultas no aplicativo haverá outras consultas.

Espero ter ajudado e boa sorte.
JJ

Correção: No último parágrafo
Quis dizer que havendo necessidade de saber a descrição do código civil eu outras partes do aplicativo haverá outras consultas a tabela de estado civil.