Um conhecimento só é válido quando compartilhado.

quarta-feira, 2 de novembro de 2016

ORMBr - Gerenciamento DB (Interbase e PostgreSQL)

Seja bem vindo a mais esse artigo, e boa leitura. 
Lancei hoje os drivers para gerenciamento de banco de dados para Interbase e PostgreSQL, já estão disponíveis no repositório, dúvidas, perguntas, bugs, sugestões, gentileza podem ser postados no Fórum http://www.ormbr.com.br/forum e os fontes podem ser baixados no site http://www.ormbr.com.br no menu Download. 
Quero aqui deixar meus agradecimentos ao Juliomar Marchetti, mais informações sobre ele podes ser encontradas no seu blog http://www.juliomarmarchetti.com.br, ele foi quem teve a ideia e colocou mão na massa para aproximar os interessados no projeto ORMBr ao seu autor, ele criou um Canal e um Grupo no Telegram o link para o Canal https://telegram.me/canalormbr e para o Grupo https://telegram.me/ormbr, convido a todos interessados a participar. 
O ORMBr já da suporta a gerenciamento a banco de dados com base no modelo criado, até o momento já temos os drivers para os bancos: MSSQL, MySQL, Firebird, Interbase, SQLite e PostgreSQL, o recurso oferecido até o momento são criação de tabelas com sua estrutura completa e com todos os recursos de coluna como TIPOS, NOT NULL, DEFAULT, juntamente com recursos como criação de PrimaryKey, ForeignKey, Indexe e Check, isso funcional e testado, e não acabou por ai, tem ainda o recurso de ADD COLUMN nova a estrutura, caso a coluna seja adicionado ao modelo e ser rodado o recurso de verificação de metadata, segue abaixo um exemplo de como usar o recurso:
procedure TForm1.Button1Click(Sender: TObject);
var
  oManager: TDatabaseAbstract;
  oConnection: IDBConnection;
begin
  // Instância da class de conexão via FireDAC, segundo parametro
  // o Driver de qual Banco usado
  oConnection := TFactoryFireDAC.Create(FDConnection1, dnPostgreSQL);

  oManager := TDatabaseManager.Create(oConnection);
  oManager.BuildDatabase;

  for cDDL in oManager.GetCommandList do
      Memo1.Lines.Add(cDDL.Command);

  oManager.Free;
end;
Nota: Até o momento a criação do banco de dados, tem que ser feito manualmente, estou estudando a implementação desse recurso via ORMBr, após a criação do banco vazio, só configura-lo ao engine de conexão que no ORMBr podem ser: FireDAC, DBExpress ou Zeos até agora, em seguida criar a fabrica de conexão conforme engine de preferência e rodas a atualização conforme modelo criado. Abaixo um exemplo de um modelo bem completo para estudo e teste:
unit ormbr.model.person;

interface

uses
  Classes,
  DB,
  /// orm
  ormbr.mapping.attributes,
  ormbr.types.mapping,
  ormbr.mapping.register;

type
  [Entity]
  [Table('Person','Tabela de pessoas')]
  [PrimaryKey('Id', NoSort, False, 'Chave primária')]
  [Indexe('IDX_FirstName','FirstName', NoSort, True, 'Indexe por nome')]
  [Check('CHK_Age', 'Age >= 0')]
  TPerson = class
  private
    { Private declarations }
    FId: Integer;
    FFirstName: string;
    FLastName: string;
    FAge: Integer;
    FSalary: Double;
  public
    { Public declarations }
    [Restrictions([NoUpdate, NotNull])]
    [Column('Id', ftInteger)]
    [Dictionary('Código ID','Mensagem de validação','0','','',taCenter)]
    property Id: Integer Index 0 read FId write FId;

    [Restrictions([NotNull])]
    [Column('FirstName', ftString, 40)]
    [Dictionary('Primeiro nome','Mensagem de validação','','','',taLeftJustify)]
    property FirstName: String Index 1 read FFirstName write FFirstName;

    [Column('LastName', ftString, 30)]
    [Dictionary('Último nome','Mensagem de validação','','','',taLeftJustify)]
    property LastName: String Index 2 read FLastName write FLastName;

    [Restrictions([NotNull])]
    [Column('Age', ftInteger)]
    [Dictionary('Idade','Mensagem de validação','0','','',taCenter)]
    property Age: Integer Index 3 read FAge write FAge;

    [Restrictions([NotNull])]
    [Column('Salary', ftCurrency, 18, 3)]
    [Dictionary('Preço','Mensagem de validação','0','','',taRightJustify)]
    property Salary: Double Index 4 read FSalary write FSalary;
  end;

implementation

initialization
  TRegisterClass.RegisterEntity(TPerson);

end.

terça-feira, 1 de novembro de 2016

ORMBr - Gerenciamento DB (Firebird e MySQL)

