dポイントプレゼントキャンペーン実施中!

AccessDBで、下記のようなことをやりたいのですが、ご教授いただけないでしょ
うか?

例)(実際の内容は違うのですが、例としてお伝えしやすい内容に変更していま
す。)

野球のデータベースを作るとします。
野球の試合日のデータ(試合テーブル)

試合ID  0001
試合日  5月1日
天候   晴れ
試合相手 タイガース
試合場所 東京グランド

こういった試合データが複数レコードある。

ここにチームのメンバ(メンバテーブル)
A選手
B選手
・・・・
Z選手


各選手の試合履歴を見るために各選手と試合データを結合させたいです。
5月1日の試合(試合ID0001)に、A,B,C選手が出場していたとしたら、

A 0001
B 0001
C 0001

を結びつけるようなテーブルを作ればよいと思うのですが、A,B,Cを入力して上
記レコードを作るのではなく、
A選手~Z選手のチェックボックスがあって、選択した選手の分だけ
(今回でいうとA,B,C)が、
A 0001
B 0001
C 0001

というように0001と結合でするレコードを作りたいのです。
プルダウンでA,B,Cを選択する方法はわかるのですが、実際にやりたいのは、100
ぐらいの選択となるので、チェックボックスで選択したいのです。

A 回答 (6件)

#5です



基本的に、複数のレコードを1つのフォームで表示したい場合、
帳票フォームになると思います。
ただ、帳票フォームにしてしまうと、好き勝手な配置はできなくなります。

複数のレコードを好き勝手に配置したい・・・VBAの登場と思います。

とは言っても、使い方/処理限定で 少ない VBA 記述での実現になりますが、
・「T試合」新規登録時のみ
・選手を追加したらフォームの手直しが必要
・この用途以外にチェックボックスがない事
という条件を設けます。

フォームの作成)

・「T試合」を元に、フォームウィザードで単票フォームとして作成します。
 プロパティで、「データ入力用」を「はい」とします。
・「登録」ボタンを配置します。(以下 VBA 記述では「btn1」の名前にしていました)
・必要な分、チェックボックスを自由に配置します。
チェックボックスの「タグ」に、選手ID を設定し、ラベルに選手名を設定します。
処理として、「タグ」が設定してあるものを対象にしているので、
非表示/タグ設定なしのチェックボックスを配置しておけば、後の修正は楽かも。
また、チェックボックスの名前は何でもいいです。(名前はみていません)

フォームの画面は以上です。
VBA の記述は以下になります。

Private Sub Form_Current()
  Dim ctl As Control

  For Each ctl In Me.Controls
    With ctl
      If (.ControlType = acCheckBox) Then
        .Value = False
      End If
    End With
  Next
End Sub

Private Sub Form_BeforeUpdate(Cancel As Integer)
  Cancel = True
  MsgBox "登録ボタンで確定", vbCritical
End Sub

Private Sub btn1_Click()
  Dim sSql As String
  Dim sS As String
  Dim ctl As Control

  If (Not Me.Dirty) Then Exit Sub

' 試合日など入力チェックをするのなら、この場所で

'
  sS = Me.BeforeUpdate
  Me.BeforeUpdate = ""
  Me.Dirty = False
  Me.BeforeUpdate = sS

  For Each ctl In Me.Controls
    With ctl
      If (.ControlType = acCheckBox And Len(.Tag) > 0) Then
        If (.Value) Then
          sSql = "INSERT INTO T出場(試合ID, 選手ID) VALUES (" _
              & Me.試合ID & "," & .Tag & ");"
          CurrentDb.Execute sSql
        End If
      End If
    End With
  Next
  Me.Requery
End Sub

新規登録時に、まずチェックボックスのチェックを外しておきます。
「登録」ボタンがクリックされた時に、チェックがあるものを探し出し、
レコードを追加します。

これで VBA の記述量は減りましたが、書きたくない・・・
ってなことなら、テーブルを見直します。

> <3>試合選手連結テーブル
> に
> 試合ID 0001 選手ID A
> 試合ID 0001 選手ID B
> 試合ID 0001 選手ID C
> の3レコードができる。

この考え方はデータベースとして合っていると思います。

私の認識不足かもしれませんが、
VBAを使わずに好き勝手に配置するには、1レコード内に全ての情報が必要だと思います。

