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

投稿時間:2004/05/10(Mon) 16:17
投稿者名:hallo
Eメール:
URL :
タイトル:
データグリッドでのレコードの位置付け方法
お世話になっております。
以下の環境でプログラムを作成しております。
  WindowsMe
  VisualBasic6.0 SP5
  Access97

アクセスのファイルに都道府県データ、市区町村データなどが入ったファイルがあります。
そのファイルの中身をデータグリッドにて表示して、住所を選択する画面を作成したいと思
います。
ファイルの項目は、都道府県番号・都道府県名です。
データグリッドに表示する際、都道府県番号順に表示しています。
そうしますと、東北地方や関東地方の都道府県の場合は、そのまま該当する都道府県を選択
すればいいのですが、近畿地方以西の都道府県を選択する場合は一度カーソルで次期画面へ
移動してから選択しなければなりません。
そこで、よく選択する都道府県をデータグリッドの一番上にでるように、あらかじめ設定す
る方法を教えていただけないでしょうか?よろしくお願いします。
表示する順番は都道府県番号順のままです。よく選択する都道府県名は取得することは可能
です。

投稿時間:2004/05/10(Mon) 17:24
投稿者名:サム
Eメール:
URL :
タイトル:
Re: データグリッドでのレコードの位置付け方法
> そこで、よく選択する都道府県をデータグリッドの一番上にでるように、あらかじめ設定す
> る方法を教えていただけないでしょうか?よろしくお願いします。
> 表示する順番は都道府県番号順のままです。よく選択する都道府県名は取得することは可能
> です。

選択or保存された回数をテーブルに項目追加し、
SELECT ... ORDER BY 保存回数 DESC, 都道府県番号
または
レコードセット.Sort "保存回数 DESC, 都道府県番号"
とすればできるのではないでしょうか。
それとも一番よく選択される都道府県のみ一番上に表示したいということでしょうか。
今さらテーブル構造はいじれないということでしたら、
どのような方法でよく選択する都道府県名を取得しているのか明記して下さい。

投稿時間:2004/05/10(Mon) 17:59
投稿者名:hallo
Eメール:
URL :
タイトル:
Re^2: データグリッドでのレコードの位置付け方法
> 選択or保存された回数をテーブルに項目追加し、
> SELECT ... ORDER BY 保存回数 DESC, 都道府県番号
> または
> レコードセット.Sort "保存回数 DESC, 都道府県番号"
> とすればできるのではないでしょうか。
> それとも一番よく選択される都道府県のみ一番上に表示したいということでしょうか。
> 今さらテーブル構造はいじれないということでしたら、
> どのような方法でよく選択する都道府県名を取得しているのか明記して下さい。

サムさん、分かりにくい説明で申し訳ありません。
よく選択する都道府県名の取得は、あらかじめユーザに設定をしてもらい、設定した都道
府県名をテキストファイルに保存し、その保存したテキストファイルから取得しようと思
っています。
教えていただきたいことは、データグリッドには都道府県番号順に表示し、表示するとき
にテキストファイルから取得した都道府県名をデータグリッドの一番上に移動したいので
す。
下記に簡単な図で表して見ます。(#が画面をたちあげたときにブックマークされている個所
現状)
  +---+--------+
#|01 |北海道  |
  |02 |青森県  |
  |03 |岩手県  |
  |04 |宮城県  |
  |05 |秋田県  |
  +---+--------+
希望)テキストファイルから[宮城県]または[04]を取得    
  +---+--------+
#|04 |宮城県  |
  |05 |秋田県  |
  |06 |山形県  |
  |07 |福島県  |
  |08 |茨城県  |
  +---+--------+
実際表示しているレコード数は15行程度ですがここでは5行にしました。

分かりづらいかもしれませんが、ご教授よろしくお願いします。

投稿時間:2004/05/10(Mon) 18:36
投稿者名:サム
Eメール:
URL :
タイトル:
Re^3: データグリッドでのレコードの位置付け方法
> サムさん、分かりにくい説明で申し訳ありません。
> よく選択する都道府県名の取得は、あらかじめユーザに設定をしてもらい、設定した都道
> 府県名をテキストファイルに保存し、その保存したテキストファイルから取得しようと思
> っています。
> 教えていただきたいことは、データグリッドには都道府県番号順に表示し、表示するとき
> にテキストファイルから取得した都道府県名をデータグリッドの一番上に移動したいので
> す。
>
並べ替えるのではなくて、初期表示時に自動的にスクロールしておきたいということですね。
勘違いしてすみません。
それなら、魔界の仮面弁士の方法でよいのではないでしょうか。

