Árvore de páginas

Versões comparadas

Chave

  • Esta linha foi adicionada.
  • Esta linha foi removida.
  • A formatação mudou.

...

5. Solicitação de Coexistência de versões Protheus anteriores ou iguais a 12.1.31

a. Coexistência de diversas Versões Protheus

b. Tabela de Documento contábil, CTF

c. Não alteração dos fontes de outros módulos nos processos de Contabilizações off line , versões maiores ou iguais a P12.1.031

d. Fontes com ajustes no módulo Contábil 

6. Mensagem Única

7. Tabelas Contábeis Envolvidas

8. Desenvolvimento/Codificação

...

Hoje, na contabilização de integrações existe a função LockByName para o controle de execução desse processo. Este processo cria um registro de identificação do processo na tabela de semáforo contábil, faz o bloqueio deste registro e já libera o LockByName do processo. O bloqueio do registro da tabela do semáforo Contábil é retirado e excluído dessa tabela pelo processo que o bloqueou ao término do processamento. Nas contabilizações on line nos processos dos módulos de controladoria esse controle de semáforo será retirado. Caso, algum módulo necessite de controle de semáforo em seus processos on line, este deverá estes deverão ser feito criados pelo processo da origem de acordo com as suas necessidades.


A princípio, como primeira solução, fomos orientados a utilizarmos apenas a função LockByName, sem a criação da tabela de semáforo contábil. Com isto surgiram questões como a ocorrência de um bombardeio dessa função e a preocupação de ocasionar uma lentidão generalizada no sistema e/ou a perda de dados. Outra questão trazida a tona foi a função Ca100Incl ser chamada dentro de transação.

...

Esta funcionalidade será utilizada em todos os módulos do ERP em que existe contabilização, Mensagem Única e dentro do próprio módulo Contabilidade Gerencial.

03. Escolha do Mecanismo para Remoção do Semáforo

Após discussões das questões de performance, concorrência, perda de dados, funções dentro de transações, inicialmente, fomos orientados a adotar a solução abaixo que serão feitos em dois pontos.


Roteiro para aplicação das nova funcionalidades nas versões iguais ou maiores a 12.1.031.

1 - Aplicar o pacote de atualização de dicionário Código: 007415, caso o pacote não tenha sido incorporado a versão.

2 - Aplicar a atualização dos fontes ( ptm ) para utilização das novas funcionalidades.

3 - Executar o UPDDISTR da versão com o SDF diferencial da versão.

03. Escolha do Mecanismo para Remoção do Semáforo

Após discussões das questões de performance, concorrência, perda de dados, funções dentro de transações, inicialmente, fomos orientados a adotar a solução abaixo que serão feitos em dois pontos.


