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

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

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

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

Access

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

Q&A

解決済

1回答

405閲覧

1つのフォームに詳細欄にタブコントロールでタブ分けされた参照整合性のないサブフォームの保存ボタンの動きについて

oze

総合スコア14

VBA

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

Access

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

0グッド

0クリップ

投稿2018/07/23 04:51

まずは、拝見ありがとうございます。
助力いただける方、コメントお願いします。

Accessでの開発を行っており(未経験)保存ボタンのVBAの記述で悩んでおります。

1つのテーブルデータのメンテナンスでしたら調べればすぐに出てくるのでわかるのですが、
1つのフォームで3つのマスタデータ(参照整合性なしでそれぞれ新規登録タブと更新削除タブを持ち、タブ計6つ)のメンテナンスを行う場合のVBAの記述が全く分かりません。

また、マスタデータの入っている場所がpostgreSQLデータベースになりますので
ODBCドライバで接続を行っております。

保存ボタンはヘッダーに、タブは詳細欄に配置されております。

保存ボタンの動きのとしては、
・タブ内のサブフォームに入力されたものを保存する(postgreSQLデータベース内に)
・保存ボタンが押される以外では保存は行わないものとする
・入力内容に不備がある場合はポップアップ表示で登録できないことを伝える

以上の3点になります。

助力いただける方、コメントお願いします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

postgresをリンクテーブルとするなら、直接の連結は避けたほうが良いです。
メインとなるデータを選択した段階で、accessのテーブルにワークテーブルを設け該当データをコピーして、そのデータの確定後にそのデータ元にpostgresを更新するようにしたほうが良いでしょう。
※フォームはそのワークテーブルと連結する。

またそうすることによってリレーションシップが作成できますから、意図する簡単な作成ができるのではないかと思います。
サブフォームを含むフォームを簡単作成

尚、ワークテーブルを使用する際の連結の場合、データを削除すると画面上に#deleteが表示されます。
回避方法としてはワークテーブルと全く同じダミーのテーブルを作成しておき、ワークテーブルを削除する直前に、フォームのコントロールソースをダミーに切り替えると回避できます。

投稿2018/07/23 05:09

sazi

総合スコア25173

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

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

hatena19

2018/07/23 05:38

ワークテーブルを使うということは同意件ですが、#delete 表示の回避は、削除後サブフォームに対して Requery すればいいのでは。 あるいは、 DoCmd.RunCommand acCmdSelectAllRecords DoCmd.RunCommand acCmdDelete というようにUIをつかって削除すればいいでしょう。
sazi

2018/07/23 05:43

Requery で消えるのは知っていますが、一瞬でも表示したくない場合です。 hatenaさんの言われる方法で一瞬たりとも#delete表示されないですか?
hatena19

2018/07/23 08:02

下記でどうでしょう。 DoCmd.Echo False On Error Resume Next '削除処理 Me.サブフォームコントロール名.Form.Requery DoCmd.Echo True On Error GoTo 0
oze

2018/07/23 08:30

ワークテーブルについての知識が乏しいので、見当はずれなことを言ってしまうかもしれません、先に誤っておきます。 フィールドに登録・更新・削除ができるクエリ?を作成しておき、 ワークテーブルを作っておいて、上記のクエリから得たデータを ワークテーブルに転記し、ワークテーブルに入力されたデータをまとめて SQLデータベースにINSERTする。という認識でお間違いないでしょうか? その場合ですと、 登・更・削クエリのフォームプロパティで 開いたときVBAで入力されたデータをワークテーブルに転記する というVBAを記述し、保存ボタンを押したときにワークテーブルのデータを SQLデータベースにINSERTするVBAを記述する という流れでお間違いないでしょうか? 質問に質問を重ねてしまい申し訳ございません。
sazi

2018/07/23 08:43

概ね合っています。 ワークテーブルを利用する意図としては、 ・連結したフォームにすることにより生産性が向上すること。 ・accessとpostgresのトランザクション制御を分離できること。 です。 また、リンクテーブルに連結すると、画面操作している場合に、リンク先のテーブルがロックされてしまいます。
oze

2018/07/23 08:49

返答ありがとうございます。 トランザクション制御しないままで開発を進めてしまうところでした。 努力してみますが、行き詰ってしまった場合、 再度投稿するかもしれないので、お手すきでしたら返答のほうお願いしたいです。 ありがとうございました。
sazi

2018/07/25 02:42

> hatena さん DoCmd.Echoによる制御で#Deleteが表示されないのは確認できました。
sazi

2018/07/25 03:43

オートナンバーを連番として利用する際などは、オートナンバーのリセットが必要で、連結した場合には変更できないので、ダミーテーブルを利用したりしています。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問