Seja bem vindo a mais esse artigo, e boa leitura. Como prometido, subi hoje os drivers para gerenciamento de banco de dados para Firebird e MySQL, próximo passo será PostgreSQL, os demais estão disponíveis no repositório, dúvidas, perguntas, bugs, sugestões, gentileza postarem no Fórum, conto com a ajuda de todos para fazermos juntos do ORMBr, um grande e respeitado ORM Framework. Baixe o ORMBr Framework

sexta-feira, 28 de outubro de 2016

ORMBr - Gerenciamento DB (MSSql e SQLite)

Seja bem vindo a mais esse artigo, e boa leitura.

Hoje quero passar para você, que o ORMBr agora conta com a 1a versão da camada de gerenciamento de banco de dados, após grande esforço e trabalho implementei o recurso para os bancos SQLite e SQLServer, logo logo sairá para Firebird e MySQL, essa versão que já está disponível no repositório você pode baixar pelo link www.ormbr.com.br menu Download. 
Nessa novidade temos a criação completa de tabela, PrimaryKey, ForeignKeys, Indexes e Checks, e ainda a adição de novos campos caso adicionados no modelo, e não exista no banco. Tem bastante recurso a ser feito, mas um passo a cada dia chegaremos ao nosso destino desejado, que é o gerenciamento total ao banco, pretendo ir até onde for possível, ir além de alguns ORMs do mercado como gerenciamento de Views, Triggers (esses já bem avançados) e quem sabe até Store de Procedures, mesmo que cada banco tendo sua sintaxe especifica, trabalho dará, mas acredito que é possível sim, por que não? 
Tenho uma frase que marcou muito minha vida de Albert Einstein "A mente que se abre a uma nova ideia jamais voltará ao seu tamanho original", então quero que você pense nessa frase, e abra sua mente para entender os benefícios que o ORMBr pode trazer para sua vida, no que diz respeito a desenvolvimento, agilizando, dando confiabilidade e economizando em algumas dezenas e quem sabe centenas de linhas. O ORMBr é puro delphi, você não deve ter medo usa-lo, no inicio por seguir padrões de projetos, ele pode parecer complexo, mas acreditem, não é, e um ditado cabe bem nessa afirmação, "quem vê cara não vê coração", o ORMBr tem seu código extremamente simples, ele usa Dataset nativo do Delphi, ele faz o mesmo que você faz no seu código já existente do seu dia ia, mas de forma extremamente mais simples, e econômico, pois esse mesmo código servirá para todo o seu projeto, o que é preciso, é de dedicação para testa-lo, debuga-lo e entender seu funcionamento, e dai terá a confiança do que estou falando. 
Abaixo um exemplo de um modelo bem completo, que servirá como base para o ORMBr para gerenciamento do banco de dados, nele teremos a criação de uma tabela completa com todos os atributos das colunas, uma PrimaryKey, um Indexe, um Check, esse mesmo modelo ainda servirá para definição dos TFields criados no Dataset usado, isso tudo feito automaticamente para ORMBr, de forma simples e eficaz, veja abaixo:
unit ormbr.model.person;

interface

uses
  Classes,
  DB,
  /// orm
  ormbr.mapping.attributes,
  ormbr.types.mapping,
  ormbr.mapping.register;

type
  [Entity]
  [Table('Person','Tabela de pessoas')]
  [PrimaryKey('Id', NoSort, False, 'Chave primária')]
  [Indexe('IDX_FirstName','FirstNome', NoSort, True, 'Indexe por nome')]
  [Check('CHK_Age', 'Age >= 0')]
  TPerson = class
  private
    { Private declarations }
    FId: Integer;
    FFirstNome: string;
    FLastNome: string;
    FAge: Integer;
    FSalary: Double;
  public
    { Public declarations }
    [Restrictions([NoUpdate, NotNull])]
    [Column('Id', ftInteger)]
    [Dictionary('Código ID','Mensagem de validação','0','','',taCenter)]
    property Id: Integer Index 0 read FId write FId;

    [Restrictions([NotNull])]
    [Column('FirstNome', ftString, 40)]
    [Dictionary('Primeiro nome','Mensagem de validação','','','',taLeftJustify)]
    property FirstNome: String Index 1 read FFirstNome write FFirstNome;

    [Column('LastNome', ftString, 30)]
    [Dictionary('Último nome','Mensagem de validação','','','',taLeftJustify)]
    property LastNome: String Index 2 read FLastNome write FLastNome;

    [Restrictions([NotNull])]
    [Column('Age', ftInteger)]
    [Dictionary('Idade','Mensagem de validação','0','','',taCenter)]
    property Age: Integer Index 3 read FAge write FAge;

    [Restrictions([NotNull])]
    [Column('Salary', ftFloat, 18, 3)]
    [Dictionary('Preço','Mensagem de validação','0','','',taRightJustify)]
    property Salary: Double Index 4 read FSalary write FSalary;
  end;

implementation

initialization
  TRegisterClass.RegisterEntity(TPerson);

end.
No próximo artigo, vou falar para você tudo sobre os atributos do ORMBr, quais seus paramtros e para que serve cada um deles, verá que o ORMBr terá total controle com base no modelo criado, te proporcionado total funcionalidades de forma simples para ser usado.

