Fórum Como gerar um loop quot;forquot; dentro de um Stored Proce #51715

22/07/2005

0

Pessoal,

Tenho uma tabela onde existem os seguintes campos: ID, NOME_IX. Onde: ID é um valor auto-incremento e NOME_IX é um nome indexado. O indexador do nome varia de acordo com a entrada de um novo registro. Ex.: Supondo que o nome seja ´ABC´ então o indexador irá diferenciar os nomes ´ABC´ em ´ABC1´, ´ABC2´, ´ABC3´ e assim por diante, até que mude o nome. Quando mudar o nome, o indexador volta a ´1´. Ex.: Eu estava incluindo o nome ´ABC´ e já estava no ´ABC15´, daí mudei o nome para ´FFF´. Então, a partir do primeiro ´FFF´ o indexador reinicia: ´FFF1´, ´FFF2´, ´FFF3´.... até mudar de ´FFF´ para outro nome qualquer.
Hoje já tenho esse processo sendo executado via código do Delphi, porém está lento porque para saber se o nome ´FFF7´ (por exemplo) já existe, preciso fazer 6 Select na tabela até encontrar o próximo nome indexado disponível.

Gostaria fazer o seguinte: Criar uma Stored Procedure que me retorne o nome indexado correto. Ex.: Envio um texto como parâmetro para Stored Procedure e ela me retorna ´texto1´, ´texto2´....
Imagino que seja feito usando um loop ´for´ ou ´while´ e atribuindo o resultado do Select a uma variável. Só que não estou conseguindo entender as sintaxes usadas pelo FireBird. Também não estou conseguindo entender como ele faz as atribuições de retono de um Select.

Alguém já fez algo parecido? Tem idéia de como fazer?

Valeu
wbb


Wbb

Wbb

Responder

Posts

22/07/2005

Afarias

Pode explicar melhor o q quer fazer? (com um exemplo de preferência) ... eu não entendi nada.


T+


Responder

Gostei + 0

22/07/2005

Rtava

OK...
Numa tabela existe um campo autoincremental (Campo ´ID´) e outro de nome (Campo NOME).

Eu gravo nomes ´genéricos´ nesta tabela. Estes nomes devem ser diferenciados entre eles por um número (que chamo de indexador).

Hoje, via Delphi, quando preciso gravar um nome nesta tabela, eu preciso checar antes se o nome já existe. Se ele existir é incrementado o ´indexador´ e pesquisado novamente se o nome existe. Se existir, incremento novamente o indexador, pesquiso novamente e assim por diante (lento).

Via Delphi eu faço o seguinte:

Var 
    Nome_Encontrado: String;
    Index: Integer;
begin
      Nome_Encontrado := "ABC";
      Index := 1;

      with query do
      begin
         Close;
         SQL.Clear;
         SQL.Add(´Select * from TABELA where NOME = ´´´ + Nome_Encontrado + IntToStr(Index) + ´´´´);
         Open;

         // Pesquisa até encontrar um índice não utilizado
         while query.RecordCount > 0 do
         begin
            Index := Index + 1;
            Close;
            SQL.Clear;
            SQL.Add(´Select * from TABELA where NOME = ´´´ + Nome_Encontrado + IntToStr(Index) + ´´´´);
            Open;
         end;

         Nome_Encontrado := Nome_Encontrado + IntToStr(Index);
      end;
end;

Eu gostaria de implementar o que eu fiz em Delphi (acima) no banco do FireBird que estou usando. Porém, não estou conseguindo escrever a rotina lá no banco pois não estou familiarizado com a linguagem do FireBird. Na realidade precisaria ´traduzir´ o que fiz em Delphi para a linguagem do FireBird.

valeu!


Responder

Gostei + 0

25/07/2005

Wbb

Já resolvi... A rotina abaixo me retorna o que preciso e é o que o Rtava precisa também pelo que vejo, pois descreveu um problema idêntico...

CREATE PROCEDURE TESTE (
    TEXTO VARCHAR(50),
    ID_PAI INTEGER)
RETURNS (
    TEXTO_GERADO VARCHAR(50))
AS
DECLARE VARIABLE QTD INTEGER;
DECLARE VARIABLE CONTADOR INTEGER;
BEGIN
    CONTADOR = 0;
    QTD = -1;
    WHILE (QTD <> 0) DO
    BEGIN
        CONTADOR = CONTADOR + 1;

        SELECT COUNT(*) AS QTD FROM ITENS
        WHERE (NOME = :TEXTO || ´ ´ || CAST(:CONTADOR AS VARCHAR(10))) AND
              (ID_PAI = :ID_PAI) INTO :QTD;

    END

    TEXTO_GERADO = :TEXTO || ´ ´ || CAST(:CONTADOR AS VARCHAR(10));

    SUSPEND;
END

Valeu
wbb


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar