| Exibir mensagem anterior :: Exibir próxima mensagem |
| Autor |
Mensagem |
dfresmer Novato

Registrado: Sexta-Feira, 5 de Julho de 2013 Mensagens: 72
|
Enviada: Qua Jul 31, 2013 3:47 pm Assunto: Comando OR no Select Não está Funcionando |
|
|
Boa tarde Galera,
fiz um comando select para uma query, mas quando uso o comando OR ele não dá certo, faço a mesma consulta direto no banco de dados e dá certo, pelo delphi ele não filtra tudo, apenas a primeira opção cd_conta_deb ele leva em consideração:
| Código: |
procedure TfrmLancamentos.btExecutarClick(Sender: TObject);
var
dDtaini, dDtafim, sListar : string;
begin
if edDtaini.Text = ' / / ' then
dDtaini := '01/01/1900'
else
dDtaini := edDtaini.Text;
if edDtafim.Text = ' / / ' then
dDtafim := '31/12/2050'
else
dDtafim := edDtafim.Text;
edID.clear;
btEstornar.Enabled := false;
//construindo SQL
qrConsulta.Active := false;
qrConsulta.SQL.Clear;
qrConsulta.SQL.Add('SELECT * FROM ESCLancamento where ');
sListar := '';
//incluir parametros indefinidos
if edEmpresa.Text <> '' then
sListar := sListar + '(cd_empresa = :pcd_cadastro) AND ';
sListar := sListar + '(complemento like :phistorico) AND ';
if edOrigem.Text <> '' then
sListar := sListar + '(origem = :porigem) AND ';
if edValor.Text <> '0,00' then
sListar := sListar + '(vl_lancamento = :pvl_lancamento) AND ';
if edLote.Text <> '' then
sListar := sListar + '(nr_lote = :pnr_lote) AND ';
sListar := sListar + '(dt_lancamento between :pDtaini AND :pDtafim) ';
if edCd_conta.Text <> '' then
sListar := sListar + ' AND (cd_conta_deb = :pcd_conta_deb) AND (situacao = :pAtivo) OR ' + sListar + ' AND (cd_conta_cre = :pcd_conta_cre) AND (situacao = :pAtivo)'
else
sListar := sListar + 'AND (situacao = :pAtivo)';
//fim parametros indefinidos
qrConsulta.SQL.Add(sListar);
qrConsulta.SQL.Add('ORDER BY dt_lancamento, id_esclancamento');
//fim consulta sql
qrConsulta.Parameters.ParamByName('phistorico').Value := '%' + edHistorico.Text + '%';
qrConsulta.Parameters.ParamByName('pAtivo').Value := sAtivo;
qrConsulta.Parameters.ParamByName('pdtaini').Value := StrToDate(dDtaini);
qrConsulta.Parameters.ParamByName('pdtafim').Value := StrToDate(dDtafim);
if edEmpresa.Text <> '' then
qrConsulta.Parameters.ParamByName('pcd_cadastro').Value := StrToInt(edEmpresa.Text);
if edLote.Text <> '' then
qrConsulta.Parameters.ParamByName('pnr_lote').Value := StrToInt(edLote.Text);
if edValor.Text <> '0,00' then
begin
qrConsulta.Parameters.ParamByName('pvl_lancamento').Value := StrToFloat(edValor.Text);
end;
if edOrigem.Text <> '' then
qrConsulta.Parameters.ParamByName('porigem').Value := edOrigem.Text;
if edCd_conta.Text <> '' then
begin
qrConsulta.Parameters.ParamByName('pcd_conta_deb').Value := StrToInt(edCd_conta.Text);
qrConsulta.Parameters.ParamByName('pcd_conta_cre').Value := StrToInt(edCd_conta.Text);
end;
qrConsulta.Active := true;
ShowMessage(qrConsulta.SQL.Text);
TNumericField(qrConsulta.FieldByName('vl_lancamento')).DisplayFormat := ',0.00;-,0.00';
end;
|
|
|
| Voltar ao Topo |
|
 |
mhgsimoes Aprendiz


