Erro em comandos SQL

Forum sobre SQL.

Moderador: Moderadores

Avatar do usuário
Poka
Usuário Nível 4
Usuário Nível 4
Mensagens: 563
Registrado em: 25 Out 2004 21:26
Localização: Leme/SP

Erro em comandos SQL

Mensagem por Poka »

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

Código: Selecionar todos

  	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

Código: Selecionar todos

  	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

Código: Selecionar todos

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
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

Erro em comandos SQL

Mensagem por alxsts »

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:

Código: Selecionar todos

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)
Avatar do usuário
Poka
Usuário Nível 4
Usuário Nível 4
Mensagens: 563
Registrado em: 25 Out 2004 21:26
Localização: Leme/SP

Erro em comandos SQL

Mensagem por Poka »

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
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Erro em comandos SQL

Mensagem por JoséQuintas »

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.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
Poka
Usuário Nível 4
Usuário Nível 4
Mensagens: 563
Registrado em: 25 Out 2004 21:26
Localização: Leme/SP

Erro em comandos SQL

Mensagem por Poka »

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
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Erro em comandos SQL

Mensagem por JoséQuintas »

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.

Código: Selecionar todos

INSERT INTO CLIENTES ( NOME ) VALUES ( 'ANTONIO D\'AGUA' )
ou até mesmo a própria barra

Código: Selecionar todos

INSERT INTO CLIENTES ( NOME ) VALUES ( 'TAMBEM ACEITA A BARRA \\' )
É por isso que uso uma função:

Código: Selecionar todos

"INSERT INTO CLIENTES ( NOME ) VALUES ( " + StringSql( cTexto ) + ")"
E na função trato exceções, se existirem.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Erro em comandos SQL

Mensagem por JoséQuintas »

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/bu ... &busca=nao
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
Poka
Usuário Nível 4
Usuário Nível 4
Mensagens: 563
Registrado em: 25 Out 2004 21:26
Localização: Leme/SP

Erro em comandos SQL

Mensagem por Poka »

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.

Código: Selecionar todos

   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
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

Erro em comandos SQL

Mensagem por alxsts »

Olá!

Em SQL é um pouco diferente. Tem que montar os critérios usando operadores lógicos. Exemplo:

Código: Selecionar todos

UPDATE tbOrder
   SET idOrderStatus = 100
 WHERE idCustomer = 7056
   AND dtOrder = '2015-08-31'
[]´s
Alexandre Santos (AlxSts)
Avatar do usuário
Poka
Usuário Nível 4
Usuário Nível 4
Mensagens: 563
Registrado em: 25 Out 2004 21:26
Localização: Leme/SP

Erro em comandos SQL

Mensagem por Poka »

Valeu Alexandre, deu certo


Poka
Avatar do usuário
Poka
Usuário Nível 4
Usuário Nível 4
Mensagens: 563
Registrado em: 25 Out 2004 21:26
Localização: Leme/SP

Erro em comandos SQL

Mensagem por Poka »

Olá a todos

preciso de + uma ajuda

xtotkilos:=str( 5800,6,0)

Código: Selecionar todos

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
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Erro em comandos SQL

Mensagem por JoséQuintas »

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

Código: Selecionar todos

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

Código: Selecionar todos

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:

Código: Selecionar todos

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.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

Erro em comandos SQL

Mensagem por alxsts »

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)
Avatar do usuário
Poka
Usuário Nível 4
Usuário Nível 4
Mensagens: 563
Registrado em: 25 Out 2004 21:26
Localização: Leme/SP

Erro em comandos SQL

Mensagem por Poka »

Obrigado Quintas e Alexandre pelas explicações.

Quintas, deu certo.

Poka
Avatar do usuário
Poka
Usuário Nível 4
Usuário Nível 4
Mensagens: 563
Registrado em: 25 Out 2004 21:26
Localização: Leme/SP

Erro em comandos SQL

Mensagem por Poka »

Olá

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

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

Código: Selecionar todos

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
Responder