2016-08-31 10 views
0

同じフォームの別のコントロール(ctrl1)に基づく選択クエリによって設定されたフォームのリストボックスがあります。それは、CTRL1の更新時にトリガーされます。SELECTの結合がnullを返す場合にのみ、すべてのレコードを返す方法

PARAMETERS [Ctrl1 input] Long; 
SELECT table1.column1, table1.column2 
FROM (table1 INNER JOIN table2 ON table1.column2 = table2.column1) INNER JOIN table3 ON table2.column2 = table3.column3 
WHERE (((table3.column1)=[Ctrl1 input])) 
ORDER BY table1.column2; 

また、これはtable3.column3フィールドに値を持っているtable3.column1の値に一致するフォームパラメータに基づいて動作します。今すぐフォームの選択がtable3.column3に一致する値を持たない場合、リストボックスは空のままです。この状況では、代わりにすべての結合と制約なしでSELECT table1.column1, table1.column2の完全なリストを返すことを望みます。

PARAMETERS [Ctrl1 input] Long; 
CASE WHEN (SELECT table3.column3 WHERE (table3.column2 = [Ctrl1 Input]) IS NOT NULL) 
    THEN 
     SELECT table1.column1, table1.column2 
     FROM (table1 INNER JOIN table2 ON table1.column2 = table2.column1) INNER JOIN table3 ON table2.column2 = table3.column3 
    ELSE 
     SELECT table1.column1, table1.column2 
:(。リストが非常に長いので、私はどうしても必要なときだけ、全体のものを使用したい)

SQLでは、これに似たような、case機能は、私が欲しいものを達成することを表示されます

しかし、Accessクエリでcaseを使用することができません。それもうまくいくよう

IIf文は

PARAMETERS [Ctrl1 input] Long; 
IIf(
    (SELECT table3.column3 WHERE (table3.column1 = [Ctrl1 input]) IS NOT NULL), 
    (SELECT table1.column1, table1.column2 FROM (table1 INNER JOIN table2 ON table1.column2 = table2.column1) INNER JOIN table3 ON table2.column2 = table3.column3), 
    (SELECT table1.column1, table1.column2) 
    ) 

、ようだが、アクセスが、それはSELECTINSERTは、DELETEは、など。また、SELECT IIfテスト、私が得る期待すると言って、それを受け入れないだろうそれはただ一つの価値しか返すことができないと言って、それは私のためには役に立たない。

私はVBAでcaseIIfの両方を使用してTHATをクエリで使用する記事を見てきましたが、自分の状況をどのように変換するのかを理解するための十分な例は見つかりませんでしたモジュールを呼び出して呼び出します。私はVBAでは動作せず、SQLでほとんど動作しません。 VBAを掘り下げる前に、私は知りたいと思っています:

  1. 私はVBAで何をしたいのですか?
  2. case,IIf、または他のアプローチの引数がありますか?
  3. この関数では、値として何を渡しますか?フォーム上のctrl1からのデータ?
  4. 返す関数は何ですか、どうすればよいですか?これは機能自体の内部にmyfunction = the code that produces the dataset I needを設定することによって達成されますか?

私は関数の出力タイプを理解している限り、クエリの関数の使い方を理解していると思います。

洞察と情報をお寄せいただきありがとうございます。

注:私はAccess 2016を使用していますが、ファイル自体は2002-2003形式なので、GISソフトウェアと互換性があるようです。

+0

IIF()は間違った場所や順序で正しく行っています。 ifステートメントは、あなたが選択したWHERE条件では使用されません。しかし、あなたはVBAでもSQLを呼び出す前にそれをテストすることができます。正直なところ、あなたが投稿したコードはあまりにも混乱している/私はそれをもっと解読したいと思っていますが、これはあなたの問題の少なくとも1つです。 – Matt

+0

@Matt私は結果に応じて 'FROM'が変化するもし 'FROM'がその前に起こるならば' IIf'の? 混乱のためのお詫び。私が言ったように、私は言語を知らない。一般的なフィールド名とテーブル名を使用した方が良いでしょうか?各関数の構文を調べると、その例は非常に簡単で、一般的なSQLの手法を知らなくても、書式を調整する方法はわかりません。 – troubbble

+0

正直なところ、おそらく値をテストして、ロジックがあればVBAを使用してクエリ文字列を設定し、目的の文字列を渡すべきです。あなたはSQLでそれを行うことができますが、オプションのテーブルに参加したままにして、条件が満たされているかどうかを判断するために、JOINとWHEREのIF()文を使用します。 – Matt

答えて

1

IIFまたはVBAを必要としないコントロールが空である(または一致するものが見つからない)場合、Accessにフィルターをかけない方法があります。あなたは、入力がnullであればすべてを返すようにAccessに指示する必要があります。上部のクエリは次のようになります。

SELECT table1.column1, table1.column2 
    FROM 
     (SELECT table1.column1, table1.column2 
     FROM table1 
     INNER JOIN table2 
     ON table1.column2 = table2.column1) 
INNER JOIN table3 
ON table1.column2 = table3.column3 
    WHERE table3.column1 = [Ctrl1 input] 
    OR [Ctrl1 input] is null 
ORDER BY table1.column2; 

ORラインは、「あなたは私が何をすべきかを教えてくれなかった場合だけで私にテーブル全体を与えるか、何を知っている」アクセスを告げるものです。あなたのリストボックスがどのように表示されるかは関係ありません。このコードはリストボックスにあるものだけを気にします。このようなコードは、AccessクエリのSQLビューに入るだけです。

+0

ありがとうございます。これを使用すると、sq.column1とsq.column2の値の入力が求められ、コントロールボックスでの選択に関係なく、最終的なリストには値が表示されません。それを参照する前に何かを "sq"として保存する必要がありますか?私は文法上の問題も持っていますw また、この解決法は全体の問題に対処していません - ボックス内の選択と表3との間に一致が見つからない場合は、オプションの完全なセットを取得しようとしています。コントロールボックスが空のときだけです。 – troubbble

+0

「sq」問題に関しては、AccessがSQLエイリアスを適切に処理していないために問題になりました。私は驚きましたが、エイリアスを使用しないようにコードを変更して修正しました。私は 'OR table3.column1!= [Crt1 input]'を追加することで不一致に戻ることができると思います。私はこれらの変更をカバーするために私の答えを編集します。 – Rominus

+0

'OR table3.column1!= [Ctrl1 input]'は、入力が何を持っていても(Accessが構文をまったく実行するかどうかにかかわらず)すべてを返します。一致がないときにすべてを表示する必要がある場合は、おそらく 'IIF'とVBAが必要です。私はそれをする方法を知らない。私はデザインの変更を助言したいと思います。プロセスに有効な値またはnullが必要であることを示す一致がない場合は、エラーをスローします。 – Rominus

関連する問題