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

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

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

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

Access

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

SQL

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

データベース

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

データベース設計

データベース設計はデータベースの論理的や物理的な部分を特定する工程です。

Q&A

解決済

1回答

2168閲覧

Access サブ―フォームのレコードの転記を、サブフォームの全レコードに対して行いたい

ryoya_access

総合スコア34

VBA

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

Access

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

SQL

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

データベース

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

データベース設計

データベース設計はデータベースの論理的や物理的な部分を特定する工程です。

0グッド

0クリップ

投稿2020/09/01 02:33

編集2020/09/01 02:34

実現したいこと

Access(2007-2016)で受注管理DBを作成しています。

サブフォーム付きフォームで受注明細から請求明細への転記を行いたいのですが、サブフォームのレコードが最初の1レコードしか転記できません。この問題を解決したく質問させていただきました。

「T_受注」と「T_受注明細」は受注Noで、「T_請求」と「T_請求明細」は請求Noでリレーションを組んでいます。
※「●」は主キー

1.T_受注---------------
●受注No:オートナンバー
契約日:日付
クライアントID:数値

2.T_受注明細-------------
●受注No:数値
●タスクID:数値
予算額:数値

3.T_請求---------------
●請求No:オートナンバー
請求日:日付
クライアントID:数値

4.T_請求明細-------------
●請求No:数値
●業務内容:テキスト
予算額:数値

〇「T_受注」がメインフォーム「F_受注」、「T_受注明細」がサブフォーム「SF_受注明細」になったフォーム
イメージ説明
※メインフォームの「受注No」がクライアント名に、サブフォームの「タスクID」が業務内容になっていますが、表示上そう見せているだけです。

Private Sub 請求に転記_Click() Dim rs As DAO.Recordset Dim No As Long Dim i As Long, j As Long '請求に追加 Set rs = CurrentDb.OpenRecordset("T_請求", dbOpenDynaset) rs.AddNew No = rs![請求No] rs![クライアントID] = Me![クライアントID] rs![請求日] = Me![契約日] rs.Update rs.Close Set rs = Nothing MsgBox "「T_受注」から「T_請求」へ転記しました。" 'サブフォームへフォーカスを移動 Forms![F_受注]![SF_受注明細].SetFocus '請求明細に追加 Set rs = CurrentDb.OpenRecordset("T_請求明細", dbOpenDynaset) j = DCount("*", "T_受注明細", "[受注No]=" & Me![受注No] & "") i = 1 Do Until i = j + 1 rs.AddNew rs![請求No] = No Select Case Me![SF_受注明細]![タスクID] Case Is = 1 rs![業務内容] = "業務A" Case Is = 2 rs![業務内容] = "業務B" Case Else rs![業務内容] = "その他" End Select rs![予算額] = Me![SF_受注明細]![予算額] rs.Update MsgBox "転記しました" On Error Resume Next DoCmd.GoToRecord acDataForm, , acNext i = i + 1 Loop rs.Close Set rs = Nothing End Sub

これでボタンを押し転記を試みたところ、以下のようになりました。
・メインフォーム部分、「T_受注」から「T_請求」への転記は成功
・サブフォーム部分、「T_受注明細」から「T_請求明細」への転記は、最初の1レコードのみ成功
例)写真でいうと、受注Noが2、業務内容がクレーム処理、予算が55のレコードのみ転記が成功している

おそらく以下の部分が問題だと思うのですが、解決方法がわかりません。
「MsgBox "転記しました"」の表示回数はきちんと繰り返されている(今回の例でいうと3回表示される)ので、Do Loop自体は想定通り動いているようなのですが…。

Do Until i = j + 1 rs.AddNew rs![請求No] = No Select Case Me![SF_受注明細]![タスクID] Case Is = 1 rs![業務内容] = "業務A" Case Is = 2 rs![業務内容] = "業務B" Case Else rs![業務内容] = "その他" End Select rs![予算額] = Me![SF_受注明細]![予算額] rs.Update MsgBox "転記しました" On Error Resume Next DoCmd.GoToRecord acDataForm, , acNext i = i + 1 Loop

