Um conhecimento só é válido quando compartilhado.

segunda-feira, 17 de abril de 2017

ORMBr - Versão 1.3.3 (Abr 2017)

  • Melhoria - Implementado recurso para atualizar dados da tabela externa com relacionamento OneToOne quando a coluna chave de relacionamento for mudada.
  • Melhoria - Otimização no método Open(), para que o SELECT seja construído somente uma vez.
  • Melhoria - Refatoração nos métodos Open() e Find(), para aceitarem o parâmetro ASQL como String.
  • Melhoria - Renomeado método GetNextPacket para NextPacket.
  • Melhoria - Liberado o método NextPacket, para ser chamado pela aplicação, caso a propriedade AutoNextPacket = False;
  • Melhoria - Refatoração nos métodos DisableDataSetEvents e EnableDataSetEvents.
  • Melhoria - Grande refatoração para aumento de performance, passando a usar mais informações mapeadas do objeto e menos RTTI.
  • Correção - Ajuste feito para respeitar a paginação de registros, quando passado um comando SELECT pelo método Open() e Find() direto, não estava sendo feito paginação nenhuma.
  • Novo - Atualização do demo que não usa dataset, mostrando como criar um campo Aggregate, direto na class totalizando determinado campo.
  • Novo - Criado método FindWhere(AWhere: string), esse método adiciona a clausula WHERE ao final do comando SELECT montado, passando assim um filtro para restringir o retorno de registros do banco de dados em um TObjectList<M>
  • Novo - Criado método OpenWhere(AWhere: string), esse método adiciona a clausula WHERE ao final do comando SELECT montado, passando assim um filtro para restringir o retorno de registros do banco de dados em um IDBResultSet.
  • Novo - Criado a propriedade AutoNextPacket, para que o método NextPacket possa ser controlado pela aplicação, valor padrão é TRUE;
  • Novo - Criado interface ICommandMonitor que irá monitorar todos os comandos executado pelo ORMBr e mostrar em uma tela o que foi executado. Funcionalidade mostrada no demo na pasta ..\ORMBr\Demo\Data\FireDAC.
  • Novo - Driver TFactorySQLite para acesso nativo ao SQLite, o driver usa componente de terceiro, as units agora fazem parte do projeto ORMBr e está na pasta ..\ORMBr\Source\External\SQLite, podem ser usadas sem precisar instalar o componente na IDE, basta instânciar o componente direto na aplicação.
Exemplo :
 FDatabase := TSQLiteDatabase.Create(Self);
 FDatabase.Filename := '..\Database\database.db3';

segunda-feira, 3 de abril de 2017

ORMBr - Conhecendo Formas de Obter Dados do Database

Seja bem vindo, e ótima leitura.
Veja as possíveis formas de obter dados do Database pelo ORMBr para popular um DataSet em memória.





Declare uma variável do tipo da interface de DataSet
  var
    oMemTable: IContainerDataSet;
Instâncie a interface, aqui vou usar TFDMemTable do FireDAC, mas temos ainda TClientDataSet até a data de hoje.
  begin
    oMemTable := TContainerFDMemTable.Create(oConn, MyFDMem);
Agora vou mostrar as formas que podemos fazer a abertura para que os dados sejam capturados do banco de dados e populem o FDMemTable em memória.
begin
  // 1a Forma - Traz os dados da tabela Master do banco e popula o FDMemTable 
  // em memória.
  oMemTable.DataSet.Open;

  // 2a Forma - Traz o registro com ID = 5 e popula o FDMemTable em memória.
  oMemTable.DataSet.Open(5); 

  // 3a Forma - Você quem define o comando SELECT usando a interface ICriteria.
  oMemTable.DataSet.Open(CreateCriteria.Select.All
                                       .From('Master')
                                       .Where('master_id >= 5')
                                       .OrderBy('description'));

quinta-feira, 16 de fevereiro de 2017

TAXTaskDialog - BrComponentes

