Clipper On Line • Ver Tópico - Erro em comandos SQL

Erro em comandos SQL

Discussão sobre SQL

Moderador: Moderadores

 

Erro em comandos SQL

Mensagempor Poka » 14 Ago 2015 11:02

Olá a todos

Estou começando usar Firebird + ODBC

o select abaixo seria por exemplo +- como pegar todas as notas e a quantidade de itens de cada nota.

O grid vai ter por exemplo varias colunas

o select abaixo dá certo

     Str:="SELECT pd.codigo, count(pm.codigo) as qtdoc from PAGAR_DADOS pd  ";
       +" JOIN pagar_mov pm on (pm.codigo = pd.codigo) group by pd.codigo;"


o select abaixo com + de 1 campo da erro

     Str:="SELECT pd.codigo, pd.dtvenc, count(pm.codigo) as qtdoc from PAGAR_DADOS pd  ";
       +" JOIN pagar_mov pm on (pm.codigo = pd.codigo) group by pd.codigo;"


erro no segundo select

Error HY000 - [ODBC Firebird Driver][Firebird]Dynamic SQL Error
SQL error code = -104
Invalid expression in the select list (not contained in either an aggregate function or the GROUP BY clause)


Se alguém puder ajudar, agradeço.

Poka
Poka
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 340
Data de registro: 25 Out 2004 21:26
Cidade/Estado: Leme/SP
Curtiu: 0 vez
Mens.Curtidas: 10 vezes

Erro em comandos SQL

Mensagempor alxsts » 14 Ago 2015 12:43

Olá!

Em SQL (vale para todos os SGBDs), quando se usa funções de agregação (aggregate functions), todas as colunas que não são usadas nestas funções devem obrigatoriamente constar da lista de colunas da cláusula GROUP BY. Exemplos de aggregate functions: Sum, Count, Avg...

Adapte a tua consulta:
Str:="SELECT pd.codigo, pd.dtvenc, count(pm.codigo) as qtdoc from PAGAR_DADOS pd ";
   +" JOIN pagar_mov pm on (pm.codigo = pd.codigo) group by pd.codigo, pd.dtvenc;"
[]´s
Alexandre Santos (AlxSts)
alxsts
Colaborador

Colaborador
 
Mensagens: 2014
Data de registro: 12 Ago 2008 15:50
Cidade/Estado: São Paulo-SP-Brasil
Curtiu: 13 vezes
Mens.Curtidas: 111 vezes

Erro em comandos SQL

Mensagempor Poka » 14 Ago 2015 14:17

Valeu Alexandre, deu certinho.

Já estou fazendo algumas coisas com o Firebird, faz dias que estou nessa linha, pesquisei nos livros e apostilas que eu tenho, na internet e só vi exemplos com apenas um campo, não sabia que tinha que repetir no group by.

Obrigado

Poka
Poka
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 340
Data de registro: 25 Out 2004 21:26
Cidade/Estado: Leme/SP
Curtiu: 0 vez
Mens.Curtidas: 10 vezes

Erro em comandos SQL

Mensagempor JoséQuintas » 14 Ago 2015 19:48

Talvez mais fácil de entender:
Se estava totalizando por código, significa todos os vencimentos, então impossível definir uma data.
Se quer totais separados por código e vencimento, então são dois totalizadores.
José M. C. Quintas
Harbour 3.4, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, hbnetio, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
Avatar de usuário

JoséQuintas
Colaborador

Colaborador
 
Mensagens: 9321
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 6 vezes
Mens.Curtidas: 538 vezes

Erro em comandos SQL

Mensagempor Poka » 27 Ago 2015 11:34

Olá

Jose Quintas, estou passando os dados dos arquivos + fáceis primeiro, vai ter aqueles relatórios de somar mês a mês do ano inteiro, aí vamos ver como fazer.

Bem por enquanto estou com outro problema:

Já sei que em comandos SQL não aceita aspas, fui passar tabela de clientes e um cliente que contém a palavra D´Agua por exemplo deu erro. Como fazer neste caso, posso simplesmente substituir por outra coisa. O usuário nunca vai poder usar esse tipo texto? .
Ainda não testei em campos tipo BLOB (memo), será que não vai aceitar também?.
Estou passando um sistema de advogado, e nos textos tem todos os tipos acentuação.
Existe outras silabas que os comandos SQL não aceita também? Aí vai ficar difícil para o advogado escrever os seus textos, explicar para ele que o sistema não aceita!!!

