Skip to content

Tag-icone-mini.png 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 BDESem BDE
'T' AS VIRTUALCAST('T' AS CHAR(1)) AS VIRTUAL
NOMCLI||NOMTRACAST(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 ​

Componentes para exportacao sem BDE.png

.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 BDESem BDE
'T' AS VIRTUALCAST('T' AS CHAR(1)) AS VIRTUAL
NOMCLI||NOMTRACAST(NOMCLI||NOMTRA AS VARCHAR(254))
select (select patcon from td_fil limit 1) from dualselect cast((select patcon from td_fil limit 1) as varchar(200)) from dual
select (select patcon from td_fil limit 1) from dualselect 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 ENDCAST(CASE WHEN NULL IS NULL THEN 'TOTALI' ELSE NULL END AS CHAR(6))
NULLCAST(NULL AS VARCHAR(<verificar valor máximo atribuído; ou 254>))
0 AS COLUNA0.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)).

No WTS, a documentação dos componentes ficam em:

C:\Program Files (x86)\Devart\UniDac for Delphi 7\Doc\UniDAC.chm