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

Gladiston Santana gladiston em vidy.com.br
Ter Out 29 13:33:01 -03 2013


Bom saber disso, até a versão 1.5 (olhei o manual agora)  cursores só
podiam ser usados em blocos SQL, mas não eram compreendidos dentro duma
procedure apesar de pertencer a classe PSQL. A partir da 2.x isso já é
possível, obrigado pela correção.

Mas acho que era assim porque o uso do cursor se assemelhava ao for/select
por causa de suas limitações. A ideia do cursor é semelhante a um dataset
que vai para frente e para traz podendo inclusive editar ou excluir o
registro onde o cursor estiver posicionado sem criar uma nova sentença com
update/delete, e isso o FB não faz (ainda).
Claro que agora que sei que funciona, a implementação do logo no inicio
pode prosseguir, ao invés do for/select poderá usar cursores sem precisar
dum 'loop' como teria de ser feito com for/select.


Em 28 de outubro de 2013 17:59, W O <sistemas2000profesional em gmail.com>escreveu:

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