Clipper On Line • Ver Tópico - Erro em comandos SQL
Mudar para estilo Clássico
Discussão sobre SQL
Postar uma resposta

Erro em comandos SQL

11 Abr 2017 13:11

Olá a todos

assim dá certo

Código:
xicms:=str(12.00,5,2)
  str:="update nomeTab  set alicms = '"+xicms+"';"



assim dá erro porque estou somando número com string
já tentei com CAST, mas não consegui.

Código:
  xicms:=12.00
  str:="update nomeTab  set alicms = '"+xicms+"';"


teria que transformar o numérico em string na linha de comando.

alguém tem algum exemplo?

Poka

Erro em comandos SQL

11 Abr 2017 18:40

Olá!

Você mesmo respondeu... tem que converter.

Achei estranho o valor da alíquota estar entre apóstrofes, indicando que a coluna da tabela no banco é do tipo carácter. Neste caso, a variável numérica xicms tem que ser convertida para string e o resultado colocado entre aspas ou apóstrofes no comando SQL:
Código:
xicms := 12.00
cStr :="update nomeTab  set alicms = ' " + AllTrim( Str( xicms, 5,2 ) ) + " ' ;"


Se o tipo de dados na tabela for numérico, ficaria assim:
Código:
xicms := 12.00
cStr :="update nomeTab  set alicms = " + AllTrim( Str( xicms, 5,2 ) ) + ";"


O mais indicado é criar funções que retornem os valores já convertidos e, quando necessário, entre aspas ou apóstrofes.

Erro em comandos SQL

11 Abr 2017 19:25

Ou, talvez mais fácil de decidir, veja a string que precisa e se a fórmula retornou a string correta.

Código:
update nometab set alicms = '12.00'
update nometab set alicms = 12.00

Erro em comandos SQL

12 Abr 2017 08:33

Obrigado Alexandre e Quintas.

Código:
cStr :="update nomeTab  set alicms = " + AllTrim( Str( xicms, 5,2 ) ) + ";"


já tinha testado com str e não dava, acho que tinha feito algo errado. Mas deu certo, inclusive com com apóstrofes se sem.

Poka

Erro em comandos SQL

12 Abr 2017 10:02

É apenas uma sugestão:

Como vai usar muito, ao invés de AllTrim( Str() ) pode ser interessante criar sua própria função, por exemplo NumberSql()
Não parece, mas se usa muito, vai ajudar até a reduzir o tamanho do EXE, além de padronizar.

Código:
FUNCTION NumberSql( xValue, nInt, nDec )

   RETURN AllTrim( Str( xValue, nInt, nDec ) )


Em termos de fonte, está trocando a chamada de duas funções por uma única chamada.
Supondo que use 1.000 vezes, vai reduzir 1.000 chamadas em fonte, ou reduzir pela metade.

E pode fazer o mesmo pra strings, datas, etc.

Só um comentário extra:
Não sei se postou apenas parte do comando, mas isso trocaria o arquivo inteiro de uma vez.
Ao contrário do xbase, em SQL o default é todo o arquivo, e não apenas o registro atual.

Erro em comandos SQL

12 Abr 2017 14:42

Bem lembrado Quintas, já tenho uma função para data, realmente facilita bastante.

Obrigado

Poka

Erro em comandos SQL

12 Abr 2017 19:44

Olá!

Poka escreveu:Mas deu certo, inclusive com com apóstrofes se sem.

Isto ocorre porque o otimizador de queries do SGBD executa o comportamento padrão dele, chamado de conversão implícita,sempre que possível. Assim, se o comando manda gravar uma string em uma coluna de tipo numérico, o otimizador converte a string para numérico. Caso tente gravar um numérico em um campo string, converte o numérico para string. Não dá erro mas, consome mais recursos. O ideal é enviar sempre o valor representado no tipo de dados igual ao da coluna da tabela.

JoséQuintas escreveu:Como vai usar muito, ao invés de AllTrim( Str() ) pode ser interessante criar sua própria função, por exemplo NumberSql()
alxsts escreveu:O mais indicado é criar funções que retornem os valores já convertidos e, quando necessário, entre aspas ou apóstrofes.

Erro em comandos SQL

13 Abr 2017 16:41

Obrigado Alexandre pela explicação.
mais uma situação .
na linha abaixo por exemplo.
Código:
"update  nomeTabela  set  vlcofins = vlmerc*3.78/100;"

ok
Código:
"update  nomeTabela  set  vlcofins = vlmerc/100*3.78;"

Dá diferença de centavos, isto porque o resultado da divisão, considera somente 2 casas, como fazer para considerar 5 casas decimais por exemplo.
não vi uma função no firebird para essa situação.

Obrigado
Poka
Postar uma resposta