質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Access

Accessはマイクロソフトによるリレーショナルデータベース管理システムです。オブジェクト指向のアプリケーション作成に対応しており、テーブルや編集をはじめ、クエリ生成、入力フォーム作成、レポート作成など一通りの機能を備えています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

Q&A

解決済

1回答

4460閲覧

Access 追加時に重複する商品がある場合そのレコードに色を付けたい。

退会済みユーザー

退会済みユーザー

総合スコア0

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Access

Accessはマイクロソフトによるリレーショナルデータベース管理システムです。オブジェクト指向のアプリケーション作成に対応しており、テーブルや編集をはじめ、クエリ生成、入力フォーム作成、レポート作成など一通りの機能を備えています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

0グッド

0クリップ

投稿2019/08/07 07:08

##質問
Accessで伝票管理システムを作成しています。
メインで伝票を入力するフォームがあるのですが、そこで重複した商品が入力された状態で伝票登録ボタンを使用したときに
「商品が重複しています。」といったメッセージを表示し、登録が取り消されるようにしたいです。
また、どこが重複しているのかがわかるようにそのレコードに色をつけたいです。
※重複した商品を入力すること自体は、OKな仕様ですのでそのあたりは触れないでいただけると幸いです。

##概要
重複することがある状況は、手入力で入力したときのみです。
商品を入力するのは伝票入力フォームのサブフォームです。
行っている方法は、サブフォームのレコードに重複フラグを設け、登録するときにSQL文で重複しているレコードにフラグを立てるようにし、最終的に条件付き式で色をつけるようにしたいと考えています。

##現状
今は下記のようにしているのですが、これだと登録を押したときに重複していないものまでフラグが立ってしまいます。(というより全て立っていると思います。)

重複しているレコードだけ、フラグを立たせたいです。

↓伝票登録ボタン使用時の処理(追加処理など他処理は省略)

vba

1'重複チェック 2SQL = "UPDATE T_WSlipDetail SET F_ZF = True WHERE EXISTS (SELECT Count(F_ProductCode) FROM Q_WSlipDetail GROUP BY F_ProductCode HAVING T_WSlipDetail.F_ProductCode = Q_WSlipDetail.F_ProductCode and Count(F_ProductCode) >= 2)" 3 4 With Application.CurrentDb 5 .Execute SQL 6 End With 7 8 9 Dim dd As String 10 dd = Nz(DLookup("F_ZF", "T_WSlipDetail", "F_ZF = True"), 1) 11 If dd <> 1 Then 12 MsgBox "重複している商品があります。", vbOKOnly + vbExclamation, "注意" 13 Exit Sub 14 Else 15 End If

サブフォームに参照しているクエリ
Q_WSlipDetail

フィールド名テーブル名備考
F_SlipCodeT_WSlipDetail伝票番号
F_LineNumT_WSlipDetail行番号
F_ProductCodeT_WSlipDetail商品番号
F_ProductNameT_Product商品名
F_CostT_WSlipDetail単価
F_QtyT_WSlipDetail数量
F_ZFT_WSlipDetail重複フラグ

↓入力用
T_WSlipDetailテーブル

フィールド名備考
F_SlipCodeテキスト型伝票番号
F_LineNum数値型行番号
F_ProductCodeテキスト型商品番号
F_Cost通貨型単価
F_Qty数値型数量
F_ZFYes/No重複フラグ

助言をくだされば幸いです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

伝票内で同じ商品という条件なら

SQL

1UPDATE T_WSlipDetail as target SET F_ZF = True 2WHERE ( 3 select count(*) from T_WSlipDetail 4 where F_SlipCode=target.F_SlipCode and F_ProductCode=target.F_ProductCode 5 ) > 1

※フラグはいつoffにするんでしょう?

追記

件数が多いなら、こっちの方が高速かもしれません。
※フラグの設定に変更

SQL

1UPDATE T_WSlipDetail left join ( 2 select F_SlipCode, F_ProductCode 3 from T_WSlipDetail 4 group by F_SlipCode, F_ProductCode 5 having count(*)>1 6 ) as condition 7 on T_WSlipDetail.F_SlipCode=condition.F_SlipCode 8 and T_WSlipDetail.F_ProductCode=condition.F_ProductCode 9SET T_WSlipDetail.F_ZF = IIf(condition.F_SlipCode is null, False, True)

※left joinでエラーになるようなら

SQL

1UPDATE T_WSlipDetail 2SET F_ZF = IIf(DCount("*", "T_WSlipDetail", "F_SlipCode='" & F_SlipCode & "' and F_ProductCode='" & F_ProductCode & "'")>1, True, False)

SQL

1UPDATE T_WSlipDetail As Target 2SET F_ZF = IIf((select Count(*) from T_WSlipDetail where F_SlipCode=Target.F_SlipCode and F_ProductCode=Target.F_ProductCode)>1, True, False)

