Resumo:
Formado em Administração de Empresas, casado, pai de 2 filhos, cinéfilo. Autodidata, teve os livros técnicos como fonte de estudos. Posteriormente, a internet tornou-se uma valiosa aliada.
Durante algum tempo utilizou o Clipper como ferramenta de desenvolvimento. Mais tarde conheceu o Delphi (por volta de 1995), muito utilizado no desenvolvimento de aplicações desktop, aplicações multicamadas e cliente/servidor.
Constantemente tem aprofundado seus conhecimentos, focando no aprendizado de técnicas de Programação Orientada a Objetos – POO – e Design Patterns.
Atualmente, desenvolve sistemas para várias empresas situadas na cidade de Balsas-MA e cidades circunvizinhas.
Experiência
Desenvolvedor de Software
Lukas Sistemas
Desenvolvimento de Sistemas
Período: Janeiro de 1999 até a presente data
Cidade: Balsas – MA
Hoje, a Lukas Sistemas tem softwares desenvolvidos para os mais variados fins, como por exemplo:
* Controle Escolar – cadastros de alunos, professores, cursos, forma de avaliação, diários, matrículas, lançamento de notas, emissão de Atas, Boletins, Ficha de Matrícula;
* Autopeças – controle de estoques, compra e venda, controle de funcionários, ordens de serviços, cadastro de clientes e fornecedores, emissão de recibos; Emissão NF-e, NFC-e, MDF-e, CT-e…
Formação acadêmica
AIEC
Bacharel, Administração de Empresas
2003 – 2007
Atividades e grupos: Plano de Negócios Dinâmico, com a utilização do software Vensin
Centro Educacional Cenecista de Balsas
Técnico em Contabilidade, Ensino Médio
1992 – 1994
Boa tarde Luiz, acredito que ja nos conhecemos virtualmente, ao menos vc não é estranho para mim.
Sou responsável pelo conteúdo do site da Active Delphi e gostaria de poder publicar alguns de seus artigos, no site da Active, sempre mantendo o link Original.
O que me diz? Tem interesse em criarmos essa parceria?
Abraço e Sucesso!
Olá Ricardo
Eu ministrei um curso na DevMedia: Criando Boleto em Delphi 7. Talvez seja por lá que você me conheça. Pode ser também pelo grupo que vocês criaram para desenvolver um projeto OOP. Eu andei visitando e mandando alguns comentários.
Fico até lisonjeado pelo interesse em meus artigos. Mas, veja que o conteúdo está muito direcionado ao blog (palavras chaves, links internos, etc.). Não sei se seria tão interessante disponibilizá-los assim no site da Active. Eu gostaria realmente que os artigos se mantivessem como estão, sem alterações, pois estou fazendo um trabalho forte no Adwords, e tudo aqui tem um motivo de ser.
Ola, tenho uma empresa de informática e um sistema de Gestão, por falta de mão de obra aqui na minha regiao resolvi estudar programação DELPHI , como auto didata e gostei, gostaria de umas aulas suas particulares, é possivel°
forte abraço
Alex
Olá Alex
Eu sempre estou em busca de novas oportunidades e parcerias, porém aula particular foge totalmente do que eu estou almejando atualmente.
Este blog é algo que não me exige muita coisa e os meus artigos faço com tranquilidade, no meu tempo, entende? Não tenho um horário a cumprir, além é claro de ser um momento de aprendizagem para mim também.
Feliz Ano Novo!
Abraços.
Parabéns pelos artigos.
Estou estudando Delphi e busco aprender como fazer pesquisas usando BD Access.
Você já publicou algo que ensine isso?
Olá Carlos
Artigo sobre Access não, porém, o modo de se fazer “pesquisas” nesse banco de dados não se diferencia tanto de qualquer outro banco SQL. Desta forma, estude mais sobre os comandos SQL’s e bancos SGBD’s. Tenho certeza de que encontrará o que procura.
Abraços.
Caro Luiz, muito boa suas explicações. Estou aguardando ansiosamente para a continuação do DAO. Grande abraço.
luiz,
boa noite!
otimo artigo…
acompanhei ate o 13…
aprendi bastante…
valeu..
gostaria de saber o seguinte…
a “configuracao” da classe… as pk, nome da tabela, etc…
tem como fazer isso com um arquivo xml ?!
sem usar o marschal…
abraços!
Olá Luiz. Tens algum fonte para leitura de arquivo de retorno bancário?
Olá Alberto, desculpa a demora em responder.
No próprio manual cedido pelo banco contém a especificação do arquivo de retorno.
Luis, gostaria de receber todos os post que voce fez sobre ORM, o que preciso fazer pra adotar o seu ORM como modelo?
Ola Luiz, muito bom esses seus post’s sobre o ORM, já fiz o DAO para FIREDAC e implementei os campos BLOB’s, quero saber se você tem interesse em alguma ajuda para continuar estes post’s, pois são excelentes e eu gostaria de contribuir.
Opa, e aí Mauro, tudo bem?
Claro, toda ajuda é bem vinda!
Vamos fazer o seguinte:
Recentemente, eu voltei a atualizar os fontes do nosso projeto. São alterações importantes, como por exemplo, a reorganização das responsabilidades das classes. Do jeito que o projeto estava indo, tinha classe com responsabilidades demais. Então, separei assuntos como, conexão e transação, em classes distintas das classes DAO. Desta forma, deixa eu fazer mais um post, com as atualizações que eu tenho aqui, para sincronizarmos nossos projetos.
Me dá só um tempinho. Sei que já prometi isso antes, mas é que realmente as coisas aqui saíram do prumo (a turbulência aqui tem sido grande!).
Ok?
Olá, tudo bem ? Parabéns pelo seu post. Estou estudando ele e estou aprendendo muito. Gostaria de tirar uma dúvida com você, como eu faria nesse ORM para identificar um campo auto incremento ?
Luiz tudo certo?
Recentemente comecei a minha saga para gerar um ORM próprio, assim economizo em licenças e tal.
Estou usando seu estudo para me guiar, mas tem uma situação que não vi durante todo o curso, como você exibe os dados em tela?
Estou perguntando porque o Delphi com o DbGrid não acessa objetos como o TTabela diretamente.
Você se utiliza de Livebindings ou outro método?
Parabéns pelo curso e pelo BLOG.
Até
Olá Lucas
Em algum momento eu cito na série que evito ao máximo trabalhar com componentes conectados (datawares: dbedits, dbcombobox, etc.), com exceção do Dbgrid, onde utilizo este último em alguns projetos. Eu sinto que estou mais no controle desta forma.
Para mostrar a lista de registros num DBGrid, como não ficar preso à suíte de componentes (IBX:TIBQuery, por exemplo)?
Existem alguns caminhos. Um deles seria utilizar TClientDataset na veia!, utilizando o método de ConsultaSql do ORM que nos devolve um TDataSet.
Outro seria criar Datamodules específicos para cada suíte de componentes (DataModuleIBX, DataModuleFireDac, etc.). Sempre que desejar alterar o sistema para uma nova suíte, bastaria criar um novo Datamodule. O problema aí é que, dependendo do tamanho da sua aplicação, o trabalho de manter isso não se justificaria, pois a complexidade tende somente a aumentar na medida que mais e mais funções e módulos sejam acrescidos ao sistema.
Cada programador tem uma maneira de encarar esse processo. Eu gosto de trabalhar com TClientDataSet e componentes desconectados (TEdits, TCombobox, etc.); já outros com o componente Query/Table da suíte que utiliza. E ainda tem a maioria que trabalha totalmente conectado (componentes datawares). Você terá escolher o que melhor lhe atende. O que se encaixe na sua filosofia de desenvolvimento ou que esteja definido na sua equipe, se este for o caso.
Abraços.
Olá a todos,
Luiz parabéns pelos seus posts, são excelentes e muitos deles já me ajudaram muito, a propósito queria deixar aqui meu muito obrigado!!! Aproveitando também queria deixar aqui uma dica, não sei se já conhecem, ou se teriam interesse em conhecer, recentemente fiquei sabendo de um novo projeto sobre ORM de código aberto, idealizado por Isaque Pinheiro, o ORMBr. Talvez queiram se juntar a comunidade e ajudar a fortalecer ainda mais o projeto, principalmente o Luiz que por sinal tem muito conhecimento e sem dúvidas poderá agregar ainda mais ao projeto caso tenha interesse.
Abraço a todos.
Olá Tiago
Antes de mais nada, fico feliz que de alguma forma este blog tenha lhe ajudado.
Com relação ao ORMBr, a vida aqui anda numa correria absurda e infelizmente ando sem tempo de fazer algo que gosto muito, que é o ato de conferir o que a comunidade anda fazendo. Vou dar uma olhada com certeza.
Um Feliz Ano Novo!
Olá Luiz, tudo bom?
Gostaria de parabenizar você pelo conteúdo do blog, principalmente pela série “Que tal um ORM básico?”, a qual implementei no meu TCC e utilizo no meu cotidiano. Simplesmente fantástico.
Quero agora da uma olhada no post sobre o AdminLTE, e aguardando novos posts rs.
Felicidades!
Deus abençoe.
Opa, que beleza Jonathan! É bom saber que os artigos lhe auxiliaram, principalmente na questão dos estudos.
Enfatizo estudos porque esse sempre foi o meu objetivo. Não tenho pretensão de criar produtos acabados. Apenas utilizo os assuntos visando levantar ideias, passar e obter novos conhecimentos, dar um norte para quem está sem rumo ( rsrsrs ), e por aí vai.
Com relação ao projeto misto, meio web (javascript, python, servidor Amazon, etc) meio desktop (Delphi), novos posts estão sem previsão no momento. Envolvido em vários projetos aqui.
Abraços.
Gostei do BLOG e principalmente sobre ORM e esse novos caminhos (web).
Moro em São Luís do Maranhão
Conheci por acaso o Blog quando pesquisava no Google sobre ORM
Olá Luiz,
Adquiri seu livro, boleto foi pago na segunda-feira, 18/11/2019 poderia confirmar o recebimento.
Valor R$ 20,97 com desconto.
Aguardo …
Obrigado.
Eu que agradeço, Jackson.
Já recebeu o link do download?
Abraços.
Boa tarde Luiz Carlos. Parabéns pelo conteúdo, muito bom, facilita o desenvolvimento e fica com uma boa arquitetura para manutenção.
O amigo tem aprimorado esse conceito ORM que possas nos disponibilizar ? Trabalho também com essa linha de prática, classes e deixar o sistema sem acoplamento. Mas achei essa técnica muio boa, se livrar de tanto params.byname . se puder me passar agradeço.
Olá Fabrício, obrigado pela participação.
Os fontes atualizados do projeto estão no github: https://github.com/luizsistemas/ORM-Basico-Delphi
Toda e qualquer nova implementação você irá encontrar lá.
Aproveito para responder sua pergunta feita no meu e-mail.
Você gostaria de saber o porquê de eu não ter implementado o “autoincremento” no projeto. A resposta é simples: necessidade. Ou seja, sempre que eu sinto a necessidade da implementação de alguma nova funcionalidade que irá beneficiar a produtividade em meu trabalho aqui, eu faço a implementação.
Resolvi colocar este assunto (ou este projeto) em formar de artigos no blog para possibilitar a outros que tenham o mesmo benefício que eu tenho tido com o mesmo. Porém não é meu objetivo abordar todas as funcionalidade de um ORM completo, mesmo porquê já temos no mercado muitos que fazem este trabalho, sendo estes bem mais comple[xo]to. O intuito aqui é bem mais simples: o objeto foi ser didático. Eu quis mostrar o caminho e a partir daí, com os ensinamentos passados, permitir a quem seguir os artigos poder evoluir o seu próprio ORM.
Enfim, não tive a necessidade de implementar autoincremento, porém caso você queira, revise a parte onde falo dos atributos. Verá que, entendendo como o Delphi lhe fornece a Rtti, ficará muito simples implementar qualquer “necessidade” que por ventura você possa ter.
Não é promessa, mas quando tiver um tempo disponível, posso ver a possibilidade de colocar mais essa função no projeto.
IBoa tarde Luis!
Vou deixar aqui o código que adicionei para fazer o Auto_increment
Caso queira adicionar ou algum colega queira fazer, ai está para todos.
Implementando o Auto_increment no projeto de Luis Carlos. ORM
Parte 01.
1º Vai na Unit – Lca.Orm.Atributos
Declare a class: OBS pode ser abaixo da AttPK , não dentro por que é outra class
——— > Autoinc = class(TCustomAttribute) end;
2º Declare o método dentro da “IAtributos”
IAtributos = interface
[‘{26CCA2DF-174A-48BE-A48D-7758294159A6}’]
———-> function GetAtribAutoInc(PropRtti: TRttiProperty): Autoinc;
end;
3 º Repita o mesmo método dentro da class
TAtributos = class(TInterfacedObject, IAtributos)
private
public
——— > function GetAtribAutoInc(PropRtti: TRttiProperty): Autoinc;
end;
4 º – CRTL + shifit+C para criar a função
Finalizando o método de capturar o atributo
function TAtributos.GetAtribAutoInc(PropRtti: TRttiProperty): Autoinc;
var
AtribRtti: TCustomAttribute;
begin
Result := nil;
for AtribRtti in PropRtti.GetAttributes do
if AtribRtti Is Autoinc then
begin
Result := AtribRtti as Autoinc;
Break;
end;
end;
Parte 02:
1º Vai na Unit – Lca.Orm.Comp.FireDac
Vou copiar todo o código para entender melhor onde aplicar. Único lugar será no insert.
Onde estiver com está seta ——-> por que foi adicionado o código.
function TDaoFireDac.Inserir(ATabela: TTabela; ACampos: array of string; AFlag: TFlagCampos): Integer;
var
PropRtti: TRttiProperty;
RttiType: TRttiType;
AtribFk: AttFk;
—– > AAutoInc : Autoinc;
NomeTabela: string;
Comando: IQuery;
begin
try
TAtributos.Get.ValidaTabela(ATabela, ACampos, AFlag);
RttiType := TRttiContext.Create.GetType(ATabela.ClassType);
NomeTabela := TAtributos.Get.PegaNomeTab(ATabela);
Comando := TQueryFD.Create(FConexao, FTransacao);
Comando.Sql.Text := FSql.GerarSqlInsert(NomeTabela, RttiType, ACampos, AFlag);
for PropRtti in RttiType.GetProperties do
begin
—–> AAutoInc:= TAtributos.Get.GetAtribAutoInc(PropRtti);
—–> if not Assigned(AAutoInc) then
—–> begin
if (Length(ACampos) > 0) then
begin
if not (TAtributos.Get.LocalizaCampo(PropRtti.Name, TAtributos.Get.PegaPks(ATabela))) then
begin
if ((AFlag = fcIgnore) and (TAtributos.Get.LocalizaCampo(PropRtti.Name, ACampos))) or
((AFlag = fcAdd) and (not TAtributos.Get.LocalizaCampo(PropRtti.Name, ACampos))) then
Continue;
end;
end;
AtribFk := TAtributos.Get.GetAtribFk(PropRtti);
if Assigned(AtribFk) then
AtualizarRelacionamento(ATabela, PropRtti, AtribFk, Comando.DataSet)
else
TAtributos.Get.ConfiguraParametro(PropRtti, PropRtti.Name, ATabela, Comando.DataSet, FParams);
—–> end;
end;
Comando.Executar;
Result := Comando.RowsAffected;
except
raise;
end;
end;
——————————- Finaliza aqui implementação ————————————–
Como usar ?
O gerador de class do Luis Carlos gera como está abaixo
[attPK]
property Codigo: Integer read FCodigo write FCodigo;
Agora, basta informar o autoinc
[attPK , Autoinc]
property Codigo: Integer read FCodigo write FCodigo;
OBS: Desta forma, o banco ficará responsável em fazer o auto_increment
Boa tarde, Fabrício
Só uma palavra: Show!
Você pegou mesmo o espírito da coisa. Parabéns.
Quem deseja usar, o código está aí. Já no projeto do blog, só me dê um tempinho, visto que além de validar na minha rotina de testes (pois utilizo o componente em produção – aí a coisa é séria, não é mesmo?!), ainda tenho resolver umas questões em que eu estou trabalhando.
Obrigado pela colaboração.
Abraços.
Olhei a sua implementação aqui, e nela você testa se tem um atributo do tipo AutoInc. Se não tem, ele faz o procedimento normal.
Ok, quanto a isso, sem problema. Mas, pensei também num Autoincremento “interno”, ou seja, quando marcasse como AutoInc, o próprio componente utilizaria algum meio de geração sequencial ou utilizando o método já criado, que é o GetID. A diferença de utilização entre o autoincremento do banco ou do componente poderia ser definido por uma flag.
Mas, como eu disse, vai depender da necessidade de cada um.
Luis, Pode ser também, achei essa forma mais prática, deixando livre para o banco trabalhar. Desmarcando só gerenciar o increment, nunca usei o auto increment do banco, controlava a rotina, mas, o projeto atual, precisarei passar a responsabilidade para o banco, Esse banco será controlado pelo servidor restfull.
Também será preciso implementar um outro atributo, “Ignore”, quando quiser usar uma property dentro da mesma class que não entre na rotina do Insert ou Update.
Basta implementar dentro de Insert e Update. Deixar só os Selects para fazer os relacionamentos. Nas propertys de relacionamento adicionar o atributo [Ignore]
[attPK,Ignore]
property Financeiro: Integer read FFinanceiro write FFinanceiro;
[attPK,Ignore]
property Grupo: Integer read FGrupo write FGrupo;
Se acrescentar outra property dentro da classe sem ignorar, dar erro, RTII vai considerar tudo.
Essa acabou sendo uma boa discussão, Fabrício.
Para alguém que esteja acompanhando, pode ter pensado: “o que o Fabrício levantou faz total sentido, então por que o Luiz não teve a necessidade de tal implementação?”.
Por isso, acho interessante explicar.
“Gato escaldado de água fria tem medo”
Desde 95, já passei por diversos bancos de dados, como: Access, Paradox (arrrhhhh), MySql, MS SQL Server, Firebird (💕) e por aí vai.
Bom, geralmente eles seguem o mesmo padrão, mas aqui e ali as coisas mudam. E essas mudanças, por menores que sejam, podem gerar conflitos. Conflitos estes às vezes de difícil solução.
Por isso, eu tento manter minha base de dados o mais simples possível. Por exemplo, nos fields das minhas tabelas trabalho apenas com dados primitivos. Evito utilizar campos autoincremento e/ou lançar mão de triggers. E por fim, stored procedures muito pouco.
Eu sei que, para alguns casos, melhoraria bastante o desempenho. Mas no final das contas, funcionou para mim utilizar esta estratégia, principalmente por trabalhar com projetos, digamos, bastante heterogêneos (se é que me entendem! rsrsrs) e alguns legados da vida.
Agora, para quem tem definido que não haverá mudança de SGBD no projeto (pelo menos não que esteja previsto), aí creio ser útil utilizar o que a tecnologia oferece.
Cada caso é um caso.
Verdade amigo, As mudanças sempre tem, na verdade ser Expert não é simbologia de sucesso, tem muita gente ganhando dinheiro e com um sistema simples que atende o cliente. Minha visão atual é ter um produto que possa atender pelo menos as necessidades básicas dos clientes. Como nós não somos concorrentes da Microsoft e outros, estamos tranquilos, nossos sistemas são práticos. Tenho a mesma visão sua, simplificar é uma boa maneira de usar as ferramentas, pensando na futura mudança. ORM está ótimo assim, prático de entender e dar manutenção. Pegar código e colar sem estudar, não é bom.
Agradeço pelo conteúdo, já vi outros mais complexos, mas, preferir esse. Através desse, vou adaptando conforme minha realidade.
Grande abraço e bom trabalho.