Vários critérios para consulta
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]
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
Curtidas 0
Respostas
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;
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
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
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.
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