1

いくつかの背景情報です。私のテーブル (HireHistory) には 50 列 (水平方向) があります。2 つのテキスト ボックス (HistoryMovieID と HistoryCustomerID) とボタン (ボタンはクエリ 'HireHistoryQuery' を実行します) を持つフォーム (HireHistoryForm) があります。

これは私のデータの抜粋です (CustomerID は一番上にあります)。 データ

したがって、HistoryCustomerID ボックスに数値を入力すると、その列が表示されるようにする必要があります。たとえば、入力した値が「1」の場合、クエリでは列 1 のすべてのレコードが表示されます。

HistoryMovieID ボックスに数字 (0001 など) を入力すると、特定の CustomerID の MovieID のすべてのインスタンスが表示されます。つまり、列 1 は ID であるため、ID=1 の場合、「0001 on 19/05/2006」と表示され、続いて「0001」の次のインスタンスが検索されます。

HistoryCustomerID については、これをクエリの「フィールド」に入れようとしました。

=[Forms]![HireHistoryForm]![HistoryCustomerID]

しかし、うまくいきませんでした。私のクエリは「10」というラベルの付いた列を返しただけで、行は「10」で構成されていました。

お役に立てれば幸いです。:)

4

1 に答える 1

1

攻撃を意図したものではありません (とにかく可能な限り少なくします) が、これはデータを構造化する恐ろしい方法です。次のように再構築する必要があります。

CustomerID  MovieID HireDate
----------  ------- --------
1           0001    19/05/2006
1           0003    20/10/2003  
1           0007    13/08/2003
...     
2           0035    16/08/2012
2           0057    06/10/2012
...

現在のデータ構造を維持する場合

  1. 気が狂うし、

  2. 他の誰かがこの問題に近づく可能性はほとんどありません。

編集

改訂されたデータ構造は非常にわずかな改善ですが、それでもあなたにとっては不利に働きます. ここでの他の質問では、クエリを実行するときにデータ構造を「その場で」「修正」する方法を本質的に求めていることを考慮してください。

幸いなことに、少しの VBA コードを一度実行して、データ構造を実行可能なものに変換できます。まず、「HireHistoryV2」と呼ぶ新しいテーブルを作成します。

ID         - AutoNumber, Primary Key
CustomerID - Number(Long Integer), Indexed (duplicates OK)
MovieID    - Text(4), Indexed (duplicates OK)
HireDate   - Date/Time, Indexed (duplicates OK)

データを新しいテーブルにコピーする VBA コードは次のようになります。

Function RestructureHistory()
Dim cdb As DAO.Database, rstIn As DAO.Recordset, rstOut As DAO.Recordset
Dim fld As DAO.Field, a() As String

Set cdb = CurrentDb
Set rstIn = cdb.OpenRecordset("HireHistory", dbOpenTable)
Set rstOut = cdb.OpenRecordset("HireHistoryV2", dbOpenTable)

Do While Not rstIn.EOF
    For Each fld In rstIn.Fields
        If fld.Name Like "Hire*" Then
            If Not IsNull(fld.Value) Then
                a = Split(fld.Value, " on ", -1, vbBinaryCompare)
                rstOut.AddNew
                rstOut!CustomerID = rstIn!CustomerID
                rstOut!MovieID = a(0)
                rstOut!HireDate = CDate(a(1))
                rstOut.Update
            End If
        End If
    Next
    Set fld = Nothing
    rstIn.MoveNext
Loop
rstOut.Close
Set rstOut = Nothing
rstIn.Close
Set rstIn = Nothing
Set cdb = Nothing
MsgBox "Done!"
End Function

注: dd/mm/yyyy の日付形式を使用しているようです。日付の変換を注意深くチェックして、正しく変換されていることを確認してください。

于 2013-04-18T08:46:36.717 に答える