 |
ActiveDelphi .: O site do programador Delphi! :.
|
| Exibir mensagem anterior :: Exibir próxima mensagem |
| Autor |
Mensagem |
lokasso Aprendiz

Registrado: Terça-Feira, 11 de Abril de 2017 Mensagens: 174
|
Enviada: Seg Nov 06, 2017 2:01 pm Assunto: [RESOLVIDO] Consulta SQL usando IN/NOT IN no delphi |
|
|
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 |
|
 |
johnny-walker Moderador


Registrado: Sábado, 4 de Outubro de 2003 Mensagens: 10653 Localização: Contagem/MG - BRAZIL
|
Enviada: Seg Nov 06, 2017 2:12 pm Assunto: |
|
|
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 |
|
 |
natanbh1 Colaborador

Registrado: Terça-Feira, 15 de Março de 2011 Mensagens: 3093 Localização: Belo Horizonte - MG
|
Enviada: Seg Nov 06, 2017 2:40 pm Assunto: |
|
|
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 |
|
 |
lokasso Aprendiz

Registrado: Terça-Feira, 11 de Abril de 2017 Mensagens: 174
|
Enviada: Seg Nov 06, 2017 5:28 pm Assunto: |
|
|
| 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 |
|
 |
imex Moderador

Registrado: Sexta-Feira, 7 de Janeiro de 2011 Mensagens: 11666
|
Enviada: Seg Nov 06, 2017 8:00 pm Assunto: |
|
|
Boa noite,
Você pode postar o código que está utilizando para executar essa query no Delphi? |
|
| Voltar ao Topo |
|
 |
lokasso Aprendiz

Registrado: Terça-Feira, 11 de Abril de 2017 Mensagens: 174
|
Enviada: Seg Nov 06, 2017 9:04 pm Assunto: |
|
|
| 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 |
|
 |
imex Moderador

Registrado: Sexta-Feira, 7 de Janeiro de 2011 Mensagens: 11666
|
Enviada: Ter Nov 07, 2017 8:45 am Assunto: |
|
|
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 |
|
 |
lokasso Aprendiz

Registrado: Terça-Feira, 11 de Abril de 2017 Mensagens: 174
|
Enviada: Ter Nov 07, 2017 2:21 pm Assunto: |
|
|
| 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 |
|
 |
imex Moderador

Registrado: Sexta-Feira, 7 de Janeiro de 2011 Mensagens: 11666
|
Enviada: Ter Nov 07, 2017 2:48 pm Assunto: |
|
|
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 |
|
 |
lokasso Aprendiz

Registrado: Terça-Feira, 11 de Abril de 2017 Mensagens: 174
|
Enviada: Ter Nov 07, 2017 6:26 pm Assunto: |
|
|
| 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 |
|
 |
imex Moderador

Registrado: Sexta-Feira, 7 de Janeiro de 2011 Mensagens: 11666
|
Enviada: Qua Nov 08, 2017 8:53 am Assunto: |
|
|
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 |
|
 |
lokasso Aprendiz

Registrado: Terça-Feira, 11 de Abril de 2017 Mensagens: 174
|
Enviada: Qua Nov 08, 2017 3:53 pm Assunto: |
|
|
| 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 |
|
 |
imex Moderador

Registrado: Sexta-Feira, 7 de Janeiro de 2011 Mensagens: 11666
|
Enviada: Qua Nov 08, 2017 4:42 pm Assunto: |
|
|
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 |
|
 |
lokasso Aprendiz

Registrado: Terça-Feira, 11 de Abril de 2017 Mensagens: 174
|
Enviada: Sex Nov 10, 2017 2:40 am Assunto: |
|
|
| 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 |
|
 |
lokasso Aprendiz

Registrado: Terça-Feira, 11 de Abril de 2017 Mensagens: 174
|
Enviada: Sex Nov 10, 2017 6:09 am Assunto: |
|
|
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 |
|
 |
|
|
Enviar Mensagens Novas: Proibido. Responder Tópicos Proibido Editar Mensagens: Proibido. Excluir Mensagens: Proibido. Votar em Enquetes: Proibido.
|
|