Trabalhando com ListBox de Multiplo valor

28/09/2009

Olá Rodrigo/Wesley, solicito ajuda de vcs novamente, bom tenho uma tela onde tenho 7 ListBox, com alguns valores relacionados a uma tabela de Membros, onde tenho NOME, IDGRUPO, IDTRATAMENTO, IDPROFISSAO, IDIGREJA, IDESCOLARIDADE, IDESTADOCIVIL, IDSEXO. Bem, preciso listar em uma GridView os Membos conforme eu seleciono nos ListBox, se eu não escolher nada, me traga SELECT * FROM MEMBROS Pois Bem, nos ListBox todos estão AutoPostBack=true e SelectionMode=Multiple Eu utilizo MSSQLServer e RAD Studio 2007, tenho essa store procedure no SQLServer, porem estou postando somente para que vcs possam me orientar o que eu possa fazer, pois não consigo utilizar mais de um parametro selecionado em um mesmo ListBox. Minha Store Procedure ALTER PROCEDURE [dbo].[spParametrizado] @IDGRUPO AS SMALLINT, @IDTRATAMENTO AS SMALLINT, @IDPROFISSAO AS SMALLINT, @IDIGREJA AS SMALLINT, @IDESCOLARIDADE AS SMALLINT, @IDESTADOCIVIL AS SMALLINT, @IDSEXO AS SMALLINT AS DECLARE @SQL AS VARCHAR(4000) SET @SQL = ' SELECT IDMEMBRO, NOME, TEL_RES, TEL_COM, CELULAR, EMAIL FROM MEMBROS WHERE 1=1 ' IF (@IDGRUPO IS NOT NULL) BEGIN SET @SQL = @SQL + ' AND IDGRUPO = "' + CONVERT(VARCHAR, @IDGRUPO) + '"' END IF (@IDTRATAMENTO IS NOT NULL) BEGIN SET @SQL = @SQL + ' AND IDTRATAMENTO = "' + CONVERT(VARCHAR, @IDTRATAMENTO) + '"' END IF (@IDPROFISSAO IS NOT NULL) BEGIN SET @SQL = @SQL + ' AND IDPROFISSAO = "' + CONVERT(VARCHAR, @IDPROFISSAO) + '"' END IF (@IDIGREJA IS NOT NULL) BEGIN SET @SQL = @SQL + ' AND IDIGREJA = "' + CONVERT(VARCHAR, @IDIGREJA) + '"' END IF (@IDESCOLARIDADE IS NOT NULL) BEGIN SET @SQL = @SQL + ' AND IDESCOLARIDADE = "' + CONVERT(VARCHAR, @IDESCOLARIDADE) + '"' END IF (@IDESTADOCIVIL IS NOT NULL) BEGIN SET @SQL = @SQL + ' AND IDESTADOCIVIL = "' + CONVERT(VARCHAR, @IDESTADOCIVIL) + '"' END IF (@SEXO IS NOT NULL) BEGIN SET @SQL = @SQL + ' AND SEXO = "' + CONVERT(VARCHAR, @SEXO) + '"' END EXECUTE(@SQL) Meu botão Filtrar está assim: procedure TParametrizado.btFiltrar_Click(sender: System.Object; e: System.EventArgs); var Comand : SqlCommand; Conn : SqlConnection; SqlReader : SqlDataReader; begin Conn := SqlConnection.Create(ConfigurationManager.ConnectionStrings['Conexao'].ToString); Comand := SqlCommand.Create('spParametrizado', Conn); Comand.CommandType := CommandType.StoredProcedure; Comand.Parameters.Add('@IDGRUPO', ListBox_Grupos.SelectedValue); Comand.Parameters.Add('@IDTRATAMENTO', ListBox_Tratamentos.SelectedValue); Comand.Parameters.Add('@IDPROFISSAO', ListBox_Profissoes.SelectedValue); Comand.Parameters.Add('@IDIGREJA', ListBox_Igreja.SelectedValue); Comand.Parameters.Add('@IDESCOLARIDADE', ListBox_Escolaridade.SelectedValue); Comand.Parameters.Add('@IDESTADOCIVIL', ListBox_EstadoCivil.SelectedValue); Comand.Parameters.Add('@IDSEXO', ListBox_Sexo.SelectedValue); Conn.Open; SqlReader := Comand.ExecuteReader; if SqlReader.HasRows then begin try GridView1.DataSource := SqlReader; GridView1.DataBind; finally Conn.Close; end; end else MessageScript( Page, 'Não foram encontrado Registros conforme Opções Selecionadas !!!'); end; Obrigado mais uma vez.
Paulo Freire

