Versão 41
Alterações significativas
Engine
- Atribuir uma
string
com tamanho maior que a capacidade de um campo de um DataSet passa a
gerar um erro em vez do valor ser truncado silenciosamente. Por causa dessa mudança, erros que
antes eram silenciados podem passar a ser apresentados para os usuários. A recomendação é que
os códigos afetados por essa alteração sejam revistos para utilizar um tamanho de campo adequado
ou passem a truncar o valor antes da atribuição, deixando explícito que o truncamento de dados é
intencional. Caso seja necessário, o comportamento anterior pode ser restaurado por meio do comando
DataSet.setStringOverflowMode('truncate')
.
Essa configuração é global para todos os scripts executados em um Engine e deve ser feita
preferencialmente em um script de inicialização do Engine.
Melhorias
Admin
- Foi criado o processo “Admin > Base de dados > Migração chaves 64 bits” com o objetivo
de auxiliar a migração das bases de dados para utilizar inteiros de 64 bits na representação
das chaves e versões do sistema. Atualmente, esses valores são representados como inteiros de
32 bits, mas, em versões futuras do Engine, será permitido o uso de inteiros de 64 bits, ampliando
a quantidade máxima de registros em uma base de dados. Mais detalhes dessa migração
podem ser obtidos no manual
Migração chaves de 64 bits.
- Foram realizadas as seguintes melhorias no processo
“Admin > Bases de dados > Análise do esquema da base de dados”:
- Adicionada a opção de filtro pelo tipo das colunas.
- As grades e os campos que exibem as classes de origem da configuração passam a contar
com o botão “Abrir no VSCode”, agilizando a visualização da definição da tabela, coluna ou
índice.
- Na grade “Tabelas”, passa a ser exibido o campo “Tipo inteiro padrão”. Esse campo exibirá
o tipo que será utilizado na base de dados para os campos declarados com o tipo legado
“integer”.
Desenvolvimento
- Os processos de atualização passam a suportar a conversão de colunas do tipo “char” para
“varchar”. Nas versões mais recentes do sistema, o tipo “char” é utilizado exclusivamente em
colunas que armazenam apenas um caractere, pois há divergências entre os SGBDs no suporte ao
tipo “char” com tamanho maior. No entanto, colunas criadas antes de 2017 ainda poderiam utilizar
o tipo “char” para armazenar textos maiores, comportamento esse que será revisto a partir desta
versão. A conversão de colunas do tipo “char” para “varchar” em tabelas com elevada quantidade de
registros pode ser demorada. Caso haja conversões a serem realizadas em tabelas de movimentação, é
recomendado que elas sejam feitas antes na base de homologação a fim de calcular o tempo necessário
para a atualização do ambiente de produção.
- Os processos de atualização passam a agrupar em uma única operação apenas os comandos de
alteração de colunas que são conhecidos por serem aceitos por todos os SGBDs suportados pelo Engine,
evitando que a falha na alteração de uma coluna impeça a alteração das demais.
Engine
- Foi criada a propriedade
ModelDef.prototype.integerDatabaseType
com o objetivo de indicar o tipo a ser utilizado na base de dados para os campos declarados com o
tipo “integer”.
- A atualização do esquema das tabelas do cache local que ocorre na inicialização do Engine foi
otimizada, reduzindo a janela de manutenção necessária nas atualizações de sistema.
- Campos de qualquer tipo que tenham a propriedade
options
ou o evento getOptions
definidos
serão tratados de forma similar aos campos do tipo “combo”, permitindo assim que combos possam
ter o seu tipo e tamanho declarados de forma estática. Na definição das classes de dados, passa
a ser recomendada a declaração do tipo real dos combos, evitando assim que as mudanças nas opções
gerem alterações desnecessárias no esquema da base de dados e também para determinar o
tipo adequado (int64
ou int32
) dos combos cujas opções são valores inteiros.
Campos combo com tipo definido também têm a vantagem de eliminarem o comportamento errático de
aceitar o índice da opção como valor válido, comportamento esse mantido apenas para os campos
declarados explicitamente com o tipo “combo”. Mais detalhes dessa distinção podem ser observadas
na documentação do método
GridField.prototype.setValue
.
- Tokens de autorização passam a suportar chaves de 64 bits.
- A classe
HtmlToPdf
foi convertida em módulo. O script anterior, da UFS, foi preservado para manter a compatibilidade
dos includes nos códigos clientes desta classe. Foi adicionada a possibilidade da impressão em PDF
ser feita remotamente, no Engine servidor ou via serviço HTTP.
- A classe
EngineAppStore
foi convertida em módulo e renomeada para
NativeAppPackageManager
.
O script anterior, da UFS, foi preservado para manter a compatibilidade dos includes nos códigos
clientes desta classe.
- Foi criado o método
Database.prototype.viewExists
com o objetivo de verificar se uma visão existe na base de dados.
- Foi criado o método
Database.prototype.columnExists
com o objetivo de verificar se uma coluna existe em uma tabela ou visão da base de dados.
Extensão VS Code
- Execuções de código que retornem um DataSet que possua SQL Statement passam a exibir
no resultado o plano de execução da query.
- Passa a ser possível abrir mais de uma aba de execução para um mesmo arquivo.
- Abas de execução agora contam com o botão “Go to File”, que exibe o arquivo que foi executado.
- A extensão passa a contar com o comando
Engine DevTools: Show Execution Plan
, que exibe
em uma aba lateral o plano de execução do arquivo ou seleção corrente.
- A extensão passa a ter suporte completo a Resource Strings. Agora é possível criar
(comando
Engine DevTools: Create Resource String
), remover (opção “Delete This Resource String”
no menu de contexto do editor) e editar (como um arquivo padrão no editor do VS Code).
Web Framework
- Foi criado o método
UploadedFile.prototype.uploadToLobStorage
com o objetivo de gravar na LobStorage os arquivos recebidos nas operações de upload iniciadas
pelo método
Process.prototype.upload
.
- Os tipos “int64” e “int32” passam a ser suportados nas definições de campos no modelo de dados e
nas grades do sistema. Eles também passam a ser suportados nas definições de colunas e filtros
das fontes de dados.
Defeitos corrigidos
Desenvolvimento
- A criação de índices com colunas com nomes reservados, como “time”, poderia falhar nos processos
de atualização do sistema quando era utilizado o PostgreSQL.
Engine
- Esporadicamente ocorria um erro de Access Violation no término da execução de um script
invocado através do
Database.runScript
.
- A leitura da propriedade
Connection.prototype.isOnline
poderia gerar um erro caso fosse informado um endereço de servidor inválido.
- Ao modificar a propriedade
options
de um campo duplicado criado pelo método
Field.prototype.clone
poderia ocorrer a modificação dessa mesma propriedade no campo que originou a cópia.
- A propriedade
Field.prototype.charLength
poderia retornar um valor incorreto em campos do tipo “combo” criados pelo método
Field.prototype.clone
.
- Quando um Engine, em modo edge, era iniciado sem conexão com o servidor, ele passava a
usar o antigo protocolo raw Iap, não voltando a sincronizar o cache local quando a conexão com
o servidor era restaurada se ele não estivesse com esse protocolo habilitado.
Web Framework
- Ao clicar no botão “Ok” do processo auxiliar de preenchimento de campo lookup, aberto ao dar
dois cliques em um campo lookup, ocorria o erro “TabControl.sanityCheckForId(): unknown sheet id”
se o processo original fosse encerrado pelo usuário antes de confirmar ou cancelar a seleção.
- O sincronismo da grade poderia falhar durante o preenchimento de um campo lookup, podendo
provocar uma divergência entre os valores exibidos ao usuário e os dados da grade no servidor.
Outras alterações
Engine
- Foi criado o parâmetro de comando de linha
--noProxy
que desabilita no Engine o uso da configuração
de proxy do sistema operacional. Mais detalhes disponíveis no manual
Configuração do Engine.
- Ao criar um campo do tipo “integer” no DataSet passa a ser utilizado por padrão o tipo
“int64” em vez de “int32”. O tipo associado ao “integer” pode ser configurado pela função
DataSet.setIntegerDataType
.
- Foi criada a propriedade
engine.smallTempDir
que indica a pasta
mais otimizada para a criação de arquivos temporários de tamanho reduzido.
- O método
Database.prototype.tableExists
passa a retornar false
caso seja informado um nome de uma visão em vez de uma tabela. Para
verificar se uma visão existe, deve ser utilizado o método
Database.prototype.viewExists
.
- O antigo protocolo de comunicação entre Engines raw Iap, que não usa o Http, passa a
ser usado somente quando a URL do servidor possui o esquema iap.
Web Framework
- O método
Process.prototype.upload
passa a realizar o upload de arquivos em uma única requisição HTTP no formato multipart/form-data
.
Última atualização em 19 Sep 2024