Introdução
CRUD é o básico do básico: Create, Read, Update e Delete. A maior parte dos programas “de gestão” do mundo é, no fundo, CRUD com regras de negócio em cima.
Neste artigo eu mostro um CRUD enxuto usando Zeos (TZConnection/TZQuery) com FirebirdSQL, com exemplos prontos para você copiar e adaptar.
Recomendação de vídeos (na sequência)
Se você prefere acompanhar em vídeo, recomendo assistir nesta ordem:
Zeos CRUD – Parte 1
ASSISTIR VÍDEO NO YOUTUBEZeos CRUD – Parte 2
ASSISTIR VÍDEO NO YOUTUBEZeos CRUD – Parte 3
ASSISTIR VÍDEO NO YOUTUBEPré-requisitos
- Zeos instalado e disponível na paleta.
- TZConnection configurado (driver Firebird e parâmetros corretos).
- Uma tabela de exemplo para trabalhar.
Estrutura de tabela (exemplo Firebird)
Vamos usar uma tabela simples de clientes. Ajuste nomes e tipos conforme o seu caso:
create table clientes (
id bigint generated by default as identity primary key,
nome varchar(120) not null,
email varchar(150),
dt_cadastro timestamp default current_timestamp
);
Dica: Se você ainda não está usando identity (FB 3+), dá para usar SEQUENCE + TRIGGER, mas para um CRUD básico o identity simplifica bastante.
Configuração mínima: TZConnection
Você pode configurar pelo Object Inspector, mas é útil saber o essencial (driver, database, user/pass). Um exemplo típico de parâmetros seria:
Protocol: firebird
HostName: 127.0.0.1
Port: 3050
Database: /caminho/do/banco.fdb
User: SYSDBA
Password: masterkey
CRUD com TZQuery
A ideia é simples:
- Read (listar): usar
Open(SELECT). - Create/Update/Delete: usar
ExecSQL(INSERT/UPDATE/DELETE). - Parâmetros: sempre usar parâmetros (nada de concatenar strings).
Read: listar clientes
// ZQueryList é um TZQuery ligado ao mesmo TZConnection
ZQueryList.Close;
ZQueryList.SQL.Text :=
'select id, nome, email, dt_cadastro ' +
'from clientes ' +
'order by nome';
ZQueryList.Open;
Create: inserir cliente (com RETURNING)
Em Firebird é comum usar RETURNING para obter o ID inserido sem precisar de select separado:
// Retorna o ID recém-criado em :p_id
ZQueryExec.Close;
ZQueryExec.SQL.Text :=
'insert into clientes (nome, email) ' +
'values (:p_nome, :p_email) ' +
'returning id';
ZQueryExec.ParamByName('p_nome').AsString := edtNome.Text;
ZQueryExec.ParamByName('p_email').AsString := edtEmail.Text;
ZQueryExec.Open; // RETURNING gera um resultset
ShowMessage('Novo ID: ' + ZQueryExec.Fields[0].AsString);
Importante: INSERT/UPDATE/DELETE normalmente usam ExecSQL. Porém, quando você usa RETURNING, você vai ter um resultset; por isso, neste caso, Open faz sentido.
Update: atualizar cliente
ZQueryExec.Close;
ZQueryExec.SQL.Text :=
'update clientes set ' +
' nome = :p_nome, ' +
' email = :p_email ' +
'where id = :p_id';
ZQueryExec.ParamByName('p_id').AsLargeInt := StrToInt64(edtId.Text);
ZQueryExec.ParamByName('p_nome').AsString := edtNome.Text;
ZQueryExec.ParamByName('p_email').AsString := edtEmail.Text;
ZQueryExec.ExecSQL;
Delete: excluir cliente
ZQueryExec.Close;
ZQueryExec.SQL.Text := 'delete from clientes where id = :p_id';
ZQueryExec.ParamByName('p_id').AsLargeInt := StrToInt64(edtId.Text);
ZQueryExec.ExecSQL;
Transação: o que não pode faltar
Se você estiver fazendo mais de uma operação que precisa ser atômica (ex.: inserir “mestre” + “detalhe”, ou gravar e depois atualizar estoque), use transação explícita e garanta o fechamento.
// Padrão recomendado: se a transação iniciou, termina em Commit/Rollback
ZConnection1.StartTransaction;
try
ZQueryExec.ExecSQL;
ZQueryOutra.ExecSQL;
ZConnection1.Commit;
except
if ZConnection1.InTransaction then
ZConnection1.Rollback;
raise;
end;
Conclusão
Esse é o “esqueleto” de um CRUD: query parametrizada, escolha correta entre Open e ExecSQL, e transação bem-fechada quando necessário. A partir daqui você acrescenta validações, regras de negócio, logs e testes.