Função AdvPL que retorna o último código de uma tabela via SQL

Olá pessoal…

Hoje vou mostrar uma função que fiz, que retorna o último código de uma tabela em AdvPL, utilizando uma query SQL.

AdvPL

AdvPL

Geralmente, costumamos usar o GetSXENum com o ConfirmSX8 para controlar a numeração de códigos das tabelas, porém as vezes precisamos pegar o último código via SQL, pensando nisso, criei a função zUltNum, que recebe 3 parâmetros, o primeiro é o alias da tabela, o segundo é o campo, e o terceiro é se já trará o número somado (por exemplo, se o último for 003 na tabela, irá trazer 004).

Para usar, basta:

u_zUltNum("SB1", "B1_X_CAMPO", .T.) //Se o último for 003, vai trazer 004
u_zUltNum("SB1", "B1_X_CAMPO", .F.) //Se o último for 003, vai trazer 003

Abaixo o código completo:

//Bibliotecas
#Include "Protheus.ch"
#Include "TopConn.ch"
 
/*/{Protheus.doc} zUltNum
Função que retorna o ultimo campo código
@type function
@author Atilio
@since 01/11/2017
@version 1.0
    @param cTab, Caracter, Tabela que será consultada
    @param cCampo, Caracter, Campo utilizado de código
    @param [lSoma1], Lógico, Define se além de trazer o último, já irá somar 1 no valor
    @example
    u_zUltNum("SC5", "C5_X_CAMPO", .T.)
/*/
 
User Function zUltNum(cTab, cCampo, lSoma1)
    Local aArea       := GetArea()
    Local cCodFull    := ""
    Local cCodAux     := ""
    Local cQuery      := ""
    Local nTamCampo   := 0
    Default lSoma1    := .T.
     
    //Definindo o código atual
    nTamCampo := TamSX3(cCampo)[01]
    cCodAux   := StrTran(cCodAux, ' ', '0')
     
    //Faço a consulta para pegar as informações
    cQuery := " SELECT "
    cQuery += "   ISNULL(MAX("+cCampo+"), '"+cCodAux+"') AS MAXIMO "
    cQuery += " FROM "
    cQuery += "   "+RetSQLName(cTab)+" TAB "
    cQuery := ChangeQuery(cQuery)
    TCQuery cQuery New Alias "QRY_TAB"
     
    //Se não tiver em branco
    If !Empty(QRY_TAB->MAXIMO)
        cCodAux := QRY_TAB->MAXIMO
    EndIf
     
    //Se for para atualizar, soma 1 na variável
    If lSoma1
        cCodAux := Soma1(cCodAux)
    EndIf
     
    //Definindo o código de retorno
    cCodFull := cCodAux
     
    QRY_TAB->(DbCloseArea())
    RestArea(aArea)
Return cCodFull

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