[リストへもどる]
一括表示

投稿時間:2002/12/24(Tue) 19:32
投稿者名:KKK
Eメール:
URL :
タイトル:
FLEXGRIDについて
何時もお世話になっております。

ACCESSとVB6を使いADOでACCESSに接続しているのですが、

DIM RS AS NEW ADODB.RECORDSET
    RS.OPEN "SQL文" CN,~

という感じで値を取得しているのですが、これをFLEXGRIDに表示して、それをGRID上で編集した後にACCESSに登録したいのですが、これをするにはSQL文を
StrSQL="UPDATE TBL SET TEST1=" & "'" & TEXTMATRIX(1,1) & "'," & ....."

という感じで、一つ一つのデータをDBに挿入していくのは非常に面倒くさいと考えています。
そこで、質問なのですが
テーブルGRIDで編集したデータをGRID全体をACCESS(DB)に更新を反映させることはできるのでしょうか?

よろしくお願いします。

投稿時間:2002/12/24(Tue) 22:18
投稿者名:魔界の仮面弁士
Eメール:
URL :
タイトル:
Re: FLEXGRIDについて
> テーブルGRIDで編集したデータをGRID全体をACCESS(DB)に更新を反映させることはできるのでしょうか?

ADOのRecordsetには、バッチ更新モードという物があります。
これを使うと、複数レコードに対する変更を、一括して反映させる事が可能です。


Set rs = New ADODB.Recordset
With rs
   Set .ActiveConnection = Cn
   .Source = "SELECT * FROM MyTable"    '必ず、主キーを含むデータにしておくこと
   .LockType = adLockBatchOptimistic
   .CursorType = adOpenStatic
   .CursorLocation = adUseClient
   .Open
End With

この後、rsの内容を編集していき、最後にUpdateBatchメソッドを呼び出せば、
それらの編集結果が、一度に反映されます。

投稿時間:2002/12/26(Thu) 10:44
投稿者名:KKK
Eメール:
URL :
タイトル:
Re^2: FLEXGRIDについて
> この後、rsの内容を編集していき、最後にUpdateBatchメソッドを呼び出せば、
> それらの編集結果が、一度に反映されます。

何時もありがとうございます。
早速試してみます。
ありがとうございました。

投稿時間:2002/12/29(Sun) 18:25
投稿者名:KKK
Eメール:
URL :
タイトル:
Re^3: FLEXGRIDについて
> > この後、rsの内容を編集していき、最後にUpdateBatchメソッドを呼び出せば、
> > それらの編集結果が、一度に反映されます。

すみません
また質問をさせてください。

            '1レコード目からEOFまでレコードの追加
'            .vsFlexGrid1.Rows = rs.RecordCount + 2
            Do While Not rs.EOF
            
                With FrmDaityo.vsFlexGrid1
                    
                    '1レコード全部の値をグリッドに挿入する
                    .Rows = rs.RecordCount + 2
                    
                    For i = 1 To 53
                
   .TextMatrix(R, i) = IIf(IsNull(rs.Fields(i).Value) = True, Space(0),rs.Fields(i).Value)
                    
                    Next i
                    
                    'COL(0)に列番号を挿入する
                        .TextMatrix(R, 0) = R - 1

                End With
                
                rs.MoveNext
                R = R + 1
                
            Loop

という感じで、ループをかけてテーブルの構成に合わせてグリッドに値を挿入しているのですが、そのグリッドを編集して、更新ボタンでそのグリッド上の値をそのままテーブルに反映させたいのです。
上のようなコードでも場合でもUPDATEBATCHは可能なのでしょうか?
すみません。
きっとまだ解っていないのでとんでもない質問かもしれませんが、よろしくお願いします。

投稿時間:2003/01/02(Thu) 13:08
投稿者名:魔界の仮面弁士
Eメール:
URL :
タイトル:
Re^4: FLEXGRIDについて
あら? 私は「FLEXGRID」というのは、[MSHFlexGrid]か[MSFlexGrid]の事かと思っていたのですが、
ここでいうFLEXGRIDとは、米VideoSoft社のVS-FlexGridの事だったのですね。。。(^^;)
http://www.grapecity.com/japan/support/database/P1_88.htm

コントロールによって、それぞれが持つプロパティ・メソッド・イベントというのは
微妙に異なってきますから、コントロールの製品名は、正確に記載された方が良いですよ。


