[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