[firebase-br] For Select 2 Ciclos e o mesmo Ficheiro

Gladiston Santana gladiston em vidy.com.br
Seg Out 28 10:26:35 -03 2013


FOR/SELECT é um cursor simples que só tem vida dentro do FOR, saiu dele,
ele morre.
O cursor tradicional (em outros sistemas) voce declara, aloca e desaloca e
fica alterando a posição do cursor, as vezes um tiro de canhão para matar
mosquito, isto é, problemas simples. então a rigor FOR/SELECT não é uma
implementação adequada para a resolução de um problema que só pode ser
resolvida com um cursor tradicional, então se voce quer um cursor
tradicional no FB terá de usá-lo em blocos SQL porque ele não roda dentro
de procedures diretamente(talvez com o execute statement/block) ou então
mudar a lógica de sua programação, talvez criando uma GTT (tabela
temporária) e fazendo nela as operações de popular, FOR/SELECT e
removendo/alterando essa tabela para que dados processados anteriormente
não sejam desprezados. Eu tive processos clássicos de 4h que diminuíram
para 5s usando GTT, então dependendo do problema pode ser usado com muito
êxito.


Em 27 de outubro de 2013 13:25, Mário Reis <mariodosreyx em gmail.com>escreveu:

> Bom dia Boa Gente,
>
> Primeiro desculpem mas há dias que estou tentando postar em resposta à
> susgetões e não aparece nada na lista; dai o novo POST
>
> Estou tentando por em pratica a sugestão do Júlio. Em vez de usar o Declare
> CURSOR usar o FOR Select....Do Begin End. Que uso em centenas de outras
> situações mormente Descendo um Ficheiro Mestre, exemplificando:
>
> For Select campos M.A, M.B, M.C From FicheiroMestre M Into :wA, :wB, :wC
>
> Do
>
>   Begin
>
>    For Select campos D, F, G From FicheiroDetalhe D where D.D=:wA
> Into :wD, :wF, :wG
>
>         Do
>
>           Begin
>
>               Execute qualquer coisa....
>
>           End
>
>
>
>        -- Quando rebenta o ciclo interior tudo bem por a seguir vem o
> próximo registo
>
>
>
>        -- do FicheiroMestre e assim por diante...
>
>
>
>        -- Sem crise....
>
> End
>
>
>
> Agora, neste caso tenho na mesma 2 ciclos, um exterior e outro interior mas
> ambos sobre o mesmo ficheiro. E, quando saio do "ciclo interior" o ponteiro
> ainda está no primeiro registo do ciclo exterior, assim:
>
> IN_LIMITE=3;
>
> For
>
>  Select campos A, B, C From TabelaX X
>
>        Where  X.A=:IN_BANCO_ID
>
>        ORDER BY A, B, C      Into :wA, :wB, :wC
>
>      Do
>
>       Begin
>
>          Contador = 1;
>
>          For Select campos A, B, C From TabelaX   X1
>
>              Where X1.A=:IN_BANCO_ID AND X1.B=:WB
>
>             Order By A, B, C      Into :wX, :wY, :wZ
>
>         Do
>
>          Begin
>
>
>
>              IF (Contador < In_Limite) Then
>
>                SUSPEND   -- Só retorna 3 linhas
>
>
>
>             Contador=Contador+1;
>
>
>
>         End
>
>
>
>        -- Aqui, quando rebenta o ciclo interior, já andou 12
> Linhas/Registos
>
>
>
>        -- Porém Ciclo Exterior ainda estou no 1.º Registo da mesma TabelaX
>
>
>
>        -- como se resolve isto????
>
>
>
>        -- Tentei com um Select First 1 Skip :Icount  A, B, C From Tabela X
>
>
>
> mas SKIP não suporta parâmetros.
>
>
>
>        --
>
>
>
>  End
>
>
>
>
>
>
>
> Diferente do que fazemos no Delphi com
>
>
>
> While Not TabelaX.Eof Do
>
>
>
>  Begin
>
>
>
>     Contador:=1;
>
>
>
>      WAux:=CampoA
>
>          While ( (TabelaXCampoA.AsString=WAux)    And Not TabelaX.Eof) Do
>
>
>
>             Begin
>
>
>
>                 If (Contador <=3) Then
>
>
>
>                  Do_My_Display;
>
>
>
>                 TabelaX.Next;
>
>
>
>                  Inc(Contador);
>
>
>
>             End;
>
>
>
>   // Aqui o registo do ciclo exterior já está no próximo mesmo que o
> Contador vá em 10/12. Com o For Select... não se consegue o mesmo?
>
>
>
>  End
>
>
>
>
>
> •Aqui, com no For Select ...exterior o ponteiro(registo) não mexe junto com
> o do ciclo interior?!
>
> É que só quero os 1.ºs 3...4...5 ou 6 registos de um conjunto de 10, 20 ou
> 30.
>
> Terei sido claro na exposição da dificuldade?
>
> É com efeito assim, conforme conclui, ou estarei a fazer algo de errado(?)
> com os For Select...
>
> Alguém mais experiente que eu em Firebird já passou por isto?
>
> Como resolveu? Como se resolve e pode ajudar-me?
>
>
>
> Obrigado.
>
>
> ______________________________________________
> FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br
> Para saber como gerenciar/excluir seu cadastro na lista, use:
> http://www.firebase.com.br/fb/artigo.php?id=1107
> Para consultar mensagens antigas: http://firebase.com.br/pesquisa



Mais detalhes sobre a lista de discussão lista