[firebase-br] RES: RES: RES: RES: Otimizar Where

Felix - Sol Informática felix em soltecnologia.com.br
Ter Dez 20 11:31:52 -03 2011


Resolvido com procedure (mas dá no mesmo fazendo na aplicação, ou seja,
executar o segundo select somente quando o primeiro não localizar):

SET TERM ^ ;
CREATE PROCEDURE SELECT_VEICULO (PTEXTO Varchar(50) )
RETURNS (
    XPLACA Char(7),
    XAUTOMOVEL Varchar(50),
    XPROPRIETARIO Varchar(50) )
AS
DECLARE VARIABLE YPLACA Char(7);
DECLARE VARIABLE YAUTOMOVEL Varchar(50);
DECLARE VARIABLE YPROPRIETARIO Varchar(50);
BEGIN
   yPlaca        = '';
   yAutomovel    = '';
   yProprietario = '';
   
   select all veiculo.placa, veiculo.AUTOMOVEL, cadastro.nome 
      from veiculo inner join cadastro on veiculo.cb = cadastro.CB
      where veiculo.placa = :ptexto
      into :yPlaca, :yAutomovel, :yProprietario;

   if (yPlaca = '') then
   begin
      for 
         select all veiculo.placa, veiculo.AUTOMOVEL, cadastro.nome 
            from veiculo inner join cadastro on veiculo.cb = cadastro.CB
            where veiculo.AUTOMOVEL containing :ptexto or cadastro.nome
containing :ptexto
            into :xPlaca, :xAutomovel, :xProprietario
      do
      suspend;
   end
   else
   begin
      xPlaca        = yPlaca;
      xAutomovel    = yAutomovel;
      xProprietario = yProprietario;
      suspend;
   end

END^

Chamada da procedure como no exemplo:
SELECT p.XPLACA, p.XAUTOMOVEL, p.XPROPRIETARIO FROM SELECT_VEICULO('FELIX')
p

Poderá me retornar 1 só registro (achou exatamente a placa OU apenas 1
registro satisfazia a condição da busca pelo nome do veículo ou do
proprietário) ou vários (não achou a placa, o texto informado é compatível
com vários automóveis / proprietários).

Daí basta colocar na aplicação a janela de seleção do registro quando houver
um retorno múltiplo.

Fco. Felix
www.soltecnologia.com.br





Mais detalhes sobre a lista de discussão lista