[解決しました]レコードの書き込み禁止解除

データベース (Base) について
返信する
Kankun
記事: 22
登録日時: 7月 13, 2012, 3:06 pm

[解決しました]レコードの書き込み禁止解除

投稿記事 by Kankun »

おせわになります レコードを直接変更したいのですが レコードを書き込み禁止を解除?したいのですが かりに
context1 = createUnoService("com.sun.star.sdb.DatabaseContext")
src1 = context1.getByName("xxxxx")
cnn1 = src1.getConnection("", "")
stm1 = cnn1.createStatement()
rst1 = stm1.executeQuery("SELECT * FROM 最新状態 WHERE 車両インデックス = "+qes)
ResultSetConcurrency = UPDABLTAE
とした時 ResultSetConcurrency = UPDATABLE がBASIC runtaime error. 変数の未定義 でプログラムが止まります
ResultSetConcurrency = UPDABLTAE はどうやって使用すればいいのですか? 教えてくださいお願いします。
 
最後に編集したユーザー Kankun [ 7月 28, 2012, 4:35 pm ], 累計 1 回
OpenOffice.org 4.1.5
Win 7 10
ike@九州
記事: 33
登録日時: 4月 30, 2009, 9:05 am

Re: レコードの書き込み禁止解除

投稿記事 by ike@九州 »

service Statement のプロパティのようですね。

http://www.openoffice.org/api/docs/comm ... oncurrency

stm1.ResultSetConcurrency=1008

http://www.openoffice.org/api/docs/comm ... rency.html
Kankun
記事: 22
登録日時: 7月 13, 2012, 3:06 pm

Re: レコードの書き込み禁止解除

投稿記事 by Kankun »

ike@九州さん お返事ありがとうございました 早速ためして見ました

context1 = createUnoService("com.sun.star.sdb.DatabaseContext")
src1 = context1.getByName("xxxxx")
cnn1 = src1.getConnection("", "")
stm1 = cnn1.createStatement()

rst1 = stm1.executeQuery("SELECT * FROM 最新状態 WHERE 車両インデックス = "+qes)

stm1.ResultSetConcurrency=1008
rem ResultSetConcurrency = UPDATEABLE

と変更してみたら 取りあえずOKでしたが この後の、レコードを変更する所で

rst1.updateString(2,rst2.getString(1)) して見たところ


BASIC runTime Error.例外が発生しました
Type: com.sun.star.sdbc.SQL ExceptionMessage The result set is Read-only.

とエラーが発生しました まだRead-onlyなんですよね 
もしよろしければ アドバイスしてください よろしくおねがいします
OpenOffice.org 4.1.5
Win 7 10
ike@九州
記事: 33
登録日時: 4月 30, 2009, 9:05 am

Re: レコードの書き込み禁止解除

投稿記事 by ike@九州 »

BASE では更新クエリは不可仕様なので UPDATE で代替だと思います。
(rst1 は READ ONLY のみ)

http://hsqldb.org/doc/guide/dataaccess- ... _statement

生成文確認していません。以下のような生成文になれば宜しいかと

UPDATE 最新状態 SET "対象カラム名" = ' 文字列 ' WHERE "車両インデックス" = 値

カラム名はダブルクオート必須、文字列はシングルクオート
stm1.executeUpdate("UPDATE 最新状態 SET ""対象カラム名"" = '" + rst2.getString(1) + "' WHERE ""車両インデックス"" = " + qes + ";")
Kankun
記事: 22
登録日時: 7月 13, 2012, 3:06 pm

Re: レコードの書き込み禁止解除

投稿記事 by Kankun »

ike@九州さん お返事ありがとうございました 早速ためして見ましたが
とりあえずエラーは無くなりました(プログラムの途中ですが)けどファアイル(ハードディスクの中の)
に書き込まれませんまだなにかプログラムを追加しなければいけませんか?
 もしよければまた、アドバイスよろしくおお願いします。

context1 = createUnoService("com.sun.star.sdb.DatabaseContext")
src1 = context1.getByName("車の修理")
cnn1 = src1.getConnection("", "")
stm1 = cnn1.createStatement()
rst1 = stm1.executeQuery("SELECT * FROM 最新状態 WHERE 車両インデックス = "+qes)

stm1.ResultSetConcurrency=1008
' ResultSetConcurrency = UPDATEABLE

context2 = createUnoService("com.sun.star.sdb.DatabaseContext")
src2 = context2.getByName("車の修理")
cnn2 = src2.getConnection("", "")
stm2 = cnn2.createStatement()
rem stm2.ResultSetConcurrency=1008

'******************************************************************************************************************************************************************
'*
'* 最大走行距離 と 日付を抽出
'*
'******************************************************************************************************************************************************************


rem 下のクエリーは 最大走行距離と日日が抽出するもの
rst2 = stm2.executeQuery("SELECT 車両インデックス , MAX( 走行距離メータ ), MAX( 作業日 ) FROM 作業データ GROUP BY 車両インデックス ORDER BY 車両インデックス ASC")
If Not IsNull(rst2) Then
While rst2.next
qes = "'"+Trim(rst2.getString(1))+"'"
rst1 = stm1.executeQuery("SELECT * FROM 最新状態 WHERE 車両インデックス = "+qes)
count = 0
While rst1.next
count = count + 1
Wend
rst1 = stm1.executeQuery("SELECT * FROM 最新状態 WHERE 車両インデックス = "+qes)
stm1.ResultSetConcurrency=1008
rst1.next

if count = 0 then
if Debg=1 then
msgbox " *****  レコードなし  **** "+" qes>"&qes & "< count "&count

