FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour MARIADB FIELDPUT
Posts: 42
Joined: Thu Jul 13, 2006 12:20 AM
MARIADB FIELDPUT
Posted: Wed Apr 29, 2026 04:38 PM

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

Posts: 8515
Joined: Tue Dec 20, 2005 07:36 PM
Re: MARIADB FIELDPUT
Posted: Wed Apr 29, 2026 04:56 PM

Algo asi?

sql
-- Example: Total 12 digits, 6 after decimal
ALTER TABLE your_table MODIFY your_column DECIMAL(18, 6);
// 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)
// 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)
CREATE TABLE produtos (
    id INT AUTO_INCREMENT PRIMARY KEY,
    nome VARCHAR(100),
    preco_unitario DECIMAL(18, 6) -- 12 dígitos inteiros + 6 casas decimais
);
// 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
oCol:bStrData := { || Transform( oRs:preco_unitario, "999,999,999.999999" ) }
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://forums.fivetechsupport.com/viewtopic.php?t=46376

https://mariadb.com/docs/server/reference/data-types/numeric-data-types/decimal

Regards, saludos.

João Santos - São Paulo - Brasil - Phone: +55(11)95150-7341
Posts: 42
Joined: Thu Jul 13, 2006 12:20 AM
Re: MARIADB FIELDPUT
Posted: Wed Apr 29, 2026 05:24 PM

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

Posts: 17
Joined: Fri Apr 18, 2008 02:41 PM
Re: MARIADB FIELDPUT
Posted: Wed Apr 29, 2026 05:32 PM

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

Posts: 42
Joined: Thu Jul 13, 2006 12:20 AM
Re: MARIADB FIELDPUT
Posted: Wed Apr 29, 2026 05:37 PM

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

Posts: 17
Joined: Fri Apr 18, 2008 02:41 PM
Re: MARIADB FIELDPUT
Posted: Wed Apr 29, 2026 05:58 PM

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

Continue the discussion