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.
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.
