Como filtrar campo vazio com uma ADOTable?

Delphi

22/08/2013

Primeiro quero agradecer por todas as ajudas em tópicos que estou tendo.

Ao meu problema, criei uma aplicação em Delphi com o Banco de Dados e fiz todas as ligações usando ADOTable e exibindo os dados em um DBGrid.
Alguns cadastros devem estar com o campo NProjeto vazio, pois significa que este cadastro ainda não foi finalizado. Quando finaliza, esse campo recebe finalizado.

Quero colocar um CheckBox escrito: 'Listar Vazias' e ao clicar, mostrar todos os cadastros que possuem o campo NProjeto vazio. Ainda não consegui fazer isso.
Tentei com SQL mas não gostei do resultado e ainda não filtrou direito.
Quero fazer com filtro de ADOTable mesmo, estou fazendo da seguinte maneira:

If(CheckBox1.State=cbChecked) Then
  Begin
    AdoTable1.Filter:='NProjeto like '+QuotedStr(Edit12.Text);
    AdoTable1.Filtered:=True;
    Label23.Caption:=InttoStr(AdoTable1.RecordCount)+(' Registros');
  End
  Else
  Begin
    AdoTable1.Filtered:=False;
    Label23.Caption:=InttoStr(AdoTable1.RecordCount)+(' Registros');
  End;


Esse Edit12 eu coloquei recebendo texto vazio e está invisivel.
Não dá certo desse jeito, ele só filtra se eu preencher algo, salvar, deixar em branco e salvar novamente; se eu deixar ele em branco na hora do cadastro, ele não é filtrado.


Por favor, me ajudem! Sou iniciante em Delphi e estou criando o maior software que já fiz.
Obrigado!
Matheus Gomes

Matheus Gomes

Curtidas 0

Respostas

Deivison Melo

Deivison Melo

22/08/2013


Começe a trabalhar com o SQL de sua query montado em tempo de execução, passando
a utilizar ele no código delphi ao invés da property: SQL ou text (seja qual for
os componentes que esteja utilizando).

Exemplo:

var
strSQL: string;
begin
with Query do
begin
strSQL :='';
strSQL := 'select empresas.codigo_empresa as codigo, ' +
'empresas.razao_social_empresa as nome from empresas where 1 = 1 ';


If(CheckBox1.State=cbChecked) THEN
strSQL := strSQL + ' and valor is null';
else
strSQL := strSQL + ' and valor is not null';
Close;
CommandText := strSQL;
Open;
end;


Já fiz muito isso...

Não sei se era assim que vc queria...

Caso não seja sinaliza por favor!

Atenciosamente,

Emanoel Deivison
Recife - PE
GOSTEI 0
Matheus Gomes

Matheus Gomes

22/08/2013

Cara, eu não queria fazer com Query porque o meu banco de dados possui muitos registros e a Query atrasa o trabalho.
Teria uma outra maneira de fazer isso ?
GOSTEI 0
Matheus Gomes

Matheus Gomes

22/08/2013

Achei uma solução simples aqui. Obrigado pela ajuda!

Tópico encerrado.
GOSTEI 0
Joel Rodrigues

Joel Rodrigues

22/08/2013

Estou marcando o tópico como concluído, mas teria como compartilhar a solução encontrada?
A solução do seu problema pode ajudar outros futuramente.
GOSTEI 0
Matheus Gomes

Matheus Gomes

22/08/2013

Claro!
Fiz da seguinte forma:

procedure TFormControle.CheckBox1Click(Sender: TObject);
begin
  If(CheckBox1.State=cbChecked) Then
  Begin
    AdoTable1.Filter:='NProjeto like '+QuotedStr(Edit12.Text);
    AdoTable1.Filtered:=True;
    Label23.Caption:=InttoStr(AdoTable1.RecordCount)+(' Registros');
  End
  Else
  Begin
    AdoTable1.Filtered:=False;
    AdoTable1.Last;
    Label23.Caption:=InttoStr(AdoTable1.RecordCount)+(' Registros');
  End;
end;


Na hora que salvo o cadastro, coloco o campo NProjeto recebendo " - " e depois recebendo vazio, pois só assim ele reconhece o campo como vazio.
GOSTEI 0
POSTAR