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

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

Esses e outros códigos, estão disponíveis gratuitamente no nosso GitHub, acesse em github.com/dan-atilio/AdvPL.
Caso queira uma customização específica para sua empresa, saiba mais em nossa Loja.

Bom pessoal, por hoje é só.
Abraços e até a próxima.

About Dan_Atilio

Analista e desenvolvedor de sistemas. Técnico em Informática pelo CTI da Unesp. Graduado em Banco de Dados pela Fatec Bauru. Entusiasta de soluções Open Source e blogueiro nas horas vagas. Autor do projeto Terminal de Informação, onde são postados tutoriais e notícias envolvendo o mundo da tecnologia.

Deixe uma resposta

%d blogueiros gostam disto: