Página 1 de 2
ordscope()
Enviado: 09 Set 2008 08:19
por ederxc
Bom dia moçada !
Alguem saberia me dizer se é possivel dentro do
Ordscope()
mudar o indice ex:
Código: Selecionar todos
select dbf
set order to 01
dbf->(ordscope(0,varivel)
dbf->(ordscope(1,varivel)
Set order to 2 // aqui isso seria possivel ?
obrigado
Re: ordscope()
Enviado: 09 Set 2008 09:05
por gvc
O ordscope usa o índice para fazer o filtro do arquivo.
Mudar a ordem do arquivo vai tornar a função se efeito.
Por favor, especifique melhor sua dúvida.
Re: ordscope()
Enviado: 09 Set 2008 09:17
por ederxc
Tenho um cadastro de fornecedores onde cada fornecedor pode ser especificado por area de atuação
fornecdor eletronico
fornecedor papelaria/informatica
fornecedor Geral
No caso uso o ordscope() para mostrar em um browse somente os fornecedores de uma Area ex:
mostrar apenas o de eletronico:
eletronicos é cia eletronico
eltro barsil seila eletronico
eletro e tal ltrda. eletronico
e dentro desse scopo mudar o indice para pesquisar por CNPJ , CODIGO, NOME
té+
Re: ordscope()
Enviado: 09 Set 2008 10:20
por janio
Uma solução seria vc criar um índice composto com o CODIGO + CNPJ.
Então vc poderia filtar inicialmente pelo grupo de fornecedores e depois buscar o CNPJ, tipo:
Select arquivo
DbSetOrder(xxx)
DbGoTop()
OrdScope( 0, CODIGO )
OrdScope( 1, CODIGO )
DbGoTop()
DbSeek( CODIGO + CNPJ )
Re: ordscope()
Enviado: 09 Set 2008 10:40
por ederxc
Opá , lega essa solução Janio , porêm no meu caso não ira funcionar pois não tenho apenas um tipo de indice para para pesquisar neste scopo e sim 03 indices ou seja , de qualquer forma preciso mudar o tipo de indice dentro do scopo
té++
Re: ordscope()
Enviado: 11 Set 2008 10:55
por Eolo
Pelo que entendi, são 2 coisas: browse e pesquisa. Certo?
Seguinte:
a) indexe por área, nome e CNPJ
b) sete o ordscope pela área desejada
c) abra o browse
d) para pesquisar, use a função OrdWildSeek: vc pode pesquisar pelo nome ou CNPJ sem alterar o ordscope.
Em outras palavras, o browse vai mostrar:
AREA1___JOSE SILVA_____12345
AREA1___ANTONIO SILVA__34388
AREA1___PAULO SOUZA___14523
Esse seek pesquisa por "parte" do índice. Se vc pesquisar por "45", vão ser selecionados os registros 1 e 3. Se vc pesquisar por "SILVA", vão ser selecionados os registros 1 e 2.
Vc pode então acumular os registros selecionados em um array ou DBF temp e mostrar na tela pro usuário escolher...
Re: ordscope()
Enviado: 11 Set 2008 11:09
por Eolo
Em tempo:
a) créditos pro Mestre Leonardo, que foi quem me deu a dica dessa função. A propósito, ela é MUITO rápida. Piscou, tá feito.
b) se a indexação vai ser área + nome + CNPJ, então a ordem - no exemplo - saiu errada. O correto, melhorado (ou seja, imaginando 2 fornecedores com o mesmo nome), é o seguinte:
AREA1___ANTONIO SILVA__34388
AREA1___JOSE SILVA_____12345
AREA1___JOSE SILVA_____88888
AREA1___PAULO SOUZA___14523
A pesquisa por "SILVA" vai mostrar os registros de 1 a 3. A pesquisa por "45" vai mostrar os registros 2 e 4.
c) vc pode incluir "n" campos na indexação. Só precisa lembrar do seguinte: se vc vai pesquisar por um campo X, esse campo X TEM que estar no índice.
Re: ordscope()
Enviado: 11 Set 2008 11:40
por Eolo
Exemplo? Aqui está:
Código: Selecionar todos
use fornece new excl
inde on area+nome+cnpj tag xpto to fornece
set inde to fornece
go top
pesq:={}
do whil ordwildseek("*SILVA*", .t.)
aadd(pesq, {fornece->nome, fornece->cnpj})
endd
* a matriz PESQ vai ter "n" elementos, tantos quantos forem os registros que
* têm "SILVA" nos campos AREA+NOME+CNPJ (em qualquer posição, não apenas no início)
pesq:={}
do whil ordwildseek("*1357*", .t.)
aadd(pesq, {fornece->nome, fornece->cnpj})
endd
* a matriz PESQ vai ter "n" elementos, tantos quantos forem os registros que
* têm "1357" nos campos AREA+NOME+CNPJ (em qualquer posição, não apenas no início)
use
Re: ordscope()
Enviado: 11 Set 2008 20:53
por asimoes
Pessoal,
Estou tentando este código usando o OrdWildSeek e não estou tendo sucesso.
O que pode estar errado:
Tem que usar alguma biblioteca da contrib?
Código: Selecionar todos
PROCEDURE Main()
LOCAL aStruct := { ;
{ "Codigo", "C", 2, 0 }, ;
{ "Nome" , "C", 30, 0 }, ;
{ "Idade" , "C", 2, 0 } ;
}
CLS
ConfiguraAmbiente()
DbCreate( "Teste", aStruct, "DBFCDX", .T., "Teste" )
USE Teste
INDEX ON Nome TAG Ind01 TO Ind01
SET ORDER TO TAG Ind01
APPEND BLANK
TESTE->Codigo:="01"
TESTE->Nome :="ALEXANDRE"
TESTE->Idade :="43"
//--------------------------------------------------------
APPEND BLANK
TESTE->Codigo:="02"
TESTE->Nome :="JOAO"
TESTE->Idade :="11"
//--------------------------------------------------------
APPEND BLANK
TESTE->Codigo:="03"
TESTE->Nome :="MARIANA"
TESTE->Idade :="09"
//--------------------------------------------------------
APPEND BLANK
TESTE->Codigo:="04"
TESTE->Nome :="BETE"
TESTE->Idade :="39"
//--------------------------------------------------------
APPEND BLANK
TESTE->Codigo:="05"
TESTE->Nome :="ELISABETE"
TESTE->Idade :="36"
//--------------------------------------------------------
GO TOP
aCust:={}
DO WHILE OrdWildSeek( "*BE?", .T. )
? "aqui"
AAdd( aCust, TESTE->Nome)
ENDDO
AEval( aCust, {|c| QOut(c) } )
USE
RETURN
FUNCTION ConfiguraAmbiente()
REQUEST HB_LANG_PT
REQUEST HB_CODEPAGE_PT850
HB_SETCODEPAGE( "PT850" )
SET CENTURY ON
SET DATE BRITISH
SET EPOCH TO 2000
SET DELETE ON
SET EXCLUSIVE OFF
SET DBFLOCKSCHEME TO 1 // PARA USO JUNTO COM O FOX
REQUEST DBFCDX
RDDSETDEFAULT("DBFCDX")
DBSETDRIVER("DBFCDX")
RETURN NIL
Re: ordscope()
Enviado: 11 Set 2008 21:48
por asimoes
Consegui fazer o teste, tinha que lincar a harbour.lib não sei porque.
Mas me parece que a função está com problema.
O DBF que estou testando tem os seguintes nomes:
ALEXANDRE
JOAO
MARIANA
ELISABETE
BETE
PEDRO
Estão ordenados por nome, usando indice cdx.
Quando eu faço o ordwildseek()
DBGOTOP()
DO WHILE OrdWildSeek( "*A*", .T.)
AAdd( aCust, TESTE->Nome)
ENDDO
O vetor deveria conter:
ALEXANDRE - ELISABETE - JOAO - MARIANA
Mas está retornando:
ELISABETE - JOAO - MARIANA
Ignorando o primeiro nome. Alguém sabe o que é isso?
Re: ordscope()
Enviado: 12 Set 2008 12:28
por Eolo
Asimoes, boa observação... Cara, deve ser BUG do xHarbour...
Isso nunca aconteceu comigo porque, por uma outra razão, eu sempre tenho um registro em branco no começo dos meus DBF. Então esse erro não aparece porque o registro não considerado (na pesquisa) é sempre o tal em branco.
Confira; inclua, no seu exemplo, um registro em branco no começo do arquivo e faça a mesma pesquisa. Assim vai achar todas as ocorrências...
Re: ordscope()
Enviado: 12 Set 2008 12:57
por Eolo
Achei uma saída (enquanto não aparece uma solução melhor): se é só o primeiro registro (do índice) que não é considerado, basta fazer WildSeek
top/bott e depois
bott/top. Na primeira passada, ele não vai aparecer. Mas, na segunda, sim. E, pra evitar eventuais duplicidades, é só filtrar com o ASCAN:
Código: Selecionar todos
aCust:={}
GO TOP
DO WHILE OrdWildSeek( "*BE*", .T. ) // top/bottom
? "aqui"
AAdd( aCust, TESTE->Nome)
ENDDO
GO BOTTOM
DO WHILE OrdWildSeek( "*BE*", .T. , .T.) // bottom/top
IF ASCAN(ACUST, TESTE->NOME)=0
? "aqui"
AAdd( aCust, TESTE->Nome)
ENDIF
ENDDO
Re: ordscope()
Enviado: 12 Set 2008 13:51
por asimoes
Eolo,
Realmente, quando eu incluo um registro em branco ele passa ser o registro corrente da pesquisa, observando isso, a função deve fazer um skip no inicio e depois vai normal. A questão é, tenho que entrar com registro branco toda vez que for fazer a pesquisa ou basta ter 1 nas tabelas de consulta?, achei a sua outra solução chamando a função duas vezes interessante e resolve o problema do possível skip.
Obrigado, pela dica.
Re: ordscope()
Enviado: 12 Set 2008 14:23
por Eolo
Eu citei o "registro em branco" porque eu o uso normalmente, como padrão, então o erro que deu pra você não aconteceu nunca comigo, por este motivo. Mas a solução melhor, óbvio, é a do outro tópico.
Re: ordscope()
Enviado: 12 Set 2008 14:43
por Toledo
Eolo, existe uma solução mais simples, veja o tópico abaixo:
viewtopic.php?f=4&t=8583
Abraços,