Dê Ideias!

Compartilhe conhecimento

Fique tranquilo, nós não enviamos spam
junho 16th, 2015 por William Gurzoni

Assim como outros softwares o Protheus possui um log de erro que é gerado sempre que há uma situação inesperada na rotina, em algumas linguagens, a chamada "exceção".
Quando um erro ocorre no Protheus, na maioria das vezes este é gerado na tela do usuário em formato de texto e o mesmo pode ser copiado e analisado.

O error.log do Protheus (como é conhecido entre os analistas), é muito rico e na maioria das vezes é o suficiente para localização do erro no arquivo fonte no caso de ser erro de programação. Para quem não está familiarizado, abaixo segue o layout dos principais componentes do log.

Error.log

Cabeçalho do error.log

SetOrder – Index not found

Este erro quer dizer que a rotina está fazendo referência a um índice que não existe na tabela. Por boa prática de programação é recomendado que em customizações se utilize de nick name na rotina. O nick name é um recurso que permite atribuir uma espécie de "apelido" ao índice, e é este apelido que utilizamos nas rotinas customizadas, assim caso um novo índice com o mesmo número que o seu seja criado no padrão do sistema, será transparente para sua rotina.

variable does not exist C1_XNOME

Caso a variável apresentada no log seja um campo, o problema possivelmente está ocorrendo pois não foi utilizado o alias (SC1->) para fazer referência, então ao invés de utilizar C1_XNOME, deve-se utilizar SC1->C1_XNOME. Este problema ocorre quando a área ativa (tabela atual) não é a mesma do campo, neste caso a SC1.

Caso o erro esteja sendo apresentado em uma variável normal, então possivelmente você não realizou a declaração dela antes de usar. Basta declarar, atribuir um valor e seguir em frente.

Variable is not array – Type [C]

Este erro é bem comum quando se está aprendendo a trabalhar com arrays. Arrays são variáveis que podem armazenar vários valores ao mesmo tempo. Trabalham de forma parecida a um gaveteiro, onde em cada gaveta se pode armazenar uma ou mais roupas. Cada gaveteiro possui uma posição determinada.

Este erro é apresentado quando se tenta acessar uma posição de um suposto array, porém a variável é um texto ou número. Vejá no exemplo abaixo:

Local aTeste := "Olá mundo"

Alert(aTeste[1])

Neste exemplo a posição 1 não existe, pois a variável é um texto comum. Para funcionar, deveria fazer da seguinte forma:

Local aTeste := {"Olá mundo ", "está é a segunda posição do array"}

Alert(aTeste[1] + aTeste[2])

Type mismatch / type mismatch on compare

Este erro ocorre sempre que é realizada uma operação com um tipo de dado não correspondente, como por exemplo a comparação de um campo de data com outro de texto ,e assim por diante.

Um exemplo tosco seria:

If dDatabase
     Alert (dDatabase)
Endif

O erro seria gerado pois um If (estrutura condicional) espera receber uma condição lógica (True ou false), contudo está recebendo uma data, gerando assim o erro Type mismatch.

Obs: a dDatabase é uma variável reservada, onde irá retornar a data base do sistema, aquela que o usuário escolheu no momento do login.

Variable is not an object

Este erro ocorre quando se tenta acessar métodos ou atributos de um objeto, porém o objeto não foi instanciado anteriormente. Este tipo de erro é muito comum quando se está criando um processo de workflow (envio de e-mail), pois quando se utiliza as classes de workflow é necessário criar o objeto apontando para um arquivo de modelo em formato HTML. Quando este arquivo não é localizado por algum motivo, o objeto do workflow não é instanciado corretamente, então este erro é apresentado.

Para corrigir, será necessário debugar sua rotina customizada e encontrar o local onde o objeto deveria estar sendo instanciado e não está.

Array out of bounds

Talvez esta seja um dos erros impossíveis de se compreender sem realizar o debug do código fonte que o gerou. Isto porque é gerado sempre que o sistema tenta acessar uma determinada posição do array (vetor) que não existe. Geralmente isso acontece por falha na programação. Este erro é difícil de identificar pois o protheus não traz no error.log o array com seus valores, então a menos que o fonte não seja muito grande e você seja bom de "teste de mesa", precisará debugar para entender o que está gerando o erro.

Can not insert duplicate key

Este erro sempre será apresentado no caso de tentar inserir um registro que possui a mesma chave primária de outro registro já cadastrado.

A chave primária é nada mais nada menos que um grupo de campos, que em conjunto em um registro não podem se repetir dentro da tabela. Em exemplo de chave primária no mundo real, seria o CPF ou CNPJ, estes não podem se repetir nos bancos de dados do governo, pois cada pessoa deve possuir um número exclusivo.

No Protheus geralmente a chave primária das tabelas são compostas de FILIAL+(campos chave da tabela).

Para corrigir: Para que não ocorre este tipo de erro, sempre antes de confirmar a inclusão de um registro na base de dados, faça uma verificação se já não existe um outro registro com os mesmos dados da chave primária. Esta verificação pode ser realizada com um simples "seek".

Divided by zero

Para quem já é programador de outras linguagens, este erro já é bem conhecido. Até mesmo na matemática o professor sempre repete "Não se divide um número por zero", e o mesmo ocorre na programação. Quando o programa está sendo executado e encontra uma situação destas, ocorre esta exceção.

Para corrigir: proteja sua rotina para que não ocorra este tipo de exceção, pode-se colocar um IF antes da divisão e verificar se o divisor é maior que zero.


Uma resposta para “Tipos de error.log no Protheus – Parte 1”

  1. Juca disse:

    Legal, muito bom o tópico!!

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *


William Gurzoni

Entusiasta por tecnologia.
Bacharel em Análise de Sistemas e pós graduado em Business Intelligence.

#3D Printing #Drones #Protheus