Paulo Freire

Curtidas 0

Mais Respostas

Paulo Freire

Paulo Freire

28/09/2009

Me perdoem, usei o Browser Chrome, e ficou sem formação. qualquer coisa eu posto novamente.
GOSTEI 0
Paulo Freire

Paulo Freire

28/09/2009

Olá Rodrigo/Wesley, solicito ajuda de vcs novamente, bom tenho uma tela onde tenho 7 ListBox, com alguns valores relacionados a uma tabela de Membros, onde tenho NOME, IDGRUPO, IDTRATAMENTO, IDPROFISSAO, IDIGREJA, IDESCOLARIDADE, IDESTADOCIVIL, IDSEXO. Bem, preciso listar em uma GridView os Membos conforme eu seleciono nos ListBox, se eu não escolher nada, me traga SELECT * FROM MEMBROS Pois Bem, nos ListBox todos estão AutoPostBack=true e SelectionMode=Multiple Eu utilizo MSSQLServer e RAD Studio 2007, tenho essa store procedure no SQLServer, porem estou postando somente para que vcs possam me orientar o que eu possa fazer, pois não consigo utilizar mais de um parametro selecionado em um mesmo ListBox.


Minha Store Procedure:

ALTER PROCEDURE [dbo].[spParametrizado]

@IDGRUPO AS SMALLINT,
@IDTRATAMENTO AS SMALLINT,
@IDPROFISSAO AS SMALLINT,
@IDIGREJA AS SMALLINT,
@IDESCOLARIDADE AS SMALLINT,
@IDESTADOCIVIL AS SMALLINT,
@IDSEXO AS SMALLINT

AS DECLARE

@SQL AS VARCHAR(4000) SET @SQL = ' SELECT IDMEMBRO, NOME, TEL_RES, TEL_COM, CELULAR, EMAIL FROM MEMBROS WHERE 1=1 '

IF (@IDGRUPO IS NOT NULL) BEGIN SET @SQL = @SQL + ' AND IDGRUPO = "' + CONVERT(VARCHAR, @IDGRUPO) + '"'
END

IF (@IDTRATAMENTO IS NOT NULL) BEGIN SET @SQL = @SQL + ' AND IDTRATAMENTO = "' + CONVERT(VARCHAR, @IDTRATAMENTO) + '"'
END

IF (@IDPROFISSAO IS NOT NULL) BEGIN SET @SQL = @SQL + ' AND IDPROFISSAO = "' + CONVERT(VARCHAR, @IDPROFISSAO) + '"'
END

IF (@IDIGREJA IS NOT NULL) BEGIN SET @SQL = @SQL + ' AND IDIGREJA = "' + CONVERT(VARCHAR, @IDIGREJA) + '"'
END

IF (@IDESCOLARIDADE IS NOT NULL) BEGIN SET @SQL = @SQL + ' AND IDESCOLARIDADE = "' + CONVERT(VARCHAR, @IDESCOLARIDADE) + '"'
END

IF (@IDESTADOCIVIL IS NOT NULL) BEGIN SET @SQL = @SQL + ' AND IDESTADOCIVIL = "' + CONVERT(VARCHAR, @IDESTADOCIVIL) + '"'
END

IF (@SEXO IS NOT NULL) BEGIN SET @SQL = @SQL + ' AND SEXO = "' + CONVERT(VARCHAR, @SEXO) + '"' END

EXECUTE(@SQL)



Meu botão Filtrar está assim:

procedure TParametrizado.btFiltrar_Click(sender: System.Object; e: System.EventArgs);
var
   Comand : SqlCommand;
   Conn : SqlConnection;
   SqlReader : SqlDataReader;

