マスタ入力画面を作成しコードを入力しますが、既に登録済みのコードである場合は、該当するレコードを表示して未登録のコードの場合は、新規入力として取り扱う方法を教えてください。
また、登録ボタンによってのみテーブルへ書きこまないようにするにはどうしたら良いのでしょうか?
以上、よろしくお願いします。

このQ&Aに関連する最新のQ&A

A 回答 (1件)

コード入力欄に入力したときにどのように動作するかで変わってきます。

考えられるのは、
1.コード入力欄に入力したコードをリアルタイムに検索する
2.コード入力後、ボタンを押したり、次の入力欄に移ったりしたときに検索する。
ということです。

検索自体は、SQLで書けば簡単にできます。
クエリーでいったん直値などで作成後、SQLの表示を使って SQL文を表示してそれをコピーすれば作成できます。このとき、直値を指定したところを変数に置き換えます。

すでにあったものの場合はフィルタを使い、新規レコードの場合は、プロパティを変更するようにします。

> また、登録ボタンによってのみテーブルへ書きこまないようにするにはどうしたら良いのでしょうか?
この意味がちょっと分かりづらいのですが、「書き込むようにする」ということでよろしいでしょうか?また、変更したときでも破棄してもいいのでしょうか?
そのときは、Form_BeforeUpdateで、Cancelして Undoすればよいでしょう。

以上のキーワードでヘルプを検索してみてください。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

関連するカテゴリからQ&Aを探す

このQ&Aと関連する良く見られている質問

Q【SQL】あるマスタのレコードに存在しない項目を取得する。

下記のような2つのマスタがあるとします。

・商品名マスタ

商品コード  商品名
- - - - - -  - - - - - -
n01       ナス
k01       カボチャ
n02       ニンジン
t01       タマネギ


・購入履歴マスタ

履歴連番  商品コード  購入日時
- - - - -   - - - - - -  - - - - - -
001     n01      2008-07-01
002     k01      2008-07-02
003     n01      2008-07-03
004     n01      2008-07-04
005     k01      2008-07-04

このとき、購入履歴マスタのレコードに存在しない商品を取得するSQLはどのように組み立てればよいでしょうか?
例えば上記例で言えば、下記のような結果を得ることが目的です。

商品コード  商品名
- - - - - -  - - - - - -
n02       ニンジン
t01       タマネギ

以上、よろしくお願いします。

下記のような2つのマスタがあるとします。

・商品名マスタ

商品コード  商品名
- - - - - -  - - - - - -
n01       ナス
k01       カボチャ
n02       ニンジン
t01       タマネギ


・購入履歴マスタ

履歴連番  商品コード  購入日時
- - - - -   - - - - - -  - - - - - -
001     n01      2008-07-01
002     k01      2008-07-02
003     n01      2008-07-03
004     n01      2008-07-04
...続きを読む

Aベストアンサー

こんにちは。

SELECT 商品名マスタ.商品コード
, 商品名マスタ.商品名
, 購入履歴マスタ.商品コード
FROM 商品名マスタ LEFT JOIN 購入履歴マスタ
ON 商品名マスタ.商品コード = 購入履歴マスタ.商品コード
WHERE ((購入履歴マスタ.商品コード) Is Null);

でどうですか。

QAccess:フォームをクリック!該当レコードを開くには?

Aテーブルを参照している2つのフォームがあります。
Bフォームは、Aテーブルの全内容を表示し、
Cフォームは、特定の項目のみを表示します。
そこで!Cフォームで、詳細を見たいレコードをクリックすると、
Bフォームの該当レコード(全内容)が開かれるようにしたいのですが、
可能なのでしょうか。
VBAは初心者ですが頑張りますので、ぜひ教えてください。

Aベストアンサー

[コード].SetFocus 
これは「コード」のフィールドにマウスポイント置いてアクティブにします(つまり検索前にコードのフィールドをアクティブにします。)
 フィールド名は[]で指定します。

Me!は検索対象のPage(この場合,vbaの対象が開かれているフォームを指します。)を指定しています。
 べつのフォームを検索するときはフォーム名を指定しなければいけません。

 Excelなどでセルを選択すると太線でセルが表示されますが、そのセルにSetFocusがあるということです。
 フォーカス(カメラの焦点のことをフォーカスといいます 焦点を絞る)を移す時にこのsetfocusを使います

 Accessのヘルプを表示してキーワードに「setfocusメソッド」といれて検索してください。

 一度にVBAを覚えるのは無理ですが少しずつでも覚える姿勢があればはやくマスターできるでしょう。 私だって全部知っている訳ではなく、必要に迫られて作っているだけです。
 Accessの参考書にはいろいろ載っていますが、私は、ほとんどビジュアルベーシックで覚えました。
 ビジュアルベーッシックとAccessのVBAは共通部分がたくさんありますよ。

[コード].SetFocus 
これは「コード」のフィールドにマウスポイント置いてアクティブにします(つまり検索前にコードのフィールドをアクティブにします。)
 フィールド名は[]で指定します。

