Makro in Base: ResultSet was set to forward only.

Hallo zusammen,

ich habe in einem Makro den Versuch gemacht mit so einer Konstruktion
wie sie im Handbuch beschrieben ist

bRichtig = oResult.lastIF oResult.Last THEN

   iZaehler = oResult.getRow

etc. etc

die Anzahl der Datensätze in einem Abfrageergebnis herauszufinden,
bekomme aber eine Fehlermeldung, die wie folgt aussieht:

    BASIC-Laufzeitfehler.
    Es ist eine Ausnahme aufgetreten
    Type: com.sun.star.sdbc.SQLException
    Message: ResultSet was set to forward only.

Wenn ich jetzt "ResultSet was set to forward only." bei Google in die
Suche schmeisse, bekomme ich so Antworten wie bei
http://de.openoffice.info/viewtopic.php?f=8&t=9757

    musst du noch den ResultSetType festlegen:|

        oStatement.ResultSetType =
com.sun.star.sdbc.ResultSetType.SCROLL_SENSITIVE

    Danach geht es dann mit der SQL-Abfrage weiter.

Und wenn ich das dann tue, dann bekomme ich ne Fehlermeldung die lautet:

    Lesefehler.
    Eigenschaft ist schreibgeschützt

Und dann bin ich mit meinem Latein am Ende.

Kann mir jemand über diese Hürde hinweg helfen?

Wäre obercool.

Wolfgang

Hallo Wolfgang,

    musst du noch den ResultSetType festlegen:|

        oStatement.ResultSetType =
com.sun.star.sdbc.ResultSetType.SCROLL_SENSITIVE
>
    Danach geht es dann mit der SQL-Abfrage weiter.

Und wenn ich das dann tue, dann bekomme ich ne Fehlermeldung die lautet:

    Lesefehler.
    Eigenschaft ist schreibgeschützt

Laut :

http://docs.libreoffice.org/dbaccess/html/RowSet_8cxx_source.html

bzw Linien 1588-1632

wird erstmal probiert, welche Fähigkeiten den DB-Treiber, bzw die
DB-Verbindung besitzt :

{
1599 // try type/concurrency settings with decreasing usefulness, and
rely on what the connection claims
1600 // to support
1601 Reference< XDatabaseMetaData > xMeta(
m_xActiveConnection->getMetaData() );
1602
1603 sal_Int32 nCharacteristics[5][2] =
1604 { { ResultSetType::SCROLL_SENSITIVE,
ResultSetConcurrency::UPDATABLE },
1605 { ResultSetType::SCROLL_INSENSITIVE,
ResultSetConcurrency::UPDATABLE },
1606 { ResultSetType::SCROLL_SENSITIVE, ResultSetConcurrency::READ_ONLY },
1607 { ResultSetType::SCROLL_INSENSITIVE,
ResultSetConcurrency::READ_ONLY },
1608 { ResultSetType::FORWARD_ONLY, ResultSetConcurrency::READ_ONLY }
1609 };

Es wird immer ein Mindestwert gesetzt, welches nicht die Fähigkeiten
überfordern kann :

1619 // don't try type/concurrency pairs which are more featured than
what our caller requested
1620 if ( nResultSetType > _nDesiredResultSetType )
1621 continue;
1622 if ( nResultSetConcurrency > _nDesiredResultSetConcurrency )
1623 continue;
1624
1625 if ( xMeta.is() && xMeta->supportsResultSetConcurrency(
nResultSetType, nResultSetConcurrency ) )
1626 break;

Mit Spreadsheets, CSV, Text-Tabellen, sind die Dateien schreibgeschutzt
(readonly), also wird diese Verbindung normalerweise als solche markiert :

1611 if ( m_xActiveConnection->getMetaData()->isReadOnly() )
1612 i = 2; // if the database is read-only we only should use
read-only concurrency

Alex

Hallo Wolfgang,

ich habe in einem Makro den Versuch gemacht mit so einer Konstruktion
wie sie im Handbuch beschrieben ist

bRichtig = oResult.lastIF oResult.Last THEN
   iZaehler = oResult.getRow
etc. etc

Ich gehe davon aus, dass wir beim Makrokapitel teilweise noch etwas
nachjustieren und vor allem zusätzlich erklären müssen.
IF oResult.Last THEN ...
geht nicht.
Für oResult.Last müsste den Zeiger auf den letzten Datensatz setzen.
(Steht im Handbuch etwas weiter unten)
IF oResult.IsLast THEN ...
funktioniert hingegen so, dass es nachforscht, ob der Zeiger endlich auf
dem letzten Datensatz sitzt.

Komplett also in etwa so etwas, ausgeführt direkt in dem
Datenbankdokument ...

.... und hier noch ein Nachtrag: