Página 1 de 1

indexar ntx descendente

Enviado: 02 Dez 2009 22:40
por jcsprog
e ai pessoal preciso indexar descendente os seguintes campos nome fantasia + numero do pedido
fantasia = space(20) e numero do pedido numerico(10)
no clipper 5.3 erra assim index on fantasia+descend(str(pedido,10)) to lanp1
funcionava tudo bem
no harbour nao funciona da erro ja na linha de index
agradeço a ajuda
utilizo harbour x minigui



---
Nota da Moderação (Maligno):
A presente mensagem, totalmente composta por letras maiúsculas, teve de ser editada para a troca de caixa. Por favor, atente para as regras do fórum e redija suas mensagens de acordo com as regras de netiqueta.

Re: indexar NTX DESCENDENTE

Enviado: 02 Dez 2009 23:43
por alxsts
Olá!

Experimente colocar, no início do arquivo .PRG, a declaração abaixo:

Código: Selecionar todos

REQUEST descend

Re: indexar NTX DESCENDENTE

Enviado: 03 Dez 2009 01:54
por sygecom
Não seria apenas assim:

Código: Selecionar todos

INDEX ON FANTASIA+STR(PEDIDO,10) TO LANP1 DESCENDING 

Re: indexar NTX DESCENDENTE

Enviado: 03 Dez 2009 10:26
por jamazevedo
O problema que ocorre é que a função DESCEND() não é linkada com o executável. Sabe-se lá porque motivo.
Para resolver o problema fiz uma chamada a essa função no fim do programa e funcionou, veja o exemplo abaixo:

Código: Selecionar todos

FUNCTION Main()
          ....
          USE Clientes VIA "DBFCDX"
          INDEX ON Clientes->Nome + DESCEND( Clientes->Numero ) TO Clientes
          ....
RETURN
DESCEND()
Já a solução apresentada pelo Alxsts para mim é novidade vou testá-la.

E a solução do Sygecom deixará todo o índice invertido, mas pelo que percebi em teu exemplo, a necessidade é somente inverter o numero.

Re: indexar ntx descendente

Enviado: 03 Dez 2009 10:51
por Maligno
O problema que ocorre é que a função DESCEND() não é linkada com o executável.
Exatamente. Explicando: a simples inclusão do nome "Descend()" na chave de índice não surte efeito algum. Uma chave de índice é apenas uma simples string, avaliada em run-time.
Para casos assim, há duas soluções: como você descobriu, inserindo uma simples chamada à função, de forma inócua OU utilizando o comando apropriado para esse fim: REQUEST DESCEND, como o colega "alxsts" indicou. Isso faz com o que o símbolo DESCEND seja forçosamente incluído na tabela de ligações passada ao linker, que então incluirá no EXE o módulo onde este símbolo se encontra.

Re: indexar ntx descendente

Enviado: 03 Dez 2009 15:21
por lugab
Pessoal, a solucão é colocar "REQUEST DESCEND" no ínício ?

Se SIM, por tabela, a solução para quem usa CDX seria a abaixo ?

REQUEST DBFCDX
RDDSETDEFAULT("DBFCDX")
REQUEST DESCEND

Grato,

gabriel

Re: indexar ntx descendente

Enviado: 03 Dez 2009 15:32
por Maligno
Para o problema de "unresolved external" deve funcionar. Ou pelo menos deve gerar o EXE sem qualquer erro. Porém, o OP não se manifestou a respeito, nem tampouco detalhou o erro. Apenas cogitou-se a possibilidade do erro ser esse. Se for, deve resolver. Se for outro erro, restará ao OP entrar em detalhes.

fUNCIONOU COM REQUEST

Enviado: 04 Dez 2009 12:25
por jcsprog
VALEU GALERA
:D

Re: indexar ntx descendente

Enviado: 04 Dez 2009 15:10
por alxsts
Olá!

Ótimo!

Algumas considerações finais:
- Descend() de um campo tipo data retorna um valor numérico. Portanto, para indexar uma data em ordem cronológica inversa, use:

Código: Selecionar todos

INDEX ON STR( Descend( dtAlgo ) )
- para recuperar dados em um arquivo indexado com Descend(), é necessário usar a função também:

Código: Selecionar todos

<xcAlias>->( DbSeek( STR( Descend( dtAlgo ) ) ) )
- existe uma queda de performace nos processos de indexação e busca.

Re: indexar ntx descendente

Enviado: 04 Dez 2009 15:29
por Maligno
A regra é clara: a perfomance na busca por uma chave de índice será tão pior quanto mais complexa for a expressão da chave.