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 

[RESOLVIDO] Consulta SQL usando IN/NOT IN no delphi
Ir à página 1, 2  Próximo
 
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Delphi
Exibir mensagem anterior :: Exibir próxima mensagem  
Autor Mensagem
lokasso
Aprendiz
Aprendiz


Registrado: Terça-Feira, 11 de Abril de 2017
Mensagens: 174

MensagemEnviada: Seg Nov 06, 2017 2:01 pm    Assunto: [RESOLVIDO] Consulta SQL usando IN/NOT IN no delphi Responder com Citação

Galera, mais uma vez aqui

É o seguinte estou com um pequeno probleminha em um select, por exemplo estou fazendo uma consulta na tb_cliente onde essa consulta não poderá retornar cliente com status 's' ou seja bloqueado tentei das seguintes maneiras:

1-
Código:
SELECT NOME,CNPJ,TEL,LIMITE FROM TB_CLIENTE;
WHERE NOME LIKE :NOME;
AND STATUS NOT IN ('S');
ORDER BY NOME;


2-
Código:
SELECT NOME,CNPJ,TEL,LIMITE FROM TB_CLIENTE;
WHERE STATUS NOT IN ('S');
AND NOME LIKE :NOME;
ORDER BY NOME;


Ambas não retornam nenhum registro, ja tentei tirar o NOT e também nada, agora vamos a qual funcionou:

3-
Código:
SELECT NOME,CNPJ,TEL,LIMITE FROM TB_CLIENTE;
WHERE STATUS NOT IN ('S');


Estou fazendo a consulta por nome e por cnpj e necessita do PARAMBYNAME, estou fazendo usando a sql errada ou teria um outro jeito de fazer essa consulta?

Ah, antes que me esqueça, estou usando um checkbox para fazer esse filtro, caso o usuário queira fazer a consulta completa

Grato


Editado pela última vez por lokasso em Qui Nov 16, 2017 12:06 am, num total de 1 vez
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
johnny-walker
Moderador
Moderador


Registrado: Sábado, 4 de Outubro de 2003
Mensagens: 10653
Localização: Contagem/MG - BRAZIL

MensagemEnviada: Seg Nov 06, 2017 2:12 pm    Assunto: Responder com Citação

O problema pode ser o seguinte, caso você digite algo do tipo:

NOME like 'Fulano' "E(AND)" STATUS not in ('S')
Teria de ser assim:
NOME like 'Fulano%' <<-- o que vem depois não importa, pois procura pelo conteúdo no início da frase, se você omitir, procura pelo conteúdo integral.

Opte por não utilizar o operador IN, pois a performance dele é pior do que utilizar o operador de igualdade(=).


O operador IN serve mais para fazer operações de um conjunto, o que está contido e o que não está contido junto com o operador NOT.



bye
_________________
P.O.W.E.R B.Y D.E.L.P.H.I
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular MSN Messenger
natanbh1
Colaborador
Colaborador


Registrado: Terça-Feira, 15 de Março de 2011
Mensagens: 3093
Localização: Belo Horizonte - MG

MensagemEnviada: Seg Nov 06, 2017 2:40 pm    Assunto: Responder com Citação

Faça um teste trocando o Not In por <> (Diferente).

Código:
SELECT NOME,CNPJ,TEL,LIMITE FROM TB_CLIENTE
WHERE NOME LIKE :NOME AND STATUS <> 'S'
ORDER BY NOME

_________________
''A persistência é o caminho para o êxito.''
Charlie Chaplin
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail
lokasso
Aprendiz
Aprendiz


Registrado: Terça-Feira, 11 de Abril de 2017
Mensagens: 174

MensagemEnviada: Seg Nov 06, 2017 5:28 pm    Assunto: Responder com Citação

johnny-walker escreveu:
O problema pode ser o seguinte, caso você digite algo do tipo:

NOME like 'Fulano' "E(AND)" STATUS not in ('S')
Teria de ser assim:
NOME like 'Fulano%' <<-- o que vem depois não importa, pois procura pelo conteúdo no início da frase, se você omitir, procura pelo conteúdo integral.

