Montagem comando SQL de pesquisa no server

18/06/2009

Ola Pessoal ! Partindo do principio, que tenho uma aplicação multi-camadas, utilizando WebService, e que na aplicação cliente eu não posso ter nenhum comando SQL, vamos ao cenário: Na primeira tela do programa, o usuario tem que informar alguns parametros de pesquisa, e depois clicar no botão 'Pesquisar'. Este botão vai consumir um servico de pesquisa no banco de dados, a partir destes parametros informados. Como faço para montar este comando SQL, no server, sabendo que esta consulta pode ser um SQL complexo, com varios JOIN'S entre tabelas ? Exemplo : Tenho uma tabela de material que tem ligação com a tabela de lotacao e uma ligacao com a tabela de codigo estrutural. Quando o usuario clica no botão 'Pesquisar' eu mostra para ele os campos : codigo do material, descricao do material, descricao do codigo estrutural e descricao da lotacao num grid. Então como faria para montar este SQL no server ? PS : Eu não quero colocar no server, uma query e um provider para cada consulta. No server, tenho somente uma query e um provider que uso para TODAS as consultas do meu sistema. []'s Ines Brotto
Frame Brotto

Frame Brotto

Curtidas 0

Respostas

Rodrigo Mourão

Rodrigo Mourão

18/06/2009

Olá Ines;

Sempre digo aos meus alunos e clientes que existe mil e uma maneiras de preparar Neston, basta você inventar uma. A mesma coisa ocorre com o Delphi. No seu caso especificamente uma das soluções seria ter no servidor de aplicação, métodos disponíveis que iriam executar este consulta. Neste caso citado você poderia ter um método chamado ListaProdutos, este método poderia ter tantos parâmentros quantos necessários. Suponha que você pudesse passar ou não o nome do produto, código, nome do fabricante e código de barra.

Lembrando que o usuário pode informar um dos parâmetros, todos ou nenhum isso vai depender do que ele preenche na tela de consulta. No servidor o método ficaria mais ou menos assim:

Procedure ListaProdutos(DescProduto: String = ""; Código: Integer = 0; DescFabricante: String = ""; CodBarra: Integer = 0)

Com isso temos valores default para os parâmetros e na implementação poderia ficar assim:

Procedure ListaProdutos(DescProduto: String = ""; Código: Integer = 0; DescFabricante: String = ""; CodBarra: Integer = 0)
var
  Cmd: TStringList;
begin
  Cmd:= TStringList.Create;
  Cmd.Add('select p.codigo, p.descricao, p.preco, p.estoque, p.barra, f.descricao ');
  Cmd.Add('  from produto p, fabricante f');
  Cmd.Add(' where p.idfabricante = f.idfabricante');
  if DescProduto <> EmptyStr then
    Cmd.Add(' and p.descricao like '+QuotedStr(DescProduto+'%'));
  if DescFabricante <> EmptyStr then
    Cmd.Add(' and f.descricao like '+QuotedStr(DescFabricante+'%'));
  if Codigo <> 0 then
    Cmd.Add(' and p.codigo = '+IntToStr(codigo));
  if CodBarra <> 0 then
    Cmd.Add(' and p.barra ='+IntToStr(CodBarra));

    SuaQueryPadrao.Sql.Add(CMD.Text);
    O resto do seu procedimento aqui !!
end;
end;

Bem Ines, esta é uma das soluções. Assim você poderia seguir o mesmo procedimento e criar quantos métodos forem necessários, montando neles os comandos sql e passando para esta query única que você tem na sua aplicação.

Espero ter ajudado !!

Abs!!

GOSTEI 0
Rodrigo Mourão

Rodrigo Mourão

18/06/2009

Olá Inês !!

Estaremos colocando o chamado com oconcluído, caso ainda tenha alguma dúvida é so reabrir o chamado.

Estamos sempre à disposição.

Abs!

Atenciosamente,
Rodrigo Carreiro Mourão
Borland Instructor Certified
Coordenador da Consultoria em Delphi
GOSTEI 0
POSTAR