Microsoft Access 掲示板

2つのフォームからの検索について

12 コメント
views
4 フォロー

いつもお世話になっております。
共通するフィールドからの検索なのですが1つは過去のデータでもう1つは現在のデータです
テーブル1 
 送付NO ファイル名 日付 会社名 氏名 現場名 工事名 金額
テーブル2
 送付NO ファイル名 日付 宛先ID 現場ID 工事名 金額
テーブル2はクエリで宛先マスタ・現場マスタがあり
 送付NO ファイル名 日付 宛先ID 会社名 氏名 現場ID 現場名 工事名 金額となっておりフォームは作成しております

検索フォームからこの2つのデータで会社名・現場名・工事名などの検索をしたいのですが
恥ずかしながら
DoCmd.OpenForm "F_mitumori", , , "現場名 like'" & Me!テキスト25 & "'"
DoCmd.OpenForm "T_mitu", , , "現場名 like'" & Me!テキスト25 & "'"
で、やってみたら一応できるのですが・・・当然のごとく2つフォームがでてきてT_mituが前に
出てきます。
いろいろネットで検索はしてみたのですが、書き方が悪いのか出てきませんでした。
ご教授をお願いします。

island
作成: 2019/04/18 (木) 10:28:40
通報 ...
1

2つのテーブルの検索結果をどのように表示したいのでしょうか。

現状は2つのフォームに表示されているようですが、それを一つのフォームで表示したいということでしょうか。

その場合は、2つのテーブルデータを、一つの表として表示したいのか、2つの表として並べて表示たいのか、
とか、いろいろ表示の仕方がありますが、どのような表示がご希望でしょうか。

まずは、それを明確にしてください。

2
island 2019/04/18 (木) 14:40:42 ae49e@a036a

返信ありがとうございます。
検索フォームに入力をしたら2つのテーブルデータから1つの表に表示できればうれしいです

3

検索フォームに入力をしたら2つのテーブルデータから1つの表に表示できればうれしいです

ユニオンクエリを使うことになります。WEB検索すると解説ページが見つかりますのでそれを参考に作成してみてください。

ユニオンクエリの作り方 | Accessの使い方教えます!(初心者向け)

作成できたら、このユニオンクエリをフォームのレコードソースにすればOKです。

4
island 2019/04/18 (木) 16:30:54 ae49e@a036a

返信ありがとうございます。
ユニオンクエリの作り方を見て下記のようにやってみました。

SELECT T_mitu.見積書送付NO, T_mitu.[ファイル名], T_mitu.見積日付, T_mitu.宛先ID, 宛先マスタ.会社名, 宛先マスタ.氏名, T_mitu.現場ID, 現場.現場名, T_mitu.工事名, T_mitu.金額, T_mitu.NET金額, T_mitu.見積書
FROM (宛先マスタ INNER JOIN 現場 ON 宛先マスタ.宛先ID = 現場.宛先ID) INNER JOIN T_mitu ON (現場.現場ID = T_mitu.現場ID) AND (宛先マスタ.宛先ID = T_mitu.宛先ID);

 union all

SELECT T_mitumori.見積書送付NO, T_mitumori.[ファイル名], T_mitumori.見積日付, T_mitumori.会社名, T_mitumori.氏名, T_mitumori.現場名, T_mitumori.工事名, T_mitumori.金額, T_mitumori.NET金額, T_mitumori.見積書, *
FROM T_mitumori;

実行を押すと複数値があるものは・・・とエラーがでてしまいました。
フィールド数を揃えようと宛先ID・現場IDを消してみてもダメでした。これはクエリからではなくテーブルの結合なのでしょうか。テーブルでやるとテーブル1のT_mitumori とテーブル2のT_mituはフィールド数・フィールド名が違うのでうまくいきません。そういうことではないのでしょうか。

5
hatena 2019/04/18 (木) 16:59:27 修正 >> 4

テーブルに「複数値を持つフィールド」があるということですね。
複数値を持つフィールドの作成または削除 - Access

とりあえず「複数値を持つフィールド」を含めないで、ユニオンクエリにした場合はどうなりますか。
(「複数値を持つフィールド」はユニオンクエリには含められないです。)

それで、うまくいかない場合は、
サンプルを作成して確認してみたいので、現状のテーブルのフィールド名とそのデータ型,どれが複数値をもつフィールドなのか、主キー設定を提示してもらえますか。

6
island 2019/04/19 (金) 15:19:39 ae49e@a036a

返信ありがとうございます。
関係のなさそうなフィールド名を入れてやってみました。
select 見積書送付NO,ファイル名,見積日付 from T_mitu union select  見積書送付NO,ファイル名,見積日付 from T_mitumori;

そうしたら見積日付 from T_mitu の構文エラー 演算子がありませんとでました。書き方が間違っているのでしょうね・・・

T_mitu              T_mitumori
 見積書送付NO オートナンバー型           見積書送付NO オートナンバー型
 ファイル名  短いテキスト     ファイル名   短いテキスト 
 見積日付   日付/時刻型      見積り日付   日付/時刻型
 宛先ID    数値型        会社名     短いテキスト
 現場ID    数値型         氏名     短いテキスト
 工事名    短いテキスト      現場名     短いテキスト
 金額     数値型         工事名     短いテキスト
 NET金額   数値型              金額      数値型
 見積書    添付ファイル      NET金額    数値型
                              見積書     添付ファイル

