Parametro para SQL com mais de um valor

29/05/2006

0

Salve pessoal ... sou novato no que dis respeito ao delphi, e estou com uma duvida que tenho certeza que você podem me ajudar! O caso seria +/- assim.

Em um filtro para emissão de relatorios o usuario podera ou devera escolher qual a situação (status) das notas fiscais, esse status que e a duvida!

Na instrução SQL tem uma condição que diz assim

where Status in (1, 2, 3, 9) 



Esse 1, 2, 3, 9 e o que eu preciso passar como paramentro para um ADO DataSet, mas mesmo contatenando os valores e tudo mais o Delphi sempre me retorna erro dizendo que não pode converter de VARCHAR para Integer.

Se alguem sobre como fazer para resolver esse problema ou tiver uma solução alternativa serei muito grato.[/code]


Mabs

Mabs

Responder

Posts

30/05/2006

Marcio.theis

Qual é o tipo de campo do Status ? Se for varchar vc vai precisar passar:
where Status in (´1´,´2´,´3´,´9´)



Responder

30/05/2006

Mabs

O problema esta em como passar esses valores, sendo q o campo status e do tipo inteiro, e estou passando esses parametros para um ADODataSet, quando o delphi executa a query fica assim

where status in (´1,2,3´)


e o SQL intende q seria apenas um valor do tipo string!


Responder

30/05/2006

Marcio.theis

Vc deve remover as aspas, deve de ficar assim:
where status in (1,2,3)

tipo:
qry.Close;
qry.SQL.Clear;
qry.SQL.Add(´select *´);
qry.SQL.Add(´from tabela´1);
qry.SQL.Add(´where status in (1,2,3)´);
qry.Open;



Responder

31/05/2006

Mabs

Cara e assim essa query e bem grande, já pensei em monta-la em tempo de execução mas fica meio complicado devido ao seu tamanho, dentro da query em um ADODataSet esta esta esperando essse paramentro esta assim

 Where Status in ( :STATUS ) 


E eu gostaria de passar esses parametros para o ADODataSet onde eu faço assim

 NF_ADOSet.Parameter.ParameterbyName(´STATUS ´).Value := ´1, 2, 3´


Quando eu faço isso o Delphi passa em formato de String com as benditas aspas e retorna erro, se e colocando o DataType do parametro para variante ele naum retorna erro, mas porem a a query executada no SQL, que eu monitorei atravez do profiler, executa com as aspas.

Ai eu ja naum sei mais o que fazer ...


Responder

31/05/2006

Beppe

Não é possível fazer isso.

Isto pq a instrução where Status in (´1´, ´2´, ´3´) se traduz como:

where Status = ´1´ or Status = ´2´ or Status = ´3´

Se tiver uma função strpos, pode fazer algo com ela, passando uma string como parâmetro.


Responder

31/05/2006

Mabs

Se tiver uma função strpos, pode fazer algo com ela, passando uma string como parâmetro.


Explique melhor isso se possivel!


Responder

31/05/2006

Motta

qual bd ?

tenho uma solução para Oracle.


Responder

31/05/2006

Mabs

MS SQL2000 mas manda ai quem sabe tem como aplicar para o MS SQL


Responder

01/06/2006

Motta

crie 2 tipos :


CREATE OR REPLACE TYPE TIPOLISTAINSTR                                                                                                                                                   as table of varchar2(30)
/

CREATE OR REPLACE TYPE TIPOLISTAINNUM                                                                                                                                                   as table of number
/

uma função que formata para cada :

CREATE OR REPLACE FUNCTION LISTAINSTR ( p_string in varchar2 )
return TipoListaInStr
--
-- Retorna uma string para ser usada em uma instrução
-- IN de uma condição Where
--
-- Use para listas do tipo string
--
-- fonte http://asktom.oracle.com
--
as
  l_data         TipoListaInStr := TipoListaInStr();
  l_string       long default p_string || ´,´;
  l_n            number;

begin
  loop
    exit when l_string is null;
      l_data.extend;
      l_n := instr( l_string, ´,´ );
      l_data( l_data.count ) := substr( l_string, 1, l_n-1 );
      l_string := substr( l_string, l_n+1 );
  end loop;
  return l_data;
end;
/

CREATE OR REPLACE FUNCTION LISTAINNUM ( p_string in varchar2 )
return TipoListaInNum
--
-- Retorna uma string para ser usada em uma instrução
-- IN de uma condição Where
--
-- Use para listas do tipo numérico
--
-- fonte http://asktom.oracle.com
--
as
  l_data         TipoListaInNum := TipoListaInNum();
  l_string       long default p_string || ´,´;
  l_n            number;
begin
  loop
    exit when l_string is null;
      l_data.extend;
      l_n := instr( l_string, ´,´ );
      l_data( l_data.count ) := substr( l_string, 1, l_n-1 );
      l_string := substr( l_string, l_n+1 );
  end loop;
  return l_data;
end;
/


no select 

:pListaAss := ´1,2,3,4,5´;

----

select *
from tabela
where campo
IN (SELECT * FROM The
                           (SELECT Cast(ListaInNum(:pListaAss) AS TipoListaInNum)
                            FROM DUAL))





mas acho que é solução só para Oracle


Responder

Que tal ter acesso a um e-book gratuito que vai te ajudar muito nesse momento decisivo?

Ver ebook

Recomendado pra quem ainda não iniciou o estudos.

Eu quero
Ver ebook

Recomendado para quem está passando por dificuldades nessa etapa inicial

Eu quero

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

Aceitar