ただ私がやると
DataGrid1.FirstRow = RS.Bookmark
の行で「ブックマークが不正です」となってしまうのですが、
DataGrid1.Bookmark = RS.Bookmark
だけでも一番上に表示されます。

投稿時間:2004/05/10(Mon) 19:27
投稿者名:魔界の仮面弁士
Eメール:
URL :
タイトル:
Re^4: データグリッドでのレコードの位置付け方法
> それなら、魔界の仮面弁士の方法でよいのではないでしょうか。
> ただ私がやると
> DataGrid1.FirstRow = RS.Bookmark
> の行で「ブックマークが不正です」となってしまうのですが、

私の環境では動作しました。(何故でしょうね?)
念のため、後述のコードを試して見てください。(VB6付属のNWIND.MDBを使用しています)


> DataGrid1.Bookmark = RS.Bookmark
> だけでも一番上に表示されます。
Bookmarkプロパティだけですと、例えば、
・1〜100までデータがあって、現在、60行目が選択されている。
・データグリッドの可視範囲には、30〜40行目が表示された状態。
の時に、60行目のBookmarkを渡しても、60行目までスクロールする事はありません。

しかし、FirstRowプロパティを指定した場合は、選択行がどこにあっても、
指定した行が最上段に表示されるようにスクロールされます。

# 逆に、FirstRowプロパティだけを指定した場合は、選択行は変化せず、
# スクロール位置だけが変化します。


===============================
Option Explicit

Private WithEvents gRS As ADODB.Recordset
Private Const Path As String = _
    "C:\Program Files\Microsoft Visual Studio\VB98\NWIND.MDB"

Private Sub Form_Load()
    Dim Cn As ADODB.Connection
    Set Cn = New ADODB.Connection
    Cn.CursorLocation = adUseClient
    Cn.Provider = "Microsoft.Jet.OLEDB.4.0"
    Cn.Open Path
    Set gRS = New ADODB.Recordset
    gRS.Open "Orders", Cn, adOpenStatic, adLockOptimistic, adCmdTable
    Set Cn = Nothing
    Set Me.DataGrid1.DataSource = gRS
    Me.DataGrid1.Refresh
End Sub

Private Sub Command1_Click()
    Dim RS As ADODB.Recordset
    Set RS = gRS.Clone(adLockReadOnly)
    RS.Find "OrderID>=10814"
    If Not RS.EOF Then
        'スクロール位置の指定
        Me.DataGrid1.FirstRow = RS.Bookmark
        '選択行の指定
        Me.DataGrid1.Bookmark = RS.Bookmark
    End If
    Set RS = Nothing
End Sub

投稿時間:2004/05/11(Tue) 10:02
投稿者名:サム
Eメール:
URL :
タイトル:
Re^5: データグリッドでのレコードの位置付け方法
魔界の仮面弁士さん
以前、Validateイベントの件ではお世話になりました。

> Bookmarkプロパティだけですと、例えば、
> ・1〜100までデータがあって、現在、60行目が選択されている。
> ・データグリッドの可視範囲には、30〜40行目が表示された状態。
> の時に、60行目のBookmarkを渡しても、60行目までスクロールする事はありません。
>
そうですね。すでに選択されていてスクロールしてしまった場合には、
ダメみたいです。
halloさんの要求が初期表示時のみであれば、Bookmarkのみでも対応できそうです。
Me.DataGrid1.Bookmark = 1
Me.DataGrid1.Bookmark = RS.Bookmark
にするとか。

掲示していただいたコードを
そっくりそのまま新規Form1に貼り付けたのですが、やはり
Me.DataGrid1.FirstRow = RS.Bookmark
の行でエラーになります。
私の環境は
WinXP HOME-Edition
VB6.0 SP5
Access 2000
です。あとからインストールした
古いAccessが悪さしているのでしょうか。

halloさん
halloさんの使い方では、クローン必要なさそうですが、
見つからなかった場合、RS.EOFがTrueになってしまうので
注意が必要かと思います。

データベースが
|01 |北海道 |
|02 |青森県 |
|03 |岩手県 |
|04 |宮城県 |
|05 |秋田県 |
となっているのにテキストファイルが
[宮城]または[004]など。

