Base de conhecimento


su_e10020201. O usuário N não possui permissão para realizar acesso remoto à base B.

su_e10020301. A quantidade de campos indexados (N) é menor que a quantidade de filtros passados por paramêtros (M, P).

su_e10031701. Mensagem de erro - Não foi possível obter uma conexão com o banco de dados. O quantidade máxima de 10 de conexão(ões) simultânea(s) com o banco de dados chegou ao seu limite.

su_e10032201. Mensagem de erro - An error occurred while allocating memory for an String.

su_e10032901. Mensagem de erro - Can't leave CriticalSection, because the current thread does not own the critical section.

su_e10032902. Mensagem de erro - Can't leave CriticalSection, because does not exist CriticalSection.

su_e10041301. Mensagem de erro - Connection is Disabled.

su_e10050501. Você não está autorizado a deletar registros da classe <chave da classe>.

su_e10050502. Você não está autorizado a inserir registros na classe <nome da classe>.

su_e10050503. Login without authentication failed for user.

su_e10070501. IDO Undo Log File %s already exists.

su_e10070601. Erro ao obter os Dados(DataSet) da fonte de dados.

su_e10070602. Mensagem de erro - Erro ao processar a fonte de dados.

su_e10081701. Mensagem de erro - Wrong version number (72).

su_e10082401. Mensagem de erro - Field of memo type can't be indexed.

su_e10082402. Mensagem de Erro - Table %s Field %s of memo type not defined as lookup multiple.

su_e10092301. Mensagem de erro - Não houve resposta do impressor de HTML. O arquivo 'NomeDoArquivo.out' não foi encontrado.

su_e10092302. Ido Internal Error - Wrong Ido Page Format.

su_e10100701. Mensagem de erro - Não foi encontrada nenhuma JRE instalada.

su_e10112401. Configuração do SSL no Engine.

su_e10112402. Redirecionamento de arquivos quando criados no diretório raiz do Windows.

su_e10112601. Mensagem de erro - Invalid URI.

su_e11022301. Demora na carga de cache.

su_e11022302. Erro de violação de unique constraint ORA-00001.

su_e11022303. Erro no dbCache.log - Key "xxxx" found, but field "xxxx" not found.

su_e11031001. Classes e arquivos órfãos.

su_e11031801. Erro nas dlls do engine causa Assertion Failure na inicialização.

su_e11032401. Desligamento incorreto do engine.

su_e11052501. Failed to login to SMTP Server %srv:%port.

su_e11053101. Como criar novos campos em tabelas.

su_e11072501. Atualizar Engine.

su_e11102701. Execução do Engine e UAC.

su_e11102901. Registros de log com formatação inválida.

su_e12032601. The %s is an invalid DB Character Set.

su_e12040401. Não e possível desabilitar a checagem de permissões depois do 'IQuery.from'.

su_e12092501. Mensagem de erro - Chave negativa, gerada na licença custom, já existe.

su_e12101501. Descartar uma tabela do cache em todas as instâncias do Engine.

su_e12110801. Mensagem de erro - Hora do sistema alterada.

su_e12110802. Mensagem de erro - SQL expression size exceeded.

su_e12121201. Erro ao carregar JVM - Não há memória suficiente.

su_e13021401. Mensagem de Erro - Too many Javascript Identifiers.

su_e13060401. Valor numérico fora do intervalo [-10^28, 10^28].

su_e13070201. Alteração de dados detectada na tabela <nome da tabela> durante a criação da estrutura.

su_e13082101. Como configurar o modo kiosk na inicialização do Windows.

su_e13100101. O Postgres retornou um erro - operator does not exist - XXX = YYY.

su_e14031801. Consultas ao banco de dados em arquivos x-model ou x-class.

su_e14050601. Acessando servidor HTTPS com o objeto XMLHttpRequest.

su_e14060601. Erro na execução de scripts pós-upgrade.

su_e14103101. Mensagem de Erro - Esta base de dados possui os produtos (Nome_dos_Produtos) habilitados para desenvolvimento e por esse motivo não será permitido habilitar a customização. Apenas bases de clientes podem criar chaves custom.

su_e16060701. Usar HtmlPrinter como serviço do Windows.

su_e21083101. Configurar permissões para usuário limitado no windows executar um determinado serviço.




O usuário N não possui permissão para realizar acesso remoto à base B

Esta mensagem não é um erro mas sim uma crítica de segurança. Apenas usuários com permissão de acesso remoto pode acessar uma instância do Engine em uma determinada base.

O responsável pela liberação de acesso é o Administrador do Sistema responsável pela base.

Para liberar o acesso do usuário para realizar o acesso remoto siga os passos a baixo:

  • Vá em “Admin > Segurança > Grupos e Usuários > Usuários”;
  • Selecione o usuário que deseje dar o acesso remoto e entre no modo ficha;
  • No campo Política de Segurança, selecione uma política de segurança que tenha o acesso remoto habilitado. Para identificar se uma política de segurança possui acesso remoto habilitado, basta verificar se o caixa de verificacão (checkbox) Acesso Remoto está marcado. Para abrir o cadastro de política de segurança a partir do cadastro de usuários, basta clicar duas vezes no campo Política de Segurança.
  • Se não houver política de segurança cadastrada com o acesso remoto habilitado, você deve cadastrar uma e associar ao usuário.

A quantidade de campos indexados (N) é menor que a quantidade de filtros passados por paramêtros (M, P)

Este problema ocorre, porque existe um erro de programação no processo.

A propriedade indexFieldName está com a quantidade de campos menor que a quantidade de posição do array atribuída no primeiro ou segundo parâmetro do método setRange.

Exemplo:

__includeOnce(-1898145959); /* QueryAnalyzer.js */
const classKey = -1894834681; /* Vínculos Entre Fluxos de Tarefas e Situações */
const ds = connection.cloneLocalCacheByClass(classKey);

