Estimado Grupo
Hay un inconveniente que no logro encontrar solucion cuando grabo un campo numerico de mas de 6 decimales, por temas de manejos de tipos de cambio, calculo de costos unitarios requiero trabajar con 8 decimales en la tabla defino como tipo de variable DOUBLE 15,8, al momento de grabar con FIELDPUT("camponro",nValorNro) donde Valornro le asigno 1.12345678 me graba el numero a 6 decimales redondeado 1.123457 como no encontre alguna solucion ni cambiando a otro tipo de variable lo grabo directamente con :
oCon:SQLQUERY( "UPDATE tablamov SET camponro="+ALLTRIM (STR(nValornro))+" WHERE nrodoc="+ALLTRIM(STR(nNro))
de esta manera parcho este impase, que no solo es con este campo sino tambien con campos que requieren calculos y los tengo que grabar a mas de 6 decimales.
el problema lo heredede al migrar de usar la clase TMYSQL a MARIADB con la clase TMYSQL no tenia este inconveniente grabando directamente con FIELDPUT()
Me inclino que el problema parte desde la clase por el redondeo a 6 digitos, como se graba correctamente con el SQLQUERY descarte que era por tipo de variable en la tabla
Esperando contar con su apoyo
Carlos Cardoza
MARIADB FIELDPUT
MARIADB FIELDPUT
Re: MARIADB FIELDPUT
Algo asi?
Code: Select all | Expand
sql
-- Example: Total 12 digits, 6 after decimal
ALTER TABLE your_table MODIFY your_column DECIMAL(18, 6);
Code: Select all | Expand
// Assuming oRs is your recordset or you are using workareas
local nValue := 12345.123456 // The 6 decimal value
// Use standard fieldPut
fieldPut( <nFieldPos>, nValue )
// OR if using TDolphin or native FWH library
oRs:FieldPut("your_column", nValue)
Code: Select all | Expand
// Alternative: Update using SQL command in FWH
cSql := "UPDATE your_table SET your_column = " + Str(nValue, 18, 6) + " WHERE id = " + Str(nId)
oCn:Execute(cSql)
Code: Select all | Expand
CREATE TABLE produtos (
id INT AUTO_INCREMENT PRIMARY KEY,
nome VARCHAR(100),
preco_unitario DECIMAL(18, 6) -- 12 dígitos inteiros + 6 casas decimais
);
Code: Select all | Expand
// Exemplo de atualização de um campo com 6 decimais
LOCAL oCn, oRs
LOCAL nValor := 123.456789 // 6 casas decimais
// ... conexão com banco de dados oCn ...
oRs := oCn:RowSet( "SELECT * FROM produtos WHERE id = 1" )
if !oRs:Eof()
oRs:Edit()
// campo, valor
oRs:FieldPut( "preco_unitario", nValor )
oRs:Save() // Salva no banco de dados com a precisão correta
endif
Code: Select all | Expand
oCol:bStrData := { || Transform( oRs:preco_unitario, "999,999,999.999999" ) }
Code: Select all | Expand
LOCAL nNovoPreco := 50.123456
LOCAL nId := 1
oCn:Execute( "UPDATE produtos SET preco_unitario = " + ;
Str( nNovoPreco, 18, 6 ) + ; // Converte para string com 6 decimais
" WHERE id = " + Str( nId ) )
https://mariadb.com/docs/server/referen ... es/decimal
Regards, saludos.
Re: MARIADB FIELDPUT
El problema es a 8 decimales cuando grabo con FIELDPUT la variable con valor 1.12345678 me graba con 1.123457 (redondea el ultimo digito)
Cuando ejecuto query UPDATE con SQLQUERY o EXECUTE graba correctamente los 8 decimales con tipo de variable DOUBLE 15,8
Re: MARIADB FIELDPUT
Beunas.
oCon:SQLQUERY( "UPDATE tablamov SET camponro="+ALLTRIM (STR(nValornro))+" WHERE nrodoc="+ALLTRIM( STR(nNro,15,8) )
Creo que si pasas el retorno de la variable en STR ( 15, 8 ) como quieres, devolverá exactamente 8 decimales.
Ver también: SET DECIMALS
Alexandre Pereira
Harbour 3.2 - FWH - 25.12 - MSVC - VsCODE - Win11
Re: MARIADB FIELDPUT
Estimado Alex2002
El problema es cuando uso FIELDPUT() que no graba los 8 decimales , lo redondea a 6 decimales
cuando lo grabo con UPDATE desde el sqlquery o execute graba correctamente los 8 decimales
Re: MARIADB FIELDPUT
Lo entendí.
Por casualidad obtendrás un error si lo haces:
FIELDPUT("camponro", str(nValorNro, 15, 8 ) )
?
O sino:
nDecAnt := Set( _SET_DECIMALS, 8 )
FIELDPUT("camponro", nValorNro )
Set( _SET_DECIMALS, nDecAnt )
prueba
Alexandre Pereira
Harbour 3.2 - FWH - 25.12 - MSVC - VsCODE - Win11