> 4)「T出場」
> an: オートナンバ 主キー
> 試合ID: 数値型 「T試合」の試合IDと
> 選手ID: 数値型 「T選手」の選手IDと

が、

an: オートナンバ 主キー
試合ID: 数値型 「T試合」の試合IDと
ck1: Yes/No型  ルックアップはチェックボックス
ck2: Yes/No型
ck3: Yes/No型
ck4: Yes/No型
・・・
ck120: Yes/No型

フィールドは250個位作れたと思います。
ck1 は A さん用、ck2 は B さん用
等、取り決めが必要になります。(データベースとして外れていく?)
※ 一意に特定できるフィールドが欲しかったので、オートナンバを入れてましたが、
  上記では不要かも

ただ、この後でやろうとしている事(処理)が、複雑になっていくような・・・
お勧めできるものではありません。

もし、この構成にしたとして、このテーブルを元に単票フォームを作ります。
(チェックボックスを自由に配置して、ラベル部分を割り当てる選手名に変更)
(割り当てていないものは、不可視にでもしておきます)
このフォームを、「T試合」を元にしたフォームのサブフォームとして組み込みます。
「試合ID」を、リンク親/子フィールドに設定することで
メイン(親)フォームのレコード移動に連動して表示は切り替わってくれます。
選手を追加した場合は、ラベル部分を選手名に変更/可視化する修正が必要です。

ここまで、VBA 記述はありません。

細かい動きを処理しようとすると VBA がチョッと必要になります。

以下一例で、(サブフォーム内の処理として)
親の「試合ID」が設定されていなければ先行して編集状態にしない
「試合ID」が設定されていない・・・新規でしょ
新規でチェック出来たらおかしいよねって

Private Sub Form_BeforeInsert(Cancel As Integer)
  If (IsNull(Me.Parent.試合ID)) Then Cancel = True
End Sub

メイン/サブフォームの構成にすると、
メイン側を編集して、サブフォーム側をいじろうとすると
メイン側のレコードは確定されたと思います。
逆に、サブ側を編集してメイン側をいじろうとすると
サブ側のレコードは確定されたと思います。

登録ボタンは、無くても良さそうです。
フォームの構成はこんな感じになると思います。


ワーク用テーブルを使う手もありますが
サブフォームで参照するのは「ワーク用テーブル」の方
フォーム起動時に、「T出場」から「ワーク用テーブル」に展開
フォームを閉じる時に、「ワーク用テーブル」から「T出場」に戻す
ただ、この処理に #5 と同じ位 VBA 記述が必要になってきます。

