Fórum Linguagem Sql...Fiz Mas Não Concordo #222602
26/03/2004
0
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
Curtir tópico
+ 0Posts
26/03/2004
Weber
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
26/03/2004
Paullus
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
26/03/2004
Marco Salles
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
26/03/2004
Marco Salles
Ninguem Quer Opinar :(
Gostei + 0
26/03/2004
Rodriguesap
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
26/03/2004
Marco Salles
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
27/03/2004
Weber
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
27/03/2004
Marco Salles
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
27/03/2004
Rodriguesap
(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
27/03/2004
Marco Salles
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:
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
03/04/2004
Rodriguesap
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
03/04/2004
Aroldo Zanela
[/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
Clique aqui para fazer login e interagir na Comunidade :)