Fórum Parametro para SQL com mais de um valor #322419
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
1 | 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
Curtir tópico
+ 0Posts
30/05/2006
Marcio.theis
1 | where Status in (´1´,´2´,´3´,´9´) |
Gostei + 0
30/05/2006
Mabs
1 | where status in (´1,2,3´) |
e o SQL intende q seria apenas um valor do tipo string!
Gostei + 0
30/05/2006
Marcio.theis
1 | where status in (1,2,3) |
tipo:
1 2 3 4 5 6 | 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; |
Gostei + 0
31/05/2006
Mabs
1 | Where Status in ( :STATUS ) |
E eu gostaria de passar esses parametros para o ADODataSet onde eu faço assim
1 | 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 ...
Gostei + 0
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.
Gostei + 0
31/05/2006
Mabs
Explique melhor isso se possivel!
Gostei + 0
31/05/2006
Motta
tenho uma solução para Oracle.
Gostei + 0
31/05/2006
Mabs
Gostei + 0
01/06/2006
Motta
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 | 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
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)