const fluxos = [ -1895831369, -1895831370, -1895831371 ];
ds.indexFieldNames = "CHTABELA"; // 1 campo
ds.setRange( fluxos, fluxos ); // 3 posições para cada parâmetro
ds;

Correto:

__includeOnce(-1898145959); /* QueryAnalyzer.js */
const classKey = -1894834681; /* Vínculos Entre Fluxos de Tarefas e Situações */
const ds = connection.cloneLocalCacheByClass(classKey);

const fluxos = [-1895831371 , -1895831369 ];
ds.indexFieldNames = "CHTABELA"; // 1 campo
ds.setRange( fluxos[0], fluxos[1]); // 1 posição para cada parâmetro
ds;

Mensagem de erro - Não foi possível obter uma conexão com o banco de dados. O quantidade máxima de 10 de conexão(ões) simultânea(s) com o banco de dados chegou ao seu limite

Este erro ocorre quando a quantidade máxima de conexões com um banco de dados foi excedida.

A configuração da quantidade máxima de banco de dados é feito no manage em Configuration/Databases/MDBC.


Mensagem de erro - An error occurred while allocating memory for an String

Quando há pouca memória virtual disponível para o sistema de modo que não haja memória suficiente para alocar uma string de um determinado tamanho.

O sistema passa a subir esta mensagem de erro. A quantidade máxima de memória virtual por processo é limitada pelo sistema operacional. Em sistemas operacionais de 32bits a quantidade máxima de memória virtual é 2GB.

Para resolver este problema é necessário fazer o diagnóstico do consumo excessivo de memória e corrigir o trecho de código que causa o consumo excessivo de memória.


Mensagem de erro - Can't leave CriticalSection, because the current thread does not own the critical section

Este erro ocorre no momento que o desenvolvedor executa o método criticalSection.leave(), quando existe um criticalSection, mas não está na mesma sessão (thread).

Mensagem de erro - Can't leave CriticalSection, because does not exist CriticalSection

O erro ocorre no momento que o desenvolvedor chama o método criticalSection.leave() quando não existe um criticalSection.

Mensagem de erro - Connection is Disabled

Este erro ocorre quando a propriedade Enabled do objeto connection ou database estão setados com False, impossibilitando do usuário de executar qualquer método ou propriedade do objeto que precisa de conexão com o banco.

Você não está autorizado a deletar registros da classe <chave da classe>

A mudança de classe de um registro no sistema equivale, conceitualmente, a excluir o registro de uma classe X e inserir em uma classe Y. Assim ao mudar a classe de um registro, o sistema critica a permissão de exclusão de registros na X.

Para solucionar esta crítica do sistema, você deve acionar o administrador do sistema para que ele libere a permissão para o que o seu usuário possa excluir registros da classe X.


Você não está autorizado a inserir registros na classe <nome da classe>

A mudança de classe de um registro no sistema equivale, conceitualmente, a excluir o registro de uma classe X e inserir numa classe Y. Assim ao mudar a classe de um registro, o sistema critica a permissão de inclusão de registros na classe Y.

Para solucionar esta critica do sistema, você deve acionar o administrador do sistema para que ele libere a permissão para o que o seu usuário possa inserir registros da classe Y.


Login without authentication failed for user

Está mensagem ocorre quando scheduller tentar autenticar o usuário que está executando a tarefa.

Observações:

  1. Verifique se a chave do usuário existe na base que a tarefa está sendo executada.
  2. Altere a chave do usuário, caso precise.

IDO Undo Log File %s already exists

O IDO não conseguiu criar um arquivo necessário para o seu funcionamento. Esses erro é possivelmente causado por uma falha interna no Engine. Caso o problema aconteça, é necessário que o servidor Engine seja reiniciado.

Erro ao obter os Dados(DataSet) da fonte de dados

Este defeito é disparado pelo processo executor de fonte de dados do sistema e ocorre toda vez que o método getDataSet() da fonte de dados(IDS) falha durante a sua invocação.

Para resolver este problema o Administrador de Sistemas deve ser contactado e este deverá acionar o desenvolvedor responsável pela fonte de dados(IDS) para que ela seja corrigida. O desenvolvedor deverá analisar o métodos getQuery e mountDataSet da fonte de dados indicada na mensagem de erro.


Mensagem de erro - Erro ao processar a fonte de dados

Este defeito é disparado pelo processo executor de fonte de dados do sistema e ocorre toda vez que uma da fonte de dados(IDS) falha durante a sua criação.

Para resolver este problema o Administrador de Sistemas deve ser contactado e este deverá acionar o desenvolvedor responsável pela fonte de dados(IDS) para que ela seja corrigida.


Mensagem de erro - Wrong version number (72)

Este erro geralmente ocorre quando o IP:PORTA de uma base de destino está errado e coincidiu de apontar para outro um serviço qualquer na rede ou internet.

Exemplo concreto:

No processo de atualizar da iVFS se você informar o IP:PORTA de um servidor de FTP est mensagem de erro irá aparecer.

Tecnicamente falando, o problema ocorre ao criar uma instância do objeto Connection com os parâmetros IP:PORTA de um outro serviço qualquer que não seja um Engine usando o protocolo IAP.

O protocolo IAP tenta obter a versão da base que o Connection está tentando se conectar e um outro serviço, que não conhece o protocolo IAP, responde com um valor inesperado.

Para resolver o problema certifique-se de que o IP e a porta estão corretos.


Mensagem de erro - Field of memo type can't be indexed

Este mensagem de erro é lançada pelo IDO quando está se tentando indexar um campo do tipo memo ou blob. Campos com um desses tipos não podem ser usados na criação de índices.

Mensagem de Erro - Table %s Field %s of memo type not defined as lookup multiple

Esse erro pode ocorrer na execução da rotina de verificação de integridade de campos lookup. É possível que, na definição das tabelas do sistema, exista incorretamente um mesmo campo lookup com duas definições de tipos distintas.

Mensagem de erro - Não houve resposta do impressor de HTML. O arquivo 'NomeDoArquivo.out' não foi encontrado

