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,