begin

   Conn := SqlConnection.Create(ConfigurationManager.ConnectionStrings['Conexao'].ToString);
   Comand := SqlCommand.Create('spParametrizado', Conn);
   Comand.CommandType := CommandType.StoredProcedure;
   Comand.Parameters.Add('@IDGRUPO', ListBox_Grupos.SelectedValue);C
   Comand.Parameters.Add('@IDTRATAMENTO', ListBox_Tratamentos.SelectedValue);
   Comand.Parameters.Add('@IDPROFISSAO', ListBox_Profissoes.SelectedValue);
   Comand.Parameters.Add('@IDIGREJA', ListBox_Igreja.SelectedValue);
   Comand.Parameters.Add('@IDESCOLARIDADE', ListBox_Escolaridade.SelectedValue);
   Comand.Parameters.Add('@IDESTADOCIVIL', ListBox_EstadoCivil.SelectedValue);
   Comand.Parameters.Add('@IDSEXO', ListBox_Sexo.SelectedValue);
  
  Conn.Open;
  SqlReader := Comand.ExecuteReader;

  if SqlReader.HasRows then
  begin
   try
     GridView1.DataSource := SqlReader;
     GridView1.DataBind;
   finally
     Conn.Close;
   end;
 
  end else
   MessageScript( Page, 'Não foram encontrado Registros conforme Opções Selecionadas !!!');
end;


Obrigado mais uma vez.
GOSTEI 0
Rodrigo Mourão

Rodrigo Mourão

28/09/2009

Olá Paulo


Vuio analisar para entender completamente o problema e lhe sugerir algo .

Abs!!


GOSTEI 0
Paulo Freire

Paulo Freire

28/09/2009

Beleza, obrigado.
GOSTEI 0
Rodrigo Mourão

Rodrigo Mourão

28/09/2009

Paulo vamos lá. Não sei se entendi muito bem, mas vc esta querendo selecionar ou não um item nos lists box e então fazer um filtro para exibir membros que se enquadrem nos parametros. Exemplo seleciono a profissão analista e ele me tras todos os membros analistas, correto ??

Agora me diz um coisa, vc fala em selectmode como Multiple então sua intenção seria poder selecionar duas profissões por exemplo? Ou sua intenção e permitir que o usuario selecione um profissao, um tratamento ou uma escolaridade e fazer um filtro em cima destes parametros de modo que fique dinâmico.

Eu fiquei na dúvida eu acredito q segunda opção mais viável e mais pratica. Podemos montar o Select Dinamicamente. Pode me confirmar a intenção !!

Abs!!

GOSTEI 0
Paulo Freire

Paulo Freire

28/09/2009

exatamente a 2ª opção, o usuário selecionara ANALISTA E ADVOGADO E CONTADORES num ListBox e assim montar o filtro para ser monstrado no GridView.

Valeu
GOSTEI 0
Rodrigo Mourão

Rodrigo Mourão

28/09/2009

Blz Paulo,

Posso te pedir um favor, teria como mandar a sua aplicação, pois ja esta toda montada e inclisive pq usar procedure assim ganhamos tempo e outro presico ver como vc esta carregando o ListBox.

Se nao puder nao tem problema eu montar uma aqui mas pode demorar um pouco.


abs!1


GOSTEI 0
Paulo Freire

Paulo Freire

28/09/2009

Sim, claro, vc precisa dos banco também correto, com as stores procedures?
GOSTEI 0
Paulo Freire

Paulo Freire

28/09/2009

Como eu envio os arquivos?
GOSTEI 0
Rodrigo Mourão

Rodrigo Mourão

28/09/2009

Pelo Disco Virtual !!!

https://www.devmedia.com.br/imagens/videos/4/Video%20disco%20virtual.htm


Abs!!!

P.S.: Não esqueca de passar o link !!!
GOSTEI 0
Paulo Freire

Paulo Freire

28/09/2009

Fala Rodrigo, vamos lá primeiro é o projeto em si

http://video.devmedia.com.br/discovirtual/81635/suportes/ShalomWeb.rar

São as paginas Parametrizado.aspx e EnviarEmails.aspx que utilizo os ListBox

O scrito do banco é esse

http://video.devmedia.com.br/discovirtual/81635/suportes/ScriptDataBase_ShalomWeb.rar


Qualquer dúvida estamos aqui, obrigadão


Paulo
GOSTEI 0
Rodrigo Mourão

Rodrigo Mourão

28/09/2009

Olá Paulo,

Ja beixei e montei  o projeto com o banco aqui. Peço que aguarde mais um pouco estou realizando testes para tentar resolver seu problema.

Abs!!

GOSTEI 0
Rodrigo Mourão

Rodrigo Mourão

28/09/2009