quarta-feira, 19 de outubro de 2016

ORMBr - Criando Lookup Field

No delphi desde sempre existiu o lookup field, e como não podemos deixar no ORMBr podemos criar lookup field de forma simples, é o que vamos mostrar nesse artigo de hoje.
No nosso modelos teremos uma propriedade que receberá o ID da tabela lookup, ficando assim o exemplo:
   
    ...
    [Column('detail_lookup_id', ftInteger)]
    [Dictionary('detail_lookup_id','Mensagem de validação','','','',taCenter)]
    property detail_lookup_id: Integer Index 0 read Flookup_id write Flookup_id;
    ...
Continuando, teremos a tabela que irá receber o ID da tabela lookup que vou representa-la pela variável oDetail, ela é quem terá a propriedade acima no seu modelo.
Também teremos a tabela lookup, que mostrará todos os seus registros para que possamos selecionar um, vou representa-la pela variável oLookup, ficando assim o exemplo:
    ... 
    var
      oLookup: IContainerDataSet< tlookup >;
      oDetail: IContainerDataSet< tdetail >;
    begin
      oDetail := TContainerClientDataSet< tdetail >.Create(oConn, CDSDetail);
      oLookup := TContainerClientDataSet< tlookup >.Create(oConn, CDSLookup);
      oDetail.DataSet.AddLookupField('lookup_field',
                                     'detail_lookup_id',
                                     oLookup.DataSet,
                                     'lookup_id',
                                     'lookup_description');
      ...
Observe que as variáveis oDetail e oLookup, foram instanciadas recebendo dois parâmetros, de conexão e um TClientDataset para fazer cache, até ai normal como já mostrado em outro artigo. O segredo está aqui nessa linha:
  oDetail.DataSet.AddLookupField('lookup_field',
                                 'detail_lookup_id',
                                 oLookup.DataSet,
                                 'lookup_id',
                                 'lookup_description');
Como o campo ID será recebida pela tabela oDetail como falei acima, o campo lookup será criado nela, chamando o método AddLookupField, esse método receberá todos os parâmetros necessários para configurar um TField do tipo Lookup, os parâmetros são:
    
    procedure AddLookupField(AFieldName: string;
                             AKeyFields: string;
                             ALookupDataSet: TObject;
                             ALookupKeyFields: string;
                             ALookupResultField: string);
AFieldName: Nome para o TField campo; 
AKeyFields: Nome do campo que receberá o valor do campo que será definido em LookupKeyFields que virá da tabela lookup; 
ALookupDataSet: A variável que foi instanciada e terá os registros lookup, no nosso caso oLookup; 
ALookupKeyFields: Nome do campo chave que será o retorno da tabela lookup, para ser armazenado no AKeyFields; 
ALookupResultField: Nome do campo result para ser visualizado.

terça-feira, 11 de outubro de 2016

ORMBr - Criando um Mestre-Detalhe

Mais uma dica do ORMBr.
Vamos hoje demonstrar como criar um mestre-detalhe de forma simples e eficaz, usando o ORMBr.
1o Passo: Criar a conexão com já mostrado no post ORMBr - Como criar uma conexão ? 
2o Passo: Adiciona em seu form dois TClientDataSet (podemos usar o TFDMemTable), vou usar o TClientDataSet nessa dica, adicione também dois TDataSource, em seguida configure suas propriedades ligando cada um ao seu TClientDataSet.
3o Passo:
 Adicione na clausula USES, as units:
ormbr.dependency.injection.clientdataset,
ormbr.dependecny.interfaces,
ormbr.factory.dbexpress;  // <= Aqui a fábrica de conexão escolhida por você.
4o Passo: Crie os modelos do mestre e do detalhe, veja o demo que segue junto aos fontes caso tenha dúvida nesse passo. 
5o Passo: Defina duas variáveis do tipo IContainerDataSet<T>, onde <T> devem ser os tipos dos modelos criados para mestre e detalhe, veja o código exemplo: 
oMestre: IContainerDataSet<TMestre>;
oDetalhe: IContainerDataSet<TDetalhe>;
6o Passo: No Create do Form, instancie a variável oMestre definida, passando para ela a variável de conexão, e o TClientDataSet1 que foi adicionado no inicio, veja o exemplo: 
oMestre := IContainerDataSet<TMestre>.Create(oConn, ClientDataSet1);
7o Passo: Também no Create do Form, instancie a variável oDetalhe definida, passando para ela a variável de conexão, e o TClientDataSet2 que foi adicionado no inicio e um terceiro parâmetro informando quem é o objeto MESTRE, veja o exemplo: 
oDetalhe := IContainerDataSet<TDetalhe>.Create(oConn, ClientDataSet2, oMestre);
8o Passo: Abra a tabela, chamando o método Open, veja o exemplo: 

oMestre.DataSet.Open;
A partir desse ponto, o ORMBr gerencia todo o resto, como abrir, relacionar, excluir e fechar a tabela DETALHE automaticamente.

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