Este erro pode ocorrer durante uma tentativa de impressão no sistema. Existem vários fatores que podem causar este problema e um deles é a possibilidade de um software antivírus que esteja apagando o arquivo <Diretório do Engine>\htmlprinter\htmlprinter.exe.

Para diagnosticar se é o software antivírus o causador do problema, desabilite a proteção do antivírus, renomeie pasta <Diretório do Engine>\htmlprinter e tente imprimir novamente. Se a impressão for bem sucedida, fica claro que o antivírus é o causador do problema. Não se esqueça de desfazer a renomeação da pasta <Diretório do Engine>\htmlprinter após realizar o procedimento de diagnóstico.

Se o problema for causado pelo antivírus, realize o seguinte procedimento para resolvê-lo:

  • Configure o antivírus para que ele ignore o htmlprinter.exe. Não temos como detalhar o procedimento de configuração porque não conhecemos o antivírus usado na estação que apresenta o defeito. A maioria dos antivírus possuem uma lista de softwares confiáveis na qual poderá ser adicionado o htmlprinter.exe. Não sabemos se o seu antivírus possui esta lista, talvez ele possua, mas com outro nome por exemplo Zona de Segurança, Área Segura, etc…
  • Renomeie a pasta “<Diretório do Engine>\htmlprinter\job” para “<Diretório do Engine>\htmlprinter_job”. Este passo só é recomendável se você quiser que não sejam impressas as impressões que falharam anteriormente e por isso ficaram acumuladas na pasta “<Diretório do Engine>\htmlprinter\job”. Veja a quantidade de arquivos que esta pasta tem. Se tiver poucos arquivos e se você realmente deseja imprimí-los, então não renomeie esta pasta.
  • Exclua o arquivo “htmlprinter.version”, presente em “<Diretório do Engine>\htmlprinter".

Pronto. Agora você poderá imprimir novamente.


Ido Internal Error - Wrong Ido Page Format

A mensagem de erro “Internal Error: Wrong Ido Page Format” é motivada por uma corrupção do cache local de dados. A corrupção do cache local de dados pode ocorrer em situações em que o usuário fecha o engine de forma forçada, usando o gerenciador de tarefas do windows ou até mesmo quando falta energia durante uma transação.

Se o erro for no iEngine.exe, você deverá fazer:

  • O backup das pastas: logs, dbCache e dbCacheBackup;
  • Em seguinda deverá descartar o cache local.
  • Enviar para o administrador do sistema o cache local de dados, o backup do cache local de dados e os logs.

Mensagem de erro - Não foi encontrada nenhuma JRE instalada

Este problema pode ocorrer nas seguintes situações:

  • A JRE não está instalada na máquina onde o possui uma instância do Engine tentando acessar a JVM. Solução: Basta instalar nesta máquina o último release da JRE 6.0. A instalação do JDK não é suficiente, embora ele já traga uma JRE.

  • A versão da JRE instalada seja 32 bits e o Engine seja 64 bits (o mesmo ocorreria no caso contrário também). Solução: Se certificar que JVM e Engine estejam, ambos, com a mesma configuração (32 ou 64 bits).


Configuração do SSL no Engine

Para configurar o Engine para usar SSL é necessário informar um arquivo que contenha a hierarquia de certificados. A ordem dos certificados que compõem a hierarquia é: primeiro o certificado da aplicação e em seguida o certificados da autoridade certificadora(CA), a mesma que assinou o certificação para a sua aplicação.

Poderá haver mais que 2 certificados no arquivo de hierarquia de certificados. Veja abaixo o formato do arquivo de hierarquia:

CERT1: Certificado da Aplicacão
CERT2: Certificado da certificadora que assinou CERT1
CERT3: Certificado da certificadora que assinou CERT2
...
CERTN: Certificado da certificadora que assinou CERTN-1

Redirecionamento de arquivos quando criados no diretório raiz do Windows

Existe um comportamento, a partir do Windows Vista, que se a aplicação não está sendo executada com privilégios de administrador, a escrita para arquivos em diretórios considerados “sensíveis”, tais como o “C:/” ou “Arquivos de Programas” é bloqueada.

Se o engine está executando sem permissão de administrador e um arquivo é requisitado a ser gravado na Raiz, o usuário não achará o arquivo nesse diretório. Ele todavia será gravado em outro local. Essa técnica é chamada de UAC Virtualization.

Exemplo:

Usuário tenta gravar o arquivo.

var file = new File("C:\\teste.txt")

Tal arquivo não ficará nesse diretório, mas sim em.

C:\Users\Username\AppData\Local\VirtualStore\teste.txt

O Windows abstrai essa mudança de diretório. Caso o usuário queira ler o arquivo, considere o mesmo diretório que foi indicado na criação. O Windows redirecionará a requisição de leitura para o diretório em que o arquivo foi gravado. Portanto a aplicação rodará sem problemas. A única coisa que pode incomodar é que o usuário não verá o arquivo na Raiz.

Caso você queira forçar que o arquivo seja gravado nos diretórios que a Microsoft considera sensíveis, terá que dar permissão ao engine de que rode como administrador. Você pode fazer isso clicando com o botão direito do mouse e selecionando a opção “executar como administrador”.


Mensagem de erro - Invalid URI

Esse erro ocorre quando o interpretador Javascript não consegue identificar unicamente um script, num comando include ou includeOnce, a partir da URI do script que o inclui.

Demora na carga de cache

Ao tentar carregar um cache do início, dependendo do tamanho das tabelas de cadastro, pode ser levado um tempo considerável na montagem do cache no disco. Esse tempo vai variar de acordo com o tamanho dessas tabelas, pois os dados serão capturados no banco e salvos no disco. Nessas tabelas estão os registros como: cadastro de cliente, preço, estabelecimentos, etc. Enquanto o Engine estiver carregando esse cache, ele não poderá ser utilizado. Por esse motivo, a recarga do cache só deve ser feita em casos de extrema necessidade, se tiver de ser feito em horário que o sistema esteja em uso. Alguns fatores influenciam nesse tempo de carga, como por exemplo: processador, memória RAM, velocidade do disco, conexão com o banco de dados e volume dos dados.

