Firebird - numeric & decimal
Lionel Elie Mamane
lionel at mamane.lu
Mon Oct 31 17:03:41 UTC 2016
Here's some example code to test this in Basic:
Sub Tst
dim stmt as object
stmt=ThisDatabaseDocument.currentController.ActiveConnection.createStatement()
dim rs as object
rs = stmt.executeQuery("SELECT * FROM ""Table1""")
dim rsmd as object
rsmd = rs.getMetaData()
dim i as integer
for i = 1 to rsmd.getColumnCount()
MsgBox "Driver says column " & i & " has type " & rsmd.getColumnType(i)
next i
End Sub
On Mon, Oct 31, 2016 at 05:53:17PM +0100, Lionel Elie Mamane wrote:
> On Mon, Oct 31, 2016 at 04:42:12PM +0100, Bunth Tamás wrote:
>
> > I tried to solve bug 74172
> > https://bugs.documentfoundation.org/show_bug.cgi?id=74172
> > but I got stuck:
>
> > In case of setting a numeric or decimal number the LO code calls the
> > prepared statement's setInt function, which has only an integer
> > value as parameter, but no scale.
>
> My guess is that the driver tells the rest of the LibreOffice code
> that this is an integer column. You updated getColumnTypeName in
> ResultSetMetadata.cxx, but not getColumnType, which still calls
> getColumnTypeFromFBType without passing a subtype. My guess is that
> this is the problem.
>
> When developing a driver, I find it convenient to test it with Macro
> (Basic or Python or whatever) code rather than with "all the rest of
> LibreOffice". Just make a statement (or prepartedstatement) object,
> execute SQL code on it, get the resulting resultset object and test
> how it behaves by calling member functions of it. In this case, to
> look that getColumType() returns the right value for DECIMAL and
> NUMERIC columns.
>
> If the above is not the problem, then hmm... How do you set the
> numeric or decimal number? With an UI element (which one), or with
> some macro code? You type a number with digits after the decimal
> point, right? Something like "1.5", not "15"?
>
> If yes, then, you know how to use gdb? Then set a breakpoint on the
> firebird driver's setInt. You should have a backtrace a bit like:
>
> #23 0x00007ff068cf6b09 in dbaccess::OCacheSet::setParameter (nPos=nPos at entry=1,
> _xParameter=uno::Reference to (dbaccess::OPreparedStatement *) 0x3eb5270, _rValue=..., _nType=_nType at entry=3,
> _nScale=_nScale at entry=4)
> at libreoffice-5-2/dbaccess/source/core/api/CacheSet.cxx:382
> #24 0x00007ff068d391d7 in dbaccess::OKeySet::executeUpdate (this=this at entry=0x3fb80b0,
> _rInsertRow=rtl::Reference to 0x3e91ea0, _rOriginalRow=rtl::Reference to 0x3b6fce0,
> i_sSQL="UPDATE \"Table1\" SET \"dfdf\" = ? WHERE \"id\" = ?", i_sTableName="",
> _aIndexColumnPositions=std::__debug::vector of length 0, capacity 0)
> at libreoffice-5-2/dbaccess/source/core/api/KeySet.cxx:581
> #25 0x00007ff068d389e0 in dbaccess::OKeySet::updateRow (this=0x3fb80b0, _rInsertRow=rtl::Reference to 0x3e91ea0,
> _rOriginalRow=rtl::Reference to 0x3b6fce0, _xTable=uno::Reference to (dbaccess::ODBTableDecorator *) 0x3fface0)
> at libreoffice-5-2/dbaccess/source/core/api/KeySet.cxx:552
> #26 0x00007ff068ddb0cb in dbaccess::ORowSetCache::updateRow (this=0x3ff79c0, _rUpdateRow=rtl::Reference to 0x3e91ea0,
> o_aBookmarks=std::__debug::vector of length 0, capacity 0)
> at libreoffice-5-2/dbaccess/source/core/api/RowSetCache.cxx:1353
> #27 0x00007ff068d9cf52 in dbaccess::ORowSet::updateRow (this=0x3e2c180)
> at libreoffice-5-2/dbaccess/source/core/api/RowSet.cxx:967
> #28 0x00007ff030990fd7 in frm::ODatabaseForm::updateRow (this=0x3e2b520)
> at libreoffice-5-2/forms/source/component/DatabaseForm.cxx:3470
>
> What is the value of _nType? Is it some value that indicates an
> integer? (like 4, 5, -6, -5) Or is it 2 or 3 (for NUMERIC,
> respectively DECIMAL)?
>
> See offapi/com/sun/star/sdbc/DataType.idl in the source code, or
> http://api.libreoffice.org/docs/idl/ref/namespacecom_1_1sun_1_1star_1_1sdbc_1_1DataType.html
> for the meaning of those values.
>
> > Another problem is that I cannot change the "Length" (precision) and
> > "Decimal places" (scale) field properties in Table Design mode.
>
> Probably a similar problem to above. The driver does not signal to the
> rest of LibreOffice that the database is ready to accept values there?
>
> It works for HSQLDB, so the LibreOffice code must be able to handle
> it, if the driver correctly supports it.
>
More information about the LibreOffice
mailing list