T_atesaki
  宛先ID   オートナンバー型 ←T_mituの宛先IDとリレーションシップを組んでいる。
  会社名   短いテキスト
 氏名    短いテキスト

T_genba
  現場ID   オートナンバー型 ←T_mituの現場IDとリレーションシップを組んでいる
 宛先ID   数値型 ←T_atesakiの宛先IDとリレーションシップを組んでいる
 現場名   短いテキスト

T_mitumoriは過去のデータのためフィールド名は一緒だけど独立しています。
よろしくお願いします。

7
island 2019/04/19 (金) 15:44:15 ae49e@a036a

追記です。
2つのテーブルには主キーが設定されていませんでした。あと、複数値を持つフィールドですが説明にあるような多対多のリレーションシップはありません。

8

select 見積書送付NO,ファイル名,見積日付 from T_mitu union select  見積書送付NO,ファイル名,見積日付 from T_mitumori;

このSQLの「見積日付 from」の部分の空白が全角空白になってます。これを半角空白にしてください。
あと、union ではな、union all にしてください。
union だと重複排除の処理が発生しますので重くなります。

select 見積書送付NO, ファイル名, 見積日付 from T_mitu
union all
select 見積書送付NO, ファイル名, 見積日付 from T_mitumori;

あと、添付ファイル型のフィールドがありますが、これはユニオンクエリに含めないようにしてください。

9
island 2019/04/23 (火) 15:11:01 ae49e@a036a

返信が遅くなりすみません。

やりたかったことが上のコードをもとに出来ました。
クエリ(q_mitu)でもユニオンができることがわかりこれから幅が広がりそうです。
ありがとうございました。

select 見積書送付NO, ファイル名, 見積日付, 会社名, 氏名, 現場名, 工事名 from q_mitu
union all
select 見積書送付NO, ファイル名, 見積日付, 会社名, 氏名, 現場名, 工事名 from T_mitumori;

10
island 2019/05/08 (水) 10:59:45 59838@a036a

おはようございます。いつもお世話になっております。新たな問題に直面しまた戻ってきました。
上記のSQLだと見積書送付NOが全部1.2.3・・・となってしまうので以前のとはSQLが少し違います。

見積書送付NOはアルファベット1文字と5ケタの数字(T_mitu → N00001・ T_mitumori → P00001)なのですが下記のとおりやるとT_mitumoriのアルファベットのPがNになってしまいます。オートナンバー型がダメなのでしょうか。
ご教授をお願いします。

SELECT T_mitu.見積書送付NO, T_mitu.[ファイル名], T_mitu.見積日付, 宛先マスタ.会社名, 宛先マスタ.氏名, 現場.現場名, T_mitu.工事名, T_mitu.金額, T_mitu.NET金額
FROM 現場 INNER JOIN (宛先マスタ INNER JOIN T_mitu ON 宛先マスタ.宛先ID = T_mitu.宛先ID) ON (現場.現場ID = T_mitu.現場ID) AND (宛先マスタ.宛先ID = 現場.宛先ID)
UNION ALL
SELECT T_mitumori.見積書送付NO, T_mitumori.[ファイル名], T_mitumori.見積日付, T_mitumori.会社名, T_mitumori.氏名, T_mitumori.現場名, T_mitumori.工事名, T_mitumori.金額, T_mitumori.NET金額
FROM T_mitumori;

11

見積書送付NO フィールドはオートナンバー型なのですね。
それが、 N00001 あるいは P00001 と表示されているということは、書式設定で、
¥N0000 あるいは、¥00001 と設定しているはずです。
これは表示上だけで、実際の値は数値だけです。

ユニオンクエリでは、テーブルの書式設定は引き継がれないので、数値表示になります。
Format関数で書式設定してください。

SELECT Format(T_mitu.見積書送付NO,"¥N00000"), T_mitu.[ファイル名], T_mitu.見積日付, 宛先マスタ.会社名, 宛先マスタ.氏名, 現場.現場名, T_mitu.工事名, T_mitu.金額, T_mitu.NET金額
FROM 現場 INNER JOIN (宛先マスタ INNER JOIN T_mitu ON 宛先マスタ.宛先ID = T_mitu.宛先ID) ON (現場.現場ID = T_mitu.現場ID) AND (宛先マスタ.宛先ID = 現場.宛先ID)
UNION ALL
SELECT Format(T_mitumori.見積書送付NO,"¥P00000"), T_mitumori.[ファイル名], T_mitumori.見積日付, T_mitumori.会社名, T_mitumori.氏名, T_mitumori.現場名, T_mitumori.工事名, T_mitumori.金額, T_mitumori.NET金額
FROM T_mitumori;
12
island 2019/05/08 (水) 16:19:35 7ca2d@a036a

早速の返信ありがとうございます。書式設定が前者だったので上記をもとにできました。
いつもありがとうございます本当に助かりました。