1

2 列のテーブルの行をループして、最初の列で特定の識別子をチェックし、2 番目の列のデータを新しいテーブルにコピーするクエリを作成することはできますか?

例:

tblSurveyData
FirstColumn     Second Column
A0              John
A2              Smith
A3              05-01-1973

tblSurveyReport
FirstName   MiddleName  LastName    DateOfBirth 
John                    Smith       05-01-1973

A0 データは、FirstName、A1 MiddleName、A2 LastName、および A3 DateOfBirth に移動します。さらに多くの識別子とフィールドがありますが、例として、Access のクエリでこれをどのように行うか、または VBA の方が優れたソリューションですか?

私が思いついた唯一の解決策は次の VBA ですが、これは 2 列のテーブルをバイパスし、tblSurveyReport テーブルに挿入しようとします。残念ながら、各データを独自の行に配置するため、役に立ちません。

If Identifier = "A0" Then
DoCmd.RunSQL "INSERT INTO tblSurveyReport " _
            & "(FirstName) " _
            & "VALUES ('" & Info & "')"
ElseIf Identifier = "A1" Then
DoCmd.RunSQL "INSERT INTO tblSurveyReport " _
            & "(MiddleName) " _
            & "VALUES ('" & Info & "')"
ElseIf Identifier = "A2" Then
DoCmd.RunSQL "INSERT INTO tblSurveyReport " _
            & "(LastName) " _
            & "VALUES ('" & Info & "')"
ElseIf Identifier = "A3" Then
DoCmd.RunSQL "INSERT INTO tblSurveyReport " _
            & "(DateOfBirth) " _
            & "VALUES ('" & Info & "')"
End If

ただし、各データは独自の行に入るため、すべて同じ行に配置する必要があります。

どんな助けでも大歓迎です。

前もって感謝します。

TC

4

3 に答える 3

0

レコードをリンクする何かが必要になります。データが再ソートされるとどうなりますか? 例のすべての情報が同じレコードにある必要があることをどのように知ることができますか? このようなことを行う唯一の方法は、最初のテーブルに 3 番目のフィールドを作成して、どのデータがどのデータに属しているかを判断することだと思います。次に、テーブルは次のようになります。

tblSurveyData

FirstColumn     Second Column      UserID
A0              John               XX001
A2              Smith              XX001
A3              05-01-1973         XX001

次に、次のような予備クエリを作成できます。

Select DISTINCT UserID from tblSurveyData

それを「ポインター」クエリとして使用し、結果をループすると、各 UserID を持つすべてのレコードを引き出して、それらを新しいテーブルにコピーできます。または、「ポインター」クエリと tblSurveyData を内部結合してから、クロス集計クエリを使用することもできます。これを行う最も簡単な方法は、ウィザードを使用して作成し、コードを VBA にコピーすることです。

編集:将来の読者が読みやすくするために、コメントで求めているクエリの SQL は次のとおりです。

SELECT Max(IIf([Identifier]="A0",[IValue],"")) AS FName, Max(IIf([Identifier]="A1",[IValue],"")) AS MName, Max(IIf([Identifier]="A2",[IValue],"")) AS LName, Max(IIf([Identifier]="A3",[IValue],"")) AS BDate FROM tblSurveyData; 

サンプル データの「最初の列」を「識別子」に、「2 番目の列」を「IValue」に変更する必要があります (または、上記の SQL の対応するフィールド名を変更します)。これをテストしたところ、完全に機能し、対応するフィールドに 4 つの値すべてを含む 1 つのレコードが得られました。それを空白のクエリに貼り付けたら、デザイン ビューに切り替えてクエリを Append または MakeTable クエリに変更すると、結果を tblSurveyReport にエクスポートできます。

于 2013-09-04T19:26:20.063 に答える
0

次のように、単純に 2 つのレコードセットを持つことができます。

  • 1 番目のレコードセット: rsSurveyData
  • 2 番目のレコードセット: rsSurveyReport

アイデアは、最初のレコードセットをそのレコードに沿って参照し、2 番目のレコードセットをそのフィールドに沿って参照することです。

使用しているレコードセット オブジェクト (DAO または ADODB) に応じて、開始構文は若干異なりますが、ヘルプですべての詳細を確認できます。ここでは、'Find'、'Move'、および 'Update' メソッドに ADODB 構文を使用しています。DAO レコードセットには、データを変更する前に追加の 'Edit' メソッドが必要です。また、レコードセット オブジェクトのフィールド コレクションのインデックスが 0 か 1 かは覚えていません...

それで:

rsSurveyData.moveFirst
rsSurveyReport.Find "FirstName ='" & rsSurveyData.fields("A0") & "'"
if rsSurveyReport.EOF then
    'do what you have to do when the record does not exist, for example:'
    rsSurveyReport.addNew
    rsSurveyreport.fields(1) = rsData.fields(1)
Else
    'you''ve just found the record that needs to be updated'
    for i = 2 to rsSurveyData.recordcount
        rsSurveyData.move i, 1    
        rsSurveyReport.fields(i)=rsSurveyData.fields(1) 
    next i
    rsSurveyReport.update
Endif
于 2013-09-06T11:38:17.860 に答える