INSERT INTO COM VALORES DOUBLE NAO VAI.

FBUR 13/08/2009 15:29:35
#319781
Boa tarde!

Estou fazendo um INSERT INTO da seguite forma:

strSQL = [Ô]INSERT INTO tblpagtos [Ô] & _
[Ô](datapagto,nf,datanf,idFornec,descricao,[Ô] & _
[Ô]valortotal,parcelas,valorparcelas,vcto,tipo,obs,status,parcela) [Ô] & _
[Ô]VALUES ([ô][Ô] & a & _
[Ô][ô],[ô][Ô] & b & _
[Ô][ô],[ô][Ô] & c & _
[Ô][ô],[ô][Ô] & d & _
[Ô][ô],[ô][Ô] & e & _
[Ô][ô],[ô][Ô] & f & _
[Ô][ô],[ô][Ô] & g & _
[Ô][ô],[ô][Ô] & h & _
[Ô][ô],[ô][Ô] & i & _
[Ô][ô],[ô][Ô] & j & _
[Ô][ô],[ô][Ô] & k & _
[Ô][ô],[ô][Ô] & l & _
[Ô][ô],[ô][Ô] & m & [Ô][ô])[Ô]

[ô] cn.Execute (strSQL)


As variáveis a,b,c,d... são valores tipo double, data, integer, string...

O problema está nos valores DOUBLE. Especificamente as variáveis tipo DOUBLE f (guarda o valor total) e h (guarda um valor parcelado), quando tentam ser adicionadas no banco, dá pau.

A mensagem de erro é [Ô]DATA TRUNCATED COLUMN FOR COLUMN...[Ô] a mesma deste post:

http://www.vbmania.com.br/pages/index.php?varModulo=Forum&varMethod=Abrir&varID=275931&varWorld=

Mas não deu pra ler... o texto tá todo esquisito.

Os campos que dão os erros são DOUBLE, já que os valores são do tipo 99,99. Já mudei para FLOAT e outros mais mas sempre dá o erro.

Se eu coloco a variável no formato:

f = format(valor_double, [Ô]0.00[Ô])

Dá o mesmo erro.

Se eu coloco:

f = format(data, [Ô]0,00[Ô])

o valor é arrendondado.

Usando o MySQL Administrator e fazendo uma inclusão direto no banco, fixando o valor em, digamos, 34,87, dá pau.
Se eu fizer essa mesma inclusão, só que usando ponto (assim: 34.87) dá certo.

Mas se no VB eu formatar usando a vírgula, o valor vira 35,00 redondo. Se formatar usando o ponto, dá pau.

E agora?

[]'s
TECLA 13/08/2009 16:46:07
#319795
Já tentou um REPLACE?

f = Replace(Replace(valor_double, [Ô].[Ô], [Ô][Ô]), [Ô],[Ô], [Ô].[Ô])
RCMRO 13/08/2009 22:00:02
#319829
FBUR,

Se são campos numéricos, porque vc incluia ASPAS SIMPLES para os relacionar? Campos numéricos não podem estar dentro de ASPAS SIMPLES, todos eles....
Experimenta sem elas: (tirei só para o F e H)


Dim F as String
Dim H as String

f = Replace(Replace(format(valor_double_f, [Ô]0.00[Ô]), [Ô].[Ô], [Ô][Ô]), [Ô],[Ô], [Ô].[Ô])
h = Replace(Replace(format(valor_double_h, [Ô]0.00[Ô]), [Ô].[Ô], [Ô][Ô]), [Ô],[Ô], [Ô].[Ô])
strSQL = [Ô]INSERT INTO tblpagtos [Ô] & _
[Ô](datapagto,nf,datanf,idFornec,descricao,[Ô] & _
[Ô]valortotal,parcelas,valorparcelas,vcto,tipo,obs,status,parcela) [Ô] & _
[Ô]VALUES ([ô][Ô] & a & _
[Ô][ô],[ô][Ô] & b & _
[Ô][ô],[ô][Ô] & c & _
[Ô][ô],[ô][Ô] & d & _
[Ô][ô],[ô][Ô] & e & _
[Ô][ô],[Ô] & f & _
[Ô],[ô][Ô] & g & _
[Ô][ô],[Ô] & h & _
[Ô],[ô][Ô] & i & _
[Ô][ô],[ô][Ô] & j & _
[Ô][ô],[ô][Ô] & k & _
[Ô][ô],[ô][Ô] & l & _
[Ô][ô],[ô][Ô] & m & [Ô][ô])[Ô]
ARNALDOCRUZ 13/08/2009 22:31:13
#319831

