Logo

CRUD básico usando Zeos e FirebirdSQL

Gladiston Santana - Um site para chamar de meu

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 YOUTUBE

Zeos CRUD – Parte 2

ASSISTIR VÍDEO NO YOUTUBE

Zeos CRUD – Parte 3

ASSISTIR VÍDEO NO YOUTUBE

Pré-requisitos

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 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.

← Voltar para o Guia de Sobrevivência