Opte por não utilizar o operador IN, pois a performance dele é pior do que utilizar o operador de igualdade(=).


O operador IN serve mais para fazer operações de um conjunto, o que está contido e o que não está contido junto com o operador NOT.



bye


natanbh1 escreveu:
Faça um teste trocando o Not In por <> (Diferente).

Código:
SELECT NOME,CNPJ,TEL,LIMITE FROM TB_CLIENTE
WHERE NOME LIKE :NOME AND STATUS <> 'S'
ORDER BY NOME


Valeu pelas dicas johnny-walker e natanbh1, testei os dois códigos, o código do johnny deu certo na consulta via console sql, já no delphi, trava a escrita no edit e não abre o ibdataset, já o código do natan não retornou nada pelo console e deu a mesma coisa, tentei fazer uma gambiarra com as duas mas nada rolou....a não ser que eu esteja deixando passar alguma coisa.

Grato aos dois
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: Seg Nov 06, 2017 8:00 pm    Assunto: Responder com Citação

Boa noite,

Você pode postar o código que está utilizando para executar essa query no Delphi?
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
lokasso
Aprendiz
Aprendiz


Registrado: Terça-Feira, 11 de Abril de 2017
Mensagens: 174

MensagemEnviada: Seg Nov 06, 2017 9:04 pm    Assunto: Responder com Citação

imex escreveu:
Boa noite,

Você pode postar o código que está utilizando para executar essa query no Delphi?


Boa noite imex segue o código:

