Linguagem Sql...Fiz Mas Não Concordo

Delphi

26/03/2004

Preciso Fazer Uma Consulta Em Tres Campos De Uma Tabela(Campo1:Data; Campo2:Entrada;Campo3:Saida)...Quero Que Retorne Como Resultado Da Consulta Os Registro Que Atenderem Duas Condições...Registro Que Possuirem a Mesma Data [color=red:f111e62e58]E[/color:f111e62e58] Registro Cujos Valores De Entrada [color=red:f111e62e58]Ou[/color:f111e62e58] De Saida Não Forem [color=red:f111e62e58]NULOS[/color:f111e62e58]...Olhando Desta Forma , Se Fossemos Escrever Usando a Instrução <If e Else> Eu Faria Do Modo Abaixo:
OBERSEVE A ORDEM DOS OPERADORES AND e OR E TAMBÉM A APLICAÇÃO DO DUPLO COLCHETE NA SEGUNDA PARTE DA ISNTRUÇÃO
if (CampoData=DataQualquer)And ((not CampoEntrada is null)OR
                                                  (not CampoSaida is Null)) Then

E Seguindo O Mesmo Raciocineo, Ficaria Atentado a Escrever a Instrução
Em SqL Da Seguinte Forma : Segue Um Fragmento Do Possível Código:
QEntSai.sql.Add(´Where Data=:DataMov´);
QEntSai.ParamByName(´DataMov´).AsDateTime:=MonthCalendar2.Date;
QEntSai.Sql.Add(´AND Entrada is not null´);
QEntSai.Sql.Add(´OR Saida is not null´);

Deste Modo Não Deu...Então O Que Eu Fiz...[color=red:f111e62e58]Mudei a Ordem Do Operadores <AND E OR> e Funcionou...Segue Novamente o Fragmento Do Código:[/color:f111e62e58]
QEntSai.sql.Add(´Where Data=:DataMov´);
QEntSai.ParamByName(´DataMov´).AsDateTime:=MonthCalendar2.Date;
QEntSai.Sql.Add(´OR Entrada is not null´);
QEntSai.Sql.Add(´AND Saida is not null´);

Poxa Cara , Se Funcionou Voce Esta Reclamando De Que :?: :?: :?: Mas Não é Por Ai... Eu Fiz Uma Coisa Que Fugiu Do Meu Conceito e Do Meu Raciocíneo, e Gostaria Que Alguem Comenta-sse o Sentido Da Inversão Dos Operadores And e Or Na Linguagem Sql...Muito Obrigado

HA, E Se Alguem Souber Como Fazer, Para Apos a Consulta Colocar A Query Em Modo De Edição Ou Inserção , Por Favor... Obrigado


Marco Salles

Marco Salles

Curtidas 0

Respostas

Weber

Weber

26/03/2004

Acho que essa é a forma correta:

QEntSai.sql.Add(´Where Data=:DataMov´); 
QEntSai.ParamByName(´DataMov´).AsDateTime:=MonthCalendar2.Date; 
QEntSai.Sql.Add(´AND (Entrada is not null OR Saida is not null)´);



GOSTEI 0
Paullus

Paullus

26/03/2004

Não sei o motivo do erro, mas você poderia manter a sua primeira query se fizesse uso de parênteses.
Toda condição WHERE que eu uso eu coloco entre parênteses, além de facilitar a leitura não confunde o banco de dados.

QEntSai.sql.Add(´Where Data=:DataMov´); 
QEntSai.ParamByName(´DataMov´).AsDateTime:=MonthCalendar2.Date; 
QEntSai.Sql.Add(´AND   (Entrada is not null)´); 
QEntSai.Sql.Add(´OR     (Saida is not null)´);


No Delphi se você tem a seguinte condição:

if (teste AND invalido) AND
   (teste2 AND valido) AND
   (teste3 AND valido3)