なお、#5では、選手が120人以上にならない限り修正は不要です。
"ck1" ~ 選手を「よみ」順で割り当てていきますが、
チェックボックス自体の配置は自由にして構いません。
(#4で120個作成する時に、きれいに並べたかっただけなので)


いろいろと裏を取ってください。
私の中での認識なので、嘘が混じってるかも。

この回答への補足

30246kiku様

ご丁寧な回答ありがとうございます。

最低限の処理で

> ・「T試合」を元に、フォームウィザードで単票フォームとして作成します。
>  プロパティで、「データ入力用」を「はい」とします。
> ・「登録」ボタンを配置します。(以下 VBA 記述では「btn1」の名前にしていました)
> ・必要な分、チェックボックスを自由に配置します。

の作り方で、試験的にやってみました。

T出場 テーブルに、追加したいレコードが追加されるところまでは確認できました。
もろもろきれいにするには時間がかかるので、取り急ぎ報告させていただきます。

知識が不足しているのでもう少しいろいろ試してみます。

あまりに時間がかかるようでしたらご迷惑おかけしますのでクローズさせていただきます。

お手数おかけしますがよろしくお願いします。

補足日時:2012/05/14 01:45
    • good
    • 0
この回答へのお礼

30246kiku様

その後、ご回答を参考に作成中で、Accessの知識が不足していることもありまだ最終版ができていませんが、かなりヒントになりました。
あまりお待たせしても申し訳ないのでこれでクローズさせていただきます。
本当にご丁寧な回答ありがとうございました!

お礼日時:2012/05/28 00:43

【つづき】



では、全記述です

Dim dic As Object    ' どの選手にどのチェックボックスを割り当てたか
Dim dicOld As Object  ' 編集前の選手割り当て状況 (初期では dicOld = dicNew)
Dim dicNew As Object  ' いじっていた選手割り当て状況

Private Function ChkClick()
  If (IsNull(Me.試合ID)) Then
    Me.ActiveControl = Not Me.ActiveControl
    Exit Function
  End If

  Me.天候 = Me.天候   '編集状態にしたいため

  With Me.ActiveControl
    If (.Value) Then
      .Controls(0).BackStyle = 1
      dicNew.Item(CLng(.Tag)) = Null
    Else
      .Controls(0).BackStyle = 0
      dicNew.Remove CLng(.Tag)
    End If
  End With
End Function

Private Sub Form_Load()
  Dim sSql As String
  Dim rs As DAO.Recordset
  Dim i As Long
  Dim sN As String

  Set dic = CreateObject("Scripting.Dictionary")
  Set dicOld = CreateObject("Scripting.Dictionary")
  Set dicNew = CreateObject("Scripting.Dictionary")

  sSql = "SELECT * FROM T選手 ORDER BY よみ;"
  Set rs = CurrentDb.OpenRecordset(sSql)
  i = 0
  Do While (Not rs.EOF)
    i = i + 1
    If (i > iM6Count) Then Exit Do
    sN = "ck" & i
    dic.Item(rs("選手ID").Value) = sN
    With Me(sN)
      .Value = False
      .Tag = rs("選手ID")
      With .Controls(0)
        .Caption = rs("選手名")
        .BackStyle = 0
      End With
      .OnClick = "=ChkClick()"
      .Visible = True
    End With
    rs.MoveNext
  Loop
  rs.Close
  Set rs = Nothing
End Sub

Private Sub Form_Current()
  Dim sSql As String
  Dim rs As DAO.Recordset
  Dim i As Long

  Me.Painting = False
  For i = 1 To iM6Count
    With Me("ck" & i)
      If (Not .Visible) Then Exit For
      .Value = False
      .Controls(0).BackStyle = 0
    End With
  Next

  dicOld.RemoveAll
  dicNew.RemoveAll

  sSql = "SELECT * FROM T出場 WHERE 試合ID = " & Nz(Me.試合ID, 0) & ";"
  Set rs = CurrentDb.OpenRecordset(sSql)
  While (Not rs.EOF)
    i = rs("選手ID")
    dicOld.Item(i) = Null
    dicNew.Item(i) = Null
    With Me(dic.Item(i))
      .Value = True
      .Controls(0).BackStyle = 1
    End With
    rs.MoveNext
  Wend
  rs.Close
  Set rs = Nothing
  Me.Painting = True
End Sub

Private Sub Form_BeforeUpdate(Cancel As Integer)
  Cancel = True
  MsgBox "修正したら登録ボタンで確定", vbCritical
End Sub

Private Sub Form_Undo(Cancel As Integer)
  Dim v As Variant
  Dim i As Long

  Me.Painting = False
  For i = 1 To iM6Count
    With Me("ck" & i)
      If (Not .Visible) Then Exit For
      .Value = False
      .Controls(0).BackStyle = 0
    End With
  Next

  dicNew.RemoveAll
  If (dicOld.Count > 0) Then
    For Each v In dicOld.keys
      dicNew.Item(v) = Null
      With Me(dic.Item(v))
        .Value = True
        .Controls(0).BackStyle = 1
      End With
    Next
  End If
  Me.Painting = True
End Sub

Private Sub btn1_Click()
  Dim sSql As String
  Dim sS As String
  Dim v As Variant

  If (Not Me.Dirty) Then Exit Sub

' 試合日など入力チェックをするのなら、この場所で

'
  sS = Me.BeforeUpdate
  Me.BeforeUpdate = ""
  Me.Dirty = False
  Me.BeforeUpdate = sS

  If (dicOld.Count > 0) Then
    For Each v In dicOld.keys
      If (Not dicNew.Exists(v)) Then
        sSql = "DELETE * FROM T出場 WHERE 試合ID = " & Me.試合ID _
            & " AND 選手ID = " & v & ";"
        CurrentDb.Execute sSql
      End If
    Next
  End If
  If (dicNew.Count > 0) Then
    For Each v In dicNew.keys
      If (Not dicOld.Exists(v)) Then
        sSql = "INSERT INTO T出場(試合ID, 選手ID) VALUES (" _
            & Me.試合ID & "," & v & ");"
        CurrentDb.Execute sSql
      End If
    Next
  End If
  Call Form_Current
End Sub

Private Sub Form_Close()
  Set dic = Nothing
  Set dicOld = Nothing
  Set dicNew = Nothing
End Sub

この回答への補足

30246kikuさん

労力と時間をかけたご回答、誠にありがとうございます。
標準の機能(VBAを使わないと言う意味。)でできるものかと安易な質問でした
が、VBAをかなり使いこなす必要があるのですね。
恥ずかしながらVBAは初心者ですので、このご回答をベースにトライしてみたいと思います。

> <2>選手テーブルの追加があれば、「試合記録入力フォーム」に自動で、チェッ
> クボックスの追加があればよりよいのですが、そこは難しければ手動で追加して
> いけばよいと思っています。(<2>の更新は少ないため)
>
> さらに、別フォームでもよいので、過去の試合IDを選択すると、出場選手のチェックボックスにレ点が呼びもどされ、
> チェックをはずして、再登録すると、<3>からレコードが消えたり、
> チェックがないものに追加でレ点を入れると、<3>にレコードが追加される
> と、なおうれしいです。

を欲張ったので複雑になったのかもしれませんが、
・選手のチェックボックスは固定
・本フォームは登録するときのみ
に限定すれば、VBAを使わなくても実現できますでしょうか?


ちなみにAccessは2002です。

補足日時:2012/05/09 00:45
    • good
    • 0

#3です



私自身の作業は遅れそうですが、
待たせるのも何なんで大丈夫そうなものを先行して。

VBA 部分、記述が多くなったので回答を2つに分けます。
概要だけでもと思ったのですが、全部あった方が理解しやすいかな
という事で、VBA記述全部載せます。
検証等しっかりやってください。(おかしな使い方している部分があるかも)

大事なものを聞き忘れていましたが、Access のバージョンは何でしょう。
以下記述するのは、2007で確認したものになります。
もし、2000であれば、フォームの「取り消し時」イベントがないため
完全な動きにはなりません。(「取り消し時」イベントも使うので)

テーブル構成)