Olá Paulo, eu nunca me dei bem com SQL Server, não consegui conectar no banco de dados, por isso não testei a aplicação, mas a principio vai funcionar.

Vamos la primeiro temos quel alterar a procedure [spParametrizado] atualmente os parametros são smallint mude para varchar:

  @IDGRUPO         AS varchar,
  @IDTRATAMENTO    AS varchar,
  @IDPROFISSAO     AS varchar,
  @IDIGREJA        AS varchar,
  @IDESCOLARIDADE  AS varchar,
  @IDESTADOCIVIL   AS varchar,
  @SEXO            AS varchar

Eu vou mostar a mudanca no grupo, mas basta fazer a mesma coisa para os outros parametros. Veja como fica a alteracao para o parametro Grupo:

IF (@IDGRUPO IS NOT NULL)
BEGIN
    SET @SQL = @SQL + ' AND IDGRUPO in ("' + @IDGRUPO + '")'
END


Para entender, sai o =  e entra o IN ()  isso pq agora poderemos pegar não um mais varios grupos. Faca o mesmo para os outros parametros.

Agora vamos ao Delphi. No clique do botao filtrar a pagina parametrizacao antes do codigo que ja exista vc terar uqe pegar os codigos dos grupos selecionados e passar para o select. Eu criei uma variavel Grupo e fiz um loop. Veja:

for i := 0 to ListBox_Grupos.Items.Count-1 do
  begin
    if ListBox_Grupos.Items[I].Selected then
      Grupo := Grupo + ListBox_Grupos.Items[I].Value+',';
  end;
  Grupo := Grupo.Remove(Grupo.Length,1);

Como estou colocando ID,ID,ID, no final eu delete a ultima virgula. Depois eu passo o grupo para o procedure.

Conn   := SqlConnection.Create(ConfigurationManager.ConnectionStrings['ConexaoShalom'].ToString);
  Comand := SqlCommand.Create('spParametrizado', Conn);
  Comand.CommandType := CommandType.StoredProcedure;
  Comand.Parameters.Add('@IDGRUPO', Grupo);

Faça o loop com os outros compoenntes.

Como falei nao testei a aplicacao pois nao consigo conectar na base, mas a procedure compilou legal e a aplicacao tambem.

Qualquer coisa e so falar  !!!

Abs!!1






GOSTEI 0
Paulo Freire

Paulo Freire

28/09/2009

Olá Rodrigão, como vc disse belezinha, compilou a procedure e a aplicação, porem ao chama-la em localhost/shalomweb, me aparece essa exceção conforme a figura enviada. Meu botão filtrar está dessa forma.

procedure TParametrizado.btFiltrar_Click(sender: System.Object; e: System.EventArgs);
var
  Comand      : SqlCommand;
  Conn        : SqlConnection;
  SqlReader   : SqlDataReader;
  Grupo, Tratamento, Profissao, Igreja, Escolaridade, EstadoCivil,
  Sexo        : string;
  i           : integer;