Ele faz a verificação da esquerda para a direita, se o primeiro operador é falso a condição não chega a testar as próximas condições retornando automaticamente falso para tudo TALVEZ funcione da mesma forma no seu banco de dados.


GOSTEI 0
Marco Salles

Marco Salles

26/03/2004

Testei Usando as Duas Sugestões...Todas as Duas é Regada De Lógica.Não Ficaria Surpreso Se As Duas Sugestões Correspondesse a Expectativa... mas Na Prática, Pelo Menos No Meu Caso Só Uma Funcionou...O Questiomamento é Exatamente Este: ONDE ESTA O ERRO
DA SINTA-SE DA INSTRUÇÃO SQL :?:

weber: Funcionou Perfeitamente e Segue a Linha Inicial Do Raciocíneo:
Retorno Da Consulta:Registro Com a Data E (CampoEntrada OU CampoSaida Não Nulos)...
QEntSai.sql.Add(´Where Data=:DataMov´); 
QEntSai.ParamByName(´DataMov´).AsDateTime:=MonthCalendar2.Date; 
QEntSai.Sql.Add(´AND (Entrada is not null OR Saida is not null)´); 


paullus:A Sugestão De Colocar Para Facilitar a Leitura e Não Confundir o Banco De Dados é Válida, Porem o Resultado Não Confere Com a Expectativa:O Retorno Desta Consulta Esta Sendo : (Registro Com a Data
And CampoEntrada Nao Nulo) Ou CampoSaida Não Nulo, Quando Deferia Ser: Registro Com a Data E (CampoEntrada OU CampoSaida Não Nulos)...
QEntSai.sql.Add(´Where Data=:DataMov´); 
QEntSai.ParamByName(´DataMov´).AsDateTime:=MonthCalendar2.Date; 
QEntSai.Sql.Add(´AND   (Entrada is not null)´); 
QEntSai.Sql.Add(´OR     (Saida is not null)´);


Mais Uma Vez: Onde Esta o ERRO Na Sintase Do Código Do Weber Para a Sintase Do Código Sugerido Pelo Paulls :?: :?: :?: Poderia Mais Algume Opinar Sobre o Assunto :?: :?:


GOSTEI 0
Marco Salles

Marco Salles

26/03/2004

Mais Uma Vez: Onde Esta o ERRO Na Sintase Do Código Do Weber Para a Sintase Do Código Sugerido Pelo Paulls Poderia Mais Algume Opinar Sobre o Assunto