Como vocês fazem?

aguardo qualquer ajuda

Poka
Poka
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 340
Data de registro: 25 Out 2004 21:26
Cidade/Estado: Leme/SP
Curtiu: 0 vez
Mens.Curtidas: 10 vezes

Erro em comandos SQL

Mensagempor JoséQuintas » 27 Ago 2015 12:16

Aí vai ter que testar se vai ter problema com codepage.
Mas basicamente o MySql aceita qualquer coisa, basta usar a barra invertida "\" em casos que são exceção.

INSERT INTO CLIENTES ( NOME ) VALUES ( 'ANTONIO D\'AGUA' )


ou até mesmo a própria barra

INSERT INTO CLIENTES ( NOME ) VALUES ( 'TAMBEM ACEITA A BARRA \\' )


É por isso que uso uma função:

"INSERT INTO CLIENTES ( NOME ) VALUES ( " + StringSql( cTexto ) + ")"


E na função trato exceções, se existirem.
José M. C. Quintas
Harbour 3.4, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, hbnetio, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
Avatar de usuário

JoséQuintas
Colaborador

Colaborador
 
Mensagens: 9321
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 6 vezes
Mens.Curtidas: 538 vezes

Erro em comandos SQL

Mensagempor JoséQuintas » 27 Ago 2015 12:27

Meu site inteiro sai de uma base MySql, exceto imagens.
Mesmo assim, dá pra gravar praticamente qualquer letra.
Uma página como exemplo do que pode ser gravado no MySql:

http://www.jpatecnologia.com.br/html/busca.asp?chave=Antigos&busca=nao
José M. C. Quintas
Harbour 3.4, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, hbnetio, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
Avatar de usuário

JoséQuintas
Colaborador

Colaborador
 
Mensagens: 9321
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 6 vezes
Mens.Curtidas: 538 vezes

Erro em comandos SQL

Mensagempor Poka » 02 Set 2015 14:48

José Quintas, obrigado por responder.
Nos campos de nome vou substituir o ´ por outro caracter qualquer , não vai ter problemas, em campos Blob , aceita normal, esse era o meu medo , já que textos de advogado vocè ja viu, tem de tudo.

Agora + uma dúvida para alterações que não consegui resolver.

   Str:="UpDate &xarq set &ListaCampos  where &xCampoChave = &xconteudoTeste;"


esse comando funciona sem problemas, mas por ex, quando xcampochave = "codigo"
gostaria de testar com + de um campo, por ex: xcampoChave = docum+codFor.

Como sempre, nas apostilas e exemplos só tem com um campo.

Agradeço qualquer ajuda.

Poka
Poka
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 340
Data de registro: 25 Out 2004 21:26
Cidade/Estado: Leme/SP
Curtiu: 0 vez
Mens.Curtidas: 10 vezes

Erro em comandos SQL

Mensagempor alxsts » 02 Set 2015 17:21

Olá!

Em SQL é um pouco diferente. Tem que montar os critérios usando operadores lógicos. Exemplo:
UPDATE tbOrder
   SET idOrderStatus = 100
WHERE idCustomer = 7056
   AND dtOrder = '2015-08-31'
[]´s
Alexandre Santos (AlxSts)
alxsts
Colaborador

Colaborador
 
Mensagens: 2014
Data de registro: 12 Ago 2008 15:50
Cidade/Estado: São Paulo-SP-Brasil
Curtiu: 13 vezes
Mens.Curtidas: 111 vezes

Erro em comandos SQL

Mensagempor Poka » 02 Set 2015 19:54

Valeu Alexandre, deu certo

Poka
Poka
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 340
Data de registro: 25 Out 2004 21:26
Cidade/Estado: Leme/SP
Curtiu: 0 vez
Mens.Curtidas: 10 vezes

Erro em comandos SQL

Mensagempor Poka » 19 Set 2015 19:56

Olá a todos

preciso de + uma ajuda

xtotkilos:=str( 5800,6,0)

str:="Update &xtabLan set TotKilos= 'xtotkilos' where codfor = '&xcodfor' .and. codprod = 'xcodprod';"