begin


  For i := 0 to ListBox_Grupos.Items.Count-1 do
  begin
    if ListBox_Grupos.Items[I].Selected then
      Grupo := Grupo + ListBox_Grupos.Items[I].Value+',';
  end;
  Grupo := Grupo.Remove(Grupo.Length,1);

  For i := 0 to ListBox_Tratamentos.Items.Count-1 do
  begin
    if ListBox_Tratamentos.Items[I].Selected then
      Tratamento := Tratamento + ListBox_Tratamentos.Items[I].Value+',';
  end;
  Tratamento := Tratamento.Remove(Tratamento.Length,1);

  For i := 0 to ListBox_Profissoes.Items.Count-1 do
  begin
    if ListBox_Profissoes.Items[I].Selected then
      Profissao := Profissao + ListBox_Profissoes.Items[I].Value+',';
  end;
  Profissao := Profissao.Remove(Profissao.Length,1);

  For i := 0 to ListBox_Igreja.Items.Count-1 do
  begin
    if ListBox_Igreja.Items[I].Selected then
      Igreja := Igreja + ListBox_Igreja.Items[I].Value+',';
  end;
  Igreja := Igreja.Remove(Igreja.Length,1);

  For i := 0 to ListBox_Escolaridade.Items.Count-1 do
  begin
    if ListBox_Escolaridade.Items[I].Selected then
      Escolaridade := Escolaridade + ListBox_Escolaridade.Items[I].Value+',';
  end;
  Escolaridade := Escolaridade.Remove(Escolaridade.Length,1);

  For i := 0 to ListBox_EstadoCivil.Items.Count-1 do
  begin
    if ListBox_EstadoCivil.Items[I].Selected then
      EstadoCivil := EstadoCivil + ListBox_EstadoCivil.Items[I].Value+',';
  end;
  EstadoCivil := EstadoCivil.Remove(EstadoCivil.Length,1);

  For i := 0 to ListBox_Sexo.Items.Count-1 do
  begin
    if ListBox_Sexo.Items[I].Selected then
      Sexo := Sexo + ListBox_Sexo.Items[I].Value+',';
  end;
  Sexo := Sexo.Remove(Sexo.Length,1);


  Conn   := SqlConnection.Create(ConfigurationManager.ConnectionStrings['ConexaoShalom'].ToString);
  Comand := SqlCommand.Create('spParametrizado', Conn);
  Comand.CommandType := CommandType.StoredProcedure;
  Comand.Parameters.Add('@IDGRUPO', Grupo);
  Comand.Parameters.Add('@IDTRATAMENTO', Tratamento);
  Comand.Parameters.Add('@IDPROFISSAO', Profissao);
  Comand.Parameters.Add('@IDIGREJA', Igreja);
  Comand.Parameters.Add('@IDESCOLARIDADE', Escolaridade);
  Comand.Parameters.Add('@IDESTADOCIVIL', EstadoCivil);
  Comand.Parameters.Add('@SEXO', Sexo);

  Conn.Open;
  SqlReader := Comand.ExecuteReader;

  if SqlReader.HasRows then
  begin

    try
      GridViewParametrizado.DataSource := SqlReader;
      GridViewParametrizado.DataBind;
    finally
      Conn.Close;
    end;

  end else
    MessageScript( Page, 'Não foram encontrados Registros conforme Selecionados !!!');


end;
GOSTEI 0
Paulo Freire

Paulo Freire

28/09/2009

Opa acho que a imagem não foi, segue novamente.
GOSTEI 0
Rodrigo Mourão

Rodrigo Mourão

28/09/2009

Falha minha.

Segue código correto:

 Grupo := Grupo.Remove(Grupo.Length-1,1);

E sempre Length-1.

Abs !!1

GOSTEI 0
Paulo Freire

Paulo Freire

28/09/2009

Olá Rodrigo, devo estar fazendo algo errado: vejas telas:
GOSTEI 0
Paulo Freire

Paulo Freire

28/09/2009

O código do botão está ssim:

procedure TParametrizado.btFiltrar_Click(sender: System.Object; e: System.EventArgs);
var
  Comand      : SqlCommand;
  Conn        : SqlConnection;
  SqlReader   : SqlDataReader;
  Grupo, Tratamento, Profissao, Igreja, Escolaridade, EstadoCivil,
  Sexo        : string;
  i           : integer;


