Set Relation + Set Filter

Set Relation + Set Filter

Postby Anderson.OL » Tue Dec 09, 2008 7:02 pm

Olá, alguem já teve problemas ao usar set relation mais set filter nesta ordem?

Tenho as seguinte tabelas:

Code: Select all  Expand view
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  Expand view
   //---------------------------------------------------------------------//
   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
Anderson.OL
 
Posts: 92
Joined: Thu Feb 15, 2007 11:37 am
Location: Itaocara - RJ - Brasil

Filter... mejor usas OrdScope()

Postby tosko » Wed Dec 10, 2008 3:04 pm

Si usas indices CDX mejor utiliza los OrdScope

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




Saludos
Tosko
User avatar
tosko
 
Posts: 28
Joined: Sat Oct 29, 2005 12:01 am
Location: Puerto Vallarta MX

Re: Set Relation + Set Filter

Postby Carlos Mora » Thu Dec 11, 2008 2: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"
Carlos Mora
 
Posts: 988
Joined: Thu Nov 24, 2005 3:01 pm
Location: Madrid, España

Postby Rochinha » Mon Dec 15, 2008 1: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:

Code: Select all  Expand view
//---------------------------------------------------------------------//
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  Expand view
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  Expand view
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
Rochinha
 
Posts: 309
Joined: Sun Jan 08, 2006 10:09 pm
Location: Brasil - Sao Paulo


Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: Google [Bot] and 82 guests