こちらどのように修正すればよいのでしょうか。
お力添えのほど、よろしくお願いいたします。

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

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

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

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

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

sazi

2020/09/01 02:47

請求明細の作成だけになっていますが、更新は考慮しなくて良いのですか?
ryoya_access

2020/09/01 03:04

実際はこれに加えて、更新(上書き保存)ボタンを「F_受注」-「SF_受注明細」、「F_請求」-「SF_請求明細」の両方に設置するつもりです。更新ボタンは何度でも押せますが、「請求に転記」ボタンは基本的に1度しか押せないようにする(enable=False)ことで、同じ受注データを重複して請求へ転記してしまうことを防ごうと考えているのですが、常識・技術的にあやしい部分があったでしょうか?
sazi

2020/09/01 03:16 編集

新規と更新のボタンの有効/無効制御まで行われているのであれば、利用者が迷う事は無いので、問題は無いと思います。 明細の一部追加にも対応できているならですけど。
tosi

2020/09/01 04:40

今回はこの修正で動くと思います。 On Error Resume Next DoCmd.GoToRecord acDataForm, , acNext ↓↓↓ Me![SF_受注明細].SetFocus DoCmd.GoToRecord , , acNext
guest

回答1

0

ベストアンサー

フォーム名の指定が無いけど、Resume でエラー無効になっているのではないでしょうか。

VBA

1On Error Resume Next 2 DoCmd.GoToRecord acDataForm, , acNext

尚、追加と更新のクエリーで行う方が、ループ不要だし、シンプルだと思います。

投稿2020/09/01 03:11

編集2020/09/01 03:19
sazi

総合スコア25206

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

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

ryoya_access

2020/09/01 04:12

フォーム名にサブフォームを指定し「DoCmd.GoToRecord acDataForm,”SF_受注明細” , acNext」とすると、「エラー:オブジェクト「SF_受注明細」が開いていません」とエラーが出てしまいます。ほかのレコード移動方法として、「rs.MoveNext」というコードで試みましたが、こちらでは「カレントレコードがありません」と出てしまいました。 おっしゃる通り、追加クエリをVBAで実行する方法では、サブフォームの全レコードに対して転記を行うことができていました。しかしクエリでは、タスクIDを業務内容に変換する以下のコード Select Case Me![SF_受注明細]![タスクID] Case Is = 1 rs![業務内容] = "業務A" Case Is = 2 rs![業務内容] = "業務B" Case Else rs![業務内容] = "その他" End Select 部分の処理を行う方法がわからず、今回のようにSelect Caseを用いた方法で行おうとしていた…というのが背景にありました。
ryoya_access

2020/09/01 04:15

確かにただ、更新クエリで後からタスク名を業務内容に変えればいいだけですね。
ryoya_access

2020/09/01 04:16

一度追加クエリでそのまま転記を行い、その後更新クエリでタスクIDを業務内容に変換する、、、という方向性で進めてみます。ありがとうございます。
sazi

2020/09/01 04:32

区分などによる分岐は、iif(),choose(), switch()などの関数がクエリーで使用できます。
ryoya_access

2020/09/01 04:43

「区分による分岐」と同じような考え方で、同一区分のレコードの予算額を合算し、1つのレコードとして転記を行うことも可能なのでしょうか? 例) SF_受注明細 受注No タスクID 予算額 1 4 400円 1 5 500円 1 1 100円 ※タスクID4,5は同一区分とする ↓ SF_請求明細 請求No 業務内容 予算額 n その他 900円 n 業務A 100円 もしできるようなら、参考になる検索ワードなどを頂戴できればと思うのですが…!
sazi

2020/09/01 05:02

集計クエリー(group by)を元にしたクエリーが可能です。 但し、更新クエリーの場合は、更新できないクエリーになる場合があるので、その場合は集計テーブルによる追加・更新を行うようにします。
ryoya_access

2020/09/01 05:20

ありがとうございます。頂いた知見をもとに、実装したい処理を完成させられるよう頑張ります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問