Seja bem vindo, e ótima leitura. 
A partir da versão do Delphi 2007, foi adicionado na VCL o TTaskDialog, o qual só terá o efeito visual se você estiver rodando sua aplicação no Windows Vista ou superior. Nós desenvolvedores, queremos sempre coisas novas para podermos repassar para os clientes e conquistá-los sempre mais com um produto de qualidade, visual atraente e facilidade, por isso desenvolvi o TAXTaskDialog. 
O TAXTaskDialog é um componente que dará a sua aplicação uma melhor aparência, independente da versão do Windows que você estiver rodando sua aplicação usando ele, ele é um componente não visual, e pode ser parametrizado através do Object Inspector na IDE do delphi, tanto quanto via código. Disponibilizei a um tempo atras, no meu canal ORMBr no Instagram, canal esse que tratamos sobre um ORM criado por mim, e que é open source, quem tiver interesse em participar o link é https://t.me/canalormbr e também temos o grupo ORMBr onde discutimos e trocamos conhecimentos o link é https://t.me/ormbr, agora criei um repositório no Git e disponibilizei os fontes juntamente com o pacote de instalação do componente TAXTaskDialog, minha ideia é depois mudar seu nome para TBrTaskDialog, e nesse repositório disponibilizar uma suite de componentes bons juntamente com seus fontes, assim quem tiver interesse poderá baixa-los e usa-los, junto com os fontes do TAXTaskDialog, seguirá um demo, ele mostrará além de vários usos as duas formas de parametrização, via Object Inspector e via código. 
A baixo mostro um exemplo via código e uma imagem do resultado.
var
TskDlg: TAxTaskDialog;
begin
 TskDlg := TAxTaskDialog.Create(nil);
 try
  TskDlg.TitleColor := clLime;
  TskDlg.TitleFont.Color := clBlack;
  TskDlg.Caption := 'Sistemas Axial';
  TskDlg.Title:= 'Tem certeza que deseja entrar em alteração?';
  TskDlg.Text := 'Esta opção entra em ateração do registro selecionado';
  TskDlg.FooterText := 'Selecione uma opção ou cancele a operação';
  TskDlg.CommonButtons := [tcbNone];
  TskDlg.MainIcon := tdiQuestion;
  TskDlg.FooterIcon := tdiWarning;
  TskDlg.Flags := [tfUseCommandLinks];
  TskDlg.MetroStyle.TaskDialogMetro := True;
  TskDlg.MetroStyle.TaskDialogColor := clGray;
  TskDlg.MetroStyle.TaskDialogFontColor := clWindow;

  with TaxTaskDialogButtonItem(TskDlg.Buttons.Add) do
  begin
   Caption := '&Sim';
   CommandLinkHint := 'Esta opção você entrará no modo de edição';
 end;
 with TaxTaskDialogButtonItem(TskDlg.Buttons.Add) do
 begin
  Caption := '&Não';
  CommandLinkHint := 'Esta opção você não entrará no modo edição';
 end;
 TskDlg.Execute;

 if TskDlg.ButtonResult <> 0 then
   Abort;
 finally
  TskDlg.Free;
 end;

Abaixo segue outra imagem do resultado em execução do TAXTaskDialog bem completo, sua parametrização foi feita via IDE do Delphi no Object Inspector, vocês poderão analisa-la no demo.  
 O Link do repositório git é https://bitbucket.org/ProjetosBr/componentesbr

quarta-feira, 23 de novembro de 2016

ORMBr - Conhecendo o Outro Lado

Seja bem vindo, e ótima leitura. 
O combustível do ORMBr sempre será as classes modelos, e para que tenhamos alto desempenho, precisamos conhecer o que adicionar a esses modelos para que tenhamos sincronização com nosso banco de dados.
Apresento aqui para vocês as correspondências entre os tipos usados pelo ORMBr e os tipos criados no seu banco dados já existente.



