Delphi 2010 não aceita Parametro Null
Pessoal, Estou migrando do delphi 3 para o Delphi 2010 e esbarrei em um problema esquisito. No código abaixo ao montar a consulta dinamicamente ou staticamente não, quando seto alguns valores como null não retorna nenhum registro. Pelo que constatei pelo program SqlMonitor os parametros são preenchidos com zero. Enquanto na versão compilada em delphi 3 a 7 o parâmetro é null. Alguém poderia me ajudar?? Abaixo também inclui um trecho da consulta. O sistema inteiro trabalha desta forma.
if DBLKCBMotorista.KeyValue <> NULL then DataSet.ParamByName('IntPesTran').AsInteger := DBLKCBMotorista.KeyValue else begin DataSet.ParamByName('IntPesTran').DataType := ftInteger; DataSet.ParamByName('IntPesTran').clear; end;
if DBLKCBCavalo.KeyValue <> NULL then DataSet.ParamByName('StrPlaca').AsString := DBLKCBCavalo.KeyValue else begin DataSet.ParamByName('StrPlaca').DataType := ftString; DataSet.ParamByName('StrPlaca').Clear; end;
DataSet.ParamByName('NumCGCRed').DataType := ftFloat; DataSet.ParamByName('NumCGCRed').Clear;
Parte da consulta
DataSet.SQL.Add('AND ((TRelacao.StrPlaca = :StrPlaca) OR (:StrPlaca IS NULL))'); DataSet.SQL.Add('AND ((TRelacao.IntArea = :IntArea) OR (:IntArea IS NULL))'); DataSet.SQL.Add('AND ((NumCGCRed = :NumCGCRed) OR (:NumCGCRed IS NULL))');
if DBLKCBMotorista.KeyValue <> NULL then DataSet.ParamByName('IntPesTran').AsInteger := DBLKCBMotorista.KeyValue else begin DataSet.ParamByName('IntPesTran').DataType := ftInteger; DataSet.ParamByName('IntPesTran').clear; end;
if DBLKCBCavalo.KeyValue <> NULL then DataSet.ParamByName('StrPlaca').AsString := DBLKCBCavalo.KeyValue else begin DataSet.ParamByName('StrPlaca').DataType := ftString; DataSet.ParamByName('StrPlaca').Clear; end;
DataSet.ParamByName('NumCGCRed').DataType := ftFloat; DataSet.ParamByName('NumCGCRed').Clear;
Parte da consulta
DataSet.SQL.Add('AND ((TRelacao.StrPlaca = :StrPlaca) OR (:StrPlaca IS NULL))'); DataSet.SQL.Add('AND ((TRelacao.IntArea = :IntArea) OR (:IntArea IS NULL))'); DataSet.SQL.Add('AND ((NumCGCRed = :NumCGCRed) OR (:NumCGCRed IS NULL))');
Marco Aurelio
Curtidas 0
Respostas
Eduardo Marcolongo
16/05/2011
DataSet.SQL.Add('AND ((TRelacao.StrPlaca = :StrPlaca) OR (:StrPlaca IS NULL))'); DataSet.SQL.Add('AND ((TRelacao.IntArea = :IntArea) OR (:IntArea IS NULL))'); DataSet.SQL.Add('AND ((NumCGCRed = :NumCGCRed) OR (:NumCGCRed IS NULL))');
Esta parte não deveria ser assim:
DataSet.SQL.Add('AND ((TRelacao.StrPlaca = :StrPlaca) OR (TRelacao.StrPlaca IS NULL))'); DataSet.SQL.Add('AND ((TRelacao.IntArea = :IntArea) OR (TRelacao.IntArea IS NULL))'); DataSet.SQL.Add('AND ((NumCGCRed = :NumCGCRed) OR (NumCGCRed IS NULL))');
Esta parte não deveria ser assim:
DataSet.SQL.Add('AND ((TRelacao.StrPlaca = :StrPlaca) OR (TRelacao.StrPlaca IS NULL))'); DataSet.SQL.Add('AND ((TRelacao.IntArea = :IntArea) OR (TRelacao.IntArea IS NULL))'); DataSet.SQL.Add('AND ((NumCGCRed = :NumCGCRed) OR (NumCGCRed IS NULL))');
GOSTEI 0
Marco Aurelio
16/05/2011
Eduardo, Obrigado pela resposta, mas o problema continua. O problema em si está no parâmetro que o delphi está entendo como diferente de nulo. Quando o parâmetro não for preenchido ( "Nulo" ) o sistema deverá retornar todos os registros, independentes se está preenchido ou não.
Marco
Marco
GOSTEI 0
Rafael Mattos
16/05/2011
Eduardo, Obrigado pela resposta, mas o problema continua. O problema em si está no parâmetro que o delphi está entendo como diferente de nulo. Quando o parâmetro não for preenchido ( "Nulo" ) o sistema deverá retornar todos os registros, independentes se está preenchido ou não.
Marco
Marco
DataSet.ParamByName('NumCGCRed').Clear;
ele não aceita abrir mais o componente com o parametro null.
não cheguei trabalhar com o Delphi 3, mas nem no Delphi 6 e 7 ele aceitava isso
GOSTEI 0
Rafael Mattos
16/05/2011
vc teria que fazer que nem o pessoal falou a em cima
GOSTEI 0
Marco Aurelio
16/05/2011
Obrigado Rafael.
Complicado pois acontece que alguns pontos do sistema funciona o clear normalmente. Alias encontrei muitos outros pontos no sistema que utiliza o clear. Mapear o porque que esta tela em especifico está assim, está complicado. Como são muitos outros pontos a verificar, não dá para saber de imediato qual mais não funciona. O componente Query está em um Data Module. O mesmo é preenchido dinamicamente na tela da pesquisa. Os parâmetros que não são utilizados no filtro, como o exemplo acima, tem que ser passado como nulo para retornar todos registros equivalentes ao mesmo.
DataSet.SQL.Add('AND ((TRelacao.IntMotorista = :IntPesTran) OR (:IntPesTran IS NULL))');
Acredito que se eu alterar o código para quando não tiver valor selecionado do filtro não inclua o código acima citado. O problema é fazer assim no sistema todo. Como disse, tem tela que funciona. O parâmetro recebe null perfeitamente, nesta específica está recebendo "0"; Mas não vou desistir fácil assim do Delphi 2010.
Valeu.
Complicado pois acontece que alguns pontos do sistema funciona o clear normalmente. Alias encontrei muitos outros pontos no sistema que utiliza o clear. Mapear o porque que esta tela em especifico está assim, está complicado. Como são muitos outros pontos a verificar, não dá para saber de imediato qual mais não funciona. O componente Query está em um Data Module. O mesmo é preenchido dinamicamente na tela da pesquisa. Os parâmetros que não são utilizados no filtro, como o exemplo acima, tem que ser passado como nulo para retornar todos registros equivalentes ao mesmo.
DataSet.SQL.Add('AND ((TRelacao.IntMotorista = :IntPesTran) OR (:IntPesTran IS NULL))');
Acredito que se eu alterar o código para quando não tiver valor selecionado do filtro não inclua o código acima citado. O problema é fazer assim no sistema todo. Como disse, tem tela que funciona. O parâmetro recebe null perfeitamente, nesta específica está recebendo "0"; Mas não vou desistir fácil assim do Delphi 2010.
Valeu.
GOSTEI 0