A maneira para se fazer uma nova carga do cache é parar a execução do Engine e depois excluir (se houver necessidade de guardar esse cache, as pastas poderão ser somente renomeadas, como por exemplo adicionar “_” ao final do nome de cada uma delas) as pastas dbCache, dbCacheBackup e dbCacheProvider, presentes dentro do diretório onde está o Engine. Quando o Engine for iniciado novamente, as pastas citadas acima serão recriadas e o cache montado novamente.

O cache também pode ser remontado a partir do backup existente no diretório do Engine. Para isso, somente a pasta dbCache deve ser excluída ou renomeada. Porém, é importante ressaltar que o backup só é feito quando o Engine é inicializado. Caso o Engine não seja iniciado diariamente, o backup pode ser muito antigo, e a sua atualização poderá ser muito demorada. A sugestão é que o Engine seja reiniciado em um determinado horário que não esteja em uso. Se estiver como serviço do Windows o interessante é configurar uma tarefa que, em determinado horário, reinicie o serviço. Isso fará com que o backup do cache seja atualizado e em casos onde é necessário recarregar o cache bastará excluir a pasta dbCache pois será utilizado o backup.

Vale ressaltar que em se tratando de gerência de riscos para casos de problema no Engine ou na máquina onde há o servidor principal, o mais indicado é utilizar técnicas de replicação, como por exemplo: ter um outro Engine como servidor de aplicação onde esse Engine não recebe nenhum tipo de requisição e só existe para que seja feito backup e mantenha um cache íntegro. É importante que esse Engine seja reiniciado toda noite, para que o backup do cache seja sempre realizado. Em casos de indisponibilidade do servidor principal, uma solução rápida seria só mudar o diretório do serviço, fazendo com que o servidor que era de backup passe a ser o principal.

Outro ponto é que mesmo utilizando a técnica acima, ainda há a possibilidade do próprio hardware, onde está o servidor, ter um problema. Para esse caso, seria interessante ter uma outra máquina com a mesma configuração e com o Engine já configurado e que estivesse sendo mantido o cache atualizado. Com a queda do servidor principal por problema de hardware, rapidamente o outro servidor poderia ser colocado no ar, lembrando apenas de alterar o IP.

Essas técnicas visam a robustez da arquitetura a ser utilizada na aplicação, tendo sempre um opção para qualquer problema que possa vir a ocorrer e fazendo com que a resposta seja rápida para esses problemas, minimizando o tempo offline da base.


Erro de violação de unique constraint ORA-00001

O erro ocorre por uma tentativa de inserção ou update no banco que provocava uma duplicação no valor de um campo que não pode ter valores duplicados:

ORA-00001: unique constraint (constraint_name) violated

Para verificar qual tabela está causando o erro, o comando SQL abaixo pode ser excutado:

SELECT DISTINCT table_name
FROM all_indexes
WHERE index_name = 'CONSTRAINT_NAME';

De posse da tabela que está sendo violada deve se tornar mais fácil descobrir qual a operação está causando o erro.

mais informações sobre o erro em: http://www.techonthenet.com/oracle/errors/ora00001.php


Erro no dbCache.log - Key "xxxx" found, but field "xxxx" not found

Quando o modo DEBUG do dbCache.log está ativado, é possível que seja visto o erro: Erro: Key “xxxx” found, but field “xxxx” not found.

Esse erro ocorre porque se tentou acessar um campo de uma chave que está no cache local, porém esse campo não existe na tabela ao qual a chave pertence.

Exemplo: tentar capturar o campo NOME em um chave que pertence a tabela IGROUPUSER. Vai ser lançado o erro no dbCache.log pois não existe o campo NOME nessa tabela. session.userKey.nome

Esse erro será lançado para aplicação, ou seja, para o browser. A menos que seja tratado no processo, pelo desenvolvedor.

Não é possível o Engine saber se o erro é grave ou não, pois trata-se de uma implementação onde o desenvolvedor dos processos e relatórios faz uso do recurso de captura de campo através de chave do cache local. Somente quem desenvolveu o processo/relatório sabe o quão grave é não ter o valor do campo ou estar tentando pegar o valor de um campo através de uma chave que não possui o campo buscado.


Classes e arquivos órfãos

Após um upgrade algumas pastas podem ser apagadas fazendo com que seus arquivos filhos fiquem órfãos na iVFS, estes arquivos são movidos para a pasta Dados/Sistema/Orfãos.

O cliente deve analisar quais estão sendo utilizados e fazer a recolocação para o local correto no sistema ou, em caso negativo, pode realizar a exclusão manual dos mesmos (clicando-se com o botão direito no script e escolhendo a opção delete).

Estes arquivos pertencem somente a base de destino e caso deletados não serão inseridos novamente em uma futura atualização.

Durante uma atualização cada base que a recebe vai apresentar a sua própria relação de arquivos órfãos, então o procedimento de remoção ou adequação dos script pode ser feita independentemente para cada uma.

Importante notar que está relação não é de arquivos que ficaram orfãos durante o processo de upgrade, mas sim de todos os arquivos órfãos no sistema, os quais já podem estar nesta situação há mais tempo.


Erro nas dlls do engine causa Assertion Failure na inicialização

O engine depende de DLLs para seu funcionamento com uma atualização as dependências (DLLs) podem mudar.

Caso estas dependências mudem e o engine não consiga atualizar suas dependências automaticamente, a inicialização do engine por falhar mostrando o erro abaixo:

ASSERTION FAILURE (D:\10_2_3\IENGINE\SCR\IMAIN.PAS, LINE 221)

Um forma que pode levar a esse erro é quando o link do atalho está errado, ou seja, o atalho tem um endereço que não é do servidor central ou o parâmetro -nu foi acrescentado ao atalho, fazendo com que o engine não se atualize automaticamente.

