Parametro para SQL com mais de um valor
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
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]
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
Curtidas 0
Respostas

Marcio.theis
29/05/2006
Qual é o tipo de campo do Status ? Se for varchar vc vai precisar passar:
where Status in (´1´,´2´,´3´,´9´)
GOSTEI 0

Mabs
29/05/2006
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
e o SQL intende q seria apenas um valor do tipo string!
where status in (´1,2,3´)
e o SQL intende q seria apenas um valor do tipo string!
GOSTEI 0

Marcio.theis
29/05/2006
Vc deve remover as aspas, deve de ficar assim:
tipo:
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;
GOSTEI 0

Mabs
29/05/2006
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
E eu gostaria de passar esses parametros para o ADODataSet onde eu faço assim
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 ...
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 ...
GOSTEI 0

Beppe
29/05/2006
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.
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

Mabs
29/05/2006
Se tiver uma função strpos, pode fazer algo com ela, passando uma string como parâmetro.
Explique melhor isso se possivel!
GOSTEI 0

Motta
29/05/2006
qual bd ?
tenho uma solução para Oracle.
tenho uma solução para Oracle.
GOSTEI 0

Mabs
29/05/2006
MS SQL2000 mas manda ai quem sabe tem como aplicar para o MS SQL
GOSTEI 0

Motta
29/05/2006
crie 2 tipos :
mas acho que é solução só para Oracle
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