coloque assim

,[ô][Ô] & Str(ccur(campovalor)) & [Ô][ô],[ô][Ô]

[Ô]VALUES ([ô][Ô] & str(ccur(a)) & _
[Ô][ô],[ô][Ô] & str(ccur(b)) & _
[Ô][ô],[ô][Ô] & str(ccur(c)) & _
[Ô][ô],[ô][Ô] & d & _
FBUR 14/08/2009 11:03:17
#319860
Citação:

Já tentou um REPLACE?

f = Replace(Replace(valor_double, [Ô].[Ô], [Ô][Ô]), [Ô],[Ô], [Ô].[Ô])



Legal! Não sabia da existência dessa função... Bem útil! Funcionou belezinha. :) Usando a função Replace, dá para fazer a inclusão com ou sem aspas simples.
Só que tenho q declarar as variáveis f e h como Variant. Se for Double ou Currency, o mesmo problema acontece: 6,80 vira 680.

Uma observação, se eu fizer a inclusão através de recordset, o erro não acontece, o tipo da variável pode ser double e não preciso usar o Replace:


strSQL = [Ô]SELECT * FROM tblpagtos[Ô]
Set rs = New ADODB.Recordset
rs.Open strSQL, cn, adOpenKeyset, adLockPessimistic

rs.AddNew
rs!datapagto = a
rs!nf = b
rs!datanf = c
rs!idFornec = d
rs!descricao = e
rs!valortotal = f
rs!parcelas = g
rs!valorparcelas = h
rs!vcto = i
rs!tipo = j
rs!obs = k
rs!Status = l
rs!parcela = cont

rs.Update
Next cont


rs.Close

Set rs = Nothing



As variáveis f e h são do tipo Double e só recebem os conteúdos de Textbox. Ex: f = 56,50 e h = 28,25. E a inclusão no banco ocorre sem problemas... Pq será?
RCMRO 14/08/2009 14:50:03
#319882
FBUR,

Você está enfrentando problemas de conversao IMPLICITA de tipos de variáveis.
O legal é trabalhar SEMPRE com o mesmo tipo de variável e todas as conversões seram EXPLICITAS para que não tenha mais surpresas. Se for gravar um [Ô]STRINGÃO[Ô] com toda a instrução SQL, converta todas as numéricas e string para evitar problemas. Claro que via Recordset você não precisa converter pois numérico é numérico e string é string mas, com certeza, é mais lento do que EXECUTE direto no SGBD. Ai vai depender do volume de dados.
Isso explanado, tem sim importância se você colocar valores numérios entre ASPAS SIMPLES pois eles terão que ser TRADUZIDOS para números antes de serem gravados. STRING é entre ASPAS SIMPLES, números NÃO.

Pense nisso... Irá ajudar bastante a melhorar a qualidade do seu código no futuro.

PS.: CONVERSÕES IMPLICITAS -> O computador tenta adivinhar o que você quer. Ex.: A$ = 10 ==> Vai virar [Ô]10[Ô]
CONVERSÕES EXPLICITAS -> você diz o que você quer e não deixa o computador tentar adivinhar. Ex.: A$ = STR(10) ==> TEM que virar [Ô]10[Ô]

Valeu. Abraços.
Tópico encerrado , respostas não são mais permitidas