endif

document = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
dispatcher.executeDispatch(document, ".uno:NewRecord", "", 0, Array())

if Debg=1 then
MsgBox "インデックスRST2 >"&rst2.getString(1)&" 最終距離RST2 > "&rst2.getString(2) &"日日 > "&rst2.getString(3)
endif

rem rst1.updateString(2,rst2.getString(1))
rem rst1.updateString(3,rst2.getString(2))
rem rst1.updateString(4,rst2.getString(3))
stm1.executeUpdate("UPDATE 最新状態 SET ""車両インデックス"" = '" + rst2.getString(1) + "' WHERE ""車両インデックス"" = " + qes + ";")
stm1.executeUpdate("UPDATE 最新状態 SET ""最終確認距離"" = '" + rst2.getString(1) + "' WHERE ""車両インデックス"" = " + qes + ";")
stm1.executeUpdate("UPDATE 最新状態 SET ""最終確認日"" = '" + rst2.getString(1) + "' WHERE ""車両インデックス"" = " + qes + ";")
else
if Debg=1 then
MsgBox " レコード あり             "+" qes >" &qes & "< count "&count
MsgBox "インデックス   "&rst1.getString(2) &" 最終距離 > "&rst1.getString(3) &" 日日 > "& rst1.getString(4)
endif

rst1 = stm1.executeQuery("SELECT * FROM 最新状態")
rst1.next


While rst1.getString(2) = qes

MsgBox "インデックス   "&rst1.getString(2) &" 最終距離 > "&rst1.getString(3) &" 日日 > "& rst1.getString(4)& " qes >"&qes

rem MsgBox "インデックス RST1>"&rst1.getString(2)&" 最終距離 > "&rst1.getString(3) &"日日 > "& rst1.getString(4)

rst1.next
Wend
rem rst1.updateString(3,rst2.getString(2))
rem rst1.updateString(4,rst2.getString(3))
stm1.executeUpdate("UPDATE 最新状態 SET ""最終確認距離"" = '" + rst2.getString(1) + "' WHERE ""車両インデックス"" = " + qes + ";")
stm1.executeUpdate("UPDATE 最新状態 SET ""最終確認日"" = '" + rst2.getString(1) + "' WHERE ""車両インデックス"" = " + qes + ";")


Endif
rem If not IsNull(rst1) Then


rem ----------------------------------------------------------------------
rem get access to the document
document = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")

rem ----------------------------------------------------------------------
dispatcher.executeDispatch(document, ".uno:NextRecord", "", 0, Array())

rem End If

Wend
End If



rst2.close()

cnn2.close()

rst1.close()

cnn1.close()

この後 エンジンオイル エレメント交換時の最大走行距離 と 日付を抽出する 同じ様なプログラムがつづきます

(サンプルのデーターベースを添付できればいいのですが)

テーブル
  作業データ 過去の作業記録 
  最新状態  作業データから個々の最終交換距離 取り換え日等を入力したい

マクロで実現したい事
  作業データ から 車両インデックスごとの最新の状態を調べて一つのファイル(テーブル最新状態)にしたい。
OpenOffice.org 4.1.5
Win 7 10
ike@九州
記事: 33
登録日時: 4月 30, 2009, 9:05 am

Re: レコードの書き込み禁止解除

投稿記事 by ike@九州 »

サンプル無いので適宜変更してください。
メインの部分です

Sub Main

context1 = createUnoService("com.sun.star.sdb.DatabaseContext")
src1 = context1.getByName("車の修理")
cnn1 = src1.getConnection("", "")
stm1 = cnn1.createStatement()
stm2 = cnn1.createStatement()

rst1 = stm1.executeQuery("SELECT 車両インデックス , MAX( 走行距離メータ ) , MAX( 作業日 ) FROM 作業データ GROUP BY 車両インデックス ORDER BY 車両インデックス ASC")

While rst1.next
qes = "'"& Trim(rst1.getString(1)) & "'"
iKyori = rst1.getInt(2) 'カラムの設定に応じて getInt、getLong、getFloat、getDouble
sDate = "'" & rst1.getString(3) & "'"

rst2= stm2.executeQuery("SELECT * FROM 最新状態 WHERE 車両インデックス = " & qes)

'該当車両インデックスがない場合に新規挿入、必要に応じて カラム名、VALUES 追加
If Not rst2.next then
stm2.executeUpDate("INSERT INTO 最新状態(車両インデックス) VALUES(" & qes & ")")
End If

'最新データに更新
stm2.executeUpDate( "UPDATE 最新状態 SET ""最終確認距離"" = " & iKyori & "," & """最終確認日"" = " & sDate & " WHERE 車両インデックス = " & qes)
Wend

stm1.close()
stm2.close()
cnn1.close()

End Sub
Kankun
記事: 22
登録日時: 7月 13, 2012, 3:06 pm

Re: レコードの書き込み禁止解除

投稿記事 by Kankun »

ike@九州さん お返事大変ありがとうございました 
教えていただいたものをベースにして考えてみます 大変勉強になりました。
OpenOffice.org 4.1.5
Win 7 10
Kankun
記事: 22
登録日時: 7月 13, 2012, 3:06 pm

Re: レコードの書き込み禁止解除

投稿記事 by Kankun »

とりあえず解決したので サンプルを貼り付けます 皆様いろいろありがとうございました :D
添付ファイル
車のメンテナンス.zip
(5.81 KiB) ダウンロード数: 288 回
OpenOffice.org 4.1.5
Win 7 10
返信する

“Base”に戻る