ActiveDelphi - Índice do Fórum ActiveDelphi
.: O site do programador Delphi! :.
 
 FAQFAQ   PesquisarPesquisar   MembrosMembros   GruposGrupos   RegistrarRegistrar 
 PerfilPerfil   Entrar e ver Mensagens ParticularesEntrar e ver Mensagens Particulares   EntrarEntrar 

Comando OR no Select Não está Funcionando

 
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Delphi
Exibir mensagem anterior :: Exibir próxima mensagem  
Autor Mensagem
dfresmer
Novato
Novato


Registrado: Sexta-Feira, 5 de Julho de 2013
Mensagens: 72

MensagemEnviada: Qua Jul 31, 2013 3:47 pm    Assunto: Comando OR no Select Não está Funcionando Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular
mhgsimoes
Aprendiz
Aprendiz


Registrado: Sexta-Feira, 7 de Dezembro de 2007
Mensagens: 142
Localização: Belo Horizonte / MG

MensagemEnviada: Qua Jul 31, 2013 4:31 pm    Assunto: Responder com Citação

É 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
Ver o perfil de Usuários Enviar Mensagem Particular
dfresmer
Novato
Novato


Registrado: Sexta-Feira, 5 de Julho de 2013
Mensagens: 72

MensagemEnviada: Qua Jul 31, 2013 4:42 pm    Assunto: Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular
mhgsimoes
Aprendiz
Aprendiz


Registrado: Sexta-Feira, 7 de Dezembro de 2007
Mensagens: 142
Localização: Belo Horizonte / MG

MensagemEnviada: Qua Jul 31, 2013 4:56 pm    Assunto: Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular
imex
Moderador
Moderador


Registrado: Sexta-Feira, 7 de Janeiro de 2011
Mensagens: 11666

MensagemEnviada: Qua Jul 31, 2013 5:10 pm    Assunto: Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular
Mostrar os tópicos anteriores:   
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Delphi Todos os horários são GMT - 3 Horas
Página 1 de 1

 
Ir para:  
Enviar Mensagens Novas: Proibido.
Responder Tópicos Proibido
Editar Mensagens: Proibido.
Excluir Mensagens: Proibido.
Votar em Enquetes: Proibido.


Powered by phpBB © 2001, 2005 phpBB Group
Traduzido por: Suporte phpBB