Componentes
Referenciado por: Como criar interface para nova coluna de domínio no Config | Dicas Técnicas | Padrões para uso de componentes em Delphi |
Este artigo explica o que é necessário fazer de diferente para utilizar os componentes da Devart (Sem BDE).
TUniConnection
Para se efetuar conexão com banco de dados é necessário utilizar um componente do tipo TUniConnection.
É necessário definir as propriedades Ansi em tempo de desenvolvimento e as particularidades de cada banco/conexão em tempo de execução.
Para cada tipo de banco de dados é necessário um componente provider que verifica a licença de uso do componente.
Ansi
LoginPrompt = False
Para não abrir tela de login do componente.Options.DefaultSortType = stCaseInsensitive
Para permitir informar usuário sempre em maiúsculo.Options.EnableBCD = True
Trata campos numéricos como tipo BCD.
Oracle
- Username = <Usuário>
- Password = <Senha>
- ProviderName = 'Oracle'
- Server = <Servidor> + ':1521:' + <SID>
- Database =
- SpecificOptions = Oracle.Direct=True
Indica conexão direta sem precisar instalar o client Oracle.
PostgreSQL
- Username = <Usuário>
- Password = <Senha>
- ProviderName = 'PostgreSQL'
- Server = <Servidor>
- Database = <Database>
- Port = <Port>
É obrigatório informar a porta, antes os componentes adotavam a porta padrão 5432, mas com a atualização do dia 25/07/2016, tornou-se obrigatório informar a porta de conexão.
TUniQuery
Para efetuar consultas à banco de dados existe à disposição o componente TUniQuery.
Connection = <TUniConnection>
Indica o servidor da conexão.Options.SetFieldsReadOnly = False
Permite que se altere os valores dos campos que não sejam da tabela principal da query.Options.RequiredFields = False
Retira obrigação de atribuir valores à campos not null.SpecificOptions = PostgreSQL.UnknownAsString=True
Faz com que o componente entenda tipos desconhecidos como string.SpecificOptions = PostgreSQL.FetchAll=False
Permite que o componente traga os dados para a query aos poucos.SpecificOptions = PostgreSQL.ExtendedFieldsInfo=False
Não executa query adicional para buscar informações sobre os campos e tabelas a quem pertencem (para melhoria de performance).SQL
Quando o componente estiver ligado à um grid é necessário que todas as colunas tenham definição de tipo e tamanho - para que não apareça Memo:
| Com BDE | Sem BDE |
|---|---|
| 'T' AS VIRTUAL | CAST('T' AS CHAR(1)) AS VIRTUAL |
| NOMCLI||NOMTRA | CAST(NOMCLI||NOMTRA AS VARCHAR(254)) |
TUniScript
Importante! * Existe um erro no componente o qual não gera erros porem não executa o comando na base de dados.
o erro é referente a comentários antes do finalizador de comandos que por padrão é definido como ; sendo assim é necessário que cada comando seja implementado sem comentários antes do finalizador. Erro foi enviado para Devart para futura correção.
Paletas
Paletas do Delphi que possuem componentes da Devart:
- UniDAC
Contém os principais componentes. - UniDAV Providers
Contém os componentes para permitir uso dos componentes da Devart. - Data Access
VirtualTable
CRBatchMove. - Data Controls
CRDBGrid.
Grid
ControlTypes
É necessário mover os ControlTypes da query (datamodule) para o grid (form).
Checkout Server sem BDE
Para gerar carga para o Checkout através do Checkout Server sem BDE é necessário alguns cuidados com os selects.
Arquitetura

