Página 5 de 5

Erro em comandos SQL

Enviado: 11 Abr 2017 13:11
por Poka
Olá a todos



assim dá certo

Código: Selecionar todos

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: Selecionar todos

  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

Enviado: 11 Abr 2017 18:40
por alxsts
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: Selecionar todos

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: Selecionar todos

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

Enviado: 11 Abr 2017 19:25
por JoséQuintas
Ou, talvez mais fácil de decidir, veja a string que precisa e se a fórmula retornou a string correta.

Código: Selecionar todos

update nometab set alicms = '12.00'
update nometab set alicms = 12.00

Erro em comandos SQL

Enviado: 12 Abr 2017 08:33
por Poka
Obrigado Alexandre e Quintas.

Código: Selecionar todos

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

Enviado: 12 Abr 2017 10:02
por JoséQuintas
É 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: Selecionar todos

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

Enviado: 12 Abr 2017 14:42
por Poka
Bem lembrado Quintas, já tenho uma função para data, realmente facilita bastante.

Obrigado

Poka

Erro em comandos SQL

Enviado: 12 Abr 2017 19:44
por alxsts
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

Enviado: 13 Abr 2017 16:41
por Poka
Obrigado Alexandre pela explicação.
mais uma situação .
na linha abaixo por exemplo.

Código: Selecionar todos

 "update  nomeTabela  set  vlcofins = vlmerc*3.78/100;"
ok

Código: Selecionar todos

 "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