Ponto de entrada acionado na primeira vez que carrega os dados da sequência de numeração das tabelas
Exemplo da Rotina:
User Function CriaSXE() //Tratativas Return cProxNum
Exemplo 1- Ponto de entrada para tratar várias tabelas:
#include "protheus.ch"
#include "topconn.ch"
/*/{Protheus.doc}P.E - CriaSXE
Ponto de entrada para retornar o próximo número que deve ser utilizado na inicialização da numeração. Este ponto de entrada é recomendado
para casos em que deseja-se alterar a regra padrão de descoberta do próximo número.
A execução deste ponto de entrada, ocorre em casos de perda das tabelas SXE/SXF ( versões legado ) e de reinicialização do License Server.
@author: Súlivan Simões Silva - Email: sulivansimoes@gmail.com
@since : 15/10/2019
@version : 1.0
@param : PARAMIXB, array, Vetor contendo as informações que poderão ser utilizadas pelo P.E.
@return : cRet, caracter, Número que será utilizado pelo controle de numeração.
Caso seja retornado Nulo ( NIL ), a regra padrão do sistema será aplicada. Esta função nunca deve retornar uma string vazia.
@Lik : 1 - http://tdn.totvs.com/pages/releaseview.action?pageId=6815179
2 - https://centraldeatendimento.totvs.com/hc/pt-br/articles/360019303171-MP-ADVPL-CRIASXE-PARA-SOLUCIONAR-LACUNAS-NO-CONTROLE-DE-NUMERA%C3%87%C3%83O
@obs : MANUTENÇÕES FEITAS NO CÓDIGO:
--------------------------------------------------------------------------------------------
Versão gerada:
Data:
Responsável:
Log: [Fale aqui o que foi feito]
--------------------------------------------------------------------------------------------
/*/
user function CRIASXE()
local aArea := getArea()
Local cAlias_ := paramixb[1]
local cCpoSx8 := paramixb[2]
local cAlias_Sx8:= paramixb[3]
local nOrdSX8 := paramixb[4]
local aTabelas := {} //Tabelas que irão permitir a execução do P.E
local cTabela := "" //Alias corrente que irá permitir a execução do P.E.
local nCount := 0
local cQuery := "" //Na query eu vejo o ultimo número que tá no banco.
local cProxNum := Nil //Retorno da função.
ConOut("[u_CRIASXE] 01 - Entrou no ponto de entrada CRIASXE / Se nao tiver log entre mensagem 01 e 02, nao foi feito nada aqui!")
//Definindo as tabelas que irão executar o P.E / Caso precise executar em mais alguma só adicionar no array e pronto..
aTabelas := {"SL1","FJV"}
//Percorro array e vejo se tabela corrente deve executar o P.E
for nCount := 1 to len(aTabelas)
if( cAlias_ $ aTabelas[nCount] )
cTabela := aTabelas[nCount]
ConOut("[u_CRIASXE] -> TRATATIVA | Sera ajustado via P.E numeracao automatica: "+ cAlias_ + " - " +;
cCpoSx8 + " - " + cAlias_Sx8 + " - " + cValToChar(nOrdSX8) )
exit
endif
next
//Se a tabela corrente estiver na coleção de tabelas E as variáveis dos parâmetros não estiverem com problema.
if( !empty(cTabela) .AND. ! ( empty(cAlias_) .AND. empty(cCpoSx8) ) )
ConOut("[u_CRIASXE] -> Antes de criar consulta para pegar ultimo numero do campo "+cCpoSx8 )
cQuery := " SELECT MAX("+ cCpoSx8+ ") AS ULTIMO_NUM FROM "+ RetSqlName(cAlias_) +" AS TMP "
cQuery += " WHERE TMP.D_E_L_E_T_ = '' "
cQuery := changeQuery(cQuery)
TcQuery cQuery New Alias 'TMP_QRY'
ConOut("[u_CRIASXE] -> Depois de criar consulta para pegar ultimo número do campo "+cCpoSx8 )
//Caso a query retorne ultimo número
if( !TMP_QRY->(eof() ) )
cProxNum := soma1(TMP_QRY->ULTIMO_NUM) //pego ultimo código e somo 1
ConOut("[u_CRIASXE] -> Proximo numero do campo "+cCpoSx8+" sera "+cProxNum )
else
ConOut("[u_CRIASXE] -> A query veio vazia ou ocorreu algum problema, nao conseguiu incrementar o proximo numero do campo"+cCpoSx8 )
endif
TMP_QRY->( dbCloseArea() )
endif
ConOut("[u_CRIASXE] 02 - Encerrou taferas no ponto de entrada CRIASXE")
restArea( aArea )
return cProxNum
Exemplo 2- Ponto de entrada para tratar uma tabela customizada:
//Bibliotecas
#Include "Totvs.ch"
#Include "TopConn.ch"
/*/{Protheus.doc} CriaSXE
Ponto de Entrada para controlar a numeração
@author Atilio
@since 17/10/2019
@version 1.0
@return cCodRet, Código de retorno que entrará no lugar do chamado pelo License
@type function
@see https://tdn.totvs.com/pages/releaseview.action?pageId=6815179
@obs Esse p.e. é chamado na primeira vez de pegar a numeração na tabela
/*/
User Function CriaSXE()
Local aArea := GetArea()
Local cAliasX := ParamIXB[1] //cAlias - Nome da tabela;
Local cCpoSX8X := ParamIXB[2] //cCpoSX8 - Nome do campo que será utilizado para verificar o próximo sequencial;
Local cAliasSX8X := ParamIXB[3] //cAliasSX8 - Filial e nome da tabela na base de dados que será utilizada para verificar o sequencial;
Local nOrdSX8X := ParamIXB[4] //nOrdSX8 - Índice de pesquisa a ser usada na tabela.
Local cCodRet := Nil
Local cQryMax := ""
//Se for a tabela SZJ
If cAliasX == "SZJ"
//Montando a query, pegando o último
cQryMax := " SELECT " + CRLF
cQryMax += " ISNULL(MAX(" + cCpoSX8X + "), '') AS ULTIMO " + CRLF
cQryMax += " FROM " + CRLF
cQryMax += " " + RetSQLName('SZJ') + " SZJ " + CRLF
cQryMax += " WHERE " + CRLF
cQryMax += " ZJ_FILIAL = '" + FWxFilial('SZJ') + "' " + CRLF
cQryMax += " AND ZJ_NUMERO NOT LIKE 'LANC%' " + CRLF
cQryMax += " AND SZJ.D_E_L_E_T_ = ' ' " + CRLF
TCQuery cQryMax New Alias "QRY_MAX"
//Se tiver dados e se não tiver vazio
If ! QRY_MAX->(EoF()) .And. ! Empty(QRY_MAX->ULTIMO)
cCodRet := Soma1(QRY_MAX->ULTIMO)
EndIf
QRY_MAX->(DbCloseArea())
EndIf
RestArea(aArea)
Return cCodRet
Observações:
- Caso tenha dúvidas ou problemas com os exemplos, entre em contato;
- Se tiver sugestões de rotinas, pode entrar em contato;
- Função e documentação enviada por Súlivan Simões;