SELECT COM ATRIBUTO IN EM CAMPOS INTEIROS E PARAMETROS VARCHAR
17/03/2015
0
O campo ped.tipo_id é inteiro, mas preciso pesquisar mais de um tipo de venda. exemplo: Tipo 1 = 1, tipo 2 = 2, etc... O select ficaria IN(1,2), só que os valores 1,2 vem dentro paramento :tipo, e da erro de tipo de dados, ja tentei o CAST também não tive sucesso.
Alguém já utilizou esse atributo assim? Podem me ajudar?
SELECT COALESCE(Sum(ped.total1),0) FROM pedidos ped WHERE ped.tipo_id < 5 AND ped.loj_id = :loja AND ped.status = :status AND ped.tipo_id in( :tipo ) AND Cast(ped.data_emissao AS DATE) BETWEEN :dt_ini AND :dt_fim
Sidney Abreu
Post mais votado
17/03/2015
1. Declare uma variável varchar para receber o comando sql que será executado
2. Carregue a variável com a parte fixa no código
3. Complemente o código com os parâmetros necessários, SEMPRE tratando-os como string
4. Execute o comando, através da variável declarada, via EXECUTE STATEMENT
Vou fazer a sintaxe para o sql server, que me é mais familiar.
Você pode adaptá-la ao Firebird.
Senão rolar, me avise, que eu tento aqui em um server Firebird...
DECLARE @sql varchar(1000) set @sql = 'SELECT COALESCE(Sum(ped.total1),0) FROM pedidos ped WHERE ped.tipo_id < 5 AND ped.loj_id = ' + Cast(:loja as VARCHAR(5)) + 'AND ped.status = ' + Cast(:status as VARCHAR(5)) + 'AND ped.tipo_id in( ' +.:tipo ')'+ 'AND Cast(ped.data_emissao AS DATE) BETWEEN ' +:dt_ini+ ' AND ' + ':dt_fim' execute statement (@sql)
Repare que no código acima eu assumi :
> :loja e :status como inteiro... mas convertidos para varchar, pois eles devem ser concatenados à string do comando
> :tipo... já como varchar delimitado, ou seja, vai ser passada uma string tipo '1,2,3'
> :dt_ini e :dt_fim, já como string delimitado
Para os seguintes parâmetros...
> :loja ( int ) : 5
> status ( int ) : 3
> :tipo ( varchar ) : '1,2,3'
> :dt_ini ( varchar ) : '2015-01-01'
> :dt_fim ( varchar ) : '2015-01-31'
Você ficará com @sql igual a :
SELECT COALESCE(Sum(ped.total1),0)
FROM pedidos ped
WHERE ped.tipo_id < 5
AND ped.loj_id = 5
AND ped.status = 3
AND ped.tipo_id in( '1,2,3')
AND Cast(ped.data_emissao AS DATE) BETWEEN '2015-01-01' AND '2015-01-31'
Resolvendo seu problema de transformar a passagem dos parâmetros char como uma sequencia de inteiros.
Atenção aos delimitadores das strings ( ' ' ) !!!
Espero não ter complicado muito...
Marcos P
Mais Posts
17/03/2015
Marcos P
Você deve trabalhar com query dinâmica, gerando o comando em uma variável varchar ( ou text ), concatenando os parâmetros como string e executando o comando como EXECUTE STATEMENT...
Esse link, pode ajudar : EXECUTE STATEMENT
17/03/2015
Marcos P
Leia : 'AND ped.tipo_id in( ' + :tipo ')'+
( não tem aquele ponto... )
17/03/2015
Sidney Abreu
Abraço
17/03/2015
Marcos P
Procura por "query dinâmica" no Google... é um recurso que pode ser bastante útil, tanto do lado do banco de dados como do lado da aplicação !
17/03/2015
Sidney Abreu
18/03/2015
Marcos P
Clique aqui para fazer login e interagir na Comunidade :)