GARANTIR DESCONTO

Fórum Montar Select em Tempo de Execução #291217

09/08/2005

0

Olá Galera!!!

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

Marceloribeiro

Responder

Posts

09/08/2005

Ovidiojr

Olá, Marcelo.
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.


Responder

Gostei + 0

09/08/2005

Marceloribeiro

Certo, mas o que eu estou buscando é uma maneira de fazer sem combobox, sem nada, ou seja, só o fato do usuário preencher o campo eu já monto a select...

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


Responder

Gostei + 0

09/08/2005

Massuda

Certo, mas o que eu estou buscando é uma maneira de fazer sem combobox...
Eu não entendi... você vai ter quatro edits ou um único edit?


Responder

Gostei + 0

10/08/2005

Marceloribeiro

Não, o que eu gostaria de saber é o seguinte:

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


Responder

Gostei + 0

10/08/2005

Rjun

Acredito que não tenha como você fugir do encadeamento de IF´s.


Responder

Gostei + 0

10/08/2005

Marceloribeiro

Então não tem jeito, p/ cada tela eu vou ter que dar uma tratativa diferente? será que não teria uma forma mais dinâmica???

Marcelo Ribeiro


Responder

Gostei + 0

10/08/2005

Rjun

Você poderia criar um componente que recebesse uma collection com o nome do campo e o controle relacionado ao campo. Seria um pouco trabalhoso de inicio mas você teria um componente para utilizar em qualquer form.


Responder

Gostei + 0

10/08/2005

Ovidiojr

Certo, entendi. O que vc pode fazer então é o seguinte.
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.


Responder

Gostei + 0

10/08/2005

Melo

Seria isso mais ou menos, que vc esteja querendo.. :)

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;


Responder

Gostei + 0

10/08/2005

Marceloribeiro

Galera, Valeu!!!

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


Responder

Gostei + 0

11/08/2005

Isabelct

query1.commandtext := ´select * from client where 1 = 1 ´;


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.


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar