Árvore de páginas

Versões comparadas

Chave

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

...

  1. Visão Geral
  2. Exemplo de utilização
  3. Escolha do Mecanismo para Remoção do Semáforo
  4. Pontos de atenção das funções escolhidas e nas formas de bloqueio de registros/Definição de funções a utilizar
    1. Ca100Incl e SimpleLock
    2. StarJob e RpcSetEnv  

Mensagem Única

  1. Tabelas Contábeis Envolvidas
  2. Parâmetros do Semáforo Contábil
  3. Funções de Semáforo
  4. Rotinas chamadoras das funções de Semáforo Contábil
  5. Rotinas chamadoras da função GravaLanc
  6. Rotinas chamadoras da função Ca100incl

...

Na primeira situação em que a função Ca100Incl é chamada recebendo o vetor aFlagCTB, os elementos do vetor devem ser bloqueados para serem no final atualizados na origem.  O conteúdo de alguns campos da tabela CTK também deverão ser bloqueados, como o CTK_TABORI e CTK_RECORI, pois nem sempre o conteúdo destes campos da tabela CTK são os mesmos do vetor aFlagCTB.  Na grande maioria das vezes serão,  neste caso, se utilizarmos a função SimpleLock ou uma outra que não utilize o LockByName ocultamente, duas vezes, devemos certificar que não ocorrerá nenhum problema. Também devemos certificar que  uma outra conexão não consiga pegar esses registros.


O Bloqueio no conteúdo campo CTK_RECORI deve ser feito quando o vetor aFlagCTB estiver vazio. E quando o aFlagCTB estiver preenchido efetuar o bloqueio pelo conteúdo deste vetor.


Em relação a SimpleLock não há problema em chamar a função duas vezes e não utiliza a função LockByname de forma oculta. Único cuidado a ser tomado é no momento de tirar o bloqueio de um  registro com a função MsRUnlock.  Caso esteja dentro de transação não há necessidade de executar essa função ( segundo a TEC não existe problema  ).


Na segunda situação da  chamada da função Ca100Incl, deve ser dada atenção e aprofundar o entendimento dos fontes onde o vetor aFlagCTB não é passado. Isso ocorre em algumas rotinas de contabilização de integração e dentro do próprio módulo Contábil. Também verificar e/ou identificar para qual outra finalidade esse vetor é utilizado. Por exemplo, se pode ser passadas tabelas de usuário e se existe algum tratamento específico nesta situações.


Não foi encontrada uma outra finalidade para vetor aFlagCTB a não ser a contabilização.


Outro ponto, é onde a função Gravalanc é chamada. Essa função é chamada em alguns pontos em que um procedimento e/ou regra de execução deverá ser definido, estamos falando das rotinas de rateio contábil, consolidação, Apuração de Resultados. Por exemplo, se faz sentido processar ao mesmo tempo os mesmos rateios em períodos diferentes mas subsequentes onde os lançamentos do primeiro influenciam na do segundo.

Este ponto será elucidado pelo Product Owner.


b. Starjob e RpcSetEnv 

A função ProxDoc que verifica qual o número do próximo documento contábil disponível e faz o seu bloqueio pode estar dentro de uma transação. Por isso, caso ela não consiga pegar um número de documento contábil disponível,  devemos criar uma função utilizando a função Starjob para gerar 5 ( definido em conjunto com time TEC ) números de documento contábil e voltar para a função ProxDoc até que consiga pegar e bloquear um número de documento disponível.  

...

Neste caso existe alguns quesitos a serem verificados. Primeiro, se a função StarJob pode ser executada sem antes chamar a função RpcSetEnv.  Pois essa última faz a abertura de um novo ambiente, o que poderia causar lentidão.

Não há necessidade de chamar a função RpcSetEnv. 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. Chamar como abaixo:

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

...

Outra questão, se o job iniciado não terminar, qual procedimento deverá ser tomado, já que provavelmente entrará em um 'loop' infinito.

Existe a possibilidade  finalizar a conexão de uma sessão com a função KillUser. A conexão principal pode esperar o término da execução do job, caso não termine tem a opção de 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.


Nessa situação em que o número do documento será gerado por um Job, poderá e provavelmente ocorrerá de o número do documento não ser sequencial. Quais são ou existem restrições em relação a geração de números de documentos não sequenciais?

Documentos não sequenciais - pendência PO.


c . 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.

Não foi verificado nenhum problema em mensagem única. Todos os documentos terão o bloqueios feitos da mesma forma.

05. Tabelas Contábeis Envolvidas

...