1)「Tチーム」
チームID: オートナンバ 主キー
チーム名: テキスト型

2)「T試合」
試合ID: オートナンバ 主キー
試合日: 日付/時刻型
天候: テキスト型
相手チーム: 数値型 「Tチーム」のチームIDと
試合場所: テキスト型

3)「T選手」
選手ID: オートナンバ 主キー
選手名: テキスト型
よみ: テキスト型

このテーブルは、自チームの選手のみ、と解釈。

4)「T出場」
an: オートナンバ 主キー
試合ID: 数値型 「T試合」の試合IDと
選手ID: 数値型 「T選手」の選手IDと


フォームの構成)

「T試合」を元にした単票フォームに、多数の非連結チェックボックスを配置します。
(#3までは選手は帳票で非連結のチェックボックス・・・って言ってましたが変更)
確認時に作成していたフォームの画像を添付します。

「T試合」を元に、フォームウィザードで作成。
(横に並べたかったので表形式で作成後単票に)
試合IDの表示は必要ないものとして表示から除外
レコードセレクタは「いいえ」に。レコード移動ボタンはそのまま「はい」

画像では見えませんが、右側に「登録」ボタンを「btn1」名で作成。

チェックボックスを作成していきますが、
必要人数以上のチェックボックスを不可視で作っておいて、
表示する時に必要な分だけ、可視(Visible=True)に変更します。
チェックボックス名の命名規則として、「"ck" & 連番」とします。
( "ck1" ~ "ck120" )
手作業で多数のチェックボックスを作成して名前を変更・・・
これ面倒なので、VBAで作成します。

1列20個で、計120個(6列分)のチェックボックスと、それにひっつくラベル
このラベル部分に選手名を表示するようにします。

まず、チェックボックスを配置します。
チェックボックスを追加する対象のフォーム「F6M_BASE」を、
一旦「F6M_BASE_」にコピーして、作り終わったら「F6M」に名称を変更
という内容になってます。

Private Const sFname As String = "F6M_BASE"
Private Const sFnew As String = "F6M"
Private Const IPX As Long = 567
Private Const iRowCount As Long = 20
Public Const iM6Count As Long = 120

Public Sub M6MakeProc()
  Dim i As Long
  Dim sN As String, sNc As String
  Dim iRow As Long, iCol As Long

  On Error Resume Next
  sN = sFname & "_"
  DoCmd.DeleteObject acForm, sN
  DoCmd.CopyObject , sN, acForm, sFname
  DoCmd.OpenForm sN, acDesign
  With Forms(sN)
    iRow = IPX * 1 ' 書き出し位置 詳細の上から1cm のところから
    iCol = IPX * 0.27 ' 左側どれくらい
    For i = 0 To iM6Count - 1
      With CreateControl(sN, acCheckBox, acDetail)
        sNc = "ck" & i + 1
        .Name = sNc
        .Top = iRow + (i Mod iRowCount) * IPX * 0.5
        .Left = (i \ iRowCount) * IPX * 3.2 + iCol
        .Width = IPX * 0.4
        .Height = IPX * 0.4
        .DefaultValue = "0"
        .TabStop = False
        .Visible = False
      End With
      With CreateControl(sN, acLabel, acDetail, sNc)
        .Top = iRow + (i Mod iRowCount) * IPX * 0.5
        .Left = (i \ iRowCount) * IPX * 3.2 + (IPX * 0.42) + iCol
        .Width = IPX * 2.6
        .Height = IPX * 0.42
        .BorderStyle = 1
        .BorderWidth = 1
        .BorderColor = RGB(0, 0, 0)
        .BackStyle = 0
        .BackColor = RGB(255, 240, 240)
      End With
    Next
  End With
  DoCmd.Close acForm, sN, acSaveYes
  DoCmd.DeleteObject acForm, sFnew
  DoCmd.Rename sFnew, acForm, sN
End Sub

いろいろと操作してみていると、チェック+色 にした方が良さそうだったので
それなりの記述になっていきます。

後述 VBA 記述概要をここで。

・チェックボックスクリック時
「T試合」の新規レコードであったら、見た目チェックを無効とするようにします
チェックボックスは非連結なので、変更してもレコード移動等のタイミングは分かりません。
なので、編集状態にしておくことで、レコード移動のタイミングを検知することが出来るようになります。
そこで、「天候」を同じ値で設定して編集状態に・・・
「天候」が都合悪ければ、別の連結したものを使ってください。
チェックボックスの変更状態を更新します。

・フォームが起動された時
「T選手」から選手情報をチェックボックスに割り当てていきます。
割り当てたチェックボックスのラベルに選手名を、+可視に
チェックボックスの Tag に、選手ID を登録しておきます。
これにより、クリックされた時、簡単に選手を特定できるようになります。

・レコード移動時
レコード移動によって「試合ID」が変化するので、その時の「試合ID」で
「T出場」にある選手を抽出し、チェックボックスを変更していきます。

・更新前
登録ボタン「btn1」クリックでのみ更新/登録できるようにするので、
意図しないタイミングでの更新はできない様に、常に Cancel = True とします

・取り消し時(2000では動かない)
チェックボックスを初期状態に戻し、
レコード移動時に取得した選手情報でチェックボックスを再設定

・登録ボタン
「T試合」への登録チェックが必要であればこのタイミングで
一度、更新前処理を無効としてレコードを登録します。
「T出場」に対して、チェックボックスの状態を反映します。

dicOld は、レコード移動時に取得したその試合での選手情報で、
チェックボックスでの変更状況は dicNew にて。
レコード移動直後は、dicOld dicNew は同じ内容となっています。
チェックボックスの操作により、dicOld dicNew の差分で
DELETE したり、INSERT したりします。
登録操作後、dicOld dicNew の内容を同じにするため、レコード移動時の処理を。

試合での選手情報は、レコード移動時にのみ取得しているので、
その間、他の人が同様な操作をするようなことがあればおかしくなると思います。

このフォームでは、新規追加でも、修正でも、それなりに動くと思います。

VBA記述内にコメントは、ほとんどありません。
記述を読めばわかるコメントは不要と考えています。
(逆に読む邪魔になったり、コメントで分かったつもりになったりします)
何故そうしたか・・・コメントでは理由を書くものと思っているので、
今回の記述には、そういう部分はあまりないような・・・

以降の記述の中で、For 文のところに iM6Count と見慣れないものがでてきますが、
前述のチェックボックスを作成する時に指定していた 総個数(120)に置換えてください。

【つづく】
「Accessでチェックボックス選択でレコ」の回答画像4
    • good
    • 0

#2です



全選手を帳票フォームで表示して、出場したのかをチェックボックスで入力
試合選手連結テーブルには、出場した人のみの情報を格納
・・・と言う事ですかね。
(帳票フォームは言い過ぎでしょうか)

具体的な記述をしたいのですが、
不明な点が多々あり、補足をお願いします。

フォームは、どのような構成になっているのでしょうか。
特に、

1)
> 試合ID  0001
> 試合日  5月1日
> 天候   晴れ
> 試合相手 タイガース
> 試合場所 東京グランド