Me!は検索対象のPage(この場合,vbaの対象が開かれているフォームを指します。)を指定しています。
 べつのフォームを検索するときはフォーム名を指定しなければいけません。

 Excelなどでセルを選択すると太線でセルが表示されますが、そのセルにSetFocusがあるということです。
 フォーカス(カメラの焦...続きを読む

QAccess 2007で、テーブルからレコードを削除するクエリを作りた

Access 2007で、テーブルからレコードを削除するクエリを作りたい。
具体的には、テーブルAのフィールドF1とテーブルBのフィールドF2があるとします。このとき、テーブルA中の各レコード(仮にXとします)であって、そのF1の値と同じ値をF2に持つレコードがテーブルBに含まれている場合は、(テーブルAから)そのレコードXを削除するという処理をしたいのです。ややこしいと思いますが、これをクエリやマクロで作ることはできるでしょうか?
私はVBAを知らない初心者です。上の処理も文章で書くと理解してもらえるかどうか不安ですが、だれか助けて下さい。

Aベストアンサー

解決しましたか。以下の要領で作成してみてください。
なお、(4)のSQL文はテーブル名、フィールド名は
質問のままなので、実際に合わせて変更してください。

(1)
クエリを「デザインビューでクエリを作成する」を選択。
(2)
テーブルの表示を閉じる
(3)
クエリをSQLビューに切り替える。
(4)
以下のSQL文をコピーし、SQLビューに貼り付け、保存する。

DELETE * FROM テーブルA
WHERE EXISTS ( SELECT * FROM テーブルB
WHERE テーブルB.F2 = テーブルA.F1 );


なお、保存後に一旦クエリを閉じ、再びクエリを
デザインビューで開いて、SQLビューで確認すると

DELETE Exists (SELECT * FROM テーブルB WHERE テーブルB.F2 = テーブルA.F1) AS 式1, *
FROM テーブルA
WHERE (((Exists (SELECT * FROM テーブルB WHERE テーブルB.F2 = テーブルA.F1))<>False));

のようになっているかもしれません。これはAccessが
自分用に変更したので、かまいません。

解決しましたか。以下の要領で作成してみてください。
なお、(4)のSQL文はテーブル名、フィールド名は
質問のままなので、実際に合わせて変更してください。

(1)
クエリを「デザインビューでクエリを作成する」を選択。
(2)
テーブルの表示を閉じる
(3)
クエリをSQLビューに切り替える。
(4)
以下のSQL文をコピーし、SQLビューに貼り付け、保存する。

DELETE * FROM テーブルA
WHERE EXISTS ( SELECT * FROM テーブルB
WHERE テーブルB.F2 = テーブルA.F1 );


なお、保存後に一旦クエリを閉じ、再びクエリを
デ...続きを読む

Q複数のレコードに同時に入力したい

ACCSESSでクエリを使いある条件で抽出したデータを、確認が済んだと言う意味で確認欄に日付を一括で入力をしたいと考えています。
どのようにすればよいでしょうか

よろしくお願いします。

Aベストアンサー

>ある条件で抽出したデータを
同じ抽出条件を持つ更新クエリを作り、走らせます

QAccess2002 閲覧フォームから入力フォームへのレコードの受け渡し

度々すみません。

Access初心者です。よろしくお願いします。

例えば「基本情報フォーム」から、「付帯データ入力フォーム」を起動する作りになっていたとします。

この場合、基本情報フォームは閲覧専用で、付帯データ入力フォームは入力用フォームになると思います。

しかし、コマンドボタンの追加ウィザードで両方のフォームで取り扱う「ID」で絞り込んで入力フォームを開こうとすると、うまく行きません。
単純に、入力フォーム単体で立ち上げると、入力できます。

やりたいことは単純で、閲覧フォーム上のIDを、入力用フォームのIDフィールドに表示させたいだけなのですが。。。

解決策をご存知の方がいらっしゃいましたら、ご教授お願いいたします。

Aベストアンサー

#2です

> 入力用フォームのほうにはある「区分」が用意されており、区分コードをコンボボックスで選択する作りになっています。
> その場合でも、1つのフォームでできるのでしょうか?
> 「表示フォーム」は区分コードに紐づいている「区分名」が表示されるようにしてあります。

コンボボックスの内容(連結列)が同じであれば、同様に既定値を設定できます。

コンボボックス名が「cbx01」だったとします。

表示の元となる区分テーブル「T区分」が以下だったとします。

区分コード 区分名
1      区分A
2      区分B
3      区分C
4      区分D
5      区分E

コンボボックスの値集合ソースが
SELECT 区分コード, 区分名 FROM T区分;

連結列:1
列数:2

表示フォームでの列幅: 0cm;2cm (1列目を表示しない:区分名だけ表示)
入力フォームでの列幅: 2cm;0cm (2列目を表示しない:区分コードだけ表示)

この設定で、コンボボックスに表示されるものは変わりますが、連結されているものは「区分コード」になっているので、

Me.cbx01.DefaultValue = Screen.ActiveForm.cbx01

で既定値を設定することができます。
(起動元に同様のコンボボックスがあったとして)

表示用/入力用ともコントロールソースには「区分コード」に対応するフィールドを指定していると思いますので、問題なさそうな気がします。


なお、起動元に「区分名」しかない時とかは、その時のテキストボックス名を「txt1」とすると、

Me.cbx01.DefaultValue = _
  DLookup("区分コード", "T区分", "区分名 = '" & Screen.ActiveForm.txt1 & "'")

とすれば既定値として設定できます。

列幅(表示)の切り替えは、ColumnWidths で変更します。
列幅が上記例であるとすれば、
レコードがあったら、Me.cbx01.ColumnWidths = "0cm;2cm"
入力用なら、Me.cbx01.ColumnWidths = "2cm;0cm"
と設定すれば、表示は切り替わります。

#2です

> 入力用フォームのほうにはある「区分」が用意されており、区分コードをコンボボックスで選択する作りになっています。
> その場合でも、1つのフォームでできるのでしょうか?
> 「表示フォーム」は区分コードに紐づいている「区分名」が表示されるようにしてあります。

コンボボックスの内容(連結列)が同じであれば、同様に既定値を設定できます。

コンボボックス名が「cbx01」だったとします。

表示の元となる区分テーブル「T区分」が以下だったとします。

区分コード 区分名
1...続きを読む


人気Q&Aランキング

おすすめ情報