begin


  For i := 0 to ListBox_Grupos.Items.Count-1 do
  begin
    if ListBox_Grupos.Items[I].Selected then
      Grupo := Grupo + ListBox_Grupos.Items[I].Value+',';
  end;
  Grupo := Grupo.Remove(Grupo.Length-1,1);


  For i := 0 to ListBox_Tratamentos.Items.Count-1 do
  begin
    if ListBox_Tratamentos.Items[I].Selected then
      Tratamento := Tratamento + ListBox_Tratamentos.Items[I].Value+',';
  end;
  Tratamento := Tratamento.Remove(Tratamento.Length-1,1);


  For i := 0 to ListBox_Profissoes.Items.Count-1 do
  begin
    if ListBox_Profissoes.Items[I].Selected then
      Profissao := Profissao + ListBox_Profissoes.Items[I].Value+',';
  end;
  Profissao := Profissao.Remove(Profissao.Length-1,1);


  For i := 0 to ListBox_Igreja.Items.Count-1 do
  begin
    if ListBox_Igreja.Items[I].Selected then
      Igreja := Igreja + ListBox_Igreja.Items[I].Value+',';
  end;
  Igreja := Igreja.Remove(Igreja.Length-1,1);


  For i := 0 to ListBox_Escolaridade.Items.Count-1 do
  begin
    if ListBox_Escolaridade.Items[I].Selected then
      Escolaridade := Escolaridade + ListBox_Escolaridade.Items[I].Value+',';
  end;
  Escolaridade := Escolaridade.Remove(Escolaridade.Length-1,1);


  For i := 0 to ListBox_EstadoCivil.Items.Count-1 do
  begin
    if ListBox_EstadoCivil.Items[I].Selected then
      EstadoCivil := EstadoCivil + ListBox_EstadoCivil.Items[I].Value+',';
  end;
  EstadoCivil := EstadoCivil.Remove(EstadoCivil.Length-1,1);

  For i := 0 to ListBox_Sexo.Items.Count-1 do
  begin
    if ListBox_Sexo.Items[I].Selected then
      Sexo := Sexo + ListBox_Sexo.Items[I].Value+',';
  end;
  Sexo := Sexo.Remove(Sexo.Length-1,1);


  Conn   := SqlConnection.Create(ConfigurationManager.ConnectionStrings['ConexaoShalom'].ToString);
  Comand := SqlCommand.Create('spParametrizado', Conn);
  Comand.CommandType := CommandType.StoredProcedure;
  Comand.Parameters.Add('@IDGRUPO', Grupo);
  Comand.Parameters.Add('@IDTRATAMENTO', Tratamento);
  Comand.Parameters.Add('@IDPROFISSAO', Profissao);
  Comand.Parameters.Add('@IDIGREJA', Igreja);
  Comand.Parameters.Add('@IDESCOLARIDADE', Escolaridade);
  Comand.Parameters.Add('@IDESTADOCIVIL', EstadoCivil);
  Comand.Parameters.Add('@SEXO', Sexo);

  Conn.Open;
  SqlReader := Comand.ExecuteReader;

  if SqlReader.HasRows then
  begin

    try
      GridViewParametrizado.DataSource := SqlReader;
      GridViewParametrizado.DataBind;
    finally
      Conn.Close;
    end;

  end else
    MessageScript( Page, 'Não foram encontrados Registros conforme Selecionados !!!');


end;
GOSTEI 0
Rodrigo Mourão

Rodrigo Mourão

28/09/2009

Na verdade foi outro vacilo meu. Como falei nao consegui rodar a aplicacao por problemas com o SqlServer. Mas o que ocorre e o seguinte. Se vc nao selecionar pelo menos um item no listbox vai dar este erro.

Tenta isso:

  For i := 0 to ListBox_Grupos.Items.Count-1 do
  begin
    if ListBox_Grupos.Items[I].Selected then
      Grupo := Grupo + ListBox_Grupos.Items[I].Value+',';
  end;

  If Grupo.Length > 0 then
     Grupo := Grupo.Remove(Grupo.Length-1,1);

Faça o mesmo com Tratamento, profissao, etc, etc.

Me mantanha informado.

abs!!


GOSTEI 0
Paulo Freire

Paulo Freire

28/09/2009

Esta parando inclusive na linha 260, adicionada agora, será que não seria melhor usar um comand do que store procedure.
Poderia usar aquela sua lógica que vc usa no curso de DBXEspress e firebird no aplicativo Comercial, vou postar aqui pra tu lembrar.

procedure TFrmVendas.ConsultaProduto;
var
  S: TStringList;
begin
  S := TStringList.Create;
  S.Add('Select  P.Produtoid Codigo, P.Descricao, P.Estoque, P.Preco, ');
  S.Add('        F.Descricao Fabricante, C.Descricao Categoria        ');
  S.Add('  From Categoria C, Fabricante F, Produtos P                 ');
  S.Add(' Where P.Categoria  = C.Categoriaid                          ');
  S.Add('   and P.Fabricante = F.Fabricanteid                         ');
  if EdtCodigo.Text <> EmptyStr then
    S.Add(' and P.ProdutoID = '+EdtCodigo.Text                         );
  if EdtDescricao.Text <> EmptyStr then
    S.Add(' and P.Descricao Like '+QuotedStr(EdtDescricao.Text+'%')    );
  if EdtFabricante.Text <> EmptyStr then
    S.Add(' and F.Descricao Like '+QuotedStr(EdtFabricante.Text+'%')   );
  if EdtCategoria.Text <> EmptyStr then
    S.Add(' and C.Descricao Like '+QuotedStr(EdtCategoria.Text+'%')    );

  cdsConsultaProduto.Close;
  cdsConsultaProduto.CommandText := S.Text;
  cdsConsultaProduto.Open;

  FreeAndNil(S);
