Base データの読込み
戻 る   

テーブルのデータをマクロで読み込む場合、
まず、条件に当てはまるデータが存在するかを調べ、
データが存在するとき、
  • 読み込むレコードの位置をセットする。
  • その位置のデータを読み込む
ことになります。

[レコードの位置]
  • 先頭レコードの前(BeforeFirst)
  • 先頭レコード(First)
  • 最終レコード(Last)
  • 最終レコードの次(AfterLast)
   レコードの位置を示す用語として「カーソル」があります。
結果セットを取得した当初、カーソルは先頭レコードの前(BeforeFirst)にあります。

結果セットにデータがあるときは、next()メソッドで 先頭~最終までの移動できます。
(移動に成功すると、next()メソッドはTrueを返します。)

(Nullでない)結果セットに「データがない」(レコード件数が0)状態で、 現在のカーソル位置を確認するメソッドを使うと、
isBeforeFirst()、isAfterLast()がともに True を返します。
データがないとき、カーソルは最終レコードの次(AfterLast)も指しています。 next()を行うと、移動できないため、Falseを返します。

[レコードの移動]
   次のメソッドが用意されています。
next() 次のデータレコードへ移動。
previous() 前のデータレコードへ移動。
first() 最初のデータレコードへ移動。
last() 最後のデータレコードへ移動。
beforeFirst() 最初のデータレコードの前へ移動。
afterLast() 最後のデータレコードの次へ移動。

初期値では、next()メソッドのみ使用可能。
変更するには、Statement.ResultSetTypeに
SCROLL_INSENSITIVE または SCROLL_SENSITIVE を指定する。
Statement.ResultSetType = 1004
Statement.ResultSetType = 1005

FORWARD_ONLY 1003  [初期値]
SCROLL_INSENSITIVE 1004
ResultSet にすべてのナビゲーションを許可する。
オリジナルデータへの変更は記録しない。
SCROLL_SENSITIVE 1005
ResultSet にすべてのナビゲーションを許可。
オリジナルデータへの変更による ResultSet への影響を認める。

[フィールド名からデータを取得する]
     フィールド番号からデータを取得する関数は用意されています。
dstr = resultset.getString([フィールドNo])
フィールド名からフィールド番号を取得する関数もあります。
fldindex = resultset.findColumn("[フィールド名]")
この2つの関数を組み合わせてフィールド名からデータを取得できます。
dstr = resultset.getString(resultset.findColumn("[フィールド名]"))

[レコード件数]
   結果セットのプロパティに「レコード件数」に該当するものは 用意されていないため、
集約関数count()を用いて件数を取得します。
sqlstr = "Select Count(*) from [Table名] where ~"
Rem フィールド番号を入れて、
dstr = ResultSet.getString(1)
recs = CLng(dstr)

LibreOffice 4.1.X~4.2.Xの場合、「AS エイリアス」句を使用可能
sqlstr = "Select Count([フィールド名]) as RecCount from [Table名] where ~"
fldindex = ResultSet.findColumn("RecCount")
dstr = ResultSet.getString(fldindex)
recs = CLng(dstr)

Baseのマニュアルには、「関数」の項で、
「SQLステートメントでは対象となる関数を次のように呼び出します。」
いくつか構文例が示されていて、その中に
  SELECT FUNCTION() AS エイリアス FROM table
とあるのですが、LibreOffice 4.3、4.4では、エイリアス句を使うと 「Basic ランタイムエラー」が出ました。 エラーは、count()とエイリアスの間に「演算子がない」、というもので、 SQL文をエイリアス句として解析していないのです。(2015/08/12現在)



フィールド名からデータを取得する
Rem resultset:結果セット、 fldname:フィールド名
Rem 文字列型で返す
Function GetDBDataValStr(resultset as Object, ByVal fldname as String) As String
     Dim fldindex as Long
Dim dstr as String

If IsNull(resultset) Then
dstr = ""
Else
fldindex = resultset.findColumn(fldname)
dstr = resultset.getString(fldindex)
End If
GetDBDataValStr = dstr
End Function
フィルターに対応するレコード件数を取得する
Rem tblname:テーブル名、filterstr:検索条件
Rem 件数をLong型で返す
Function GetDBRecCount(ByVal tblname as String, ByVal filterstr as String) As Long
     Dim Doc as Object
Dim Form as Object
Dim Connection as Object
Dim Statement as Object
Dim ResultSet as Object
Dim sqlstr as String
Dim dstr as String
Dim recs as Long

filterstr = Trim(filterstr)
If filterstr = "" Then
sqlstr = "Select Count(*) from "+tblname
Else
sqlstr = "Select Count(*) from "+tblname+" where "+filterstr
End If

Doc = ThisComponent
Form = Doc.getDrawPage().getForms().getByName("MainForm")

REM ***** SQL接続 *****
Connection = Form.ActiveConnection
Statement = Connection.createStatement()
ResultSet = Statement.executeQuery(sqlstr)

If IsNull(ResultSet) Then
recs = 0
Else
ResultSet.next()
dstr = ResultSet.getString(1)
recs = CLng(dstr)
End If

ResultSet.Close()
Statement.Close()

GetDBRecCount = recs
End Function
戻 る