ordscope()

Projeto [x]Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

ederxc
Usuário Nível 4
Usuário Nível 4
Mensagens: 619
Registrado em: 15 Set 2006 08:40
Localização: Pedreira -SP-

ordscope()

Mensagem 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
C:\Xharbour\Xdev\Fw\VSX
Avatar do usuário
gvc
Colaborador
Colaborador
Mensagens: 1270
Registrado em: 23 Ago 2005 10:57

Re: ordscope()

Mensagem 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.
"TRS-80/Sincler/Apple/PC - Clipper Winter 85, tlink 1.0 [pc 10 MHz - 640K] {NEZ 8000 2Kb RAM}"
{POG - Programação Orientada a Gambiarra}
ederxc
Usuário Nível 4
Usuário Nível 4
Mensagens: 619
Registrado em: 15 Set 2006 08:40
Localização: Pedreira -SP-

Re: ordscope()

Mensagem 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é+
C:\Xharbour\Xdev\Fw\VSX
Avatar do usuário
janio
Colaborador
Colaborador
Mensagens: 1846
Registrado em: 06 Jul 2004 07:43
Localização: UBAJARA - CE

Re: ordscope()

Mensagem 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 )
fui...
e-mail:janioaguiar@yahoo.com.br
msn: janio_aguiar@hotmail.com
xHarbour1.2.1/Harbour3.2 + wvg + hwgui + Mediator + MySql
ederxc
Usuário Nível 4
Usuário Nível 4
Mensagens: 619
Registrado em: 15 Set 2006 08:40
Localização: Pedreira -SP-

Re: ordscope()

Mensagem 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é++
C:\Xharbour\Xdev\Fw\VSX
Avatar do usuário
Eolo
Colaborador
Colaborador
Mensagens: 1134
Registrado em: 08 Dez 2005 18:24
Localização: São Paulo - SP

Re: ordscope()

Mensagem 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...
Avatar do usuário
Eolo
Colaborador
Colaborador
Mensagens: 1134
Registrado em: 08 Dez 2005 18:24
Localização: São Paulo - SP

Re: ordscope()

Mensagem 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.
Avatar do usuário
Eolo
Colaborador
Colaborador
Mensagens: 1134
Registrado em: 08 Dez 2005 18:24
Localização: São Paulo - SP

Re: ordscope()

Mensagem 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
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

Re: ordscope()

Mensagem 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
►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)
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

Re: ordscope()

Mensagem 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?
►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)
Avatar do usuário
Eolo
Colaborador
Colaborador
Mensagens: 1134
Registrado em: 08 Dez 2005 18:24
Localização: São Paulo - SP

Re: ordscope()

Mensagem 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...
Avatar do usuário
Eolo
Colaborador
Colaborador
Mensagens: 1134
Registrado em: 08 Dez 2005 18:24
Localização: São Paulo - SP

Re: ordscope()

Mensagem 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
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

Re: ordscope()

Mensagem 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.
►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)
Avatar do usuário
Eolo
Colaborador
Colaborador
Mensagens: 1134
Registrado em: 08 Dez 2005 18:24
Localização: São Paulo - SP

Re: ordscope()

Mensagem 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.
Avatar do usuário
Toledo
Administrador
Administrador
Mensagens: 3133
Registrado em: 22 Jul 2003 18:39
Localização: Araçatuba - SP
Contato:

Re: ordscope()

Mensagem por Toledo »

Eolo, existe uma solução mais simples, veja o tópico abaixo:

viewtopic.php?f=4&t=8583

Abraços,
Toledo - Clipper On Line
toledo@pctoledo.com.br
Harbour 3.2/MiniGui/HwGui
Faça uma doação para o fórum, clique neste link: http://www.pctoledo.com.br/doacao
Responder