投稿時間:2004/05/11(Tue) 10:28
投稿者名:魔界の仮面弁士
Eメール:
URL :
タイトル:
Re^6: データグリッドでのレコードの位置付け方法
> 魔界の仮面弁士さん
あっ。今度は呼び捨てじゃないんですね。(笑

> Me.DataGrid1.Bookmark = 1
これはまずいでしょう。Bookmarkが数値になるとは限りませんし、
AbsolutePositionのように連番になっているという保証もありません。

> 私の環境は
> WinXP HOME-Edition
> VB6.0 SP5
> Access 2000
> です。
こちらは、
  WinXP Pro SP1a
  VB6 SP6
  Access 2002 SP1 with Jet 4.0 SP7
  Access 2000 SR1 with Jet 4.0 SP7
  Access 97 SR1 with Jet 3.5x SP3
 ADO 2.0, 2.1, 2.5, 2.6, 2.7, 2.8
という環境です。

> あとからインストールした
> 古いAccessが悪さしているのでしょうか。
当方にも、古い(Access 2003以前の)バージョンのAccessが、3つも入っていたりします。(^^;

投稿時間:2004/05/11(Tue) 10:44
投稿者名:hallo
Eメール:
URL :
タイトル:
Re^7: データグリッドでのレコードの位置付け方法
魔界の仮面弁士さん、サムさん色々とありがとうございました。

自分なりに色々試しましたが、FirstRowの設定のところで、
ブックマークが見つかりませんというエラーが出てしまいます。
FirstRow の1行だけ省きましたら、初期値が画面の先頭にスク
ロールしないまでも初期値が選択されていますし、選択されてい
るレコードが表示されるようになっていますので、ユーザーから
は少しは使いやすくなったと思われます。
本当にありがとうございました。
FirstRow にところは、時間をかけて勉強したいと思います。

ところで、VB6にSP6があるのですか?SP5との違いは?
どこで手に入るか教えていただけないでしょうか?

投稿時間:2004/05/11(Tue) 11:07
投稿者名:hallo
Eメール:
URL :
タイトル:
Re^8: データグリッドでのレコードの位置付け方法
魔界の仮面弁士さん、すみません。
VB6のSP6はマイクロソフトのホームページにありました。
SP5で作成したものも問題なく動作するみたいですので早速ダウンロード
したいと思います。
お騒がせしました。

投稿時間:2004/05/11(Tue) 12:44
投稿者名:魔界の仮面弁士
Eメール:
URL :
タイトル:
Re^8: データグリッドでのレコードの位置付け方法
> ところで、VB6にSP6があるのですか?SP5との違いは?

http://support.microsoft.com/default.aspx?scid=kb;ja;834001

上記に書かれていない修正項目もあるようです。

# 逆に、SP6で埋め込まれたバグもあったりするわけですが(泣)

投稿時間:2004/05/11(Tue) 11:12
投稿者名:サム
Eメール:
URL :
タイトル:
Re^7: データグリッドでのレコードの位置付け方法
> > 魔界の仮面弁士さん
> あっ。今度は呼び捨てじゃないんですね。(笑
>
うっ!言われてはじめて気がつきました。
先生を呼び捨てにするなんてとんでもない、お許し下さい。
でも呼び捨てのほうがかっこよっかたりして。
例)魔界の仮面弁士の言うとおり
  魔界の仮面弁士さんの言うとおり

脱線してしまいましたが、
私もSP6をダウンロードして試してみます。
ちなみに
Microsoft DataGrid Control は 6.0(SP5)
となっていますが、SP6になってたりしますか?

投稿時間:2004/05/11(Tue) 12:47
投稿者名:魔界の仮面弁士
Eメール:
URL :
タイトル:
Re^8: データグリッドでのレコードの位置付け方法
> Microsoft DataGrid Control は 6.0(SP5)
> となっていますが、SP6になってたりしますか?

なってますね。…という事は、SP5のDataGridに問題があったのかも?
SP6を適用されましたら、結果報告お願いします。>halloさん & サムさん

投稿時間:2004/05/11(Tue) 13:16
投稿者名:サム
Eメール:
URL :
タイトル:
Re^9: データグリッドでのレコードの位置付け方法
> SP6を適用されましたら、結果報告お願いします。
>
正常に動作しました。
VB6.0もそろそろ終焉だというのに、今頃修正されるなんて。
それともSP5の不具合だったのかな。

他にも
ADO Data Controlやら
Common DialogなんかもSP6になってますね。(恐

投稿時間:2004/05/11(Tue) 14:04
投稿者名:hallo
Eメール:
URL :
タイトル:
Re^9: データグリッドでのレコードの位置付け方法
SP6を適用しました。
動作をいくつか試しましたが、DataGridについては今のところ問題はありません。
(他の箇所はまだ試してみませんが)
Microsoft DataGrid Control は 6.0(SP5) も
→ Microsoft DataGrid Control は 6.0(SP6)
に変更されていました。

投稿時間:2004/05/10(Mon) 17:40
投稿者名:魔界の仮面弁士
Eメール:
URL :
タイトル:
Re: データグリッドでのレコードの位置付け方法
> そこで、よく選択する都道府県をデータグリッドの一番上にでるように、あらかじめ設定す
> る方法を教えていただけないでしょうか?よろしくお願いします。
> 表示する順番は都道府県番号順のままです。よく選択する都道府県名は取得することは可能
> です。

先頭行を表す「FirstRowプロパティ」や、
選択行を表す「Bookmarkプロパティ」を使ってみてください。

    Dim RS As ADODB.Recordset
    Set RS = 連結されているレコードセット.Clone()
    RS.Find "県名='熊本県'"
    If Not RS.EOF Then
      Me.DataGrid1.Bookmark = RS.Bookmark
      Me.DataGrid1.FirstRow = RS.Bookmark
    End If

投稿時間:2004/05/10(Mon) 18:41
投稿者名:hallo
Eメール:
URL :
タイトル:
Re^2: データグリッドでのレコードの位置付け方法
> 先頭行を表す「FirstRowプロパティ」や、
> 選択行を表す「Bookmarkプロパティ」を使ってみてください。
>
>     Dim RS As ADODB.Recordset
>     Set RS = 連結されているレコードセット.Clone()
>     RS.Find "県名='熊本県'"
>     If Not RS.EOF Then
>       Me.DataGrid1.Bookmark = RS.Bookmark
>       Me.DataGrid1.FirstRow = RS.Bookmark
>     End If

魔界の仮面弁士さん、ご返答ありがとうございます。
記述していただきましたプログラムの2行目
   Set RS = 連結されているレコードセット.Clone()
の 「連結されているレコードセット」とは何でしょうか?
上記の意味がわかりませんでしたので、それを省いて以下のようにプログラムを
組んでみました。
これを実行してみましたら、
「実行時エラー 6149 ブックマークが不正です」というエラーが表示されデバッ
クしてみますと
        Me.DataGrid1.FirstRow = Rs.Bookmark
のところで何かエラーがおきています。
ヘルプでFirstRowを調べてみますとデザイン時には利用できませんと書いてあり
ました。これとは関係ないのでしょうか?
素人の質問ですがよろしくお願いします。
        
    Set Rs = New ADODB.Recordset
    Rs.Open "SELECT 都道府県番号,都道府県名 FROM 都道府県マスタ",
                  CnMast, adOpenStatic, adLockOptimistic
    
    Set DataGrid1.DataSource = Rs
    
    Rs.Find "都道府県名 = " & "'熊本県'"
    If Not Rs.EOF Then
        Me.DataGrid1.Bookmark = Rs.Bookmark
        Me.DataGrid1.FirstRow = Rs.Bookmark
    End If

投稿時間:2004/05/10(Mon) 18:59
投稿者名:魔界の仮面弁士
Eメール:
URL :
タイトル:
Re^3: データグリッドでのレコードの位置付け方法
> の 「連結されているレコードセット」とは何でしょうか?
DataSourceプロパティに設定してあるRecordsetオブジェクトの事です。

なお、Cloneメソッドを使うかどうかは任意です。
(Cloneメソッドの意味に付いては、ヘルプで調べてみてください)

> ヘルプでFirstRowを調べてみますとデザイン時には利用できませんと書いてあり
> ました。これとは関係ないのでしょうか?
『デザイン時には利用できません』というのは、
・実行時に、プログラムから指定する事ができる。
・デザイン時に、プロパティウィンドウにて指定する事ができない。
という意味と思ってください。

>     Set Rs = New ADODB.Recordset
>     Rs.Open "SELECT 都道府県番号,都道府県名 FROM 都道府県マスタ",
>                   CnMast, adOpenStatic, adLockOptimistic
RecordsetのCursorLocationプロパティをadUseClientにしておいてください。