Na função de contabilização Ca100Incl, na contabilização de integrações, receber do módulo origem o vetor aFlagCTB preenchidos com as devidas posições, aFlagCTB{  'campo da tabela a Na função de contabilização Ca100Incl, na contabilização de integrações, receber do módulo origem o vetor aFlagCTB preenchidos com as devidas posições, aFlagCTB{  'campo da tabela a ser marcado', 'string a gravar', 'alias da tabela a marcar', 'recno a ser marcado' }  para todos os registros de origem a serem contabilizados. Também não alterar o local da chamada dessa função dentro do ERP, podendo algumas chamadas ficarem dentro de transação.  

...

A função RpcSetEnvdeverá ser chamada pois iremos abrir algumas tabelas contábeis. Na função StarJob, no segundo parâmetro, informar GetEnvServer(), assim o job será executado no mesmo ambiente (environment) da conexão (thread) atual. Informar no terceiro parâmetro, true, assim a conexão pai espera a finalização do job. Como abaixo:

StarJob("cNomeJob", GertEnvServ(), .T., "Parâmetros a serem passados para o JOB" ).

Considerar que conexão principal irá aguardar o término da execução do Job . Caso este não termine,  finalizar o job com a função KillUser.

KillUser ("UserName", "ComputerName", "ThreadID", "ServerName") - para obter 3 os parâmetros dessa função utilize GetUserInfoArray. Esta retorna um vetor multidimensional com as informações de cada um dos processos em execução no server. Para obter o "ServerName" utilizar a GetSrvInfo que retorna um vetor com as informações do Server.

Na situação em que o números dos Documentos não serão  sequenciais fica na pendência do Product Owner.

05. Solicitação de Coexistência de versões Protheus anteriores e iguais ou superiores a P12.1.031

a. Coexistência de diversas Versões Protheus.

Para a coexistência de versões anteriores e iguais ou maiores a P12.1.031  do Protheus deverão ser feitas inúmeras proteções nos fontes contábeis, utilizando a função GetRpoRelease(). 

Para versões anteriores da P12.1.31, a criação do arquivo de semáforo contábil na pasta system será mantida. 

Para versões maiores ou iguais a a P12.1.031, o arquivo de semáforo contábil será substituída por LockByName.

b. Tabela de Documento contábil, CTF. 

A geração do número do documento contábil utilizando um Job estará disponível somente a partir da release 12.1.31. Para diminuir os impactos nos demais fontes, o nome da função que gera o número do documento contábil não foi alterada, continua como ProxDoc. Está irá redirecionar para a função CallProxDc para releases iguais ou superiores a 12.1.31.

Criada a variável estática __lRelease no fonte CTBXSEM.PRW para identificar a versão do release utilizado.

Fontes abaixo:

CTBA102.PRW

CTBA103.PRW

CTBA105.PRW

CTBA211.PRW

CTBA220.PRW ( Procedures )

CTBA281.PRW

CTBA340.PRW

CTBA380.PRW

CTBA410.PRW ( Localizações )

CTBM300.PRW

CTBXATU.PRW

CTBXSEM.PRW

CTBXVLD.PRW

...

espera a finalização do job. Como abaixo:

StarJob("cNomeJob", GertEnvServ(), .T., "Parâmetros a serem passados para o JOB" ).


Considerar que conexão principal irá aguardar o término da execução do Job . Caso este não termine,  finalizar o job com a função KillUser.


KillUser ("UserName", "ComputerName", "ThreadID", "ServerName") - para obter 3 os parâmetros dessa função utilize GetUserInfoArray. Esta retorna um vetor multidimensional com as informações de cada um dos processos em execução no server. Para obter o "ServerName" utilizar a GetSrvInfo que retorna um vetor com as informações do Server.


Na situação em que o números dos Documentos não serão  sequenciais fica na pendência do Product Owner.

05. Solicitação de Coexistência de versões Protheus anteriores e iguais ou superiores a P12.1.031

a. Coexistência de diversas Versões Protheus

Para a coexistência de versões anteriores e iguais ou maiores a P12.1.031  do Protheus deverão ser feitas inúmeras proteções nos fontes contábeis, utilizando a função GetRpoRelease(). 

Para versões anteriores da P12.1.31, a criação do arquivo de semáforo contábil na pasta system será mantida. 

Para versões maiores ou iguais a a P12.1.031, o arquivo de semáforo contábil será substituída por LockByName.


Tempo para efetuar e retirar o LockByName em maquina local, lembrando que esse tempo depende de infra, rede , internet, latência, etc.

Em 3 execuções de 1.000 LockByName e UnlockByName 41 segundos

Em 3 execuções de 10.000 LockByName e UnlockByName o tempo teve variação maior

Execução 1 - 14, 7 minutos

Execução 2 - 21, 35 minutos

Execução 3 - 24,16 minutos


b. Tabela de Documento contábil, CTF

A geração do número do documento contábil utilizando um Job estará disponível somente a partir da release 12.1.31. Para diminuir os impactos nos demais fontes, o nome da função que gera o número do documento contábil não foi alterada, continua como ProxDoc. Está irá redirecionar para a função CallProxDc para releases iguais ou superiores a 12.1.31 e para OldProxDoc para versões anteriores a essa versão do Protheus


Esta função é chamada nos fontes abaixo:

CTBA102.PRW

CTBA103.PRW

CTBA105.PRW

CTBA211.PRW

CTBA220.PRW ( Procedures )

CTBA281.PRW

CTBA340.PRW

CTBA380.PRW

CTBA410.PRW ( Localizações )

CTBM300.PRW

CTBXATU.PRW

CTBXSEM.PRW

CTBXVLD.PRW


c. Não alteração dos fontes de outros módulos nos processos de Contabilizações off line , versões maiores ou iguais a P12.1.031

Os outros módulos não serão obrigados a alterar os seus fontes de contabilização Off Line.  Essa foi solicitação dos Product Owners de outros módulos. Isso poderá causar lentidão. Pois em algumas contabilizações, os módulos de origem, colocam algumas funções contábeis dentro de transação, por exemplo, a Ca100Incl e  não passam o array aFlagCtb. 

A solicitação para que essa função não fique dentro de  transação é porque que ela pode abrir uma tela de interação com o usuário e isso não é recomendável que fique dentro de uma transação. 

Esta função tem a própria transação e, se o array aFlagCTB for recebido nessa função com os recnos  das linhas a serem marcados na origem como contabilizados, isso será feito na mesma transação de gravação dos lançamentos contábeis (CT2).


d. Fontes com ajustes no módulo Contábil

Com a solicitação de coexistência de várias versões do Protheus e também da solicitação de PO's de outros módulos de não alterar os fontes de contabilização off line, houve a necessidade de reavaliar e buscar por outras soluções o que impactou em novos ajustes em nossos fontes e refazer todos os testes em versões anteriores e simulando a versão 12.1.031 com a compilação dos mesmos fontes para esses trabalhos.

Voltamos os nomes das funções que haviam mudado para os nomes originais que estão na pasta Master para que não afetem versões anteriores a '12.1.031'. 


Os fontes do core alterados e suas alterações para que estes fiquem na pasta Master do TFS. CTBXSEM, CTBXATU, CTBA1A105.


d.1 - CTBXSEM

Criada a variável estática __lRelease no fonte CTBXSEM.PRW para identificar a versão do release utilizado. Se .T.a release for maior ou igual a 12.1.031, se  .F. , release anterior 12.1.031.

Outra variável estática __aChaveBlock foi criada e inicializada com NIL. A rotina CanProcItvl irá 'setar' com .T. e gravar todas as chaves bloqueadas pela função. Será esvaziada na FreeProcItvl e 'setada' como NIL

ProxDoc - Esta função é a responsável por gerar o próximo documento. Esta, agora, irá redirecionar para CallProxDc quando __lRelease for .T. e para OldProxDoc, quando for .F.. Esta funções irão fazer as respectivas sub-chamadas.


CanProcItvl/FreeProcItvl 

CanProcItvl(dDtVldDe, dDtVldAte, cFilDe, cFilAte, cChave, lSerial, aSelFil,  cEmpProc)

Esta função foi ajustada para utilizar LockByName.  Esses bloqueios serão feitos antes de iniciar o processo de contabilização. Será feito o bloqueio de acordo com os parâmetros recebidos. Caso receba, um range de filial e de período, serão feitos bloqueios em  filial+data, ou seja, filial e em cada um dos dias do período recebido no parâmetro. Todos estes parâmetros têm DeFault.

A sugestão é que receba sempre o range de datas ,as filiais e o parâmetro cChave  que é o nome do programa.

Mesmo que o parâmetro lSerial não seja passado, caso esteja na release 12.1.031, será feito por lockbyname. Caso esteja em versões anteriores a citada continua criando arquivo na pasta system.


Nesta função, em azul, está os parâmetros inseridos,  lSerial é identificador de versão 12.1.031 ou menor. Se .T., trabalha de forma independente das funções CtbSerial I/CtbSerialF, aSelfil deve ser passado quando o processo tiver a função de seleção de filiais, cEmpProc quando existe necessidade de bloquear um grupo de empresa.


CanProcItvl(

dDtVldDe - Data Inicial do processamento

 dDtVldAte - Data Final do processamento

cFilDe -  Filial Inicial a processar

cFilAte -  Filial Final a processar  - Caso a rotina tenha seleção de filiais, cFilDe /cFilAte recebe  o range das filiais selecionada array das filiais selecionadas 

cChave - Chave/nome do programa chama a função. Tamanho máximo chave 

lSerial - Se .T., recebe demais parâmetros e esta função trabalha de forma independente das funções  CtbSerialI e CtbSerialF. Se Versão anterior a  P12.1.31 trabalha com arquivo de semáforo contábil no system.   

aSelFil - Range de filiais da função de seleção de filiais.

cEmpProc - Aqui informar o Grupo de empresas, SOMENTE QUANDO O PROCESSAMENTO ENVOLVER DOIS OU MAIS GRUPOS DE EMPRESAS. Exemplo: Consolidação Contábil, InterCompany


06. Mensagem Única

Este é um outro ponto que necessitará de muito estudo e conhecimento das funcionalidades do processo de integração de mensagens únicas. Pois a inclusão de lançamentos contábeis, pode vir de outras marcas que não seja Protheus.

...

08. Desenvolvimento/Codificação

Criar uma função, CallProxD, por exemplo, para chamar a ProxDoc. Esta por sua vez Alterar a função ProxDoc para redirecionar para a função CallProxDc se versão maior ou igual  P12.1.31.  Esta irá chamar  a NewProxDoc que irá tentar bloquear um número de documento.  Caso consiga o bloqueio, irá gravar no novo campo, CTF_USADO, um indicador de que está usado. Pode ser o caracter o documento já foi usado, o carácter 'S' e mantê-lo bloqueado até a gravação dos lançamentos contábeis (CT2). Caso não consiga, esta função exemplo, FunCallProx, deverá irá inciar um Job para gravar 5 10 números de documentos e, novamente,  tentar bloquear um número de documento.

...

Segundo, criar uma função, por exemplo a citada ,FunCallProxDCallProxDc.

Essa função irá chamar a função ProxDoc que tentará bloquear um número de documento.  Caso consiga o bloqueio , irá gravar no novo campo, CTF_USADO, um indicador de que está usado. Pode ser o carácter 'S' e mantê-lo bloqueado até a gravação dos lançamentos contábeis (CT2). Caso não consiga, esta função exemplo, FunCallProx, deverá inciar um Job para gravar N números de documentos e ,após a gravação dos N números de documentos, novamente retornar a função ProxDoc  para tentar bloquear um número de documento para a gravação do documento contábil.

...