.DBF
Arquivo de dados.
.FPT
Arquivo para dados maiores que 254 caracteres (Memo).
Cuidados
O principal cuidado ao gerar carga com os componentes Devart é com relação à coluna da tabela ficar como Memo quando antes não era.
Isso ocorre quando uma string no select ultrapassa o tamanho de 254 posições.
Por usar LongStrings = False é necessário tomar cuidados extras nos scripts de exportação:
| Com BDE | Sem BDE |
|---|---|
| 'T' AS VIRTUAL | CAST('T' AS CHAR(1)) AS VIRTUAL |
| NOMCLI||NOMTRA | CAST(NOMCLI||NOMTRA AS VARCHAR(254)) |
| select (select patcon from td_fil limit 1) from dual | select cast((select patcon from td_fil limit 1) as varchar(200)) from dual |
| select (select patcon from td_fil limit 1) from dual | select cast((select patcon from td_fil limit 1) as varchar(200)) from dual |
| CAST('TOTALI' AS VARCHAR(6)) | CAST('TOTALI' AS CHAR(6)) |
| MIN('TOTALI')* | CAST(MIN('TOTALI') AS CHAR(6)) |
| CAST('1' AS CHAR(1))||CAST('1' AS CHAR(1)) | CAST(CAST('1' AS CHAR(1))||CAST('1' AS CHAR(1)) AS CHAR(2)) |
| CASE WHEN NULL IS NULL THEN CAST('TOTALI' AS CHAR(6)) ELSE NULL END | CAST(CASE WHEN NULL IS NULL THEN 'TOTALI' ELSE NULL END AS CHAR(6)) |
| NULL | CAST(NULL AS VARCHAR(<verificar valor máximo atribuído; ou 254>)) |
| 0 AS COLUNA | 0.0 AS COLUNA |
* Exemplo válido para qualquer função que retorne CHAR ou VARCHAR. Exemplo.: MIN, MAX, TO_CHAR, NOMEMES, DescricaoDominio, ValidaFluxoWorkflow, etc.
Atenção: todos esses casos são válidos para dentro das views também. Ou seja, se o select for SELECT * FROM TV_FPV é necessário inspecionar a TV_FPV e todas as views utilizadas por ela. E para cada coluna é necessário certificar-se de que se trata de coluna e não de função.
TSqlAdd
Foi constatado que o método Add, responsável por adicionar as linhas de comando SQL na query desejada, causava certa lentidão para ser executado. Para contornar essa situação, foi implementada a propriedade FSQLList, do tipo TStringList, para guardar as instruções adicionadas. Foi criado também o método MoveToQuery, que deve ser chamado antes da abertura da query, para que o conteúdo da lista seja efetivamente passado para a query. Esta simples mudança causou um ganho de desempenho considerável.
Exemplo de uso:
SqlAdd := TSqlAdd.CriaSqlAdd(dmOrder.qr_UsoGeral,True); SqlAdd.Add('select CODFIL, ID '); SqlAdd.Add(' from TT_BSC '); SqlAdd.Add(' where FLGORI = ''O'' '); SqlAdd.Add(' and FLGEST = ''A'' '); SqlAdd.Add(' and FILPED = ''%s'' ',True,[dmOrder.qr_Pedido.FieldByName('CODFIL').AsString]); SqlAdd.Add(' and TIPPED = ''%s'' ',True,[dmOrder.qr_Pedido.FieldByName('TIPPED').AsString]); SqlAdd.Add(' and NUMPED = ''%s'' ',True,[dmOrder.qr_Pedido.FieldByName('NUMPED').AsString]); SqlAdd.MoveToQuery; dmOrder.qr_UsoGeral.Open;
Data Types
A partir da versão 9 do PostgreSQL foram necessárias algumas mudanças na forma como os campos numéricos são tratados pelos componentes Devart.
- Foi ativada a opção EnableBCD da propridade Options do TUniConnection, baseando-se na documentação oficial de Data Types do Devart.
http://www.devart.com/unidac/docs/index.html?data_types.htm
- Para telas que utilizam ou verificam o tipo do dados dos campos, é necessário tratar o tipo ftBCD
Exemplo de uso com persistência usando ParamByName:
oQueryUpdate.ParamByName('NUMIVE').DataType := ftBCD;
Exemplo de uso com verificação em CASE:
case gdGrade.GetActiveField.DataType of ftfloat : VarFloat := gdGrade.GetActiveField.AsFloat; ftString : VarString := gdGrade.GetActiveField.AsString; ftDateTime : VarDateTime := gdGrade.GetActiveField.AsDateTime; ftBoolean : VarBoolean := gdGrade.GetActiveField.AsBoolean; ftBCD : VarBCD := gdGrade.GetActiveField.AsBCD; else begin ShowMessage('Este tipo de dado não pode ser replicado.'); abort; end; end;
- Em alguns clientes foi observado um erro no qual o valor é "truncado", o cliente digita 12,90 e grava no banco 12. Isso ocorre no select, quando se usa Cast(0 as Float).
A solução para isso é trocar o Cast, sendo o ideal: Cast(0 as numeric(12, 4)), em alguns casos, Cast(0.0000 as Float) ou Cast(0.0000 as Numeric(12, 4)).
Links Externos
No WTS, a documentação dos componentes ficam em:
C:\Program Files (x86)\Devart\UniDac for Delphi 7\Doc\UniDAC.chm