2)
> A選手
> B選手
> ・・・・
> Z選手

の関係は、1)メイン 2)サブの構成?

それとも、
1)は帳票フォームで、コマンドボタンやダブルクリック等で
2)のフォームを別途起動する
様になっているとか・・・

それとも、
2)の帳票フォームのヘッダ部分に、1)を選択できるコンボボックスがあったり・・・

それとも、
・・・・・

また、テーブル構成はどうなっているのでしょうか
1)は、左側がそのままフィールド名でしょうか
2)は、選手ID、選手名・・・とかになっているのでしょうか
また、試合選手連結テーブルは、試合ID、選手ID のみでしょうか
なお、各フィールドの型(数値、テキスト等)はどうなっているのでしょうか
(「試合ID」は数値型だけど、書式で4ケタ表示にしているとか)

基本的な 考え方/フォーム構成は、#2で記述したURLでの方法になります。
それを元に、使用テーブル/フォーム構成に合わせた細工をしていくものになります。
なので、基本的な事はURLを参照して理解しておいてください。

なお、提示しようとしているものは VBA 記述になります。
今日は無理と思いますが、2~3日中にブログに載せれたらと思っています。
(アドレスは規約により記述できないので、探せたら探してみてください)
(実現の方法によっては、1回の回答の文字数制限に引っ掛かるかも・・・)