Registrado: Sexta-Feira, 7 de Dezembro de 2007 Mensagens: 142 Localização: Belo Horizonte / MG
|
Enviada: Qua Jul 31, 2013 4:31 pm Assunto: |
|
|
É um pouco complicado entender a query dessa forma. Experimente dar um "ShowMessage" no SQL após ter sido montado, ou então grave-o em algum arquivo para você dar uma olhada.
É provável que tenha algum parênteses faltando/sobrando em algum lugar, que esteja gerando um resultado diferente do que você deseja. |
|
| Voltar ao Topo |
|
 |
dfresmer Novato

Registrado: Sexta-Feira, 5 de Julho de 2013 Mensagens: 72
|
Enviada: Qua Jul 31, 2013 4:42 pm Assunto: |
|
|
dei um ShowMessage no código e ficou desta forma:
| Código: |
SELECT * FROM ESCLancamento where
(cd_empresa = :pcd_cadastro) AND
(complemento like :phistorico) AND
(dt_lancamento between :pDtaini AND :pDtafim)
AND (cd_conta_deb = :pcd_conta_deb) AND (situacao = :pAtivo) OR
(cd_empresa = :pcd_cadastro) AND
(complemento like :phistorico) AND
(dt_lancamento between :pDtaini AND :pDtafim)
AND (cd_conta_cre = :pcd_conta_cre) AND (situacao = :pAtivo)
ORDER BY dt_lancamento, id_esclancamento
|
|
|
| Voltar ao Topo |
|
 |
mhgsimoes Aprendiz


Registrado: Sexta-Feira, 7 de Dezembro de 2007 Mensagens: 142 Localização: Belo Horizonte / MG
|
Enviada: Qua Jul 31, 2013 4:56 pm Assunto: |
|
|
Repare que o seu comando "OR" não está dentro de outra condição, então se o registro atender a esta condição (cd_empresa = :pcd_cadastro), todas as condições que estão antes dessa, serão desconsideradas.
| Código: |
select *
from ESCLancamento
where
(cd_empresa = :pcd_cadastro)
and (complemento like :phistorico)
and (dt_lancamento between :pDtaini and :pDtafim)
and (cd_conta_deb = :pcd_conta_deb)
and (situacao = :pAtivo)
or (cd_empresa = :pcd_cadastro)
and (complemento like :phistorico)
and (dt_lancamento between :pDtaini and :pDtafim)
and (cd_conta_cre = :pcd_conta_cre)
and (situacao = :pAtivo)
order by dt_lancamento, id_esclancamento
|
Você precisa ver se é isso mesmo que você quer. |
|
| Voltar ao Topo |
|
 |
imex Moderador

Registrado: Sexta-Feira, 7 de Janeiro de 2011 Mensagens: 11666
|
Enviada: Qua Jul 31, 2013 5:10 pm Assunto: |
|
|
Boa tarde,
dfresmer, experimente alterar o trecho abaixo:
| Código: | sListar := sListar + '(dt_lancamento between :pDtaini AND :pDtafim) ';
if edCd_conta.Text <> '' then
sListar := sListar + ' AND (cd_conta_deb = :pcd_conta_deb) AND (situacao = :pAtivo) OR ' + sListar + ' AND (cd_conta_cre = :pcd_conta_cre) AND (situacao = :pAtivo)'
else
sListar := sListar + 'AND (situacao = :pAtivo)'; |
para
| Código: | sListar := sListar + '(dt_lancamento between :pDtaini AND :pDtafim) AND';
if edCd_conta.Text <> '' then
sListar := sListar + ' (cd_conta_deb = :pcd_conta OR cd_conta_cre = :pcd_conta) AND';
sListar := sListar + ' (situacao = :pAtivo)'; |
E o trecho abaixo:
| Código: | if edCd_conta.Text <> '' then
begin
qrConsulta.Parameters.ParamByName('pcd_conta_deb').Value := StrToInt(edCd_conta.Text);
qrConsulta.Parameters.ParamByName('pcd_conta_cre').Value := StrToInt(edCd_conta.Text);
end; |
para
| Código: | if edCd_conta.Text <> '' then
qrConsulta.Parameters.ParamByName('pcd_conta').Value := StrToInt(edCd_conta.Text); |
Espero que ajude.
_________________
Assinatura: http://www.imoveisemexposicao.com.br/imoveis-em-guarulhos |
|
| Voltar ao Topo |
|
 |
|