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.