>    .TextMatrix(R, i) = IIf(IsNull(rs.Fields(i).Value) = True, Space(0),rs.Fields(i).Value)
この場合、「  .TextMatrix(R, i) = "" & rs.Fields(i).Value  」という書き方も可能です。

また、TextMatrixプロパティを繰り返し呼び出すかわりに、Clipプロパティに
Rs.GetStringを代入する事で、複数のセルの値を一括して設定させる事もできます。
(データの内容によっては、ループさせる必要が無くなる分、表示までの時間を短縮させられる場合があります)

> という感じで、ループをかけてテーブルの構成に合わせてグリッドに値を挿入しているのですが、
> そのグリッドを編集して、更新ボタンでそのグリッド上の値をそのままテーブルに反映させたいのです。
提示されたコードのように、Recordsetとグリッドを直接連動させていない場合には、
データを連動させるためのコードを、手動で書き加えてやる必要があります。

グリッドが編集された際に、Recordset側の該当行もUpdateさせるようにしてみてください。
そうすれば、最後にRs.UpdataBatchを発行させることで、データベースへ一括して反映させる事ができます。
なお、データの更新だけでなく、追加(AddNew)や削除(Delete)が行われたRecordsetであっても、
それらの編集結果は、正しくデータベースへ反映される事になります。

# 該当レコードへの移動は、Moveメソッドを用いる方法や、AbsolutePositionプロパティを
# 使う方法など、いくつかの手段があります。

ちなみに、グリッドへの編集をRecordsetに反映させるのとは逆に、Recordsetへの編集内容を
グリッド側に反映させたいのであれば、RecordsetオブジェクトのWillChangeField/FieldChangeComplete
イベントを利用する事ができると思います。


ただ、VsFlxGridの場合は、直接、Recordsetを連結させる機能があったはずですから、
そちらを利用された方が、コードとしてはスマートになるかもしれません。その場合、
セルの各値を編集すると、自動的にRecordset側も更新されますので、最後にUpdataBatchを
発行するだけで済むでしょう。

# もっとも、データの内容によっては、連結(データバインド)させない方が
# 扱いやすい場合もありますから、どちらの方法でコーディングした方が良いのかは、
# ケースバイケースですけれどね。

投稿時間:2003/01/06(Mon) 20:25
投稿者名:KKK
Eメール:
URL :
タイトル:
Re^5: FLEXGRIDについて
明けましておめでとうございます。
レスが遅くなりまして申し訳ございません。
詳しく説明していただきましてありがとうございました。
すみませんがもう1つ質問させてください。

        'Recordsetのオープン
        StrSQL1 = "SELECT * FROM TBL_IKOKUHO WHERE HIHO_NO=" & "'" & HihoNo & "'"
        
        rs.Open StrSQL1, cn, adOpenStatic, adLockBatchOptimistic

    Set vsFlexGrid1.DataSource = rs

このようにして、グリッドに直接読み込むようにコードを変えたのですが、コマンドのクリックイベントで
    
    rs.UpdateBatch

としているのですが、更新されません。
基本的に考え方が間違っているのでしょうか?
よろしくお願いします。

投稿時間:2003/01/09(Thu) 21:26
投稿者名:KKK
Eメール:
URL :
タイトル:
Re^6: FLEXGRIDについて
> 明けましておめでとうございます。
> レスが遅くなりまして申し訳ございません。
> 詳しく説明していただきましてありがとうございました。
> すみませんがもう1つ質問させてください。
>
>         'Recordsetのオープン
>         StrSQL1 = "SELECT * FROM TBL_IKOKUHO WHERE HIHO_NO=" & "'" & HihoNo & "'"
>        
>         rs.Open StrSQL1, cn, adOpenStatic, adLockBatchOptimistic
>
>     Set vsFlexGrid1.DataSource = rs
>
> このようにして、グリッドに直接読み込むようにコードを変えたのですが、コマンドのクリックイベントで
>     
>     rs.UpdateBatch
>
> としているのですが、更新されません。
> 基本的に考え方が間違っているのでしょうか?
> よろしくお願いします。

すみません。再び質問させてください。
今かなり嵌っています。

一度グリッドに落としたデータを再びRecordsetに戻すことは可能でしょうか?
つまりは上の質問なのですが・・・
よろしくお願いします。