Parametro para SQL com mais de um valor
29/05/2006
0
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
Posts
30/05/2006
Marcio.theis
where Status in (´1´,´2´,´3´,´9´)
30/05/2006
Mabs
where status in (´1,2,3´)
e o SQL intende q seria apenas um valor do tipo string!
30/05/2006
Marcio.theis
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;
31/05/2006
Mabs
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 ...
31/05/2006
Beppe
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.
31/05/2006
Mabs
Explique melhor isso se possivel!
31/05/2006
Mabs
01/06/2006
Motta
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
Clique aqui para fazer login e interagir na Comunidade :)