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

W O sistemas2000profesional em gmail.com
Seg Out 28 17:59:56 -03 2013


Hola Gladiston

Quizás entendí mal lo que dijiste, pero los cursores de Firebird sí pueden
usarse en stored procedures directamente, como puedes leer en este artículo:

http://firebird21.wordpress.com/2013/06/02/usando-cursores/

Saludos.

Walter.






2013/10/28 Gladiston Santana <gladiston em vidy.com.br>

> 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
> ______________________________________________
> 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