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

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

ただいまの
回答率

90.01%

Access:毎月発生する同じ請求書データをレコードに追加したい

受付中

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 3,391

th_bridge

score 13

請求書データを入力するフォームがあります。

メインフォームとサブフォームで構成されており、
メインに入力された内容はテーブルAに、
サブに入力された内容はテーブルBに保存されます。

入力されたレコードはそれぞれのテーブルにある
フィールド「請求NO」をキーとして紐づけています。

この請求書データの中で、毎月同じ内容で発生する請求データがあるのですが、
現状、毎月同じ内容のデータ都度入力しているので、この入力を簡略化したいと考えました。
(※請求日、請求NOは変わります)

すでに入力されているレコードをコピーし、
発行日と請求NOだけ変更しようとしたのですが、
コピーしたデータは、請求NOを変更しようとすると
サブフォームの請求内容が消えてしまい、結果、再度入力が必要になってしまいました。

また、新たにテーブルと追加クエリを作成、実行してみたのですが、
テーブルBに対して実行した際、エラー(キー違反)で出来ませんでした。
追加クエリでは追加先のテーブルのフィールド全てを設定しました。
追加用のテーブルのレコードは1件で、1件のキー違反、他は0でした。
クエリに設定するフィールドを1つずつ全て試してみたのですが、
全てキー違反となってしまい、どれが違反しているのか特定できませんでした。

ここまでが現状です。

方法としては、
①入力済のレコードを利用する
②追加クエリを利用する
③Excel等のファイルをインポートする 等、

やりようはあると思うのですが、
どれが良いか、またどうやればいいのかが分からず困っております。

拙い言葉足らずな説明かもしれませんが、お分かりになる方がいましたら
お力添えいただけますでしょうか。

どうぞよろしくお願いいたします。

・入力フォーム
イメージ説明

・テーブル構成
イメージ説明
※テーブルBの「印刷日」は印刷実行時に値が入る為、フォームに項目はありません。

画像1
イメージ説明
画像2
イメージ説明
画像3
イメージ説明

画像4
イメージ説明

画像5
イメージ説明

 
画像A
イメージ説明
画像B
イメージ説明
画像C
イメージ説明
画像D
イメージ説明
画像E
イメージ説明
画像F
イメージ説明

画像G
イメージ説明
画像H
イメージ説明

画像I
イメージ説明
画像J
イメージ説明

画像K
イメージ説明
画像L
イメージ説明

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

+1

すでに入力されているレコードをコピーし、発行日と請求NOだけ変更しようとしたのですが、

どのような方法でコピーしましたか?

コピーしたデータは、請求NOを変更しようとすると
サブフォームの請求内容が消えてしまい、結果、再度入力が必要になってしまいました。

サブフォームが表示されている状態から請求Noの入力によりサブフォームが消えるという状況から判断するとコピーはされていなくて、表示しているデータの請求Noの修正を行っていることになり、該当する明細が無いので、表示が消える状況だと思われます。
この状況は、テーブルAとテーブルBの請求Noのリンクが切れている状態だと思いますので、データは確認されて下さい。

参照作成を行いたい場合、テーブルAとテーブルB両方のコピーを行います。
具体的にはコピー元の請求Noを条件にして、ID以外のコピーしたい項目を追加します。
※その際、請求Noは新しいものである必要があります。

追記

概要

コピーボタンで、表示している請求データと請求明細データをコピーを行う。
1.コピー元は画面上の請求NOを用いる。
2.追加はクエリーで行う。
2.1.コピー元条件は画面の請求NOを使用する。
2.2.コピー先の請求NOはテーブルAの最大値+1
3.コピー完了後に、画面上の請求NOにテーブルAの請求NOの最大値を設定し、コピー先を表示する。

※以下画面や項目の名称を以下と仮定しているので、実際の名称に適宜合わせて下さい。
請求データ入力画面=F請求データ入力
請求データ入力画面の請求NO=コンボ_請求NO

クエリー

コピーする項目は想定して設定しているので、請求NO以外は過不足があれば変更して下さい。
※IDは追加しないこと。

クエリー名:Q_請求データ追加

INSERT INTO テーブルA ( 請求NO, 取引先コード, 部門, 業務件名 )
SELECT (SELECT Max(請求NO) FROM テーブルA)+1 , 取引先コード, 部門, 業務件名
FROM テーブルA
WHERE 請求NO=[Forms]![F_請求データ入力]![コンボ_請求NO];


クエリー名:Q_請求明細追加

INSERT INTO テーブルB ( 請求NO, 内容, 数量, 単価, 備考 )
SELECT (SELECT Max(請求NO) FROM テーブルA)+1 , 内容, 数量, 単価, 備考
FROM テーブルB
WHERE 請求NO=[Forms]![F_請求データ入力]![コンボ_請求NO];