A solução é deixar somente o executável do Engine e o atalho na pasta e executar o atalho novamente, verificando se o atalho está com o endereço correto.

Outra solução é baixar as dependências para a versão correta.

Após baixar as dependências, os arquivos contidos dentro do zip devem ser inseridos na pasta onde está o executável. Depois é só executar o atalho novamente.


Desligamento incorreto do engine

Foi verificado que o engine foi desligado de forma errada.

O desligamento incorreto do engine pode causar corrupção no cache e efeitos colaterais indesejados. Para desligar o engine corretamente vá até a bandeja do sistema, no canto inferior direito, próximo ao relógio, clique com o botão direito no ícone do engine e depois selecione a opção “Sair” do menu suspenso.


Failed to login to SMTP Server %srv:%port

Esse erro ocorre quando o Engine não conseguiu estabelecer uma conexão com o servidor SMTP, ou quando não foi autorizado o Login.

Possíveis causas do problema:

  • A configuração do servidor SMTP não está correta.
  • A configuração de usuário e senha para envio de e-mail não está correta.
  • Firewall está bloqueando o acesso ao servidor de SMTP.

Como criar novos campos em tabelas

Crie a definição do campo em um arquivo x-model ou x-class existente ou em um novo arquivo no diretório da iVFS do que representa a tabela no banco. Informação detalhada sobre a criação de arquivos x-class e x-model pode ser encontrada no manual de desenvolvimento do engine.

Acesse o processo de atualização de estrutura em “Base de Dados > Atualizar estrutura”. Neste momento será feita uma análise dos arquivos de definição do modelo de dados por modificações a serem refletidas no banco. Escolha as alterações que deseja consolidar no banco e clique em “Continuar” para aplicá-las. Reinicie a base para concluir o processo.


Atualizar Engine

Acessar o processo “Desenvolvimento > Atualização > Atualizar Engine” a partir da base da qual se deseja que a atualização seja enviada.

Preencher os campos com os dados da base de destino.

Após a execução do processo ter sido concluído com sucesso, reiniciar a base de destino para que a atualização seja efetivada.


Execução do Engine e UAC

Não há forma de executar o engine sem conceder privilégios de administrador ao usuário ou desabilitar a política de UAC do windows para um nível mais baixo de controle.

O windows oferece a opção de gravar as credênciais de administrador através de uma configuração no atalho, desta forma as credênciais só são requisitadas na primeira execução. Porém esta técnica oferece uma falha de segurança caso o usuário mude o aplicativo para qual o atalho aponta.

A configuração é feita adicionando os parâmetros abaixo ao atalho do engine:

runas /user:<nome_computador>\<nome_adminstrador> /savecred "C:\windows\exemplo.exe"


Registros de log com formatação inválida

O registro do log do profiller segue uma formatação bem definida para que possa ser interpretada pelo processo “Análise do log do Profiler” em “Desenvolvimento > Análise do log do Profiler”. Caso esse arquivo venha a estar com a formação errada, o processo não conseguirá interpretar corretamente e consequentemente não exibirá nenhuma informação do relatório.

Característica da formatação.

O espaçamento para definir a hierarquia entre as chamadas de função executadas são de 3 espaços em branco.

Exemplo:

0 00:02:40 914 - 00:00 000 ( 1 running ) Handling HTTP Connection - 16:00:46 20/10  [ 0 ] - 00:00:00 30/12  [ 0 ] : 0 blocks
  0 00:00:00 000 - 00:00 000 ( 1 ) Reading request information - 16:00:46 20/10  [ 0 ] - 16:00:46 20/10  [ 0 ] : 0 blocks
      0 00:00:00 000 - 00:00 000 ( 1 ) Reading from TCP/IP socket. RemoteAddress: 177.48.130.113 - 16:00:46 20/10 #Bytes requested [ 1,024 ] - 16:00:46 20/10 #Bytes read [ 954 ] : 0 blocks
  0 00:00:00 000 - 00:00 000 ( 1 ) TiHttpHandler.AcquireHelper - 16:00:46 20/10  [ 0 ] - 16:00:46 20/10  [ 0 ] : 0 blocks
  0 00:02:40 914 - 00:00 000 ( 1 running ) TiVfsHelper.Handle - 16:00:46 20/10  [ 0 ] - 00:00:00 30/12  [ 0 ] : 0 blocks

The %s is an invalid DB Character Set

Esse erro indica que a tabela de caracteres(Charset) do SGBD não é compatível com o Engine. O Engine, sendo servidor de base, verifica em sua inicialização se a tabela de caracteres do SGBD é compatível, registrando no log essa mensagem caso não seja.

Esse problema costuma ocorrer quando se utiliza no banco a tabela de caracteres ISO 8859-1, que é um subconjunto da Win1252, formato utilizado pelo SO Windows localizado para o Brasil. Quando se tenta gravar algum registro com caracteres que não estão presentes no CharSet ISO 8859-1, o registro não é gravado corretamente, ocasionando diversos problemas.

Solução:

Alterar o character set do banco para WIN1252 ou UTF8. Caso a base já tenha sido criada, deve-se criar um dump do banco atual, criar um novo esquema com um charset compatível, restaurar o dump para o novo esquema.


Não e possível desabilitar a checagem de permissões depois do 'IQuery.from'

Não é possível desabilitar a checagem de permissões depois do IQuery.from, devido ao IQuery montar os joins para validar as permissões no from.

Para a correta utilização será necessário criar uma instância do objeto IQuery, desabilitar as permissões e em seguida realizar o from.

Exemplo:

__includeOnce(-1897036629); /* IQuery.ijs */
const iq = new IQuery();
iq.uncheckPermission();
const q = iq.from(-2008889000 /* Títulos */);
q = q.where([{
  field: "CHCRIACAO", 
  operator: "=", 
  value: [35064849,35065736,35548908,35548956,35548966,35548992,35549018]
}]);
q = q.column([{field: "CHAVE"}, {field: "VALOR"}]);
q.toSql();

