Além de oferecer 100% de ferramentas e serviços personalizados, nossa equipe tem o foco na alavancagem do seu negócio, informando e auxiliando sua expansão.
Esta alteração visa corrigir um possível problema de
colunas duplicadas em servidores que sejam case
sensitive para texto (SAPdb e PostgreSQL, por exemplo).
Agora, quando uma vista ou tabela for criada, o AICS irá
forçar que o nome da coluna seja gravada em letras maiúsculas,
logo, não importando qual o destino da vista ou tabela
exportada, não ocorrerá mais o problema de colunas iguais
podendo gerar mensagens de erro de chave.
Esta nota é considerada de caráter de desenvolvimento e pode
não ser compreendida por todos os usuários.
Um DFM é uma descrição de objetos de formulário que permite
livre criação de estruturas de tela e mesmo de relatórios. O AICS
processa a descrição da mesma forma que um ambiente Delphi
faria. Inclusive, pode-se copiar e colar estruturas DFMs no próprio
AICS diretamente nos scripts (clique com o botão direito em
um script para ver as opções disponíveis).
Entretanto, o AICS não associava o nome aos objetos criados.
Isso não causa nenhum problema para executar as rotinas, entretanto,
o nome associado facilita muito a análise das telas criadas com o
uso deste recurso.
Nesta atualização do sistema, os objetos receberão o seu nome
diretamente pela propriedade "name". O único comportamento que
se altera com isso é o processamento desta associação pelos
próprios objetos. Isso pode requerer que algum campo text ou
caption seja limpo explicitamente (pode ser no próprio DFM).
Por exemplo, um TEdit passa a receber o nome em seu text,
coloque Text = '' dentro da cláusula object deste objeto. O
mesmo vale para TPanel e outros objetos que possuem captions
ou texts. Se já houver associação do valor, isso não altera em
nada o comportamente atual, somente na ausência da informação
esta mudança ocorre.
Esta nota técnica é avançada.
O processador do AICS possuía a função SetString para associar
textos, memos e blobs aos cursores SQLs. Entretanto, pode
ocorrer a necessidade de especificar ao servidor de que uma dada
coluna é do tipo Blob e não do tipo Memo (ou long).
Para alcançar este objetivo, criamos a função SetBlob com a mesma
sintaxe da SetString, porém, irá indicar ao servidor de que o dado é
um Blob.
Portanto, a sintaxe é:
SetBlob(Tabela,Coluna,Conteudo:String);
Sendo que Conteudo pode ser um string binário de até 2GB.
Esta nota pode ser considerada técnica e avançada.
O AICS expõe a função "random" que retorna um número
aleatório entre 0 e 1, o número é em ponto flutuante. Entretanto,
o algoritmo nativo do compilador não apresenta uma distribuição
aleatória uniforme para aplicações críticas. Seguindo o trabalho
de Makoto Matsumoto and Takuji Nishimura, que desenvolveram
o algorimo Mersenne Twister (mais informações podem ser
obtidas em en.wikipedia.org/wiki/Mersenne_twister), a Byte
Factory substituiu, para a função Random dos usuários, para
seguir esta implementação mais moderna. Logo, a mesma declaração
terá resultados mais uniformes:
Function Random:double;
Nem é necessário inicializar as sementes, pois o AICS o faz logo
na inicialização do sistema.
Esta nota é considerada técnica para desenvolvimento.
O AICS possui a função ObtemTag (veja no help do editor
sua declaração completa) que permite obter o conteúdo dentro
dos comandos de início e fim da Tag (semelhante a códigos
html). Na versão mais recente do AICS, este comando obtém
os dados mesmo que o tag seja com atributos dentro da abertura.
Os atributos na abertura do Tag são muito comuns em arquivos
XML mais complexos. Da mesma forma, agora visando estes
atributos, a BF criou uma nova função específica para a extração
deles com a seguinte sintaxe:
function ObtemParTag(Tag, Param, Texto:string):string
Muito semelhante à ObtemTag, com a chamada adicional
indicando qual o parâmetro que deseja retornar. Esta função
e a ObtemTag expandida foram incorporadas ao AICS e todas
as suas vertentes em Web e CGIs. Além da expansão, foram
otimizadas para ficarem mais rápidas. O impacto do ganho de
velocidade pode ser sentido em ganhos de frações de segundo
na montagem de relatórios editados pelos usuários, por exemplo.
O AICS está cada vez mais sendo utilizado como ferramenta central
na gestão de informações pela internet. A principal vantagem é sua
fantástica integração com uniformidade nas regras de negócios e
desenvolvimento integrado com o sistema desktop.
Visando melhorar os sites que utilizam Ajax + AICS, publicamos
2 funções bem úteis que permitem transpassar qualquer problema de
código de página entre o navegador e o servidor:
function UrlEncode(DecodedStr: String; SinasDeMais: Boolean): String;
function UrlDecode(EncodedStr: String): String;
Além disso, no ServAICS, foi criada a função alert_aics que, antes de
mostrar uma mensagem, a decodifica e deixa sem o possível marcador
de erro NOK. O objetivo é deixá-la mais amigável apenas. Esta função
pode ser utilizada no lugar da alert convencional do JavScript.
Nota técnica avançada.
Com esta função, será possível preparar dados para envio por
meio eletrônico, armazenagem com posterior aplicação e o que
mais a realidade necessitar.
Sintaxe:
function CursorToTags(CursorName:string):String
Onde, CursorName é o nome do cursor que deve ser exportado
O resultado será o conteúdo formatado como tags XML ou HTML.
Esta nota pode ser considerada puramente técnica por alguns
usuários do sistema. Além disso, é importante para usuários
que utilizem scripts em rotinas "web".
Quando ocorre um post sobre o serviço web, dependendo da
ação, os parâmetros já são transferidos para a tabela indicada.
Por exemplo, uma ação "tabsave" transfere os dados para a
tabela indicada no parâmetro "tab".
Entretanto, se a rotina precisar transferir os parâmetros para
outros comandos SQL (indo desde comandos de seleção a de
atualização), isso teria que ser feito linha a linha.
Visando ganhar tempo e velocidade, publicamos uma função
que irá passar os parâmetros do formulário para um cursor
qualquer, sua declaração é:
Procedure SetContentFromWebFields(NomeCursor:String)
Onde NomeCursor é o nome que foi dado numa declaração
de comando do tipo TablePrepareSql. Após este comando,
você ainda poderá manipular livremente os atributos antes
de enviá-lo ao servidor.
A generalização do processador de DFMs adicionou uma restrição
aos nomes dos objetos quando estes forem objetos de formulário,
como previsto anteriormente.
Logo, os nomes devem começar com "TForm" para serem entendidos
como objetos de formulários. Qualquer outra nomenclatura irá seguir
a nova regra que permite criar quaisquer outros objetos em qualquer
posição das telas nativas ou do usuário.
Apresentamos um roteiro completo de processos auxiliados visando migração de dados
e facilitando enormemente os trabalhos de personalização do BF AICS. Aplique estas
informações em projetos atuais ou em novos, sem distinção.
Por que migrar?
O BF AICS permite uma transparência muito maior nos projetos empresariais. Tudo
que é desenvolvido sobre ele é automaticamente documentado e aberto. É como se as
regras fossem sempre em Código Aberto.
Como um fator adicional, os desenvolvimentos sobre o sistema poderão usufruir do
ganho de serem praticamente independentes do Banco de dados e da interface de dados.
O BF AICS expõe uma classe de objetos única que é traduzida em objetos de dados
ADO, DBExpress ou a classes de acesso direto aos Bancos de Dados. Por isso mesmo,
os desenvolvimentos tendem a ser com produtos mais rápidos e mais maleáveis.
O núcleo padrão do BF AICS possui diversos módulos com regras padronizadas que
permitem não sair da estaca zero. Isso garante robustez e velocidade de convergência
na solução. O Centro de Informações permite cadastramento de estruturas que geram
as estruturas de dados no servidor de dados, telas de manipulação e edição, pesquisas,
relacionamentos com outras estruturas, controle de direitos, descrições em 3 idiomas,
relatórios padronizadas e personalizados além de análises gráficas.
Elementos da Aplicação
Uma aplicação que será migrada é composta de bases de informação, interfaces com
o usuário (telas, relatórios, consultas etc) e regras de negócios. Cada um destes itens
pode ser migrado de forma independente.
Bases
Será importante que as tabelas estejam já inseridas na base de dados. Para fazer isso,
utilize qualquer opção disponível. Como exemplo, exporte os dados originais em
formato DBF ou DB (do Paradox). Instale na estação que irá efetuar a importação,
o BDE (Borland Database Engine) – que pode ser baixado de:
http://shop.aics.com.Br/ftp/BdeInstall.zip
No AICS, acesse o menu Atualizar/Manipular dados do Servidor e ative a aba
Migração de bases.
Clique no botão Selecionar as bases que serão migradas e selecione até mais do
que uma tabela ao mesmo tempo. Ao clicar em Transferir dados para a Base Atual,
o AICS irá criar tabelas com a mesma estrutura e copiar todos os dados para o
banco SQL ativo.
Após a cópia, poderemos registrar a tabela no Centro de Informações. Clique na
raiz, selecione o botão Novo e digite uma a uma os nomes das tabelas importadas.
Especifique seus dados mínimos, como descrições e colunas chaves. Ao gravar, o
AICS irá reconhecer que a tabela existe e cadastrará todas as colunas, já com seus
tipos corretos, no Centro de Informações.
Se a tabela que foi importada não possuir chave de controle, você pode criar uma
nova coluna, marcá-la como chave de controle e, ao gravar, o AICS irá perguntar
se deseja preenchê-la (iniciá-la com valores seriais).
Se a tabela importada precisar ser específica por local, basta criar uma coluna
NETCOD, gravar confirmando para ser preenchida e marcar que a informação
é dependente de locais para que cada local tenha sua seqüência independente.
Interfaces
A montagem das interfaces pode compreender:
· Expansão de novas colunas em estruturas existentes no AICS
· Criação de novas telas com controles por grid ou por componentes
de entrada dispostos em abas
· Definição de tabelas mestre-detalhe, de configuração e abas de análises
Em muitos casos, o cadastramento das colunas no Centro de Informações já é
suficiente para uma interface pronta para uso. Para que uma tela migrada tenha
a mesma seqüência, nomenclatura e dimensões de telas montadas externamente,
o AICS possui um novo recurso que é a leitura e cadastramento de propriedades
de DFMs. DFMs são arquivos descritores de objetos (normalmente, forms)
compatíveis com ferramentas de programação da Borland. Um DFM pode ser
obtido de:
· Fontes do programa que está sendo migrado
· Extrator de DFMs (muitas vezes exageradamente chamados de
decompiladores) que monta os objetos a partir do EXE que será migrado
· Ferramentas que geram DFMs em geral
Pois bem, tendo um DFM, após já ter a estrutura cadastrada no Centro de
Informações, clique com o botão direito do mouse na estrutura cadastrada e
selecione Auto cadastramento por DFM externo.
Importante destacar que esta rotina não é 100% correta, ela pode não encontrar
os objetos de descrição corretos. Logo, revise-os após a importação para perfeita
importação. Entretanto, as abas, dimensões de tela e ordem são importadas com
alta fidelidade. Outro destaque importante é que o DFM deverá estar EM MODO
TEXTO. Para que um DFM esteja em modo texto, por exemplo no Delphi,
clique com o direito no form desejado e ative Text DFM.
Uma outra opção muito interessante é a importação direta do DFM. Este recurso
foi expandido nas versões 2009 do AICS incluindo um processador mais inteligente
e ferramentas de declaração automáticas.
Vamos exemplificar no caso acima. Após importar uma tabela nova, vamos criar
uma tela que seja o espelho de uma original. Para isso, por exemplo, num evento
de botão do cadastro (poderia ser em qualquer outra tabela ou mesmo no evento
Entrar da própria tabela importada), crie um discriminador de DFM na
forma de TAG:
Begin
Agora, abaixo do end; sem apagar o que estava no clipboard, clique com o botão
direito e selecione Colar variáveis do DFM.
Esta opção irá declarar todos os objetos presentes no trecho de objetos que foram
colados acima. O novo processador de DFMs do AICS irá ignorar muitas declarações
não suportadas ou redundantes (por exemplo, atributos que sejam nativos dos objetos).
Entretanto, o grande ganho deste tipo de migração é a facilidade de manipulação.
Nada impede, por exemplo, que o trecho do DFM seja copiado do AICS e colado
num Delphi (mesmo antigo), manipulado visualmente ou alterado, e retorne ao AICS
seguindo o procedimento acima.
Relatórios
Os objetos de relatório podem agora ser migrados nativamente e usufruir das
ferramentas de edição do AICS. Para isso, ao invés de executar o comando de preview
do objeto de relatório TquickRep, utilize a função específica para isso:
Procedure PreviewReport(Rep:TQuickRep;Destino:integer;Titulo:String)
Onde, Rep é o objeto que foi criado no DFM, Destino segue a regra do AICS (1,
vídeo, 2 – impressora etc) e Titulo é o título do relatório para o nome da janela aberta.
Regras
As regras devem ser migradas baseando-se no controle de eventos do AICS ou dos
próprios objetos importados. A única adaptação da sintaxe é na declaração de eventos.
Quando os eventos forem associados a rotinas, deve-se precedê-los de @, por
exemplo:
OnClick = @BotProcuraClick
E a declaração do evento deve utilizar objetos nativos, assim:
Procedure BotProcuraClick(Sender: DelphiTObject);