FWTemporaryTable com índice decrescente

Bom dia.

Estou criando uma tabela temporária utilizando a classe FWTemporaryTable (http://tdn.totvs.com/display/framework/FWTemporaryTable) e nela há o método AddIndex para criar índices. Gostaria de saber se há alguma maneira de criar um índice decrescente.

Desde já agradeço a ajuda.

At Rodrigo de Oliveira

1 curtida

Bom dia!

Já tentou utilizar a função DESCEND?

http://tdn.totvs.com/pages/viewpage.action?pageId=23889338

Olá.
Ainda não, porém da documento do link que você passou contém a informação
“Indices decrecentes só são permitidos em arquivos DBFNTX.
Indices com padão CDX não são criados em ordem descendente.”

No caso da classe FWTemporaryTable ela cria a tabela temporária diretamente no banco de dados.
Neste caso, creio que não irá funcionar.

At
Rodrigo de Oliveira.

Mas você necessita mesmo da criação de um índice assim? Você poderia popular a tabela a partir de um select com order by e caso necessário acessar os dados através de queries.

A criação do índice ajuda na performance de pesquisa e leitura.

É interessante ter está opção.

Bom dia,

Caso não seja necessário exibir os dados de forma decrescente, você poderia efetuar o loop começando pelo bottom e indo até o bof, é uma prática pouco comum, porém se você deseja exibir os dados já de forma decrescente, não conheço uma forma de fazer isso além de criar a tabela temporária com o Order By assim como o Jandir já mencionou.

cTabela := FwTemporaryTable:GetRealName() cOrder := "%B1_DESC DESC%" BeginSql ... SELECT B1_DESC From %Exp:cTabela% ORDER BY %Exp:cOrder%

Use a função addindex, veja exmeplo:

oTempTable:AddIndex("01", {"UNIBOR", "SALDO"})

Rodrigo, isso criaria a ordenação na tabela de forma crescente, porém a necessidade é exatamente a contrário, a única forma de fazer o contrário é via query com ORDER BY.

Infelizmente, a Totvs não implementou essa inteligência na função AddIndex, o que seria bem útil ao clicar na coluna da tela ele ordenar de forma crescente e, ao clicar novamente, ele ordenar de maneira decrescente. Tenho uma tela aqui com criatrab que o cara conseguiu implementar essa lógica com a função descend(), mas quando alterei pra fwtemporarytable, perdi essa ordenação decrescente. Não tem como fazer.

Olha, se você alimenta a tabela buscando as informações com uma query, eu recomendo usar o ORDER BY do SQL e colocar o "DESC", é o jeito mais fácil que eu conheço. Se tiver duvidas sobre SQL, eu adoro esse site: https://www.w3schools.com/sql/sql_orderby.asp

A função DESCEND não está disponível na FWTemporaryTable

Bom dia,

Eu fiz o seguinte, criei mais um campo na tabela temporária e preenchi o campo com valor inverso (tem a função Inverte() do Advpl), nos campos numéricos, preenchi com sinal invertido.

Mesmo eu alimentado a tabela temporária com a query usando DESC ele abre a tela com a ordenação normal... Alguém tem um exemplo com ordem decrescente?

Utilizem a função OrdDescend. Documentação: https://tdn.totvs.com/display/tec/OrdDescend

Eu criei a tabela utilizando a classe FWTemporaryTable e criei o índice normalmente com o método :AddIndex().

No momento de realizar a pesquisa usei:


(cAlias)->(OrdDescend(1,,.T.))
(cAlias)->(dbGoTop())

Dessa forma consegui ordenar a tabela temporária usando o índice 1 de forma descendente.

Também tem esta opcao.

https://terminaldeinformacao.com/2020/07/10/como-ordenar-uma-tabela-decrescente-com-campo-data-utilizando-fwtemporarytable/

Uma observação:
Aqui só funcionou com FwTemporaryTable quando dei um DbSelectArea no meu alias.
Ex:

        DbSelectArea("TTRB")
        TTRB->(DbSetOrder(9))
        OrdDescend(9, NIL, .T.)
        TTRB->(DbGoTop())