Mensagem de erro - Chave negativa, gerada na licença custom, já existe

Este erro acontece porque uma chave negativa gerada no servidor já existia no banco de dados. A causa desse erro, geralmente, é a presença de um script custom trazido de outra base quando não deveria.

Para solucionar o problema, deve-se contactar o administrador.


Descartar uma tabela do cache em todas as instâncias do Engine

Em casos específicos pode ser necessário descartar uma tabela do cache das instâncias dos Engines clientes de forma remota, sem que seja necessário descartar todo o cache. Neste caso ao ser reiniciado o Engine descartará a tabela e irá carregá-la novamente a partir do banco de dados.

O descarte da tabela somente acontece no iniciar do Engine. Se o Engine estiver em execução quando os registros forem deletados, a sincronização ocorrerá da forma atual, sem haver o descarte da tabela. Para haver o descarte, o Engine deve estar fechado, para que ele, ao iniciar, detecte que antes de sincronizar, a tabela deve ser descartada.

Atenção, o procedimento afeta todos os Engines clientes da base, que recarregarão a tabela ao serem reiniciados. Deve ser usado com bastante cuidado, pois a carga de uma tabela do cache pode ser demorado.

O procedimento é feito a partir da execução do script abaixo:

executeScript('ufs:engine/routines/system/discardTableOnCache.js', 'tableName', 'nomeDaTabela');

Mensagem de erro - Hora do sistema alterada

O Engine fica monitorando a hora da máquina, e registra em seus logs essa mensagem sempre que a hora da máquina é alterada. Essa mensagem também é gerada sempre que o sistema sincroniza automaticamente a sua hora.

Deve-se evitar alterar a hora da máquina com o sistema em funcionamento. Nas cidades que adotam o horário de verão, deve-se configurar o Sistema Operacional para fazer o ajuste da hora automaticamente.


Mensagem de erro - SQL expression size exceeded

Este erro é disparado quando uma consulta SQL ao servidor ultrapassa o tamanho máximo definido. Atualmente o tamanho máximo é de 1,5Mb.

Para resolver este problema o Administrador de Sistemas deve ser contactado e este deverá acionar o desenvolvedor responsável pela consulta para que ela seja corrigida.


Erro ao carregar JVM - Não há memória suficiente

Esse erro pode acontecer quando não há memória virtual contínua suficiente na máquina para alocar uma máquina virtual Java. Desta forma, é necessária que as seguintes medidas sejam tomadas para se evitar este erro:

  1. Se a máquina em que o erro ocorreu tem apenas 2 GB de memória física, recomenda-se que seja executado juntamente com o engine, apenas programas que são essenciais, desta forma a fragmentação da memória é evitada, garantindo assim espaço contínuo para que a JVM seja alocada;
  2. Se a máquina em que o erro ocorreu tem 3 GB ou mais, é possível aumentar a memória virtual para 3 GB, ou seja, a memória máxima que cada programa pode alocar. Para isso, bastar ligar o switch 3GB do windows. O passo-a-passo para se fazer isso está aqui. Se apenas esse passo não for suficiente, ele pode ser combinado com o passo 1 para uma melhor economia no consumo e menor fragmentação da memória.

Mensagem de Erro - Too many Javascript Identifiers

O compilador iJavascript limita o número máximo de identificadores por script em 65535. Caso algum script possua um número de identificadores superior, é necessário que ele seja dividido em dois ou mais scripts.

Valor numérico fora do intervalo [-10^28, 10^28]

Este erro ocorre quando o tamanho da parte inteira de um ponto flutuante é maior que 38. Esta limitação foi colocada no driver do Postgres para que os dados possam ser exportados para outros SGBDs, haja vista que o Oracle e MSSQL não aceitam números maiores que isso para tipos equivalentes ao number(38,10) do Postgres.

Alteração de dados detectada na tabela <nome da tabela> durante a criação da estrutura

Esta mensagem ocorre apenas durante a criação de uma ou mais visões através do processo “Desenvolvimento > Base de dados > Tabelas de soma”. A criação de uma visão deve ser realizada sem que haja gravação alguma nas tabelas envolvidas e durante todo o período de criação, caso contrário, esta mensagem será exibida.

Caso se esteja visualizando esta mensagem, deve-se criar novamente a(s) visão(ões) sem que haja alteração de dados nas tabelas envolvidas. Para isto, sugere-se que o procedimento seja realizado em horário de nenhum uso do sistema, ou ainda, que o Engine que esta conectado diretamente ao SGBD seja isolado de qualquer acesso via rede, concedendo-se apenas o acesso ao administrador que realizará o procedimento de criação das visões.


Como configurar o modo kiosk na inicialização do Windows

Para que o navegador do caixa entre automaticamente no modo kiosk na inicialização do Windows será necessário que:

  1. O atalho do engine esteja na pasta de inicialização do Windows.
  2. O Chrome deve estar configurado da seguinte forma
  • No navegador vá em menu > configuração > inicialização e selecione “Abrir a página Nova guia”.

O Postgres retornou um erro - operator does not exist - XXX = YYY

Este erro ocorre quando existe na cláusula where uma coluna de um tipo comparada a um dado de outro. O Oracle não dispararia este erro, pois realizaria cast automático.

Exemplo de consulta incorreta:

SELECT
LOCESCRITU, CHCRIACAO, ROMANEIONUMERO, NUMERO, EMISSAOMOV, CLASSE, REPRESENTA,
PESSOA, LOCENTREGA, TRANSPORTA, RECURSO, QUANTIDADE, TOTAL, VOLQDE, VOLPESLIQ, VOLPESBRU,
CAST(NULL AS NUMBER) AS VALFRETE
FROM PEDIDO
WHERE pedido.TIPOOPERACAO IS NULL AND pedido.ECOTACAO IS NULL
AND pedido.ROMANEIONUMERO = 181

