Set Relation + Set Filter

Post Reply
User avatar
Anderson.OL
Posts: 92
Joined: Thu Feb 15, 2007 11:37 am
Location: Itaocara - RJ - Brasil
Contact:

Set Relation + Set Filter

Post 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?
FiveWin 9.03 + xHarbour !!
User avatar
tosko
Posts: 28
Joined: Sat Oct 29, 2005 12:01 am
Location: Puerto Vallarta MX
Contact:

Filter... mejor usas OrdScope()

Post by tosko »

Si usas indices CDX mejor utiliza los OrdScope

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




Saludos
Tosko
Carlos Mora
Posts: 988
Joined: Thu Nov 24, 2005 3:01 pm
Location: Madrid, España

Re: Set Relation + Set Filter

Post 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()
Saludos
Carlos Mora
http://harbouradvisor.blogspot.com/
StackOverflow http://stackoverflow.com/users/549761/carlos-mora
“If you think education is expensive, try ignorance"
Rochinha
Posts: 309
Joined: Sun Jan 08, 2006 10:09 pm
Location: Brasil - Sao Paulo
Contact:

Post 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
Post Reply