Ponto de Entrada CriaSXE

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;

Referências: