quarta-feira, 2 de julho de 2014

Documentando Fontes ADVPL com o ProtheusDoc

Bom dia Galera,
O objetivo do ProtheusDOC é autodocumentar os programas-fontes escritos em Adv/PL.
O ProtheusDOC, é uma forma estruturada de escrever comentários, sobre funções, classes, métodos ou qualquer outro elemento de um programa-fonte Adv/PL, que descreve a utilização deste elemento.
Inicialmente os documentos serão gerados no formato HTML através de modelos customizáveis.
Estes modelos serão criados utilizando-se da tecnologia desenvolvida pela Apache Velocity.
A estrutura básica é formada por um bloco de comentários, com um identificador especial no seu início (/*/{Protheus.doc}), seguido de um comentário sucinto, seguido ou não por marcadores especiais. Algo semelhante a:
/*/{Protheus.doc} areaQuad
Efetua o cálculo da área de alguns quadriláteros.

@author José Silva
@since 20/11/2012
@version P10 R4

@param nBase, numérico, Medida do lado ou da base
@param [nAltura], numérico, Medida da altura
@param [nBaseMenor], numérico, Medida da base menor (trapézios)

@return numérico, Área calculada
/*/
User Function areaQuad(nBase, nAltura, nBaseMenor)
...

Uso:
Adicione um bloco de comentário do ProtheusDOC no elemento que você deseja descrever em seu programa-fonte.
Você pode adicionar um comentário rapidamente utilizando a combinação, CTRL + ALT + D, mantendo o cursor sobre o nome da função, por exemplo.

Em seguida, para iniciar o assistente de geração do ProtheusDOC, clique em "Arquivo" > "Novo" > "Outras...". Expanda a seção "TOTVS Tools", escolha a opção "ProtheusDoc Generator" e clique em "Avançar >" (Next >).

Localize e selecione o programa-fonte que será documentado em seguida clique em "Avançar >" (Next >).

Clique em "Concluir" (Finish) para gerar a documentação utilizando o template padrão e o local padrão de exportação (C:\export).

Localize a pasta de exportação. Ela apresentará a mesma estrutura do projeto onde o programa-fonte está localizado.

Abra o arquivo HTML em seu navegador preferido para ler a documentação gerada.

Caso deseje, você pode criar um template customizado adicionando, removendo e/ou alterando a estrutura utilizando o modelo do Velocity.
*IMPORTANTE* O arquivo do template deve estar com o encoding UTF-8.

Ao gerar a nova documentação, selecione o template customizado e/ou defina um local alternativo para a exportação da documentação.

Da mesma forma anterior, localize a pasta de exportação alternativa.

Abra o arquivo HTML em seu navegador preferido para ler a documentação customizada que foi gerada.


Espero ter ajudado!

Driblando a mensagem de erro ‘Improper Function Use'

Bom dia Galera,
Poucos seguem a boa prática de criar funções USER, com no minimo 8 caracteres,sabendo que de acordo com a especificação da linguagem AdvPL, uma USER FUNCTION é identificada por seus 10 primeiros caracteres, por exemplo:
A <User Function DDDFAT06A> será traduzida pelo pré-compilador como: <U_DDDFAT06A>, onde o 'A' se perde, por ser o 11º caractere, devido ao limite de tamanho de nome.

U
_
D
D
D
F
A
T
0
6
A

Sabendo deste limite para nomes de funções USER, existe um pequeno 'bug' na validação utilizada pela Totvs para identificar/definir se uma função é 'improper function use' ou não.
Utilizando a AxCadastro('NOMETABELA') pelo campo formulas, a seguinte mensagem será retornada:


Mas se utilizarmos um recurso, onde burlamos a validação será possível a execução!!

A solução é:
Para toda função com tamanho de 10 caracteres ou mais e que for acusada de 'improper' basta adicionar o 11º caractere, por exemplo em uma chamada a AxCadastro('NOMETABELA') seria adicionado o X, ficando a chamada como AxCadastroX('TABELA') burlando assim a validação de ‘improper functions'.


Obs.:
Isso não será valido para funções USER FUNCTIONS (Funções Customizadas) com nome menor que 10 caracteres, pois a mesma não será encontrada no RPO e será retornada mensagem informando que a função não existe no repositório.

Espero ter ajudado!

Descriptografar campos USERLGI - USERLGA via SQL

Bom dia Galera, 
Para verificar quem foi o usuário que incluiu/alterou algum registro sem a necessidade de acessar o log do Protheus, utilizem a seguinte query:

SELECT substr(E2_userlgi, 3, 1) || substr(E2_userlgi, 7, 1) ||
        substr(E2_userlgi, 11, 1) || substr(E2_userlgi, 15, 1) ||
        substr(E2_userlgi, 2, 1) || substr(E2_userlgi, 6, 1) ||
        substr(E2_userlgi, 10, 1) || substr(E2_userlgi, 14, 1) ||
        substr(E2_userlgi, 1, 1) || substr(E2_userlgi, 5, 1) ||
        substr(E2_userlgi, 9, 1) || substr(E2_userlgi, 13, 1) ||
        substr(E2_userlgi, 17, 1) || substr(E2_userlgi, 4, 1) ||
        substr(E2_userlgi, 8, 1) Usuario
FROM TABELA 
WHERE
  CONDIÇÃO


Na imagem abaixo utilizamos a query para identificar o usuário que incluiu e o ultimo que alterou os títulos no contas a pagar da filial '01' com emissão a partir de 01/06/2014.




*Obs.:   USERLGI --> Usuário que incluiu o registro.
            USERLGA --> Ultimo usuário que alterou o registro.

Espero ter ajudado!

terça-feira, 1 de julho de 2014

Simulador de Coletor de Dados para módulo SIGAACD - Protheus

Boa tarde, 
Logo na implementação do módulo SIGAACD - Automação e Coleta de Dados, nos deparamos com a necessidade de utilizar um Coletor de Dados para testar/validar a integração do coletor com as rotinas no módulo.
A Totvs disponibiliza dois programas para que a implementação seja feita sem a necessidade de um Coletor de Dados fisicamente falando. Segue:

VTDEBUG - Programa para Simular/Debugar Rotinas para Coletor de Dados(ACD)

*Basta executar o comando VTDEBUG nos parâmetros iniciais do protheus:




Após isso abrirá a tela com o Simulador do Coletor de Dados:




Também podemos simular um coletor de dados ativando a seção [Telnet] no arquivo appserver.ini, após isso basta entrar no prompt e digitar o comando: Telnet ipdoserver e irá acessar o módulo ACD conforme imagem abaixo:


Obs: Isso é possivel pois a comunicação entre o ERP e o Coletor é feita através do protocolo VT100 que por sua vez é o protocolo do Telnet.





VTMONITOR - Programa para monitorar os Usuários/Rotinas que estão conectados via Coletor de Dados.













Espero ter Ajudado!


Tipos de máscaras para tratar entradas de dados no Protheus

Boa Tarde,
Sempre que vamos criar algum campo surge algumas dúvidas como: qual máscara devo usar? esse campo irá aceitar números? quais/quantos números? o conteúdo alfabético será maiúsculo ou minusculo? dentre outras...

Para isso temos máscaras que agem sobre todo tipo de dados, identificada pelo sinal arroba (@).

Segue:
 - A Aceita apenas caracteres alfabéticos    - L Aceita apenas caracteres lógicos:    - T (True), F (False), "N" ou "S"    - N Aceita apenas letras ou números    - X Aceita qualquer caracter    - Y Aceita apenas Y (Yes) ou N (No)    - 9 Aceita somente números e sinais    - ! Converte em letras maiúsculas - & Converte em letras minusculas    - $ Exibe o símbolo "$" à frente de um número    - * Exibe o asterisco à frente de um número    - , Exibe uma vírgula Máscara para o dado    - @A Aceita apenas caracteres alfabéticos    - @B O número é ajustado à esquerda    - @C Exibe o sinal "CR" depois de números positivos    - @D Exibe as datas no formato padrão    - @E Aceita a entrada de números no formato brasileiro, ou seja, uso da vírgula como separador de decimal, e datas exibidas no formato DD/MM/AA  - @K Permite exibir um valor provável do conteúdo do campo    - @R Permite exibir caracteres que não farão parte do conjunto de caracteres a serem gravados    Ex: "@R 99.999.999/9999-99" , "@R (99)9999.9999" - @Sn Permite o rolamento horizontal para preenchimento do campo, no tamanho definido por "n"    - @X Exibe a notação "DB" depois de números negativos    - @) Retorna um valor negativo entre parênteses    - @( Retorna um valor negativo entre parênteses, com espaços em branco    - @! Converte todos os caracteres alfabéticos em letras maiúsculas - @& Converte todos os caracteres alfabéticos em letras minusculas  - BR_AMARELO,BR_AZUL,BR_BRANCO,BR_CINZA,BR_LARANJA,,BR_MARRON,BR_VERDE,BR_VERMELHO, BR_PINK, BR_PRETO.
Espero ter Ajudado!


Atualizando a Estrutura do Banco de Dados de Acordo com o SX3

Boa Tarde, 
Muitas vezes nos deparamos com a necessidade de alterar a estrutura de uma tabela, porem não podemos parar todos os serviços do sistema naquele momento pois está em produção.
Existe uma função que analisa toda a estrutura da tabela no SX3 e atualiza a mesma no banco de dados, ou seja, em caso de uma 'emergência/necessidade' podemos criar um campo diretamente no arquivo SX3 e posteriormente fazer com que ele seja criado no banco de dados. 

Segue Exemplo:

X31UPDTABLE ("nome da tabela")  

Ex:  X31UPDTABLE ("SA1") -  irá atualizar a tabela de clientes no banco de dados de acordo com o SX3 atual.

Executando o comando:

Abra a rotina de 'Lançamentos padronizados' em qualquer módulo, vá em incluir, na aba valores, no primeiro valor digite a fórmula, dê um TAB e saia sem confirmar, Pronto!!

Pode também ser executada da mesma forma pela rotina 'Formulas' conforme imagem abaixo:




Espero ter ajudado!


Eliminando Processos Travados no Schedule

Boa tarde Galera,
Este post tem como objetivo auxiliar vocês a eliminar aqueles processos que ficam com erro de retorno no schedule e que a cada inicialização do server o Protheus tenta executa-lo novamente.

Vamos lá:

Os processos do WorkFlow são controlados pelas tabelas WF1, WF2 e WF3 onde:

WF1: São os Processos do WorkFlow
WF2: É o Status do WorkFlow
WF3: Controla a Rastreabilidade do WorkFlow

Temos também os registros da tabelas WFA que é onde conseguimos identificar processos que tiveram problemas na execução da função de retorno através do campo WFA_TIPO quando estão com o valor  "0" .

Este processos estão pendentes de execução e sempre que o server for reiniciado, o WF enviará uma mensagem para lista de endereços dos administradores se forem informados na janela de parâmetros do workflow (configurador) e exibirão no console.log que estão sendo reativados.

REATIVAÇÃO DE PROCESSOS NO WF?



A reativação de processos é a forma em que o WF consegue tentar executar novamente os processos pendentes (que houveram erro de execução de retorno em uma primeira ou mais tentativas).

A reativação é feita sempre que o server  for reiniciado e que o Scheduler estiver sido informado na seção [OnStart] do appserver.ini e que na tabela WFA houver registros que no campo WFA_TIPO contenha o valor igual a "0".

[OnStart]
jobs=Scheduler

[Scheduler]
main=WFOnStart
environment=PRODUCAO
NPARMS=4
PARM1=99
PARM2=01
PARM3=ENVTOP
PARM4=T <<-- Aqui diz para o WF 'REATIVAR OS PROCESSOS'. Troque para F se não quiser.

Outra forma em que a reativação e realizada automaticamente é sempre que causar erro na execução da função de retorno e que a opção "reativar automaticamente" estiver habilitada na janela de parâmetros do workflow (configurador), conforme imagem abaixo:





É importante que na janela de parâmetros do workflow (configurador) você desabilite a opção "reativar automaticamente".

Outra forma considerada 'drástica' de resolver o problema é apagar os registros da tabela WFA que contenham o valor "0" no campo WFA_TIPO. Ou apenas modificam o valor para uma letra. Exemplo: "A". 

Espero que tenha ajudado!