Ninguem Quer Opinar :(


GOSTEI 0
Rodriguesap

Rodriguesap

26/03/2004

Caro

Este problema eu também enfrentei quando comecei a utilizar SQL, a alguns anos. Vou tentar explicar com minhas palavras.

Quando você usou

DATA = ? AND ENTRADA = ? OR SAIDA = ?

Você deve informar qual é o campo fixo, e quais os campos que ocilam. Neste caso, se entende ((data e entrada) ou saida). Sei ta difícil né.

Vou passar para um exemplo mais prático mais prático:

Imagine que você va a um restaurante, quando o garçom vem ate você e pergunta. Você escolheu bife livre AND sobremesa OR bife a quilo? Note que neste caso você entende que está sendo oferecido duas opções.

Voltando ao caso anterior você informou para retornar a data E entrada nao nula OU saida nao nula, e o retorno que você obteve esta exato. Você deve informar que as informações da DATA mais a (entrada nao nula OU saida nao nula).

neste caso ficaria

WHERE (DATA = ?) AND ((ENTRADA not null) OR (SAIDA not null))

prefira trabalhar desta forma, você entende melhor o que esta sendo passado e as chances de dar erros é mais difícil.


GOSTEI 0
Marco Salles

Marco Salles

26/03/2004

Ta Beleza
WHERE (DATA = ?) AND ((ENTRADA not null) OR (SAIDA not null))


Mas O Problema é Dizer Este Dois Colchetes Em Linguagem Sql...Ate Agora Estou Apostando Todas As Minhas Fichas Que o Operador Or Deve Ser Usado Dentro Da Instruçõa( Na Mesma Linha), Como Fez o weber:
QEntSai.Sql.Add(´AND (Entrada is not null OR Saida is not Null´);

e Não Em Instruções Separadas9Duas Linhas):
QEntSai.Sql.Add(´AND   (Entrada is not null)´); 
QEntSai.Sql.Add(´OR     (Saida is not null)´);

Será Isto Uma Regra :?:


GOSTEI 0
Weber

Weber

26/03/2004

Não é ´estar ou não na mesma linha´ não é isso que altera a instrução SQL e sim a lógica da coisa.

QEntSai.Sql.Add(´AND (Entrada is not null´);
QEntSai.SQL.Add(´OR Saida is not Null)´);

QEntSai.Sql.Add(´AND (Entrada is not null OR Saida is not Null)´);

A instrução SQL é exatamente a mesma observe que no primeiro exemplo eu só abro o ´(´ e não fecho e na segunda linha eu só fecho o ´)´.

Porém essa instrução postada por [b:b751ca1d12]rodriguesap[/b:b751ca1d12] parece ser melhor
QEntSai.SQL.Add(´AND ((ENTRADA not null) OR (SAIDA not null))´);



GOSTEI 0
Marco Salles

Marco Salles

26/03/2004

Não é ´estar ou não na mesma linha´ não é isso que altera a instrução SQL e sim a lógica da coisa.


Relembrando: O Que Quero Como Conjunto Solução :(Registros Que Tenham a Data Especificada) E( (Campo Entrada nao Nulos Ou Campo Saida Nao Nulos))

WHERE (DATA = ?) AND ((ENTRADA not null) OR (SAIDA not null)) 


...Mas O Que Estou Levantando é Como Fazer Com Que O Compilador Entenda Esta Instrução, Sem Colocar o Operador OR Na Mesma Linha...
A Primeira Ideia Que Surge é Escrever:
QEntSai.sql.Add(´Where Data=:DataMov´); 
QEntSai.ParamByName(´DataMov´).AsDateTime:=MonthCalendar2.Date; 
QEntSai.Sql.Add(´AND   (Entrada is not null)´); 
QEntSai.Sql.Add(´OR     (Saida is not null)´);


Porque Esta Instrução Não Dá: Porque Ela Fornece Como Conjunto Solução : (Os Registros Que Tenha a Data Especificada E Campo Entrada Não Nulos) Ou (Campo Saida Não Nulos)...


Então Diante Disto Lanço Um Apelo Para Que Alguem Que Conheça A Sintase Da Linguagem Sql Que Coloque o Operador Or Em Uma Linha
Separada Da Primeira Por Gentileza Que O Faça...


GOSTEI 0
Rodriguesap

Rodriguesap

26/03/2004

O código que passei pode ser usado em linhas diferentes. Ex.:

(DATA = ?) AND
(( ENTRADA not null) OR
(SAIDA not null))

Se você usar desta forma ira funcionar.

O que interessa é saber possicionar os parenteses. Se você usar desta forma ira funcionar também.

Ou como já foi passado pelo weber

DATA = ?
(ENTRADA not null OR
SAIDA not null)

Ou ainda:

DATA = ?
(
ENTRADA not null
OR
SAIDA not null
)

Desta forma também irá funcionar. Lembrese que as instruções SQL quando é processado, o interpretador dos comandos divide em ordem de execulsão. e execulta um após o outro.


GOSTEI 0
Marco Salles

Marco Salles

26/03/2004

O código que passei pode ser usado em linhas diferentes. Ex.:

Então Por Gentileza, Que o Faça..Eu Não Consegui :!:
No Meu Caso a Instrução, Não Funciona
QEntSai.sql.Add(´Where Data=:DataMov´); 
QEntSai.ParamByName(´DataMov´).AsDateTime:=MonthCalendar2.Date; 
QEntSai.Sql.Add(´AND   (Entrada is not null)´); 
QEntSai.Sql.Add(´OR     (Saida is not null)´);

Ja Tentei Também:
QEntSai.sql.Add(´Where Data=:DataMov´); QEntSai.ParamByName(´DataMov´).AsDateTime:=MonthCalendar2.Date; QEntSai.Sql.Add(´AND ((Entrada is not null))´); QEntSai.Sql.Add(´OR ((Saida is not null))´);

E Nada....
A Unica Que Funcionou Foi:
QEntSai.sql.Add(´Where Data=:DataMov´); 
QEntSai.ParamByName(´DataMov´).AsDateTime:=MonthCalendar2.Date; 
QEntSai.Sql.Add(´AND   (Entrada is not null) or (Saida is not null) ´); 

Ou Para Ser Mais Precisso:Também Funciona
QEntSai.sql.Add(´Where Data=:DataMov´); 
QEntSai.ParamByName(´DataMov´).AsDateTime:=MonthCalendar2.Date; 
QEntSai.Sql.Add(´AND  ( (Entrada is not null) or (Saida is not null) )´); 



GOSTEI 0
Rodriguesap

Rodriguesap

26/03/2004

Acho que sei o que esta dando errado. Você esta informando os Parametros e depois adicionando mais instruções SQL

QEntSai.SQL.Add(´WHERE DATA = :DataMov´);
QEntSai.ParamByName(´DataMov´).AsDateTime:=MonthCalendar2.Date; 
QEntSai.Sql.Add(´AND  ( (Entrada is not null) or (Saida is not null) )´);


Esperimente usar

QEntSai.SQL.Add(´WHERE DATA = :DataMov´);
QEntSai.SQL.Add(´AND  ( (Entrada is not null) or (Saida is not null) )´);
QEntSai.ParamByName(´DataMov´).AsDateTime:=MonthCalendar2.Date; 


Você deve primeiro adicionar os comandos SQL, e depois atribuir os Parametros. Caso você atribua os parametros entre os comandos SQL,

QEntSai.SQL.Add(´WHERE DATA = :DataMov´);
[b]QEntSai.ParamByName(´DataMov´).AsDateTime:=MonthCalendar2.Date;[/b]
QEntSai.Sql.Add(´AND  ( (Entrada is not null) or (Saida is not null) )´);


cada vez que você adicionar comandos SQL, os parametros seram limpos. Neste caso é como se você estivesse atribuido um valor nulo, ou outro que não tem nada a ver.

Espero que ajude. Se não for isso, especifique melhor o erro que tentarei ajudar.


GOSTEI 0
Aroldo Zanela

Aroldo Zanela

26/03/2004

[quote:c959ece63b=´Marco Salles´]Então O Que Eu Fiz...[color=red:c959ece63b]Mudei a Ordem Do Operadores <AND E OR> e Funcionou...Segue Novamente o Fragmento Do Código:[/color:c959ece63b]
[/quote:c959ece63b]

Se você utilizar vários operadores (lógicos ou aritméticos) para combinar expressões, o SQL processará os operadores na respectiva ordem de precedência, o que pode afetar o valor resultante. A tabela a seguir mostra o nível de precedência dos operadores (os níveis variam do nível mais alto para o nível mais baixo).

------------+-----------------+--------------
Tipo        | Operador        | Símbolo
------------+-----------------+--------------
Agrupamento | Agrupamento     | primário ( )
Aritmético  | Multiplicativo  | * / ¬
Aritmético  | Aditivo         | - +
Outros      | Concatenação de | +
            | seqüências de   |
            | caracteres      |
Lógico      | NOT             | NOT
Lógico      | AND             | AND
Lógico      | OR              | OR

O SQL trata primeiramente da expressão com o agrupamento mais interno. Além disso, se todos os operadores aritméticos em uma expressão compartilharem o mesmo nível de precedência, a ordem será da esquerda para a direita.

Nota: O nível de precedência dos operadores lógicos pode ser diferente em outras linguagens de programação.


GOSTEI 0
POSTAR