O controle de numeração do Protheus utiliza a Tabela ASCII para definição de sequência. Antigamente utilizava-se o Hard Lock conectado ao servidor. Posteriormente esse controle foi migrado para as Tabelas SXE / SXF físicas no diretório do ambiente. A partir do Protheus V12 o controle de numeração deve ser exclusivamente via License Server (Release 25 inclusive já valida no momento do Upgrade para não permitir virada do release sem uso do License - DFRM1-16558). Além do fato de o desempenho ser muito superior neste modelo em relação ao modelo nas tabelas SXE/SXF, existe também o fato de que as tabelas SXE/SXF serem gerenciadas pelo FileSystem, e por conta disto podem ser corrompidas em casos de encerramentos inesperados, como quedas de energia. A numeração das tabelas em License Server é armazenada em memória, enquanto o License Server está ativo. Quando o serviço do License Server é parado, é criado um arquivo chamado LSNumber.val na pasta do Application Server. Neste arquivo são gravadas as últimas sequências das chaves em uso no License, das tabelas que possuem numeração automática. Quando o License é reiniciado, esses dados são lidos deste arquivo e carregados em memória novamente, para dar continuidade na sequência da numeração automática. Todos os detalhes em: Numeração automática pelo License Server Deck of Cards |
---|
| Card |
---|
id | License |
---|
label | PASSO 1 - License Server |
---|
| Verifique no arquivo appserver.ini como está preenchida a chave (ENABLENUMER) da sessão [licenseserver]. Deve estar configurado: Enablenumber=1 o que indica controle no License Server (Enablenumber=0 indica controle pelas antigas tabelas SXE/SXF):
Nota |
---|
| [LICENSESERVER] Enable=1 Port=5555 ShowStatus=1 ENABLENUMBER= 0 ou 1 ENABLENUMBER= 0 = SXE e SXF ENABLENUMBER= 1 = License Server | Colocações Informações |
---|
| - Se não existir a linha Enablenumber na seção [LicenseServer], assume-se o padrão, que é numeração no License Server.
- Caso identifique que ainda está configurado como SXE/SXF recomendamos que faça um backup das tabelas SXE e SXF antes de alterar pois, ao alterar o modo de numeração para o modo License Server (Enablenumber=0 para Enablenumber=1) as tabelas SXE e SXF serão deletadas no momento em que acessar a primeira rotina que utilize numeração automática, e nesse momento, o License Server irá buscar a última numeração de cada tabela com numeração automática, e carregar em memória. Após a alteração, caso a numeração esteja na ordem incorreta, utilizar a rotina APCFG110 para acertar (abordada a seguir).
- O usuário que inicializa o serviço do Protheus Server (que usa License Server) deve ser o ADMINISTRADOR.
- Certifique-se de estar com BUILD e LIB e versão do LS - License Server atualizados (LS deve ser igual ou superior a 1.03.014). Detalhes em: Habilitada geração do arquivo LSNumber.val
Com esta atualização volta a ser gravado o arquivo LSNumber.val (quando o servidor de licenças é encerrado corretamente, via console ou no fim do serviço). Esse arquivo grava a última sequência disponível para as chaves em uso no License, quando o servidor de licenças é reiniciado esses dados são carregados para a aplicação e no momento de obter a próxima sequência serão considerado os dados que estiverem nesse arquivo. A funcionalidade é recomendada pois uma vez que a sequencia estiver corrigida o License irá guardar o conteúdo e continuar sempre a partir dele; ao invés de buscar na tabela do sistema a próxima sequencia para a chave a partir da última numeração gravada. Se estiver com License Server anterior à versão 1.03.014 e com builds superior a 7.00.131227A - 1.0.3 então, neste caso, o sistema não irá gravar o arquivo LSNumber.val e passará a buscar na Tabela a maior numeração já gravada para dar sequência. Detalhes em: Criação do LSNumber.val / Numeração automática pelo License Server Ou seja, o License Server irá varrer a Tabela em questão (exemplo SC5) no Banco de Dados e irá se basear na maior numeração que possui gravada e incrementar em +1 Exemplo: A sequência do campo está na numeração 000096 , 000097 , 000098 , 000099 , 000100 .... Mas, por algum motivo, essa tabela já possui um registro gravado com a numeração 142535. Ao reiniciar o LS, irá varrer a tabela para encontrar a última numeração e como o número 142535 é maior que o 000100, seguirá a numeração a partir do 142535 respeitando a regra da maior numeração que possui gravada e incrementar em +1 Observação: Para ambientes que possuam lacunas na numeração automática como exemplificado acima, é possível utilizar o ponto de entrada CRIASXE, que consegue varrer a tabela e setar a numeração. Mais informações: ADVPL - Ponto de Entrada CRIASXE.
Múltiplos Ambientes utilizando o mesmo License Server: Quando sua estrutura possui mais de um Appserver / mais de uma pasta System apontando para o mesmo License Server, a numeração de uma base pode influenciar na outra. Por isso, é necessário configurar a chave SpecialKey no arquivo appserver.ini de cada base, para que cada ambiente possua uma chave diferente no License Server. Esse cenário é encontrado por exemplo quando se possui mais de um ambiente (exemplo ambiente de Produção e ambiente de Teste) apontando para o mesmo banco de dados e o mesmo License Server (configuração no ini do server). Veja como configurar a chave SpecialKeyAmbiente DBF: Se os ambientes forem DBF/CDX eles devem apontar para endereços no X2_PATH, obrigatoriamente, diferentes. Ambiente TOP: Se os ambientes forem TOPConnect/TOTVSDBAcess, os alias dos ambientes devem ser, obrigatoriamente, diferentes.
|
|
Card |
---|
default | true |
---|
id | Formulário |
---|
label | Função numeração automáticaPASSO 2 - Função no dicionário |
---|
| Nem todas as Tabelas / as Rotinas do Protheus possuem por padrão a função de sugerir numeração automática. Para que, por exemplo, cadastro de clientes, traga na inclusão automaticamente o próximo número disponível, utiliza-se a seguinte sintaxe no inicializador padrão (SX3) do campo A1_COD: GetSx8Num("SA1","A1_COD") É necessário verificar se o X3 do campo que deseja está com esta informação no inicializador padrão! Na maioria das vezes o inicializador padrão do campo está cadastrado como: GetSx8Num("SA1") Os inicializadores GetSx8Num e GetSxeNum tem o mesmo funcionamento e objetivo, porém caso necessário incluir em algum campo que não seja por padrão, o mais utilizado a partir da release 12.125 é a GetSx8Num, pois as tabelas tabelas SXE/SXF não estão disponíveis para acesso direto no Lobo Guará.
(:
Com relação ao uso da função A030INICPD() no Inicializador padrão de A1_COD, é um tratamento para o código do cliente caso exista integração com o RM Sistemas, o que depende da configuração do parâmetro MV_RMCLASS, se você não tem esta integração, a função não terá efeito no seu processo. | IMPORTANTE: | Esta configuração no SX3 para geração automática de numeração sequencial deve ser utilizada apenas por campos nos quais já consta a definição no nativo do Protheus. Não deve ser incluída manualmente em campos que não possuem este controle automático por padrão (como por exemplo no | campocampo C5_NUM). Isto porque, este tratamento por si só não trata abandono de numeração reservada não utilizada (este tratamento é realizado no código fonte das rotinas). Ou seja, ao reservar a próxima numeração clicando em "Incluir"(registro 000010 por exemplo) mas não efetivar a gravação, abandonando o registro, depois de já ter sido utilizada a numeração seguinte (depois de outra instância ter gravado a 000011 por exemplo) serão provocadas lacunas fazendo com que o controle automático se perca. Desta forma, seria necessário verificar a possibilidade de uso de ponto de entrada na rotina que deseja implementar o uso de numeração automática para o fiel comportamento da ferramenta, de forma a tratar abandonos de reserva de numeração. No Portal gestão de Vendas devido a utilização de threads, que permanece ativa aguardando novas execuções a utilização GetSx8Num(), não é possível a utilização desta função pois não é encerrada as threads mantendo a mesma numeração ou ocorrendo abandono de numerações. Nesse caso, para capturar o próximo número para o campo A1_COD, é possível realizar uma customização utilizando a função de usuário (User Function) na chamada do campo do Inicializador padrão (X3_RELACAO). Isso permitirá controlar o momento em que a ação está vindo do Portal de Gestão de Vendas, possibilitando o tratamento e a validação do retorno para apresentação correta da numeração no PGV. Abaixo indicamos um exemplo de função, lembrando que trata-se apenas de um exemplo, caso necessite customizar, solicite o acompanhamento de seu analista programador:
Bloco de código |
---|
title | Exemplo de User Function |
---|
| #Include 'TOTVS.ch'
User Function NextSA1Cod()
Local cNum := GETSXENUM("SA1","A1_COD")
DbSelectArea("SA1")
SA1->(DbSetOrder(1))
While (DbSeek(xFilial("SA1")+cNum))
ConfirmSX8()
cNum := GETSXENUM("SA1","A1_COD")
Enddo
DbCloseArea()
RollbackSx8()
Return cNum |
|
|
Card |
---|
default | true |
---|
id | Ajuste da numeração automática |
---|
label | Ajuste da numeração automáticaPASSO 3 - Ajuste Configurador |
---|
| Para acertar a numeração automática, quando ela sai de ordem por algum motivo, deve-se executar a rotina APCFG110 pelo Configurador. Verifique primeiramente o último/maior número gravado na Tabela (registro "000004" por exemplo) a partir da qual deseja dar sequência (Atente-se à numeração de acordo com a Filial).
OBSERVAÇÃO:
Informações |
---|
| Suponhamos que o License Server seja parado de forma inesperada, como uma queda de energia ou fechamento inadequado, o arquivo não é gerado, e não reinicialização do License, as informações da última numeração são lidas diretamente das tabelas no banco e carregadas em memória. Ou seja, se houver uma numeração discrepante na sequência da tabela, como por exemplo, alguma numeração iniciada com uma letra, em meio a uma sequência de números (no banco de dados, as letras vem depois dos números, então o código iniciado com letra vai ser considerado o último número da sequência, depois de qualquer número), toda vez que o servidor é reiniciado sem execução do processo correto (via console ou no fim do serviço), esse código será carregado com base nessa numeração "incorreta" do banco. |
Vamos tomar, como exemplo, a numeração automática no campo A1_COD da tabela de Clientes (SA1). Na imagem abaixo, note que existem 4 clientes cadastrados, portanto a última numeração é 000004:
Na rotina APCFG110, a numeração deverá estar conforme a imagem abaixo:
- Na seção inferior (antiga SXF) - Numeros em uso/ Numeros liberados: Exibe a última numeração sugerida / a sugerir (ainda não gravada) → neste exemplo, 000005.
- Na seção superior (antiga SXE) - Proximos numeros: Exibe a numeração seguinte, ou seja (última numeração sugerida / a sugerir (ainda não gravada)) + 1 → neste exemplo, 000006.
- Se por algum motivo, ao incluir um Novo Cliente na rotina de Clientes, a próxima numeração não estiver sendo 000005, então deve clicar 2 vezes no número que está em Números em uso, alterar para o que seria o próximo, e na área Próximos números inserir o subsequente correto. Com isso é redefinida a ordem que o sistema de numeração automática deve seguir.
OBSERVAÇÃO: Informações |
---|
| Certifique-se de que tanto na seção inferior quanto na superior exista apenas uma linha (um registro) de sugestão da numeração para o ALIAS. Se houver registro duplicado, com ALIAS e Chave idênticos, reinicie o License Server e valide se foi ajustado de modo a possuir apenas uma linha (Dúvidas ou dificuldades nesse procedimento, acionar o Suporte Framework Protheus). |
|
|
|