Neste caso, o campo “pedido.ROMANEIONUMERO” é do tipo character varying (VARCHAR) e o dado após o sinal de igual é do tipo integer.

Exemplo de mensagem de erro completa:

Erro: The SGBD returned an error: ERROR:  operator does not exist: character varying = integer
LINE 8:          and   pedido.ROMANEIONUMERO = 181
                                          ^
HINT:  No operator matches the given name and argument type(s). You might need to add explicit type casts.

Local: TiPostgresDBConnection.InternalSQLExecute

SQL expression:

      select
      LOCESCRITU, CHCRIACAO, ROMANEIONUMERO, NUMERO, EMISSAOMOV, CLASSE, REPRESENTA,
      PESSOA, LOCENTREGA, TRANSPORTA, RECURSO, QUANTIDADE, TOTAL, VOLQDE, VOLPESLIQ, VOLPESBRU,
      cast(null as number) as VALFRETE
      from PEDIDO
      where pedido.TIPOOPERACAO is null and pedido.ECOTACAO is null
      and   pedido.ROMANEIONUMERO = 181

Como o próprio hint do erro já sugere, para resolver o problema, é necessário igualar os tipos de dados.

Solução 1 - Utilizar iQuery:

__includeOnce('ufs:/ngin/iquery.js');

const sql = IQuery.from(-2008879000 /* Pedidos ou Provisões */)
  .where([
    {field: 'TIPOOPERACAO', operator:'=', value: null},
    'and',
    {field: 'ECOTACAO', operator:'=', value: null},
    'and',
    {field: 'ROMANEIONUMERO', operator:'=', value: 181}
    // observe que 181 aqui é numérico, mas o iquery identifica o tipo e coloca na query como texto
  ])
  .column([
    {field: 'LOCESCRITU'}, {field: 'CHCRIACAO'}, {field: 'ROMANEIONUMERO'},
    {field: 'NUMERO'}, {field: 'EMISSAOMOV'}, {field: 'CLASSE'},
    {field: 'REPRESENTA'}, {field: 'PESSOA'}, {field: 'LOCENTREGA'},
    {field: 'TRANSPORTA'}, {field: 'RECURSO'}, {field: 'QUANTIDADE'},
    {field: 'TOTAL'}, {field: 'VOLQDE'}, {field: 'VOLPESLIQ'},
    {field: 'VOLPESBRU'},
    {castValue: null, cast: 'number', alias: 'VALFRETE' }
  ])
  .toSql();

Solução 2 - Utilizar o javascript para realizar o cast:

__includeOnce('ufs:/goog/string/string.js');

const romaneionumero = 181;
const query =
  'SELECT locescritu, chcriacao, romaneionumero, numero, emissaomov, classe,' +
  '       representa, pessoa, locentrega, transporta, recurso, quantidade,' +
  '       total, volqde, volpesliq, volpesbru, CAST(NULL AS NUMBER) AS VALFRETE ' +
  'FROM   pedido ' +
  'WHERE  pedido.tipooperacao IS NULL ' +
  '       AND pedido.ecotacao IS NULL ' +
  "       AND pedido.romaneionumero = '%s' ";
database.query(goog.string.format(query, romaneionumero));

Solução 3 - Utilizar o banco de dados para realizar o cast:

const query =
  'SELECT locescritu, chcriacao, romaneionumero, numero, emissaomov, classe,' +
  '       representa, pessoa, locentrega, transporta, recurso, quantidade,' +
  '       total, volqde, volpesliq, volpesbru, CAST(NULL AS NUMBER) AS VALFRETE ' +
  'FROM   pedido ' +
  'WHERE  pedido.tipooperacao IS NULL ' +
  '       AND pedido.ecotacao IS NULL ' +
  "       AND CAST(pedido.romaneionumero AS INTEGER) = 181 ";
database.query(query);

Consultas ao banco de dados em arquivos x-model ou x-class

Não devem ser utilizadas consultas diretas ao banco de dados na definicão de um x-class como database.query e connection.getDataSet. A instanciação de uma classe pode ser realizada em uma sessão anônima causando erros como o abaixo:

Erro: Failure evaluating VFS directory properties.
Não foi possível realizar instância a partir da classe XXXXXXXX
Anonymous user can't access database informations.

Acessando servidor HTTPS com o objeto XMLHttpRequest

O Engine implementa a API XMLHttpRequestt compatível com a implementação padrão disponível nos navegadores, exceto o suporte à operações assíncronas, não disponível no Engine.

O exemplo abaixo demonstra o uso da API no acesso a um servidor HTTP:

var xhr = new XMLHttpRequest();
xhr.setTimeout(5000); // 5 s
xhr.open("GET", "https://www.google.com");
xhr.send();
while(xhr.readyState != XMLHttpRequest.DONE) {
  sleep(1);
}

xhr.responseText

Erro na execução de scripts pós-upgrade

Após execução do processo de upgrade, o resultado pode apresentar a seguinte mensagem abaixo:

  Atenção:
  
  A execução do script 'NOME_DO_SCRIPT(CHAVE_DO_SCRIPT)' fracassou:

  O script pertence apenas a base de destino. Somente scripts de pós-upgrade da base de origem
  são executados. [su_e14060601]

Ocorre, quando o script de pós-upgrade encontra-se na base destino, mas o mesmo não econtra-se também na base origem, o fluxo correto para execução de scripts pós-upgrade é que apenas scripts da base origem são executados.


Mensagem de Erro - Esta base de dados possui os produtos (Nome_dos_Produtos) habilitados para desenvolvimento e por esse motivo não será permitido habilitar a customização. Apenas bases de clientes podem criar chaves custom

Ocorre ao tentar habilitar a criação de chaves CUSTOM na base de desenvolvimento e a mesma possui produtos licenciados incorretamente. Possivelmente há algum produto do sistema lincenciado de modo incorreto na base na qual o usuário está tentando habilitar a criação de chaves CUSTOM.

Usar HtmlPrinter como serviço do Windows

