Ordenando uma tabela de forma decrescente com a OrdDescend – Maratona AdvPL e TL++ 378

Nesse vídeo demonstraremos a utilização da função OrdDescend, que serve para ordenar uma tabela de forma decrescente, começando assim do maior para o menor.

Abaixo o código fonte desenvolvido para o exemplo em vídeo acima:

//Bibliotecas
#Include "TOTVS.ch"

/*/{Protheus.doc} User Function zExe378
Realiza a ordenação decrescente de um índice de uma tabela
@type Function
@author Atilio
@since 28/03/2023
@see https://tdn.totvs.com/display/tec/OrdDescend
@obs 

    Função OrdDescend
    Parâmetros
        + xExp           , Indefinido   , Índice que será usado
        + cIndex         , Caractere    , Nome do índice (opcional)
        + lDesc          , Lógico       , Se .T. será decrescente
    Retorno
        + lRet           , Lógico       , Retorna .T. se conseguiu flagar como decrescente

    **** Apoie nosso projeto, se inscreva em https://www.youtube.com/TerminalDeInformacao ****
/*/

User Function zExe378()
    Local aArea      := FWGetArea()
    Local oTempTable
    Local aFields    := {}
    Local cAliasTmp  := GetNextAlias()
    Local nOrder
    Local cMensagem  := ""
    
    //Cria a temporária
    oTempTable := FWTemporaryTable():New(cAliasTmp)
    
    //Adiciona no array das colunas as que serão incluidas (Nome do Campo, Tipo do Campo, Tamanho, Decimais)
    aAdd(aFields, {"CODIGO",  "C",  6, 0})
    aAdd(aFields, {"NOME",    "C", 50, 0})
    aAdd(aFields, {"VALOR",   "N",  8, 2})
    aAdd(aFields, {"EMISSAO", "D",  8, 0})
    
    //Define as colunas usadas
    oTempTable:SetFields( aFields )
    
    //Cria índice com colunas setadas anteriormente
    oTempTable:AddIndex("1", {"CODIGO", "NOME"} )
    oTempTable:AddIndex("2", {"NOME"} )
    
    //Efetua a criação da tabela
    oTempTable:Create()
    
    //Vamos incluir 3 registros
    RecLock(cAliasTmp, .T.)
        (cAliasTmp)->CODIGO  := "TST001"
        (cAliasTmp)->NOME    := "João da Silva"
        (cAliasTmp)->VALOR   := 1.99
        (cAliasTmp)->EMISSAO := Date()
    (cAliasTmp)->(MsUnlock())

    RecLock(cAliasTmp, .T.)
        (cAliasTmp)->CODIGO  := "TST002"
        (cAliasTmp)->NOME    := "Maria da Silva"
        (cAliasTmp)->VALOR   := 1.99
        (cAliasTmp)->EMISSAO := Date()
    (cAliasTmp)->(MsUnlock())

    RecLock(cAliasTmp, .T.)
        (cAliasTmp)->CODIGO  := "TST003"
        (cAliasTmp)->NOME    := "Carlos da Silva"
        (cAliasTmp)->VALOR   := 1.99
        (cAliasTmp)->EMISSAO := Date()
    (cAliasTmp)->(MsUnlock())

    //Agora vamos ordenar a tabela de forma decrescente
    nOrder := 2
    (cAliasTmp)->(DbSetOrder(nOrder))
    OrdDescend(nOrder, cValToChar(nOrder), .T.)
    (cAliasTmp)->(DbGoTop())

    //Vamos percorrer os registros e montar a mensagem
    While ! (cAliasTmp)->(EoF())
        cMensagem += "+ " + Alltrim((cAliasTmp)->NOME) + CRLF

        (cAliasTmp)->(DbSkip())
    EndDo
    FWAlertInfo(cMensagem, "Teste OrdDescend")

    //Exclui a temporária
    oTempTable:Delete()

    FWRestArea(aArea)
Return

Bom pessoal, por hoje é só.

Abraços e até a próxima.

Dan (Daniel Atilio)
Cristão de ramificação protestante. Especialista em Engenharia de Software pela FIB, graduado em Banco de Dados pela FATEC Bauru e técnico em informática pelo CTI da Unesp. Entusiasta de soluções Open Source e blogueiro nas horas vagas. Autor e mantenedor do portal Terminal de Informação.

Deixe uma resposta

Terminal de Informação