Fórum Montar Select em Tempo de Execução #291217
09/08/2005
0
Bom, gostaria de saber o seguinte:
Tenho uma tela da Cadastro de Clientes, nessa tela tenho os campos:
- codigo
- nome
- razao_social
- endereco
ok, na minha pesquisa o usuário pode informar qualquer um desses campos e clicar num botão (OK), digamos que ele informa o campo nome, então quando clicar no botão ´OK´, o sistema deverá montar uma select com o like nesse campo, mas eu não tenho como prever o campo de pesquisa do usuário, certo?
Então, será que existe alguma forma de identificar qual os campos de parâmetro que o usuário preencheu?
Valeu Galera!!!
Marcelo Ribeiro
Marceloribeiro
Curtir tópico
+ 0Posts
09/08/2005
Ovidiojr
Uma das maneiras que existe de se fazer isso é você colocar um componente radiogroup ou combobox com os campos que o usuario pode fazer a consulta. Por exemplo, quando o usuario colocar que quer selecionar o cliente por razão social, você monta o select da seguinte forma.:
if combobox.itemindex = 2 (Indice da razão social no combobox)
then query1.commandtext := ´select * from client where razao_social like ´´¬´+edit1.text+´¬´´ ´;
Faça uma condição dessa para cada item do combobox ou do componente que vc estiver usando para dar as opções para o usuario.
Qualquer duvida, favor entrar em contato.
Ovidio Jr.
Analista/Programador
TSI Sistemas.
Gostei + 0
09/08/2005
Marceloribeiro
Também não queria ficar fazendo um monte de IF, p/ cada campo do form... eu procuro uma coisa mais dinâmica.... entende?
Marcelo Ribeiro
Gostei + 0
09/08/2005
Massuda
Gostei + 0
10/08/2005
Marceloribeiro
Cada form tem uma quantidade diferente de Editsm ok?
Quando o osuário clicar no botão besquisar, eu limpo todos os edits, combobox, etc... p/ ele informar um dos campos EXEMPLO: Digamos que no cadastro de clientes eu tenha os campos abaixo,
- codigo
- nome
- ativo (S ou N)
Quando o usuário clicar em pesquisar, eu então limpo os campos, aí o usuário resolve pesquisar todos os clientes ´ativos´, então ele entra no campo ativo coloca a letra ´S´ e clica em ´OK´, bom aqui é que o bicho pega, pois a select tem que ser montada de acordo c/ o campo que foi preenchido, entende?
Vale pelas respostas galera!!!
Vamos ver se existe uma solução dinâmica p/ isso....
Marcelo Ribeiro
Gostei + 0
10/08/2005
Rjun
Gostei + 0
10/08/2005
Marceloribeiro
Marcelo Ribeiro
Gostei + 0
10/08/2005
Rjun
Gostei + 0
10/08/2005
Ovidiojr
Coloque os componentes na form, referentes a cada campo que vc quer pesquisar na tabela de clientes e ai monte o select dinamicamente. Da seguinte forma.:
query1.commandtext := ´select * from client where 1 = 1 ´;
if edt_razsocial.text <> ´´
then query1.commandtext := query1.commandtext +´ and razao_social like ´´¬´+edt_razsocial.text+´¬´´ ´;
E assim sucessivamente, va montando um IF para cada campo que vc tem para pesquisar. Assim eu acho que é a forma mais dinamica de se fazer isso. Não conheco outra forma. Se vc conhecer, favor passar para mim.
Ovidio Jr.
TSI Sistemas.
Gostei + 0
10/08/2005
Melo
Procedure LocPesquisar
var
sSql : String;
begin
sSql := ´select * from Cliente´;
if ChkBoxAtivo.checked then
Ssql := sSql + ´ ATIVO = ´ + QuotedStr(´S´)
else
Ssql := sSql + ´ ATIVO = ´ + QuotedStr(´N´);
if Length(Trim(edtNome.Text)) > 0 then
sSql := sSql + ´ NOME LIKE ¬´ + edtNome.Text + ´¬´
Dm.QryPesq.Close;
Dm.QryPesq.Sql.Clear;
Dm.QryPesq.Sql.Add(sSql);
Dm.QryPesq.Open;
end;
Gostei + 0
10/08/2005
Marceloribeiro
Gostei da idéia de usar TCollection, mas nem sonho p/ que server isso...
Acho que vou partir p/ os ifs da vida....
Agradeço a todos...
Marcelo Ribeiro
Gostei + 0
11/08/2005
Isabelct
Muito cuidado com esse tipo de instrução, esta condição (1 = 1) força o fetch de todos os registros da tabela. Em ambiente cliente/servidor com uma tabela com muitos dados, isso ficaria extremamente lento.
Quanto ao problema principal da thread, penso que só testando os campos, pois não há como ´adivinhar´ quais campos foram preenchidos...
Eu costumo montar meus testes assim, para evitar a condição inicial do select.
VarWhere := ´´; if CheckBoxAtivo.Checked then VarWhere := VarWhere + ´ATIVO = ´ + QuotedStr(´S´) + ´ AND ´; if EditNome.Texto <> ´´ then VarWhere := VarWhere + ´Nome = ´ + QuotedStr(EditNome.Text) + ´ AND ´; // E assim para todos campos
Ao final, você testa se a variável VarWhere está preenchida, retira os ultimos 4 caracteres dela (´AND ´ - estes 4 caracteres sempre vão estar no final da string), e atribui seu conteúdo à query:
query1.commandtext := ´select * from client where ´ + VarWhere;
Espero ter ajudado.
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)