Atualmente o sistema possui a seguinte limitação para o uso do HtmlPrinter. Quando o Engine está sendo executado como serviço do Windows, não é possível iniciar o programa HtmlPrinter, que realiza a impressão automática de páginas Html.

Com a versão mais atualizada do HtmlPrinter, é possível executá-lo como serviço utilizando programas especializados em executar aplicações como serviço do Windows. Nós usamos e testamos o seguinte programa: AlwaysUp

Usando esse programa é possível selecionar o executável do HtmlPrinter, localizado na pasta HtmlPrinter dentro da pasta de instalação do sistema, e iniciá-lo como serviço pelo próprio AlwaysUp. Devido o HtmlPrinter possuir um browser embarcado, a instalação como serviço deve ser feita semelhante ao tutorial do site http://www.coretechnologies.com/products/AlwaysUp/Apps/RunInternetExplorerAsAService.html

Após a inicialização, o HtmlPrinter estará sendo executado como serviço e a comunicação com o Engine ocorre normalmente, não precisando realizar configuração alguma.

Existem outras ferramentas similares ao AlwaysUp que podem ser testadas.


Configurar permissões para usuário limitado no windows executar um determinado serviço

Para que um usuário do windows, que não possui permissões de administrador, tenha permissão sobre um determinado serviço que é executado no windows temos que executar os passos abaixo.

  1. Para podermos realizar as configurações temos que acessar o windows através de uma conta de administrador.

  2. Acessado o sistema como administrador precisamos pegar o valor do SID (Security Identifier) do usuário o qual pretendemos conceder a permissão.

    2.1. Podemos pegar o valor do SID da seguinte forma:

    2.2. Basta acessar o registro do sistema, na pesquisa do windows digite “regedit.exe” e execute.

    2.3. Para acessar o que queremos basta acessar a árvore do sistema que fica a esquerda no seguinte caminho HKEY_LOCAL_MACHINE>SOFTWARE>Microsoft>Windows NT>CurrentVersion>ProfileList

    2.4. Aqui teremos várias pastas sendo cada uma referente a um usuário do sistema, o nome de cada pasta é o SID referente a este usuário. Para sabermos de qual usuário se trata cada pasta basta clicarmos em cima da pasta e verificarmos no quadro a direita a coluna “Dado” no registro de nome “ProfileImagePath” possui o nome do usuário.

    2.5. Uma vez identificado o usuário desejado, copie o valor do SID, que será algo como S-1-5-21-2103278432-2794320136-1883075150-1000. Recomendamos que copie e cole em um arquivo de texto pois será usado posteriormente.

  3. Agora precisamos pegar as permissões atribuídas ao serviço que queremos que o usuário tenha acesso.

    3.1. Acesse o promp de comando do windows. Na pesquisa do windows digite “cmd”.

    3.2. Digite a linha de comando abaixo:

    sc sdshow <NOME DO SEU SERVIÇO>

    Ex: sc sdshow teste

    3.3. A execução desse comando retornará as permissões de cada grupo e usuário que este serviço possui. Será algo como

    D:(A;;CCLCSWRPWPDTLOCRRC;;;SY)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;BA)(A;;CCLCSWLOCRRC;;;IU)(A;;CCLCSWLOCRRC;;;SU)S:(AU;FA;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;WD)

    3.4. Copie e cole junto ao SID.

  4. De posse das permissões do serviço copie o trecho igual a esse “(A;;CCLCSWRPWPDTLOCRRC;;;SY)” sem as aspas e edite da seguinte forma:

    4.1. Substitua o valor entre os pontos e vírgula “CCLCSWRPWPDTLOCRRC” por “RPWPCR”.

    4.2. Substitua o valor “SY” pelo SID que foi obtido no passo 2.

    4.3. Ao final teremos algo como isso

    (A;;RPWPCR;;;S-1-5-21-2103278432-2794320136-1883075150-1000)

    4.4. Copie este novo trecho e cole imediatamente antes do trecho “S:(AU;…” no valor que tínhamos originalmente.

    4.5. O valor final será assim:

    D:(A;;CCLCSWRPWPDTLOCRRC;;;SY)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;BA)(A;;CCLCSWLOCRRC;;;IU)(A;;CCLCSWLOCRRC;;;SU)(A;;RPWPCR;;;S-1-5-21-2103278432-2794320136-1883075150-1000)S:(AU;FA;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;WD

    É este o valor que iremos usar para reconfigurar as permissões do serviço. Atenção pois esse valor não possuem salto de linha, ele é uma linha só.

  5. Agora iremos modificar as permissões do serviço.

    5.1. Abra o prompt de comando do windows novamente e digite o comando abaixo:

    sc sdset <NOME DO SEU SERVIÇO> <Valor das permissões que acabamos de alterar, deve ser entre aspas duplas>

    Exemplo:

    sc sdset teste "D:(A;;CCLCSWRPWPDTLOCRRC;;;SY)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;BA)(A;;CCLCSWLOCRRC;;;IU)(A;;CCLCSWLOCRRC;;;SU)(A;;RPWPCR;;;S-1-5-21-2103278432-2794320136-1883075150-1000)S:(AU;FA;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;WD)"

    Atenção pois esse valor não possui salto de linha, ele é uma linha só.

    5.2. Execute o comando e aparecerá na tela a seguinte mensagem: [SC] SetServiceObjectSecurity SUCCESS ou [SC] SetServiceObjectSecurity ÊXITO

  6. Agora basta trocar de usuário e conferir se as permissões foram concedidas com sucesso.

Caso você queira que todos os usuários tenham acesso a um determinado serviço basta trocar o SID do usuário por “NS”.

Exemplo: sc sdset teste "D:(A;;CCLCSWRPWPDTLOCRRC;;;SY)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;BA)(A;;CCLCSWLOCRRC;;;IU)(A;;CCLCSWLOCRRC;;;SU)(A;;RPWPCR;;;NS)S:(AU;FA;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;WD)"