procedure TFieldTypeRegister.GetFieldTypeDefinition(AColumn: TColumnMIK);
begin
  case AColumn.FieldType of
    ftByte, ftShortint, ftSmallint, ftWord:
    begin
      AColumn.TypeName := 'SMALLINT';
    end;
    ftInteger, ftLongWord:
    begin
      if      FDriverName = dnMSSQL then AColumn.TypeName := 'INT'
      else if FDriverName = dnMySQL then AColumn.TypeName := 'INT'
      else                               AColumn.TypeName := 'INTEGER';
    end;
    ftLargeint:      AColumn.TypeName := 'NUMERIC(%l)';
    ftString:        AColumn.TypeName := 'VARCHAR(%l)';
    ftWideString:    AColumn.TypeName := 'NVARCHAR(%l)';
    ftFixedChar:     AColumn.TypeName := 'CHAR(%l)';
    ftFixedWideChar: AColumn.TypeName := 'NCHAR(%l)';
    ftDate:          AColumn.TypeName := 'DATE';
    ftTime:          AColumn.TypeName := 'TIME';
    ftDateTime:      AColumn.TypeName := 'DATETIME';
    ftTimeStamp:     AColumn.TypeName := 'TIMESTAMP';
    ftFloat:
    begin
      if      FDriverName = dnMSSQL      then AColumn.TypeName := 'FLOAT'
      else if FDriverName = dnMySQL      then AColumn.TypeName := 'FLOAT'
      else if FDriverName = dnPostgreSQL then AColumn.TypeName := 'NUMERIC(%p,%s)'
      else                                    AColumn.TypeName := 'DECIMAL(%p,%s)';
    end;
    ftSingle:        AColumn.TypeName := 'REAL';
    ftExtended:
    begin
      if      FDriverName = dnMSSQL then AColumn.TypeName := 'DOUBLE'
      else if FDriverName = dnMySQL then AColumn.TypeName := 'DOUBLE'
      else                               AColumn.TypeName := 'DOUBLE PRECISION';
    end;
    ftCurrency:
    begin
      if      FDriverName = dnMSSQL      then AColumn.TypeName := 'MONEY'
      else if FDriverName = dnMySQL      then AColumn.TypeName := 'DECIMAL(%p,%s)'
      else                                    AColumn.TypeName := 'NUMERIC(%p,%s)';
    end;
    ftBCD, ftFMTBcd:
    begin
      if      FDriverName = dnPostgreSQL then AColumn.TypeName := 'MONEY'
      else if FDriverName = dnMSSQL      then AColumn.TypeName := 'MONEY'
      else                                    AColumn.TypeName := 'DECIMAL(%p,%s)';
    end;
    ftMemo:
    begin
      if FDriverName = dnFirebird then AColumn.TypeName := 'BLOB SUB_TYPE TEXT'
      else                             AColumn.TypeName := 'LOGBLOB';
    end;
    ftWideMemo, ftBlob:
    begin
      if FDriverName = dnFirebird then AColumn.TypeName := 'BLOB SUB_TYPE TEXT'
      else                             AColumn.TypeName := 'TEXT';
    end;
  else
    raise Exception.Create('Tipo da coluna definida, não existe no ORMBr.');
  end;
end;
Dependendo do tipo definido na propriedade da sua classe modelo, o ORMBr irá identificar o tipo do campos no seu banco de dados, exemplo, se definirmos a propriedade do tipo ftWideMemo ou ftBlob, o ORMBr irá identificar que no seu banco dados a coluna é BLOB SUB_TYPE TEXT no caso o banco seja Firebird caso contrário irá identificar como TEXT para os demais bancos. 
Vemos aqui que o tipo definido no ORMBr, poderá se comportar diferente dependendo do banco usado, então pessoal atenção a esse código, qualquer situação adversa me comunique, pois acredito que não pensei em todas as situações e tipos.

ORMBr - Ao Usar, Perdemos em Performance?


Muitos pensam que usar o ORMBr perderia performance, gente o ORMBr trabalho com duas linhas de frente para vocês.
1a ) Ele fará de forma SUPER simples TUDO o que você teria que fazer manual, como SELECT, Adicionar TFields e configurar um a um, gerenciar abertura de subtabelas em mestre-detalhe, TUDO isso passa a ser automatizado.
2a) Ele fará de forma SURPER simples tudo o que os componentes DataSet já faz, pois o que você achar que um TFDQuery faz, quando você alimenta os TFields dele, em seguida dispara um Post e um ApplyUpdate?

Simplesmente montam o comando SQL internamente e mandam para o banco, é exatamente o que o ORMBr faz também.

Se é assim que funciona, como podemos perder performance ?

Total de visualizações

Postagem em destaque

ORMBr - Mapeamento objeto-relacional

Mapeamento objeto-relacional ( ou ORM, do inglês: Object-relational mapping ) é uma técnica de desenvolvimento utilizada para reduzir...

Todo os direitos reservados.. Tecnologia do Blogger.

Seguidores