補足内容を見たうえで、少なくとも概要だけでも追記したいと思います

この回答への補足

30246kikuさん、ご対応ありがとうございます。


テーブルは、

<1>試合テーブル
 試合ID
 試合日
 天候
 試合相手
 試合場所
 等

<2>選手テーブル
 選手ID
 選手名
 選手年齢
 等

<3>試合選手連結テーブル
 試合テーブル.試合ID
 選手テーブル.選手ID


<1>と<3>
<2>と<3>
はそれぞれリレーション付けられています。

その上で、これからフォームを作ろうと思っています。
フォームのイメージは、

<1>を試合のたびに入力していきます。
<1>の情報を入れる際に、出場した選手も登録します。
(つまり<3>のレコードが、出場選手分追加される)

フォームのイメージ

************* 試合記録入力フォーム ********************
 試合ID  [入力欄]
 試合日  [入力欄]
 天候   [入力欄]
 試合相手 [入力欄]
 試合場所 [入力欄]

□選手A  □選手L  □選手X
□選手B  □選手M  □選手Y
□選手C  □選手N  □選手Z
□選手D

 <登録ボタン>

********************************************************


上記のフォームで、
・5月1日の試合情報を入力する。
・出場した選手(A,B,C)のチェックボックスにレ点を入れる。
・登録ボタンを押す。

すると
<1>試合テーブル
に5月1日の1レコードができる。
<3>試合選手連結テーブル

試合ID 0001 選手ID A
試合ID 0001 選手ID B
試合ID 0001 選手ID C
の3レコードができる。

といったイメージです。

<2>選手テーブルの追加があれば、「試合記録入力フォーム」に自動で、チェッ
クボックスの追加があればよりよいのですが、そこは難しければ手動で追加して
いけばよいと思っています。(<2>の更新は少ないため)

さらに、別フォームでもよいので、過去の試合IDを選択すると、出場選手のチェックボックスにレ点が呼びもどされ、
チェックをはずして、再登録すると、<3>からレコードが消えたり、
チェックがないものに追加でレ点を入れると、<3>にレコードが追加される
と、なおうれしいです。



なかなか伝わりにくくて申し訳ないですが、ご教授いただければ幸いです。

補足日時:2012/05/08 01:21
    • good
    • 0

フォームの構成が今一つ分からないのですが、


帳票フォーム上の非連結チェックボックスでレコードを特定したい・・・という事であれば

