[firebase-br] Dúvida...

Edson T. Marques marques em oriontec.com.br
Seg Fev 14 09:01:14 -03 2005


"Meu POVO e minha POVA..."
Tudo em cima!?!?

Negócio é o seguinte:
Vou dar uma dica direto do nosso banco de dados, espero que isso possa 
ajudar:

Isso existe no nosso banco há anos e funciona bem:

create procedure sp_Pessoa_ChaveVaga (Apartir VARCHAR(10))
returns(Vago VARCHAR(10))
as
declare variable ChaveLocal INTEGER;
declare variable Comparador INTEGER;
begin
  Comparador = Cast (Apartir as INTEGER);
  for select Cast(CHAVEPES as INTEGER) from PESSOA where Cast(CHAVEPES 
as INTEGER) >=  :Comparador order by CHAVEPES into :ChaveLocal do
  begin
    if (ChaveLocal <> Comparador) then
    begin
      Vago = Cast(Comparador as VARCHAR(10);    
      SUSPEND;
      EXIT;
    end
      Comparador = Comparador + 1;
  end
  SUSPEND
end^

Este procedimento foi originalmente escrito para tratar INTEGER assim:

CREATE PROCEDURE SP_PESSOA_CHAVEVAGA ( APARTIR INTEGER)
RETURNS ( VAGO INTEGER)
AS
  DECLARE VARIABLE CHAVELOCAL INTEGER;
BEGIN
   Vago = Apartir;

   for select ChavePes from Pessoa
     where ChavePes >= :Apartir
     order by ChavePes
     into :ChaveLocal do
   begin
     if (ChaveLocal <> Vago) then
     begin
      SUSPEND;
      EXIT;
    end
    Vago = Vago + 1;
  end
   SUSPEND;
END ^

O parâmetro é usado por quem GRAVA a ultima chave sugerida e, assim, 
pode passá-la como parâmetro para reduzir a busca.

Té mais;
Edson

Robert Nunes escreveu:

>Primeiramente Bom Dia..
>
>Bom galera estou com uma dúvida na criação de uma procedure.
>a dúvida é a seguinte:
>
>Tenho uma tabela de Clientes, dentro dela tenho o campo Codigo que é do tipo
>String,
>nessa procedure eu presciso que ela me retorne o maior codigo pra eu
>acrescentar + 1 pra mim usar com sugestão no meu cadastro de Clientes, o
>problema é que o campo é do tipo String, então eu tentei fazer um select e
>mandei ordenar de maneira decrescente e assim eu retornaria o primeiro mas
>não deu certo exemplo:
>
>create procedure ProximoCodClienteNovo
>returns(OidCliente Integer)
>as
>begin
>  select Codigo
>  from Cliente
>  order by Codigo desc
>  into :OidCliente;
>
>  if (oidcliente is null) then
>    oidcliente = 1;
>  else
>    oidcliente = oidcliente + 1;
>end
>
>mas aí ele se perde pois ficaram multiplos registros na sobra...
>alguém tem alguma sugestão pra que eu retorne o maior valor pra ser segerido
>no meu cadastro
>
>desde já fico grato
>
>[]'s  Robert Nunes.
>
>
>
>
>______________________________________________
>FireBase-BR (www.firebase.com.br) - Hospedado em www.bavs.com.br
>Para editar sua configuração na lista, use o endereço http://mail.firebase.com.br/mailman/listinfo/lista_firebase.com.br
>
>
>  
>




Mais detalhes sobre a lista de discussão lista