o comando acima funciona
eu preciso do seguinte
eu já tenho o campo totkilos prenchido na tabela , quero somar com o xtotkilos, se eu pesquisar antes, pegar o conteudo e somar tom totkilos dá certo, mas gostaria de fazer direto no comando.

agradeço qualquer ajuda.

Poka
Poka
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 340
Data de registro: 25 Out 2004 21:26
Cidade/Estado: Leme/SP
Curtiu: 0 vez
Mens.Curtidas: 10 vezes

Erro em comandos SQL

Mensagempor JoséQuintas » 19 Set 2015 20:25

Só comentário: evite usar macros, pode esconder problemas.
A velha pergunta... como faria no DBF?
(considerar que no SQL o default é todos)

USE tabela
REPLACE all totkilos WITH totkilos + 10 FOR codfor='005' and codpro='006'
USE


E no SQL?

UPDATE tabela SET totkilos = totkilos + 10 WHERE codfor = '005' and codprod='006';


Mas sem macro. Prefiro usar função pra deixar mais clara a conversão:
cSql := "UPDATE " + xtablan + " SET TotKilos=TotKilos +" + Str( nQtde ) + " WHERE codfor = " + StringSql( xcodfor ) + " AND codprod=" + StringSql( xcodprod )

FUNCTION StringSql( cString )
   RETURN ['] + cString + [']


Tem um detalhe interessante no MySql:
Se os campos codfor e codprod só contém números, mesmo sendo caractere, pode usar números no comando.

WHERE codfor=5 and codprod=6

Nota:
Lembre-se que .AND. é no Harbour e não no MySql. (com os pontos).
José M. C. Quintas
Harbour 3.4, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, hbnetio, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
Avatar de usuário

JoséQuintas
Colaborador

Colaborador
 
Mensagens: 9321
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 6 vezes
Mens.Curtidas: 538 vezes

Erro em comandos SQL

Mensagempor alxsts » 20 Set 2015 14:07

Olá!
JoséQuintas escreveu:Tem um detalhe interessante no MySql:
Se os campos codfor e codprod só contém números, mesmo sendo caractere, pode usar números no comando.

Este comportamento existe em todos os sistemas gerenciadores de banco de dados relacionais, que não tem seus tipos de dados fortemente tipados. No mundo dos SGBDs, isto é conhecido como "conversão implícita de tipos". Não é uma boa prática pois pode causar erros nos resultados, lentidão no processamento e abertura de brechas para SQL injection, como mostrado no artigo Implicit type conversion in MySQL. O correto é o programador passar os argumentos já convertidos nos tipos corretos. Vejam mais um artigo relacionado: MySQL Type Conversion Rules
[]´s
Alexandre Santos (AlxSts)
alxsts
Colaborador

Colaborador
 
Mensagens: 2014
Data de registro: 12 Ago 2008 15:50
Cidade/Estado: São Paulo-SP-Brasil
Curtiu: 13 vezes
Mens.Curtidas: 111 vezes

Erro em comandos SQL

Mensagempor Poka » 20 Set 2015 16:09

Obrigado Quintas e Alexandre pelas explicações.

Quintas, deu certo.

Poka
Poka
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 340
Data de registro: 25 Out 2004 21:26
Cidade/Estado: Leme/SP
Curtiu: 0 vez
Mens.Curtidas: 10 vezes

Erro em comandos SQL

Mensagempor Poka » 07 Out 2015 16:32

Olá

Esse comando aparentemente deveria dar certo
dá o erro ERROR 00000

É para deixar o campo codcli como not null ( flag = 1)

UPDATE RDB$RELATION_FIELDS SET RDB$NULL_FLAG = 1 WHERE RDB$RELATION_NAME = 'dadopro' AND RDB$FIELD_NAME = 'codcli'


se alguém puder dar uma dica.

Poka
Poka
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 340
Data de registro: 25 Out 2004 21:26
Cidade/Estado: Leme/SP
Curtiu: 0 vez
Mens.Curtidas: 10 vezes

Próximo



Retornar para SQL

Quem está online

Usuários vendo este fórum: Nenhum usuário registrado online e 1 visitante


Faça uma doação para o forum
v
Olá visitante, seja bem-vindo ao Fórum Clipper On Line!
Efetue o seu login ou faça o seu Registro