非連結のチェックボックスでレコードを選択する
http://hatenachips.blog34.fc2.com/blog-entry-28. …

が参考になると思います。

上記を読んで分からなければ、もう少し具体的な内容で補足してもらえませんか。
また、
リストボックスを2つ並べて、選んだ/選んでない・・・
をギッコンバッタンする方法もあるかと思います。

リストボックスの活用-連動-:SampleFile035
http://www.accessclub.jp/samplefile/samplefile_3 …

左のリスト内のそれをクリックしたら、右側のリストに移る。
逆に、右リスト内のそれをクリックすると左側のリストに移る・・・・とか

操作的に、私はリストボックスを使った方がイメージ・操作しやすいですが・・・

この回答への補足

30246kiku様、ご回答ありがとうございます。
Accessに精通していないので、いただいたご回答で実施可能かどうか判断できていません。
あといただいたご回答の

リストボックスを2つ並べて、選んだ/選んでない・・・
をギッコンバッタンする方法もあるかと思います。

は、こういう入力フォームでの実現もありえますが、100以上ある選手から選ぶので、できれば選手をあいうえお順で並べて、該当の選手を探しやすいようにするためにチェックボックスにしたいわけです。教えていただいたリストボックスもあいうえお順で並べればよいと言われるかもしれませんが、100以上の選手を一画面で表示をして(例えば横にあ行、か行、さ行、、、、と並べてみれるように)必要な選手を選択したいです。

説明が不足しているかもしれないので、補足を追加します。
試合ID と 選手ID を連結させるためだけのテーブル(試合選手連結テーブル)を作っています。

試合ID 0001 に出場した選手は、 A,B,C
試合ID 0002 に出場した選手は、 A,B,C,X,Y
試合ID 0003 に出場した選手は、 A,Z

だとします。

A~Zのチェックボックスを準備して、
0001のIDに A,B,Cをチェックして、確定させると

0001 A
0001 B
0001 C

というレコードができる。
0002のIDに、A,B,C,X,Yをチェックして、確定させると

0002 A
0002 B
0002 C
0002 X
0002 Y

というレコードができる。

0003のIDに、A,Zをチェックして、確定させると
0003 A
0003 Z

というレコードができる。

上記処理が終わると、試合選手連結テーブルは、
0001 A
0001 B
0001 C
0002 A
0002 B
0002 C
0002 X
0002 Y
0003 A
0003 Z
というレコードを作りたいのです。
逆に試合ID0002にYが出場したと思っていたら間違いで、出場してなかったことがわかり、
0002 に対して、Yをチェック外して確定させると
0002 Y
レコードを削除したいです。

ご回答いただいた内容で上記が実現できますでしょうか?

補足日時:2012/05/07 00:53
    • good
    • 0

状況がよく分かりませんが


ここにチームのメンバ(メンバテーブル)
選手名 表示
A選手レ
B選手
・・・・
Z選手 レ
みたいにYes/No型のフィールド『表示』を加えて
クエリ上で抽出条件に True とすれば良いのでは?

この回答への補足

nicotinism様、ご回答ありがとうございます。
試合ID と 選手ID を連結させるためだけのテーブル(試合選手連結テーブル)を作っています。

試合ID 0001 に出場した選手は、 A,B,C
試合ID 0002 に出場した選手は、 A,B,C,X,Y
試合ID 0003 に出場した選手は、 A,Z

だとします。

A~Zのチェックボックスを準備して、
0001のIDに A,B,Cをチェックして、確定させると

0001 A
0001 B
0001 C

というレコードができる。
0002のIDに、A,B,C,X,Yをチェックして、確定させると

0002 A
0002 B
0002 C
0002 X
0002 Y

というレコードができる。

0003のIDに、A,Zをチェックして、確定させると
0003 A
0003 Z

というレコードができる。

上記処理が終わると、試合選手連結テーブルは、
0001 A
0001 B
0001 C
0002 A
0002 B
0002 C
0002 X
0002 Y
0003 A
0003 Z
というレコードを作りたいのです。
逆に試合ID0002にYが出場したと思っていたら間違いで、出場してなかったことがわかり、
0002 に対して、Yをチェック外して確定させると
0002 Y
レコードを削除したいです。

ご回答いただいた内容で上記が実現できますでしょうか?

補足日時:2012/05/07 00:45
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A