FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour Set Relation + Set Filter
Posts: 92
Joined: Thu Feb 15, 2007 11:37 AM
Set Relation + Set Filter
Posted: Tue Dec 09, 2008 07:02 PM
Olá, alguem já teve problemas ao usar set relation mais set filter nesta ordem?

Tenho as seguinte tabelas:

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!

   //---------------------------------------------------------------------//
   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 !!
Posts: 28
Joined: Sat Oct 29, 2005 12:01 AM
Filter... mejor usas OrdScope()
Posted: Wed Dec 10, 2008 03:04 PM

Si usas indices CDX mejor utiliza los OrdScope

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

Saludos
Tosko

Posts: 989
Joined: Thu Nov 24, 2005 03:01 PM
Re: Set Relation + Set Filter
Posted: Thu Dec 11, 2008 02:08 PM
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"
Posts: 310
Joined: Sun Jan 08, 2006 10:09 PM
Set Relation + Set Filter
Posted: Mon Dec 15, 2008 01:39 PM
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:

//---------------------------------------------------------------------// 
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:

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:

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

Continue the discussion