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.
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
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...
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:
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
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
►Harbour 3.x | Minigui xx-x | HwGui◄ Pense nas possibilidades abstraia as dificuldades. Não corrigir nossas falhas é o mesmo que cometer novos erros. A imaginação é mais importante que o conhecimento. (Albert Einstein)
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?
►Harbour 3.x | Minigui xx-x | HwGui◄ Pense nas possibilidades abstraia as dificuldades. Não corrigir nossas falhas é o mesmo que cometer novos erros. A imaginação é mais importante que o conhecimento. (Albert Einstein)
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...
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:
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
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.
►Harbour 3.x | Minigui xx-x | HwGui◄ Pense nas possibilidades abstraia as dificuldades. Não corrigir nossas falhas é o mesmo que cometer novos erros. A imaginação é mais importante que o conhecimento. (Albert Einstein)
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.