<Access サブフォームで連結 重複を弾いてメインに表示>
どうも、三流プログラマーのKen3です。 今回は、 読者よりもらった質問をまたまた、処理してみたいと思います。 ※2週間以上前にもらった質問だった、、、 なかなかいい処理が思いつかなくて。 じゃ、いい処理思いついたのかよ!といわれると、ドロドロした逃げ手なんだけど。 いつものように、たいした解説、回答内容じゃないので、 暇つぶしに休み時間などに拾い読みしてください。 サンプルファイルは、 http://www.ken3.org/vba/lzh/vba106.lzh にdb106.mdb(Access2000版)が保存されています。/* * 1.今回のキッカケ */
メールで下記の質問をもらいました。 ---- >例としまして(本当はもっとドロドロしたデータベースなんですが、 > 違う例えで書いてみました。) > >親フォームが音楽のバンド名が記載されてます。 >サブフォームには、 >そのバンドのメンバーと出身県と楽器と年齢などが記載されています。 > >そこで、親フォームには、そのバンドのメンバーの出身県が出るテキスト >ボックスがあります。 > >例えば・・・バンド名(BOOWY)−−−−−−−−−−親フォーム > メンバー(氷室、布袋、松井、高橋)−−サブフォーム > 出身県(群馬、群馬、群馬、福島)−−−サブフォーム > >●質問1 > >で、このサブフォームに記載されている、出身県を親のフォームの >任意に作成したテキストボックスの中に「群馬、福島」とだけ表示したいのです。 > >「群馬、群馬、群馬、福島」と表示するのは、ちょっと・・・。 >群馬がだぶっているので、群馬の表示は1つとしたいのです。 > > >●質問2 > >また、沢山のバンドや歌手をこのデータベースに入力します。 >そこで、「布袋」と検索すると、親フォームの「BOOWY」が表示されるようにしたい >のです。 > >まず親フォームのバンド名には >「バンドID」と云う名のフィールド名の主キー(オートナンバー)がありまして > >それをサブフォームの中にもフィールド名で、 同じ「バンドID」という >固有のデータで繋がっているです。 > >こんな説明で分かってもらえるんでしょうか・・・。 >すごく不安です。 ----- 2つの親子テーブルが存在して、 バンドIDでつなげた、フォーム・サブフォームが存在する。 まずは、 親フォームにある、 そのバンドのメンバーの出身県が出るテキストボックスに表示する。 これを処理してみたいと思います。/* * 2.調べごと、下準備 */
親テーブル名:T_バンド名 バンドID オートナンバー バンド名称 テキスト 備考 メモ型 子テーブル名:T_メンバー 個人ID オートナンバー バンドID 長整数型(親テーブルとリンクする) 名前 文字型 楽器 文字型 出身地 文字型 生年月日 日付型 *今回関係ないけど 備考 文字型 *今回関係ないけど なんて、テーブル構成にして、フォームを作成しました。 ポイントは ^^^^^^^^^^^ 普通に、子テーブルを表形式、親を単票で作成して、 親フォームのデザインで、サブフォーム・サブレポートのコントロールを選択します。 既存のフォーム(作成した子フォームを選択します) リンクするフィールドを選択します (名称が同じフィールドが自動で設定されると思います) サブフォームの名前を決めて、終了です。 あとは、親フォームにtxt出身地と非連結のテキストボックスを作成します。 (※データセット、連結はこれから作ります) さて、なんとか、ここまでは、簡単に作れました。 が、配置気にしない(笑)テスト用のイメージです/* * 3.テーブルからデータを読み込んでみる */
ほしいのは、バンド別の出身地(重複無し)なのですが、 とっかかりは、 子テーブルをバンドIDを条件にして、 出身地を読み込みます。
Private Sub コマンド14_Click() Dim str出身地 As String '出身地の管理 Dim rs As New ADODB.Recordset 'ADOのレコードセット Dim strSQL As String 'SQL文を作成するため 'T_メンバーテーブルから出身地をバンドIDがフォームの値と一緒 strSQL = "Select 出身地 From T_メンバー " _ & " Where バンドID = " & Me![バンドID] 'レコードセットを開く rs.Open strSQL, CurrentProject.Connection, _ adOpenKeyset, adLockOptimistic 'ループ処理 str出身地 = "" '空文字で初期化 While rs.EOF = False 'いつものEOFが偽の間 '出身地と" "スペース1つを+する str出身地 = str出身地 & rs.Fields("出身地") & " " rs.MoveNext '次のレコードに移動しないと、とんでもないことに(笑) Wend rs.Close '開いたら閉じろ、ドアを開けたら閉めるってしつけられたでしょ(笑) Set rs = Nothing '変数も後始末しますか。使った器はキレイにしろって? 'データのセットと確認メッセージ表示 Me![txt出身地] = str出身地 '非連結のテキストボックスにデータセット MsgBox "作成した文字列は" & str出身地 & "です" End Sub |
Private Sub コマンド15_Click() Dim str出身地 As String '出身地の管理 Dim n As Integer 'サーチ文字列の発見場所 Dim rs As New ADODB.Recordset 'ADOのレコードセット Dim strSQL As String 'SQL文を作成するため 'T_メンバーテーブルから出身地をバンドIDがフォームの値と一緒 strSQL = "Select 出身地 From T_メンバー " _ & " Where バンドID = " & Me![バンドID] 'レコードセットを開く rs.Open strSQL, CurrentProject.Connection, _ adOpenKeyset, adLockOptimistic 'ループ処理 str出身地 = "" '空文字で初期化 While rs.EOF = False 'いつものEOFが偽の間 'バッファの中に同じ出身地があるか場所をチェックする n = InStr(str出身地, rs.Fields("出身地")) If n = 0 Then '出身地が見つからなかったら(重複してない時) '出身地と" "スペース1つを+する str出身地 = str出身地 & rs.Fields("出身地") & " " End If rs.MoveNext '次のレコードに移動しないと、とんでもないことに(笑) Wend rs.Close '開いたら閉じろ、ドアを開けたら閉めるってしつけられたでしょ(笑) Set rs = Nothing '変数も後始末しますか。使った器はキレイにしろって? 'データのセットと確認メッセージ表示 Me![txt出身地] = str出身地 '非連結のテキストボックスにデータセット MsgBox "作成した文字列は" & str出身地 & "です" End Sub |
Private Sub コマンド14_Click() Dim str出身地 As String '出身地の管理 Dim rs As New ADODB.Recordset 'ADOのレコードセット Dim strSQL As String 'SQL文を作成するため 'T_メンバーテーブルから出身地をバンドIDがフォームの値と一緒 strSQL = "Select DISTINCT 出身地 From T_メンバー " _ & " Where バンドID = " & Me![バンドID] 'レコードセットを開く rs.Open strSQL, CurrentProject.Connection, _ adOpenKeyset, adLockOptimistic 'ループ処理 str出身地 = "" '空文字で初期化 While rs.EOF = False 'いつものEOFが偽の間 '出身地と" "スペース1つを+する str出身地 = str出身地 & rs.Fields("出身地") & " " rs.MoveNext '次のレコードに移動しないと、とんでもないことに(笑) Wend rs.Close '開いたら閉じろ、ドアを開けたら閉めるってしつけられたでしょ(笑) Set rs = Nothing '変数も後始末しますか。使った器はキレイにしろって? 'データのセットと確認メッセージ表示 Me![txt出身地] = str出身地 '非連結のテキストボックスにデータセット MsgBox "作成した文字列は" & str出身地 & "です" End Sub |
Private Sub Form_Current() Dim str出身地 As String '出身地の管理 Dim rs As New ADODB.Recordset 'ADOのレコードセット Dim strSQL As String 'SQL文を作成するため '新規のデータ時、下の処理を走らせない If Me.NewRecord = True Then '.NewRecordで新規かチッェクする Me![txt出身地] = "" '空文字でクリア Exit Sub '関数を途中で抜ける End If 'T_メンバーテーブルから出身地をバンドIDがフォームの値と一緒 'DISTINCTキーワードで重複をハジク strSQL = "Select DISTINCT 出身地 From T_メンバー " _ & " Where バンドID = " & Me![バンドID] 'レコードセットを開く rs.Open strSQL, CurrentProject.Connection, _ adOpenKeyset, adLockOptimistic 'ループ処理 str出身地 = "" '空文字で初期化 While rs.EOF = False 'いつものEOFが偽の間 '出身地と" "スペース1つを+する str出身地 = str出身地 & rs.Fields("出身地") & " " rs.MoveNext '次のレコードに移動しないと、とんでもないことに(笑) Wend rs.Close '開いたら閉じろ、ドアを開けたら閉めるってしつけられたでしょ(笑) Set rs = Nothing '変数も後始末しますか。使った器はキレイにしろって? 'データのセット Me![txt出身地] = str出身地 '非連結のテキストボックスにデータセット End Sub |
ここまで、読んでいただきどうもです。ここから下は、三流君のホームページの紹介・案内です
目的の情報が見つかったか?少々心配しつつ、、、
気になったジャンル↓を選択してください。 人気記事(来場者が多いTOP3): Excel関係: Access関係: その他:VBAの共通関数やテキストファイルの操作など 開発時の操作: [F1を押してHELPを見る]/ [Debug.Print と イミディエイトウインドウ]/ [実行時エラーでデバッグ]/ [ウォッチ式とSTOP]/ [参照設定を行う] 仕様書(設計書?) XXXX書類: [基本設計書や要求仕様書]/ [テスト仕様書 テストデータ]/ [バグ票]/ [関数仕様書]/ [流れは 入力・処理・出力] ※↑文章の味付けが変わっていて、お口に合うかわかりませんが。。。 |
Blogとリンク:[三流君の作業日記]/
[VBAやASPのサンプルコード]/
広告-[通販人気商品の足跡]