1

人物 Person_Pet ペット

データ入力フォームを作成する必要があります。Person という名前のテーブルがあり、その中に適切なフィールドがあるとします。私のフォームでは、ユーザーが持つことができるすべての可能なペットを表す (1 つまたは複数の) チェックボックスから選択できるようにする必要があります (アイテムの固定リスト: 犬、サーバル、ラマ、ジャッカロープ、エミュー、ドラゴン、スパイダー...) .

フォームには、可能な選択肢を表すチェックボックスが 1 つ必要です。その人がペットの犬を飼っている場合、そのチェックボックスは true である必要があり、犬を飼っていない場合は false である必要があります (サブフォームとしてこれを実行しようとして行き詰まったので、明らかなことを述べていると思います。 「多対多」と「偽」の価値のあるものを表示する. 彼らは複数を選択することができます.

最終的には、新しいフォームを作成するか、変更などのためにデータ入力フォームを再利用する必要があります。

これはサブフォームですか?Person テーブル、Pet テーブル、Person_Pet (id/joining) テーブルがあります。私は VBA でこれをすべて行おうとしていますが、難しい方法を選んだと思いますが、方向を変えるのに遅すぎることはありません。

編集:これから始めたらどうですか?考えられるすべてのペットのリストが表示され、 p.personid が null の場合、チェックボックスはチェックされません。null でない場合はチェックされます。これは可能ですか?(書式設定を許してください、アクセスSQLライターは明らかにタブが何であるかを知りません。テーブル名をすばやく検索して置換する必要があったため、sytanxエラーを許します)

select pet.*, p.personid
from pet pet 
left outer join
(select pi.petID, pi.personid
from    person,
        pet_person pi,
        pet 
where   person.id = pi.personID and
        pet.id = pi.petID) as p
on p.petID = pet.id

編集:

わかった。そこに大きな答えがあります。私もそれを解決しました。私はあなたの答えを見ていませんが、少しだけ見ていきます。これが私の答えです...(サブフォームはありません。すべてメインフォームの「人」フォームにあります)

  1. チェックボックスを作成し、chk1、chk2、chk3 などの名前を付けます。
  2. それらが私のlil petテーブルの適切なフィールドに対応していることを確認してください....犬= chk1、serval = chk2 ...など
  3. このvbaを実行します(そしてForm_Current()から関数を呼び出してme.idに渡します):

Function update_checkboxes(issueID As Variant) Dim query As String Dim rs As DAO.Recordset Dim db As Database Set db = CurrentDb Dim a As String

If Not IsNull(issueID) Then
    query = "SELECT iif(joined.issueid is null, 0, 1) as binval, payer.* " & _
            "FROM payer AS payer LEFT JOIN (select ri.issueid, ri.payerid " & _
                    "from  issue i, payer r, payer_issue ri " & _
                    "where i.id = ri.issueid and r.id = ri.payerid and ri.issueid = " & issueID & _
                    ")  AS joined ON joined.payerid = payer.id;"
Else
    query = "select 0 as binval, payer.* from payer"
End If

Set rs = db.OpenRecordset(query)
rs.MoveFirst

Do While Not rs.EOF
    s = rs.Fields("CorrespondingChkboxNumber")
    Me.Controls("chk" & s).Value = rs.Fields("binval")
    rs.MoveNext
Loop

rs.Close
End Function

うん。そのコピペコード形式のstackoverflowのことは私を嫌っています。ごめん。うーん。発行者 = 人、支払人 = ペット。対応するチェックボックスがアイデアではないことはわかっています。文字列フィールドを検索/チェックする必要がありますが、これは、次の場合を除き、最終的に使用する可能性があると思われるものの概念を示しています..... .........

フォローアップの質問: レコードが変更されるたびにこれらの vba クエリを実行すると、重大な時間制約の問題/結果/合計がありますか?

ところで。ご参考までに。選択された回答で可能な回答を示したいという欲求は、物事が何であるかと同じくらい重要である場合があるためです。一部の地域/郡/自治体では、ピットブルを許可しません。カリフォルニア州全体が明らかにフェレットを禁止しています。私はピットブルを飼っています。私はフェレットを飼っていません。私たちは皆、訓練するペットのドラゴンがいたらいいのにと思っています。これらはすべて、一部の地域ではペット禁止リストに載っているため、.... これらの両方を表示する必要があります。リストボックスでもできますが、少し見にくいと思います。考えられるすべてのペットを目に見えるようにリストすることで、どのペットがフラグを立てているかがわかります。最終的には、私が何を持っているかだけが本当に重要ですが........それでも。しかし明らかに、私は人やペット、そして彼らが住む場所のためのかわいい小さなアクセスデータベースを作っているわけではありません.

4

2 に答える 2

1

VBA では、次のコードを使用できます。次の 2 つのオプションがあります。

  1. 「ネイティブ」アクセス リストボックスを使用: これは、従来のリストボックスで強調表示された行として選択を示します。

    listboxes プロパティ/all
    シートで multiselect=1 (Single) を選択し、以下のコードを変更します -> コメント行を削除し、代わりに上記の行にコメントを付けます

  2. ここでMSForms.Listbox(FormcreationでactiveX挿入を選択)を使用
    すると、必要なチェックボックスが得られます。

    Multiselect:multi と ListStyle:option を選択しました。ここではクリック イベントがないため、代わりに Exit イベントを選択しました。これまでのところ問題に遭遇したことはありませんが、整然としたクリックイベントの方が優れています。

コードは次のとおりです。

Option Compare Database
Option Explicit

Dim pPetListBox As MSForms.ListBox

Private Sub FillPetListbox() 
  pPetListBox.Clear
  Dim rst As DAO.Recordset
  Set rst = CurrentDb.OpenRecordset("select * from pet order by id")
  While Not rst.EOF
    pPetListBox.AddItem rst!ID
    pPetListBox.List(pPetListBox.ListCount - 1, 1) = rst!petname
    rst.MoveNext
  Wend
  rst.Close
End Sub

Private Sub Form_Current()
  Dim rst As DAO.Recordset
  Dim indx As Long
  Set rst = CurrentDb.OpenRecordset("select * from person_pet where personid=" & Me.ID)
  For indx = 0 To pPetListBox.ListCount - 1
    rst.FindFirst "petID = " & pPetListBox.Column(0, indx)
'    rst.FindFirst "petID = " & petList.ItemData(indx)
    pPetListBox.Selected(indx) = Not rst.NoMatch
  Next
  rst.Close
End Sub

Private Sub UpdateLinkTable()
  Dim rst As DAO.Recordset
  Dim indx As Long
  Set rst = CurrentDb.OpenRecordset("select * from person_pet where personid=" & Me.ID)
  indx = pPetListBox.ListIndex
  rst.FindFirst "petID = " & pPetListBox.List(indx, 0)
  'rst.FindFirst "petID = " & petList.ItemData(indx)
  If (pPetListBox.Selected(indx) And rst.NoMatch) Then
    rst.AddNew
    rst!personID = Me.ID
    rst!petID = pPetListBox.Column(0, indx)
    rst.Update
  Else
    If ((Not pPetListBox.Selected(indx)) And (Not rst.NoMatch)) Then
      rst.Delete
    End If
  End If
  rst.Close
End Sub

Private Sub Form_Load()
  Set pPetListBox = Me.msfPetListBox.Object
  FillPetListbox
End Sub

Private Sub msfPetListBox_Exit(Cancel As Integer)
'Private Sub petList_Click()
  UpdateLinkTable
End Sub

ネイティブ アクセス リストボックスを使用する場合、リストボックスの内容をプログラムでロードする必要はありません (FillPetListBox)。代わりに、rowsource-property をペット テーブルに設定するだけです。MSForms.listbox をそのテーブルにバインドすることも可能だと思いますが、まだ試していません。

于 2012-04-25T15:59:21.057 に答える
1

サブフォームを使用します。複数のチェックボックスが非常識に接しています:)

テーブルが必要です:

PersonID
PetID

PetID は、可能性のあるペットをリストする行ソースを持つコンボボックスになります。PersonID は、リンクの子およびマスター フィールドになります。

これを行うためのコードは必要ありません。

于 2012-04-24T20:53:17.543 に答える