end;

Achei isso aqui o máximo.


Segue a nova tela

GOSTEI 0
Rodrigo Mourão

Rodrigo Mourão

28/09/2009

N verdade o cominho não seria nem esse. O problema ai e que se nao houver seleção no ListBox nao tem conteuno na variavel e no .net  quando nao há valor na variavel nao podemos fazer o boxing ou seja não podemos acessá-la como objeto.

Agora vai, com assigned testamos o ponteiro para o objeto.

Faça assim:


For i := 0 to ListBox_Grupos.Items.Count-1 do
  begin
    if ListBox_Grupos.Items[I].Selected then
      Grupo := Grupo + ListBox_Grupos.Items[I].Value+',';
  end;
  if assigned(Grupo) then
    Grupo := Grupo.Remove(Grupo.Length-1,1);


  For i := 0 to ListBox_Tratamentos.Items.Count-1 do
  begin
    if ListBox_Tratamentos.Items[I].Selected then
      Tratamento := Tratamento + ListBox_Tratamentos.Items[I].Value+',';
  end;
  if assigned(Tratamento) then
  Tratamento := Tratamento.Remove(Tratamento.Length-1,1);


  For i := 0 to ListBox_Profissoes.Items.Count-1 do
  begin
    if ListBox_Profissoes.Items[I].Selected then
      Profissao := Profissao + ListBox_Profissoes.Items[I].Value+',';
  end;
  if assigned(Profissao) then
  Profissao := Profissao.Remove(Profissao.Length-1,1);


  For i := 0 to ListBox_Igreja.Items.Count-1 do
  begin
    if ListBox_Igreja.Items[I].Selected then
      Igreja := Igreja + ListBox_Igreja.Items[I].Value+',';
  end;
  if assigned(Igreja) then
  Igreja := Igreja.Remove(Igreja.Length-1,1);


  For i := 0 to ListBox_Escolaridade.Items.Count-1 do
  begin
    if ListBox_Escolaridade.Items[I].Selected then
      Escolaridade := Escolaridade + ListBox_Escolaridade.Items[I].Value+',';
  end;
  if assigned(Escolaridade) then
  Escolaridade := Escolaridade.Remove(Escolaridade.Length-1,1);


  For i := 0 to ListBox_EstadoCivil.Items.Count-1 do
  begin
    if ListBox_EstadoCivil.Items[I].Selected then
      EstadoCivil := EstadoCivil + ListBox_EstadoCivil.Items[I].Value+',';
  end;
  if assigned(EstadoCivil) then
  EstadoCivil := EstadoCivil.Remove(EstadoCivil.Length-1,1);

  For i := 0 to ListBox_Sexo.Items.Count-1 do
  begin
    if ListBox_Sexo.Items[I].Selected then
      Sexo := Sexo + ListBox_Sexo.Items[I].Value+',';
  end;
  if assigned(Sexo) then
  Sexo := Sexo.Remove(Sexo.Length-1,1);

Abs!!


GOSTEI 0
Paulo Freire

Paulo Freire

28/09/2009

Fala Rodrigo, acho que agora passou pela aplicação beleza, o erro que apresenta agora deve ser algo na store procedure, se vc puder me ajudar eu agradeço, se não eu compreendo.

Abraços.


GOSTEI 0
Rodrigo Mourão

Rodrigo Mourão

28/09/2009

Olá Paulo,

Não sou especialista em SqlServer, ja deupara perceber e nem sou muito fã também mas pela mensagem de erro ele esta entendendo os valores passados para  procedure como sendo colunas e não valores. Isso ocorre geralmente quando colocanos um valor inteiro entre aspas ou algo do genero.

Verifique na sua procedure na parte onde vc contatena o wehre com o valor do parametro. Acredito que o problema estaja lá.

Abs!!

GOSTEI 0
Rodrigo Mourão

Rodrigo Mourão

28/09/2009

Olá amigo, as dicas ajudaram ?

Podemos encerrar o chamado ??

Estamos no aguardo !!!1

Abs!!!
GOSTEI 0
Paulo Freire

Paulo Freire

28/09/2009

Pode sim Rodrigo, valeu, e um abraço.
GOSTEI 0
POSTAR