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



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
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á!

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.
[]´s
Alexandre Santos (AlxSts)
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 »

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
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 »

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
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 »

É 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.
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 »

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

Obrigado

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á!
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.
[]´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 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
Responder