Сброс SQL Query / Recordset в LO Cal c Лист с использованием базового c кода и диапазона - PullRequest
1 голос
/ 13 февраля 2020

Я новичок в Cal c, и я использую, чтобы иметь возможность сделать что-то подобное в Excel / VB. Приведенный ниже код извлекает SP из MySql и делает именно то, что я хочу, за исключением Пока l oop. В VB я смог l oop через набор записей и вывести его в диапазон, например, «ActiveWorkbook.Sheets (1) .Range (« A5 »). CopyFromRecordset rs». Без необходимости go столбец за столбцом. Есть ли что-нибудь в Basi c -Cal c, как это? Я просмотрел все и ничего не встречал.

...

Sub  RetriveData()
Dim RowSetObj As Object, ConnectToDatabase As Object

DATABASE_NAME = "file:///home/jod/Documents/test.odb"

DBContext=createUnoService("com.sun.star.sdb.DatabaseContext")
DataSource=DBContext.getByName(DATABASE_NAME)

If Not DataSource.IsPasswordRequired Then
ConnectToDatabase = DataSource.GetConnection("","")
Else
  InteractionHandler = createUnoService("com.sun.star.sdb.InteractionHandler")
ConnectToDatabase = DataSource.ConnectWithCompletion(InteractionHandler)
End If


oURL="file:///home/jod/Documents/CodExm3.ods"
oDoc=StarDesktop.loadComponentFromURL(oURL, "_blank", 0, Array())
oSheet=oDoc.Sheets(0)
oSheet.Name="Tasks"

SQLQuery= "call GVWC_DB.TestSP();"
SQLStatement=ConnectToDatabase.createStatement
RowSetObj=SQLStatement.executeQuery (SQLQuery)

While RowSetObj.Next
i=i+1
oCell=oSheet.getCellByPosition(0,i)
oCell.String=RowSetObj.getString(1)
oCell=oSheet.getCellByPosition(1,i)
oCell.String=RowSetObj.getString(2)
oCell=oSheet.getCellByPosition(2,i)
oCell.String=RowSetObj.getString(3)
oCell=oSheet.getCellByPosition(3,i)
oCell.String=RowSetObj.getString(4)
oCell=oSheet.getCellByPosition(4,i)
oCell.String=RowSetObj.getString(5)
oCell=oSheet.getCellByPosition(5,i)
oCell.String=RowSetObj.getString(6)
oCell=oSheet.getCellByPosition(6,i)
oCell.String=RowSetObj.getString(7)
oCell=oSheet.getCellByPosition(7,i)
oCell.String=RowSetObj.getString(8)
oCell=oSheet.getCellByPosition(8,i)
oCell.String=RowSetObj.getString(9)
oCell=oSheet.getCellByPosition(9,i)
oCell.String=RowSetObj.getString(10)
oCell=oSheet.getCellByPosition(10,i)
oCell.String=RowSetObj.getString(11)
oCell=oSheet.getCellByPosition(11,i)
oCell.String=RowSetObj.getString(12)
oCell=oSheet.getCellByPosition(12,i)
oCell.String=RowSetObj.getString(13)
oCell=oSheet.getCellByPosition(13,i)
oCell.String=RowSetObj.getString(14)
oCell=oSheet.getCellByPosition(14,i)
oCell.String=RowSetObj.getString(15)
oCell=oSheet.getCellByPosition(15,i)




Wend

oSheet.getRows.insertByIndex( 0, 6 )

'Sheet.Columns.removeByIndex(5, 1)

End Sub
...

1 Ответ

0 голосов
/ 14 февраля 2020

LibreOffice API не нравится гигантские c команды «все, все в одном», как в VBA. Вместо этого все, что требуется, это простой For l oop.

resultSet = SQLStatement.executeQuery(SQLQuery)
While resultSet.next()
    For iCol = 1 To resultSet.getMetaData().getColumnCount()
        oCell = oSheet.getCellByPosition(iCol - 1, resultSet.getRow())
        oCell.String = resultSet.getString(iCol)
    Next
Wend

. Это работает, если все, что вам нужно, это строковое представление данных. При использовании таких методов, как getInt() с некоторыми столбцами, For l oop может оказаться не лучшим выбором.

Документация: ResultSet

...