Vários critérios para consulta

Delphi

10/09/2014

Boa madrugada caros colegas,

Estou precisando de um formulário de consulta pra fechar um projeto e este possui alguns detalhes. Tenho uma tabela com os seguintes campos:

Data
Atividade
Evento
Nome
Num_Matricula
Sexo
Faixa_Etaria
CPF
Comunidade
Municipio
UF
Financiador

{ Faixa_etaria é preenchido automaticamente, de acordo com a idade do participante e foi dividido em: CRIANÇA, ADOLESCENTE, JOVEM, ADULTO e IDOSO. }

A consulta deverá possibilitar ao usuário consultar uma combinação de critérios que serão validados através de um checkbox, por exemplo, o usuário pode querer saber quem foram os ADOLESCENTES, MASCULINOS do município de LAGOA GRANDE, que participaram da atividade AGROECOLOGIA NO DIA A DIA, dentro de um determinado PERÍODO. Mas, pode também querer apenas saber quem foram os participantes desta mesma atividade, num determinado período, independente de sexo, município e faixa etária...

Deu pra entender a dificuldade?

Como eu poderia organizar esta consulta de forma a propiciar ao usuário liberdade para controlar como a consulta será realizada???
Obs.: Favor desconsiderar os captions dos botões.

Utilizo Delphi XE3 e MySQL

Certo da atenção e a ajuda de todos, antecipadamente agradeço.


[img]http://arquivo.devmedia.com.br/forum/imagem/233649-20140910-045802.jpg[/img]
Aloisio Santos

Aloisio Santos

Curtidas 0

Respostas

Marcos Saffran

Marcos Saffran

10/09/2014

Bom dia pro-luck,

abaixo está uma rotina que fiz, me desculpe por possíveis erros, pois fiz no bloco de notas.
a rotina verifica apenas os checkbox e não verifica a faixa etária, pois para isso é uma subrotina e não sei os limites de sua faixa etária.

variáveis:
atividade, evento, comunidade, municipio : String;
municipio, financiador, sexo, faixaetaria : String;
ComandoSqlInicio, ComandoSqlFim, ComandoSql : String;
campos: String;
controle : Boolean;

atividade := ComboboxAtividade.Text;
evento := ComboboxEvento.Text;
comunidade := editComunidade.Text;
municipio := editmunicipio.Text;
financiador := ComboboxFinanciador.Text;
sexo := Comboboxsexo.Text;
ComandoSqlFim := '';
campos := '';
controle := False;

if CheckBoxAtividade.Checked then
begin
campos := 'atividade, ';
ComandoSqlFim := 'atividade = ' + QuotedStr(atividade) + ') ';
controle := True;
end;
if CheckBoxevento.Checked then
begin
campos := campos + 'evento, ';
if controle then
ComandoSqlFim := ComandoSqlFim + 'AND (';
ComandoSqlFim := ComandoSqlFim + 'evento = ' + QuotedStr(evento) + ') ';
controle := True;
end;
if CheckBoxcomunidade.Checked then
begin
campos := campos + 'comunidade, ';
if controle then
ComandoSqlFim := ComandoSqlFim + 'AND (';
ComandoSqlFim := ComandoSqlFim + 'comunidade = ' + QuotedStr(comunidade) + ') ';
controle := True;
end;
if CheckBoxmunicipio.Checked then
begin
campos := campos + 'municipio, ';
if controle then
ComandoSqlFim := ComandoSqlFim + 'AND (';
ComandoSqlFim := ComandoSqlFim + 'municipio = ' + QuotedStr(municipio) + ') ';
controle := True;
end;
if CheckBoxfinanciador.Checked then
begin
campos := campos + 'financiador, ';
if controle then
ComandoSqlFim := ComandoSqlFim + 'AND (';
ComandoSqlFim := ComandoSqlFim + 'financiador = ' + QuotedStr(financiador) + ') ';
controle := True;
end;
if CheckBoxsexo.Checked then
begin
campos := campos + 'sexo ';
if controle then
ComandoSqlFim := ComandoSqlFim + 'AND (';
ComandoSqlFim := ComandoSqlFim + 'sexo = ' + QuotedStr(sexo) + ') ';
controle := True;
end;
if controle := True then
begin
ComandoSqlInicio := 'select ' + campos + 'from tabela where ((';
ComandoSqlFim := ComandoSqlFim + ')';
ComandoSql := ComandoSqlInicio + ComandoSqlFim;
end
else
begin
ComandoSql := 'Select * from tabela';
end;
GOSTEI 0
Ricardo

Ricardo

10/09/2014

Não deu tempo de olhar linha por linha, mas o código que o amigo Marcos postou é o caminho mais curto, porém com se trata de checkbox, temos que tratar a questão de que mais de um checkbox pode ser selecionado. Nesse caso tem que fazer a combinação de todos eles.
GOSTEI 0
Aloisio Santos

Aloisio Santos

10/09/2014

Obrigado pela atenção, mas resolvi de uma forma mais simples, seguindo a orientação de um amigo daqui de minha cidade...

Retirei os checkboxes e os comboboxes, e usei apenas edits...
agora o usuário só digita na linha que interessa... e o código fará a pesquisa somente com estes dados informados, desconsiderando os edits que estiverem vazios...
O código ficou assim:

procedure TExtratoATV_Realizadas_.BitBtn1Click(Sender: TObject);
Var
vInicio, vFinal: String;
vAtividade, vEvento, vComunidade, vMunicipio, vFinanciador, vSexo, vFaixaEtaria: String;
begin
DataI99.Text := DateToStr(DataI.Date);
DataF99.Text := DateToStr(DataF.Date);
vAtividade := EdtAtividade.Text;
vEvento := EdtEvento.Text;
vComunidade := EdtComunidade.Text;
vMunicipio := EdtMunicipio.Text;
vFinanciador := EdtFinanciador.Text;
vSexo := EdtSexo.Text;
vFaixaEtaria := EdtFaixaEtaria.Text;

If DataF.Date < DataI.Date then
begin
ShowMessage(FMenu_.Operador.Caption+', o intervalo de datas inválido, observe que a data inicial é maior que a data final!!!');
DataF.Date := DataI.Date
end
else
begin
vInicio := DateToStr(DataI.Date);
vFinal := DateToStr(DataF.Date);

dm_.ZQryATV_Realizadas.Close;
dm_.ZQryATV_Realizadas.SQL.Clear;
dm_.ZQryATV_Realizadas.SQL.Add('select * from atv_realizadas WHERE (data >= :iInicial) AND (data <= :iFinal) AND (atv_realizada LIKE' + ''''+'%'+vAtividade+'%'+''') AND (evento LIKE' + ''''+'%'+vEvento+'%'+''') AND (comunidade LIKE' + ''''+'%'+vComunidade+'%'+''') AND (municipio LIKE' + ''''+'%'+vMunicipio+'%'+''') AND (atv_financiador LIKE' + ''''+'%'+vFinanciador+'%'+''') AND (sexo LIKE' + ''''+'%'+vSexo+'%'+''') AND (faixa_etaria LIKE' + ''''+'%'+vFaixaEtaria+'%'+''') ORDER BY atv_realizada');
dm_.ZQryATV_Realizadas.ParamByName('iInicial').AsDateTime := StrToDate(vInicio);
dm_.ZQryATV_Realizadas.ParamByName('iFinal').AsDateTime := StrToDate(vFinal);
dm_.ZQryATV_Realizadas.Open;
end;
Close;
end;

Mais uma vez, obrigado à todos.

Post encerrado.
GOSTEI 0
POSTAR