Desenvolvimento de Sistemas para Automação Comercial

Voltar

BufDataSet


Criar campos, ordenação e indice:

  • Ordenar por mais campos


Inserir Registros:


Alterar Registros:


Deletar Registros:


Salvar em Disco:


Carregar do Disco:


Buscar parcial:


Busca parcial com caracteres especiais:

  • O filtro simples com Dataset.Filter := '...' não funciona quando o texto tem acentos, cedilhas ou outros caracteres especiais, pois a comparação é literal. A solução é usar o evento OnFilterRecord do dataset, que é chamado para cada registro enquanto o filtro está ativo, permitindo aplicar sua própria lógica de comparação.

    São necessários quatro elementos, na ordem abaixo:

  • Passo 1 — Função para remover acentos:

    Percorre a string caractere por caractere e substitui letras acentuadas pelas equivalentes sem acento. Funciona com strings WIN1252 (AnsiString), padrão nos projetos Lazarus/Firebird com charset WIN1252.

  • Passo 2 — Função para comparar texto (ignora acento e maiúscula):

    Remove os acentos de ambos os textos, converte para maiúsculo e verifica se o texto buscado está contido no texto do campo. É o equivalente a um LIKE '%BUSCA%' do Firebird, mas funcionando em memória no TBufDataset.

  • Passo 3 — Criar o procedure "Evento de Filtro" (OnFilterRecord):

    Este procedure não é o evento do campo de busca. Ele é chamado automaticamente pelo dataset para cada registro enquanto Filtered = True. O parâmetro var Accept: Boolean define se o registro atual será exibido (True) ou ocultado (False).

    Pense nele como um filtro de linha do Firebird — WHERE campo LIKE '%busca%' — só que executado em Pascal, registro por registro, dentro do TBufDataset já carregado em memória.

    Atenção: a assinatura obrigatória é (DataSet: TDataSet; var Accept: Boolean). Use o parâmetro DataSet para ler os campos do registro atual.

  • Passo 4 — Atribuir o evento ao dataset (geralmente no FormCreate):

    Liga o procedure criado acima ao evento OnFilterRecord do dataset. A partir daí, toda vez que Filtered for alternado, o Lazarus chamará BufFilterRecord para cada registro.

  • Passo 5 — Evento do campo de busca (EditBuscaChange):

    Este sim é o evento OnChange do TEdit de busca. Ele não filtra nada diretamente — apenas "desliga e liga" o filtro para forçar o dataset a percorrer todos os registros novamente, chamando BufFilterRecord para cada um.

    O DisableControls e EnableControls evitam que os componentes visuais (DBGrid, etc.) piscarem a cada registro avaliado — equivalente a usar BeginUpdate/EndUpdate em listas visuais no Delphi/Lazarus.