Código:
procedure TFrm_PCliente.Edt_PKeyPress(Sender: TObject; var Key: Char);
begin
  with DM_Principal.IBQ_PCleinte do
    begin
      Close;
      SQL.Clear;

      case RG_P.ItemIndex of
        0:
          begin
            if CK_Status.Checked = True then
              begin
                SQL.Add('NOME,CNPJ,TEL,LIMITE FROM TB_CLIENTE');
      SQL.Add('WHERE NOME LIKE :NOME);
                SQL.Add('AND STATUS = "S"');
                SQL.Add('ORDER BY NOME');
                ParamByName('NOME').AsString:= Edt_P.Text+'%';
                Open;
                  if RecordCount = 0 then
                    ShowMessage('Cliente não encontrado');
              end
            else
              begin
                SQL.Add('NOME,CNPJ,TEL,LIMITE FROM TB_CLIENTE');
      SQL.Add('WHERE NOME LIKE :NOME);
                SQL.Add('ORDER BY NOME');
                ParamByName('NOME').Value:= Edt_P.Text+'%';
                Open;

                  if RecordCount = 0 then
                    ShowMessage('Cliente não encontrado');
              end;
   end;
end;


Se o CheckBox estiver true ele não executa o sql e nem deixa digitar nada no edit

Grato


Editado pela última vez por lokasso em Ter Nov 07, 2017 5:57 pm, num total de 1 vez
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: Ter Nov 07, 2017 8:45 am    Assunto: Responder com Citação

Bom dia,

Pelo que vi a sua query está ficando incompleta, pois no início é executado o SQL.Clear e depois já são adicionados os nomes dos campos.
Outro detalhe é que o Open não está sendo executado quando o CheckBox não está marcado. Acho que o Open poderia ficar fora do Case.
Dependendo também de como funciona o componente RG_P é possível otimizar um pouco mais o código.

Espero que ajude

_________________
Assinatura: https://www.imoveisemexposicao.com.br/imoveis-alugar-guarulhos!itapegica-comercial_ou_industrial-galpão
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
lokasso
Aprendiz
Aprendiz


Registrado: Terça-Feira, 11 de Abril de 2017
Mensagens: 174

MensagemEnviada: Ter Nov 07, 2017 2:21 pm    Assunto: Responder com Citação

imex escreveu:
Bom dia,

Pelo que vi a sua query está ficando incompleta, pois no início é executado o SQL.Clear e depois já são adicionados os nomes dos campos.
Outro detalhe é que o Open não está sendo executado quando o CheckBox não está marcado. Acho que o Open poderia ficar fora do Case.
Dependendo também de como funciona o componente RG_P é possível otimizar um pouco mais o código.

Espero que ajude

_________________
Assinatura: https://www.imoveisemexposicao.com.br/imoveis-alugar-guarulhos!itapegica-comercial_ou_industrial-galpão


imex na hora de copiar não veio o select no inicio, quando o CheckBox fica desmarcado, funciona certinho, consigo digitar no edit e abre a query e vem certo o resultado, a hora que não funciona o código é quando o checkbox esta marcado, pois trava o edit e nem com o enter abre a query.

Bom, são dois radio buton:
0: nome
1: cnpj

Ampos os codigos são os mesmos, mudando apenas "Where Nome/CNPJ"

Como você faria para otimizar esse código?

Grato
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: Ter Nov 07, 2017 2:48 pm    Assunto: Responder com Citação

Você pode postar o código completo desse evento?
Se por acaso o seu código ficou distorcido no fórum selecione o CheckBox "Desativar HTML nesta mensagem" que fica acima do botão "Enviar".
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
lokasso
Aprendiz
Aprendiz


Registrado: Terça-Feira, 11 de Abril de 2017
Mensagens: 174

MensagemEnviada: Ter Nov 07, 2017 6:26 pm    Assunto: Responder com Citação

imex escreveu:
Você pode postar o código completo desse evento?
Se por acaso o seu código ficou distorcido no fórum selecione o CheckBox "Desativar HTML nesta mensagem" que fica acima do botão "Enviar".


imex segue todo o código do formulário de pesquisa:

Código:
unit U_PCliente;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Data.DB, Vcl.ExtCtrls, Vcl.Grids,
  Vcl.DBGrids, Vcl.StdCtrls;

type
  TFrm_PCliente = class(TForm)
    Pnl_Padrao: TPanel;
    GB_P: TGroupBox;
    Lbl_P: TLabel;
    Edt_P: TEdit;
    DBG_P: TDBGrid;
    RG_PCliente: TRadioGroup;
    GroupBox1: TGroupBox;
    CK_Status: TCheckBox;
    CK_Baixa: TCheckBox;
    procedure Edt_PKeyPress(Sender: TObject; var Key: Char);
    procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
    procedure FormActivate(Sender: TObject);
    procedure RG_PClienteClick(Sender: TObject);
    procedure DBG_PDblClick(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure CK_StatusClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Frm_PCliente: TFrm_PCliente;

implementation

{$R *.dfm}

uses UDM_Principal, U_Cliente;

procedure TFrm_PCliente.CK_StatusClick(Sender: TObject);
begin
  if Edt_P.CanFocus then
    Edt_P.SetFocus;
end;

procedure TFrm_PCliente.DBG_PDblClick(Sender: TObject);
begin
  CNPJ:= DM_Principal.IBQ_PCliente.FieldByName('CNPJ').AsAnsiString;
  Close;
end;

procedure TFrm_PCliente.Edt_PKeyPress(Sender: TObject; var Key: Char);
begin
  with DM_Principal.IBQ_PCliente do
    begin
      Close;
      SQL.Clear;

      case RG_PCliente.ItemIndex of
        0:  //pesquisa por nome
          begin
            if CK_Status.Checked = True then
              begin
                SQL.Add('NOME,CNPJ,TEL,LIMITE FROM TB_CLIENTE');
                SQL.Add('WHERE NOME LIKE :NOME);
                SQL.Add('AND STATUS = "S"');
                SQL.Add('ORDER BY NOME');
                ParamByName('NOME').AsString:= Edt_P.Text+'%';
                Open;
                  if RecordCount = 0 then
                    ShowMessage('Cliente não encontrado');
              end
            else
              begin
                SQL.Add('SELECT NOME,CNPJ,TEL,LIMITE FROM TB_CLIENTE');
                SQL.Add('WHERE NOME LIKE :NOME');
                SQL.Add('ORDER BY NOME');
                ParamByName('NOME').AsString:= Edt_P.Text+'%';
                Open;
                  if RecordCount = 0 then
                    ShowMessage('Cliente não encontrado');
              end;
           1:  //pesquisa por cnpj
              begin
                if CK_Status.Checked = True then
                  begin
                    SQL.Add('SELECT NOME,CNPJ,TEL,LIMITE FROM TB_CLIENTE');
                    SQL.Add('WHERE CNPJ LIKE :CNPJ);
                    SQL.Add('AND STATUS = "S"');
                    SQL.Add('ORDER BY NOME');
                    ParamByName('CNPJ').AsString:= Edt_P.Text;
                    Open;
                      if RecordCount = 0 then
                        ShowMessage('CNPJ não encontrado');
                  end
                else
                  begin
                    SQL.Add('NOME,CNPJ,TEL,LIMITE FROM TB_CLIENTE');
                    SQL.Add('WHERE CNPJ LIKE :CNPJ);
                    SQL.Add('ORDER BY NOME');
                    ParamByName('CNPJ').AsString:= Edt_P.Text;
                    Open;
                      if RecordCount = 0 then
                        ShowMessage('CNPJ não encontrado');
                  end;
              end;
          end;
      end;
    end;
end;

procedure TFrm_PECliente.FormActivate(Sender: TObject);
begin
  DM_Principal.IBQ_PCliente.Close;
  RG_PCliente.ItemIndex:=0;
end;

procedure TFrm_PECliente.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Frm_Emprestimo.DBE_Cliente.Text:= Cliente
end;

procedure TFrm_PECliente.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  if Key = VK_Escape then
    Close;
end;

procedure TFrm_PECliente.RG_PClienteClick(Sender: TObject);
begin
  case RG_PCliente.ItemIndex of
  0: //nome
    begin
      Lbl_P.Caption:='Digite o Nome do Cliente:  ';
      Edt_P.Clear;
      if Edt_P.CanFocus then
        Edt_P.SetFocus;
      Edt_P.MaxLength:=0;
      DM_Principal.IBQ_PCliente.Close;
      DM_Principal.IBQ_PCliente.SQL.Clear;

    end;

  1: //cnpj
    begin
      Lbl_P.Caption:='Digite o CNPJ do Cliente:  ';
      Edt_P.Clear;
      if Edt_P.CanFocus then
        Edt_P.SetFocus;
      DM_Principal.IBQ_PCliente.Close;
      DM_Principal.IBQ_PCliente.SQL.Clear;
    end;
  end;
end;

end.
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 Nov 08, 2017 8:53 am    Assunto: Responder com Citação

Experimente fazer uns testes com o código abaixo:

Código:
procedure TFrm_PCliente.Edt_PKeyPress(Sender: TObject; var Key: Char);
begin
  with DM_Principal.IBQ_PCliente do
    begin
      Close;
      SQL.Clear;
      SQL.Add('SELECT NOME, CNPJ, TEL, LIMITE FROM TB_CLIENTE WHERE');

      case RG_PCliente.ItemIndex of
        0:  //pesquisa por nome
          begin
            SQL.Add('NOME LIKE :NOME);
            ParamByName('NOME').AsString := Edt_P.Text + '%';
          end;
        1:  //pesquisa por cnpj
          begin
            SQL.Add('CNPJ = :CNPJ);
            ParamByName('CNPJ').AsString := Edt_P.Text;
          end;
        end;

      if CK_Status.Checked then
          SQL.Add('AND STATUS = "S"');
      SQL.Add('ORDER BY NOME');
      Open;
      if RecordCount = 0 then
          ShowMessage('CNPJ não encontrado');
    end;
end;


Espero que ajude
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
lokasso
Aprendiz
Aprendiz


Registrado: Terça-Feira, 11 de Abril de 2017
Mensagens: 174

MensagemEnviada: Qua Nov 08, 2017 3:53 pm    Assunto: Responder com Citação

imex escreveu:
Experimente fazer uns testes com o código abaixo:

Código:
procedure TFrm_PCliente.Edt_PKeyPress(Sender: TObject; var Key: Char);
begin
  with DM_Principal.IBQ_PCliente do
    begin
      Close;
      SQL.Clear;
      SQL.Add('SELECT NOME, CNPJ, TEL, LIMITE FROM TB_CLIENTE WHERE');

      case RG_PCliente.ItemIndex of
        0:  //pesquisa por nome
          begin
            SQL.Add('NOME LIKE :NOME);
            ParamByName('NOME').AsString := Edt_P.Text + '%';
          end;
        1:  //pesquisa por cnpj
          begin
            SQL.Add('CNPJ = :CNPJ);
            ParamByName('CNPJ').AsString := Edt_P.Text;
          end;
        end;

      if CK_Status.Checked then
          SQL.Add('AND STATUS = "S"');
      SQL.Add('ORDER BY NOME');
      Open;
      if RecordCount = 0 then
          ShowMessage('CNPJ não encontrado');
    end;
end;


Espero que ajude


imex boa tarde, testei o seu código, porém ele trava o edit, não deixando digitar nada e nem com enter ele abre a tabela.

Grato
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 Nov 08, 2017 4:42 pm    Assunto: Responder com Citação

Existem quantos registros na TB_CLIENTE?
O banco de dados é local?
Experimente, pelo menos para teste, adicionar um botão ao form e passe o código do edit para o botão para ver se a query funciona.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
lokasso
Aprendiz
Aprendiz


Registrado: Terça-Feira, 11 de Abril de 2017
Mensagens: 174

MensagemEnviada: Sex Nov 10, 2017 2:40 am    Assunto: Responder com Citação

imex escreveu:
Existem quantos registros na TB_CLIENTE?
O banco de dados é local?
Experimente, pelo menos para teste, adicionar um botão ao form e passe o código do edit para o botão para ver se a query funciona.


imex desculpe a demora para te responder, vou começar a responder a sua pergunta:
É um de teste banco local de exatamente 67 clientes

Testei o seu código com o botão, passando o código para o botão ele destrava o edit, porém mesmo assim nao abre a consulta.

Bom eu acho que o delphi não está aceitando essa condição:

Código:
SQL.Add('AND STATUS = ''S''');


junto com essa:

Citação:
SQL.Add('WHERE NOME LIKE :NOME');


Eu já inverti e também nada, porém se eu tirar o filtro do status, a consulta realiza corretamente, não sei o que pode ser

Abraços
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
lokasso
Aprendiz
Aprendiz


Registrado: Terça-Feira, 11 de Abril de 2017
Mensagens: 174

MensagemEnviada: Sex Nov 10, 2017 6:09 am    Assunto: Responder com Citação

Galera, algumas horinhas passando nesse código e não sei mais o que fazer, sério estou pensando em deixar pra vir mesmo os clientes bloqueados, pois não sei mais o que fazer, o unico jeito que "abriu" o SQL foi esse abaixo, porém nada de informações, retornou apenas a mensagem:

Código:
procedure TFrm_PECliente.Edt_PKeyPress(Sender: TObject; var Key: Char);
begin
  if Key=#13 then
    begin
      with DM_Principal.IBQ_PCliente do
        begin
          Close;
          SQL.Clear;
          SQL.Add('SELECT SELECT NOME, CNPJ, TEL, LIMITE FROM TB_CLIENTE');

          case RG_P.ItemIndex of
            0:
              begin
                SQL.Add('WHERE NOME LIKE :NOME');
                if CK_Status.Checked = True then
                  begin
                    SQL.Add('AND STATUS = ''N''');
                  end
                else
                  begin
                    SQL.Add('WHERE NOME LIKE :NOME');
                    SQL.Add('ORDER BY NOME');
                    ParamByName('NOME').Value:= Edt_P.Text+'%';
                    Open;
                  end;
                if RecordCount = 0 then
                  ShowMessage('Cliente não encontrado');
              end;
          end;
        end;
    end;
end;


Eu apenas testei com o nome.

Abraços
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
Ir à página 1, 2  Próximo
Página 1 de 2

 
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