Clipper On Line • Ver Tópico - Erro em comandos SQL

Erro em comandos SQL

Discussão sobre SQL

Moderador: Moderadores

 

Erro em comandos SQL

Mensagempor Poka » 11 Abr 2017 13:11

Olá a todos

assim dá certo

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.

  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
Avatar de usuário

Poka
Usuário Nível 4

Usuário Nível 4
 
Mensagens: 509
Data de registro: 25 Out 2004 21:26
Cidade/Estado: Leme/SP
Curtiu: 0 vez
Mens.Curtidas: 23 vezes

Erro em comandos SQL

Mensagempor alxsts » 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:
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:
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)
alxsts
Colaborador

Colaborador
 
Mensagens: 2943
Data de registro: 12 Ago 2008 15:50
Cidade/Estado: São Paulo-SP-Brasil
Curtiu: 21 vezes
Mens.Curtidas: 248 vezes

Erro em comandos SQL

Mensagempor JoséQuintas » 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.

update nometab set alicms = '12.00'
update nometab set alicms = 12.00
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"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 de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18013
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Erro em comandos SQL

Mensagempor Poka » 12 Abr 2017 08:33

Obrigado Alexandre e Quintas.

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 de usuário

Poka
Usuário Nível 4

Usuário Nível 4
 
Mensagens: 509
Data de registro: 25 Out 2004 21:26
Cidade/Estado: Leme/SP
Curtiu: 0 vez
Mens.Curtidas: 23 vezes

Erro em comandos SQL

Mensagempor JoséQuintas » 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.

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, multithread, dbfcdx, ADO+MySql, PNotepad
"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 de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18013
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Erro em comandos SQL

Mensagempor Poka » 12 Abr 2017 14:42

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

Obrigado

Poka
Avatar de usuário

Poka
Usuário Nível 4

Usuário Nível 4
 
Mensagens: 509
Data de registro: 25 Out 2004 21:26
Cidade/Estado: Leme/SP
Curtiu: 0 vez
Mens.Curtidas: 23 vezes

Erro em comandos SQL

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

Colaborador
 
Mensagens: 2943
Data de registro: 12 Ago 2008 15:50
Cidade/Estado: São Paulo-SP-Brasil
Curtiu: 21 vezes
Mens.Curtidas: 248 vezes

Erro em comandos SQL

Mensagempor Poka » 13 Abr 2017 16:41

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

ok
 "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
Avatar de usuário

Poka
Usuário Nível 4

Usuário Nível 4
 
Mensagens: 509
Data de registro: 25 Out 2004 21:26
Cidade/Estado: Leme/SP
Curtiu: 0 vez
Mens.Curtidas: 23 vezes

Anterior



Retornar para SQL

Quem está online

Usuários vendo este fórum: Nenhum usuário registrado online e 7 visitantes


Ola Amigo, espero que meu site e forum tem lhe beneficiado, com exemplos e dicas de programacao.
Entao divulgue o link da Doacao abaixo para seus amigos e redes sociais ou faça uma doacao para o site forum...
MUITO OBRIGADO PELA SUA DOACAO!
Faça uma doação para o forum
cron
v
Olá visitante, seja bem-vindo ao Fórum Clipper On Line!
Efetue o seu login ou faça o seu Registro