追記2

手っ取り早くfalseにするSQL※1番目の逆

SQL

1UPDATE T_WSlipDetail as target SET F_ZF = False 2WHERE ( 3 select count(*) from T_WSlipDetail 4 where F_SlipCode=target.F_SlipCode and F_ProductCode=target.F_ProductCode 5 ) = 1

投稿2019/08/07 07:35

編集2019/08/08 02:53
sazi

総合スコア25173

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2019/08/07 07:39

回答ありがとうございます。 フラグは、登録ボタンをしたときの一番最初の処理でFalseにしています。 target とはなんでしょうか??
sazi

2019/08/07 07:42

targetはエイリアスです。テーブル名が同じなので相関問い合わせで識別するための別名です。 別に識別できればt1とか何でもいいですよ
退会済みユーザー

退会済みユーザー

2019/08/07 07:50

望んだ通りの動作になりました。 ありがとうございました。
退会済みユーザー

退会済みユーザー

2019/08/07 08:30

先程のフラグを外す件についてやや誤りがありました。 重複チェックを行うのは登録ボタンを使用するときなので、重複チェックする前に一度、フラグを外すというのが先程のことで、この他にも色がついたところを変更したときもにも変更時イベントで重複チェックを行い重複していなかったらフラグを外すように考えています。
sazi

2019/08/07 08:42

2番目のSQLを全体に対してフラグのon/offを設定する内容に変更しました。
退会済みユーザー

退会済みユーザー

2019/08/07 08:58

提示してくださったコードは全て、動きは同様のものですか??
sazi

2019/08/07 09:02 編集

2番目と3番目は同じですね。 ただ、3番目はD系関数を使用しているので2番目より遅いものです。
sazi

2019/08/07 09:04

3番目をコードに埋め込む際には、"は"を重ねて("")下さいね。
sazi

2019/08/07 09:09

3番目をサブクエリーにした4番目を追加しました
退会済みユーザー

退会済みユーザー

2019/08/08 00:13

件数がそこまで多いわけではないので、一番目のもので十分動作できました。 ありがとうございました。 フラグをFalseにするタイミングについても質問しようと思うのですが、新しく開設したほうがいいでしょうか?
sazi

2019/08/08 00:15

タイミングは別質問が良いかと思います。
退会済みユーザー

退会済みユーザー

2019/08/08 01:33

SQL文の中でIIF関数は使えるのですか?
sazi

2019/08/08 01:37 編集

使えますよ。というか、VBAよりSQLでの使用を想定したものです。
退会済みユーザー

退会済みユーザー

2019/08/08 01:47

三番目と四番目の違いはなんでしょうか??
退会済みユーザー

退会済みユーザー

2019/08/08 01:52

商品番号テキストボックスのダーティー時に四番目のSQLを追加してみましたが、 「更新可能なクエリであることが必要です。」というエラーが発生しました。
sazi

2019/08/08 02:06 編集

3番目と4番目の違いはサブクエリーを使うかどうかです。 3番目のD系関数よりは文字列としての埋め込みが楽なので作ってみましたが、更新可能でないなら利用できませんので、3番目を試してください。
退会済みユーザー

退会済みユーザー

2019/08/08 02:19

今、三番目のものを実行しているのですが、三番目の文を全てSQL文として実行させてるのですがもしかして違っていたりしますか??
sazi

2019/08/08 02:24

SQL文というのは文字列として編集しているという意味ですか? そうなら問題はないです。 ただ、文字列として扱うには"をエスケープ("を重ねる)してあげないといけない点が注意点です。 別途クエリーとして定義する方が簡単ではありますが。
退会済みユーザー

退会済みユーザー

2019/08/08 02:39 編集

下記のように実行してみたのですが、ダーティー時にFalseうまくなってくれなかったです。 どこか、問題がありましたらご指摘お願いします。 SQL = "Update T_WSlipDetail Set F_ZF = IIf(DCount(""*"", ""T_WSlipDetail"", ""F_SlipCode='"" & F_SlipCode & ""' and F_ProductCode='"" & F_ProductCode & ""'"") > 1, True, False)" With Application.CurrentDb .Execute SQL End With
sazi

2019/08/08 02:49

上手くいかないというのがどのような事なのか分かりません。 その生成した文字列をクエリービューに張り付けて動作させて結果を見るなどの確認を行って、どのようにな点がうまくいっていないのか明確にして下さい。 F_ProductCodeのデータにNullがあったりしていないですか?
sazi

2019/08/08 02:55 編集

追記しました。 1番目と追記分をセットで実行するようにすれば良いと思います。 3番目とか4番目はこれを一つに纏めたものですので。 ※F_ProductCodeにNullがあるような場合はまた別な問題
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問