1

mailers テーブルに新しいレコードを作成したいと考えています。このレコードには、contacts_first_filter_id、mailer_states_id、created_at の 3 つのフィールドに値が含まれます。これらの値のうちの 2 つは、他のテーブルからのクエリに基づいており、最後の値は現在の時刻です。

これを達成するために複数の方法を試しましたが、うまくいきませんでした。最初に、SQL デザイン内で直接クエリを作成してみました。

INSERT INTO mailers ( contacts_first_filter_id, mailer_states_id, created_at )
VALUES (DLookup("id","update_mailer_step_two"), DLookup("id","mailer_states" & "mailer_state = 'sent'"), Now());

これにより、エラー「不明」が発生します。

また、これをVBAエディターに入れて、ボタンのクリックでトリガーしようとしました:

Private Sub Command6_Click()


        Dim CFF_ID As String, MS_ID As String, strSQL As String

        CFF_ID = "SELECT update_mailer_step_two.id FROM update_mailer_step_two"

        MS_ID = "SELECT mailer_states.id FROM mailer_states WHERE mailer_states.mailer_state = 'sent'"

        strSQL = "INSERT INTO mailers ( contacts_first_filter_id, mailer_states_id, created_at )VALUES ((" & CFF_ID & "),(" & MS_ID & "),NOW())"

        DoCmd.RunSQL strSQL

End Sub

これにより、「クエリ入力には少なくとも 1 つのテーブルまたはクエリが含まれている必要があります」というエラーが表示されます。

INNER JOIN を使用して以下の推奨事項を試しましたが、エラーは発生しませんが、おそらく update_mailer_step_two と mailer_states の間に INNER JOIN リンクがないため、0 行が追加されます。

INSERT INTO mailers ( contacts_first_filter_id, mailer_states_id, created_at )
SELECT update_mailer_step_two.id, mailer_states.id, Now()
FROM update_mailer_step_two INNER JOIN mailer_states ON update_mailer_step_two.id = mailer_states.ID
WHERE mailer_states.mailer_state = 'sent';

mailer_states テーブルは、テキスト付きの mailer_state フィールドを含む単なるテーブルです。これは、変更されることのない単なるルックアップ テーブルです。

update_mailer_step_2 には id と呼ばれる 1 つのフィールドが含まれています。これには、データベース内の連絡先に関連付けられた一連の ID が含まれています。したがって、mailer_states と update_mailer_step_2 の間にはまったく関係がありません。

** update_mailer_step_two を作成し、新しい列を追加して、デフォルトで mailer_states に対応する値を設定すると、INNER JOIN が機能するようになると思います。残念ながら、Access ではこれを行うことができないようです。

別のstackoverflowの投稿で、次のことができると述べました。

デフォルト値で列を追加するSQL - Access 2003

しかし、それは私にとってはうまくいきません。

テーブルに新しいレコードを作成することを目的としたクエリの値として、他のテーブルに基づくクエリを配置する方法のアイデアが不足しています。

返信ありがとうございます。

4

4 に答える 4

3

最初のアプローチ (DLookup への呼び出しを含むクエリを使用) は原則として機能するはずですが、構文エラーがあります。各 DLookup を個別に実行するという @HansUp の提案は適切であり、これを特定するのに役立ちます (Visual Basic Editor で Ctrl-G を押して中間ウィンドウを表示します。@HansUp の例の各式の前の疑問符必要)。

具体的には、2 番目の DLookup 呼び出しのアンパサンドは文字列連結文字です。つまり、現在の呼び出しは次と同等です。

DLookup("id","mailer_statesmailer_state = 'sent'")

代わりに、次のように変更します。

DLookup("id","mailer_states", "mailer_state = 'sent'")


追加

update_mailer_step_two の各行に 1 つの新しい行を挿入するには、次のようにします。

INSERT INTO mailers ( contacts_first_filter_id, mailer_states_id, created_at )
SELECT update_mailer_step_two.id,
       DLookup("id","mailer_states", "mailer_state = 'sent'"),
       Now()
FROM update_mailer_step_two
于 2011-02-01T06:33:19.470 に答える
3

イミディエイト ウィンドウ (Ctrl+g) で 2 つの DLookup ステートメントを試してください。

? DLookup("id","update_mailer_step_two")
? DLookup("id","mailer_states", "mailer_state = 'sent'")

それらが機能し (エラーをスローしない)、必要なものを返す場合は、それらをサブルーチンに組み込んでみてください。

Private Sub Command6_Click()
    Dim CFF_ID As Long, MS_ID As Long, strSQL As String
    Dim db As DAO.Database
    CFF_ID = DLookup("id","update_mailer_step_two")
    MS_ID = DLookup("id","mailer_states", "mailer_state = 'sent'")
    strSQL = "INSERT INTO mailers (contacts_first_filter_id, mailer_states_id, created_at) " & _
        "VALUES (" & CFF_ID & ", " & MS_ID & ", NOW())"
    'DoCmd.RunSQL strSQL '
    Debug.Print strSQL 'look in Immediate Window to see the completed INSERT statement '
    Set db = CurrentDb
    db.Execute strSQL, dbFailOnError
    Set db = Nothing
End Sub

このテストされていないコードは、メーラーの CFF_ID、MS_ID、contacts_first_filter_id フィールドと mailer_states_id フィールド、および update_mailer_step_two テーブルと mailer_states テーブルの id フィールドの数値データ型を想定しています。それらのいずれかが実際にテキストである場合は、コードを調整するか、どちらがどちらであるかをお知らせください。

編集: Debug.Print 行の目的は、データベースに実行を依頼している完成した INSERT ステートメントを表示できるようにすることです。失敗した場合は、ステートメント テキストをコピーして、新しいクエリの SQL ビューに貼り付けることができます。そこで、Access がそれを受け入れるように微調整できます。次に、同じように機能する INSERT ステートメントを生成するようにコードを調整します。

于 2011-02-01T02:13:25.907 に答える
0

select ステートメントの結果をテーブルに挿入しようとしています。ただし、select ステートメントは、2 つの異なるテーブルから個別に選択します。

これはうまくいかないと思います。

主な理由は、2 つの独立した結果をどのように処理するかです。クロス、内部結合などでリストを作成しますか?

両方から選択するクエリを作成し、そのクエリをテーブルに挿入します。または、選択を内部結合して、その結合を値に転送することもできます。

于 2011-01-31T23:14:09.687 に答える
0

文字列を作成するときに、ボタンクリックのサンプルにも構文エラーがあると思います。これは動作するはずです (残りのコードでは、DLoookups が HansUp によって指摘されているように正しく動作すると仮定します):

strSql = "INSERT INTO mailers (contacts_first_filter_id,  mailer_states_id," & _
       " created_at) VALUES (" & CFF_ID & ", " & MS_ID & ", #" & Now() & "#)"

削除した余分な括弧が効果を発揮するかどうかはわかりません。白いスペースの違いは違いありませんが、私のバージョンでは VBANow()が値を評価して文字列に組み込むことができます。Access は#、日付を引用するために使用します。

于 2011-02-01T18:25:53.683 に答える