Linguagem Sql...Fiz Mas Não Concordo
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
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:
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]
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
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
Curtidas 0
Respostas
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
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.
No Delphi se você tem a seguinte condição:
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.
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
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)...
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)...
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 :?: :?:
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
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
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.
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
26/03/2004
Ta Beleza
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:
e Não Em Instruções Separadas9Duas Linhas):
Será Isto Uma Regra :?:
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
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.
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 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
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
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.
(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
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
26/03/2004
Acho que sei o que esta dando errado. Você esta informando os Parametros e depois adicionando mais instruções SQL
Esperimente usar
Você deve primeiro adicionar os comandos SQL, e depois atribuir os Parametros. Caso você atribua os parametros entre os comandos SQL,
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.
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
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).
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.
[/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