・作成タブ⇒クエリデザイン(テーブルの表示は何も選択せず閉じる)⇒右クリックでSQLビューを選択
この状態で上記のSQLを元に変更(実際のテーブル名や請求NOの画面上での名前など)したものを貼り付けて、
クエリーに名前を付けて保存してください。
※修正後にエラーが無ければ、デザインに戻すことができます。

コード

コピーボタンのクリック時イベントに割り当てられているコードを以下に差し替えし、テーブル名や請求NOの名前を実際のものに変更して下さい。
※マクロの呼出はではなくイベントプロシージャに変更して下さい。マクロ自体の変更は不要です。

On Error GoTo Err_コピー_Click
  DoCmd.SetWarnings False 'メッセージの表示 無効

  DoCmd.OpenQuery "Q_請求明細コピー"
  DoCmd.OpenQuery "Q_請求データコピー"

  DoCmd.SetWarnings True  'メッセージの表示 有効
  Me.Requery  '再表示
  Me.Recordset.FindFirst "請求NO=" & DMax("請求NO", "テーブルA")  'コピー先の請求NOへ移動
Exit_コピー_Click:
    Exit Sub
Err_コピー_Click:
    MsgBox Err.Description
    Resume Exit_コピー_Click

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/09/27 17:43

    前回はコピーデータの請求NOを修正してフォーカスを移動すると
    空欄だった明細内容が表示されたのですが、
    今回は修正→フォーカス移動をしても空欄のままになっています。
    請求明細が表示されるようにするにはどうすればよいでしょうか?

    キャンセル

  • 2017/09/27 18:08 編集

    かなりスレが長くなっちゃいましたね。
    実際のMDBを見た方が早いと思うので、テーブルデータを削除したMDBを送付することは可能ですか?
    可能であれば、コメントにメールアドレス(捨てアドで可)を書き込むなどで、行いたいのですが。
    (確認出来たらコメントから消す)
    取り敢えずは、意思表示のコメントだけ下さい。

    キャンセル

  • 2017/09/28 13:50

    セキュリティなどもあるでしょうから、無理にという事ではありません。
    手元で、画面を作成して動作検証していますが、コピーボタンでコピーされた新たな請求番号に画面が移りサブフォームもコピーされたものが表示され、意図通りの動作をしています。
    ※サブフォームはリンクフィールドは親子共に「請求NO」を設定
    メインフォームの請求NOはコンボボックスのようですから、当該の請求NOへの移動も兼ねているように思えますが、その処理との兼ね合いで意図通りに動かないのかもしれません。
    もう一つは、MDBが破損しかかっていて、意図通りでない動作をしているのかもしれません。
    空のMDBを作成し、全オブジェクトをインポートし、そちらで確認してみてはどうでしょうか。
    現物が無い状態での推測ではこれぐらいです。

    キャンセル

0

vbaが使えるのであれば、こちらが参考になるかと思います。
https://oshiete.goo.ne.jp/qa/5876811.html?pg=1
7番の回答がほぼやりたいことと同じだと思います。(私も以前見積書で実装しました)

テーブル名は実際のものに置き換える必要がありますし、要件に応じて変更しなければならない部分もあります。
テーブルAの請求NOが主キーで手入力のようなので、処理の最中に仮NO(一時的に999999など)を設定してあげるようにした方がいいかもしれませんね。(オートナンバーのIDを主キーにしたいところですが)

必ずバックアップを取り、テスト用のファイルでお試しください。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/09/14 16:41

    dit.さん>
    ご回答ありがとうございます。
    saziさん、リンク先の内容のご確認、ありがとうございます。

    一度、改めて挙げてくださったリンク先の内容を見てみます。
    どうもありがとうございます。

    キャンセル

  • 2017/09/14 16:59

    やりたいことと合致しそうなものなので紹介しましたが、th_bridgeさんがVBAを全く使ったことが無ければ少し難しい内容かもしれません。
    th_bridgeさんが作っているデータベース用に書き換えないといけない部分が何箇所かあります。
    今回改めて実装テストしたので直すべき部分は把握しましたが、うまく伝えられる自信があまりありません。

    まずリンク先(後からコメントに入れたURLの方がいいかも)を「こういうこともできるんだ」程度に読んでいただければと思います。

    キャンセル

  • 2017/09/15 10:04

    VBAについてはここで教えていただいたことを書いたことはあるのですが、正直難しいと考えています。
    後のコメント内のURLを今後の参考にさせていただこうと思います。
    丁寧にご対応くださいまして、ありがとうございました。

    キャンセル

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

  • ただいまの回答率 90.01%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる