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

Mário Reis mariodosreyx em gmail.com
Dom Out 27 13:25:19 -03 2013


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.





Mais detalhes sobre a lista de discussão lista