Ponto de entrada acionado na primeira vez que carrega os dados da sequência de numeração das tabelas
Exemplo da Rotina:
1 2 3 | User Function CriaSXE() //Tratativas Return cProxNum |
Exemplo 1- Ponto de entrada para tratar várias tabelas:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 | #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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 | //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;