Page 1 of 1

Set Relation + Set Filter

Posted: Tue Dec 09, 2008 7:02 pm
by Anderson.OL
Olá, alguem já teve problemas ao usar set relation mais set filter nesta ordem?

Tenho as seguinte tabelas:

Code: Select all

CLIDEPEND
CODCLI | CODDEPEND  
-------+----------  
0009   | 006        
0001   | 005       
0003   | 009
0003   | 012
0005   | 005
0005   | 012
0005   | 013
0007   | 005
0007   | 006
0007   | 007
0007   | 008

DEPENDENTE
CODIGO | NOME
-------+----------
002    | ADMILSON
003    | EDINHO
004    | NILTON
005    | JOSIAS
006    | CLINT
007    | TARCISIO
008    | ALTAMIRO
009    | SEBASTIAO
010    | DENILSON
011    | FLAVIO
012    | CALU
013    | MARIA
Qdo compilo e executo o codigo abaixo os resultados não me deixam feliz!

Code: Select all

   //---------------------------------------------------------------------//
   select CLIDEPEND
   dbsetorder(2) //-- CodDepend
   
   //-- Relacionar o nome do "retirado por" ------------------------------//
   
   select DEPENDENTE
   dbsetorder(1) //-- Código
   
   //-- Filtrar por cliente se configurado -------------------------------//
   
   set relation to DEPENDENTE->CODIGO into RETCLI
   set filter   to CLIDEPEND->CODCLI   ==  "0005"
   
   
   //-- Exibir a partir do primeiro registro -----------------------------//
   
   dbgotop()
   count to nCount
   
   msg("Numero de registros :" + str(nCount) ) //-- Exibe 1
   //---------------------------------------------------------------------//
Quando testo no set filter o "0001" ou "0003" o resultado é correto.
O problema eh quando filtro com "0005" como comentado acima, exibe 1 registro, qdo na verdade existem 3!!

Já chequei indices, alguem já passou por isto e pode compartilhar uma solução?

Filter... mejor usas OrdScope()

Posted: Wed Dec 10, 2008 3:04 pm
by tosko
Si usas indices CDX mejor utiliza los OrdScope

OrdScope(0, oDbf:acta)
OrdScope(1, oDbf:acta)
odbFaltas:GoTop()




Saludos
Tosko

Re: Set Relation + Set Filter

Posted: Thu Dec 11, 2008 2:08 pm
by Carlos Mora
Olá Anderson,
Anderson.OL wrote: Quando testo no set filter o "0001" ou "0003" o resultado é correto.
O problema eh quando filtro com "0005" como comentado acima, exibe 1 registro, qdo na verdade existem 3!!
El resultado 1 es correcto, porque Vc ejecuta el Count() en la tabla DEPENDENTE, donde solo hay 1 registro con '0005'.

Primero, hax un select CLIDEPEND antes de llamar al count()

Posted: Mon Dec 15, 2008 1:39 pm
by Rochinha
Anderson,

Esqueça estes comandos SET RELATION e SET FILTER e passe a usar .CDX para obter maiores resultados com filtragens.

Veja mais um exemplo:

Code: Select all

//---------------------------------------------------------------------// 
select CLIDEPEND 
dbsetorder(2) //-- CodDepend 
    
//-- Relacionar o nome do "retirado por" ------------------------------// 
select DEPENDENTE 
dbsetorder(1) //-- Código 
    
//-- Filtrar por cliente se configurado -------------------------------// 
//set relation to DEPENDENTE->CODIGO into RETCLI 
//set filter   to CLIDEPEND->CODCLI   ==  "0005" 
set scope to "0005" // Aqui o comando entende que vc esta na ordem 1

//-- Exibir a partir do primeiro registro -----------------------------// 
dbgotop() 
count to nCount 
    
msg("Numero de registros :" + str(nCount) ) //-- Exibe 1 
//---------------------------------------------------------------------// 
A velocidade obtida com uso de SCOPEs é muito grande, voce poderá fazer a filtragem em qualquer tamanho de tabela sem uso de temporários.

Para usar SCOPE voce deverá passar o valor de filtragem mas deve estar com o foco voltado para a ordem do arquivo que será filtrado:

Code: Select all

select CLIDEPEND 
dbsetorder(2) //-- CodDepend 
    
select DEPENDENTE 
dbsetorder(1) //-- Código 
    
dbGotop()
do while .not. eof()
    nCODCLI := DEPENDENTE->CODIGO

    select CLIDEPEND 
    OrdScope( 0, nCODCLI )
    OrdScope( 1, nCODCLI )
    dbGotop()
    
    nContados := 0
    do while .not. eof()
         nContados := nContados + 1
    enddo
    ? str( nCODCLI, 4 ) + " tem " + str( nContados, 3 )+ " registros "
    
    select DEPENDENTE 
    skip
enddo
Caso queira filtrar dados dentro de um RANGE ou periodo de dados use:

Code: Select all

Set Date Brit

dDataInicial := CtoD( "01/01/2008" )
dDataFinal := CtoD( "01/05/2008" )

OrdScope( 0, dDataInicial )
OrdScope( 1, dDataFinal )
dbGotop()
O parametro 0 em OrdScope( 0, dDataInicial ) refere ao inicio do limite
O parametro 1 em OrdScope( 0, dDataInicial ) refere ao final do limite