Página 1 de 5

Erro em comandos SQL

Enviado: 14 Ago 2015 11:02
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

Erro em comandos SQL

Enviado: 14 Ago 2015 12:43
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;"

Erro em comandos SQL

Enviado: 14 Ago 2015 14:17
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

Erro em comandos SQL

Enviado: 14 Ago 2015 19:48
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.

Erro em comandos SQL

Enviado: 27 Ago 2015 11:34
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

Erro em comandos SQL

Enviado: 27 Ago 2015 12:16
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.

Erro em comandos SQL

Enviado: 27 Ago 2015 12:27
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

Erro em comandos SQL

Enviado: 02 Set 2015 14:48
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

Erro em comandos SQL

Enviado: 02 Set 2015 17:21
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'

Erro em comandos SQL

Enviado: 02 Set 2015 19:54
por Poka
Valeu Alexandre, deu certo


Poka

Erro em comandos SQL

Enviado: 19 Set 2015 19:56
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

Erro em comandos SQL

Enviado: 19 Set 2015 20:25
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).

Erro em comandos SQL

Enviado: 20 Set 2015 14:07
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

Erro em comandos SQL

Enviado: 20 Set 2015 16:09
por Poka
Obrigado Quintas e Alexandre pelas explicações.

Quintas, deu certo.

Poka

Erro em comandos SQL

Enviado: 07 Out 2015 16:32
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