ですよね、、、フォームが破損していた可能性があるのならば、新しく作り直してよかったです。
本当に意味が分かりませんが、これはAccessの仕様なのでしょうか?
そのような仕様があるはずがない。 そのフォームが破損していたということではないでしょうか。
このような不具合に遭遇した経験がある方はいらっしゃいますでしょうか?
私はそのような経験はないです。
すでに不具合のあったフォームは削除してしまったのですが、そのプロパティについても調べた上で、データ入力用をいいえにしても不具合が改善しませんでした。
最終目的が印刷出力なら、レポートで可能です。下記を参考にしてください。
グループ内のデータを横連結する - hatena chips
クエリでどうしても必要なら、DJoin関数を使用すれば可能です。 下記をご参考に。
DJoin 関数 - リスト文字列を取得する方法
結局どれだけ見直しても直らないので、フォームデザインから同じフォームを作り直しました。
不思議なことに、新しいフォームで帳票形式で表示されることを確認した後、作り直し前のフォームを確認すると、帳票形式で表示されるようになっていました(最後に帳票形式で表示されないことを確認してから変更は加えていません)。
本当に意味が分かりませんが、これはAccessの仕様なのでしょうか? このような不具合に遭遇した経験がある方はいらっしゃいますでしょうか?
フォームの「データ入力用」プロパティが「はい」になってませんか。 なっていたら、「いいえ」にしてください。
今現在、構文エラーが出てしまいます。 引き続き検討させていただきます。
質問文で、 間違いがありました。
商品ID 売上数の合計 商品ID(※) A 80 1,2,5 B 70 3,4
※の部分は、商品IDではなく、売上IDでした。
申し訳ございません。
よろしくお願いします。
ありがとうございます。 試してみたいと思います。
ACCESSのクエリでFOR XML PATH ('')は使えないんじゃないですかねぇ
FOR XML PATH ('')
グループ内のデータを横連結する(hatena chipsさん)
またはこれでしょうか。 https://webbibouroku.com/Blog/Article/forxmlpath
SELECT SUM(売上数) , ( SELECT 売上ID + ',' FROM テーブルA WHERE 商品ID = t1.商品ID FOR XML PATH('') ) AS 売上IDグループ FROM テーブルA as t1 GROUP BY 商品ID
おそらく下記のSQLを参考につくることができるのではないでしょうか。
https://sql55.com/query/generate-csv-string.php
ありがとうございます。 元々自社開発なのです。 ソフトで作りこむ方法もあるのですが、質問させていただきました。
昭和ならば、それで許されました。現在は、遅かれ早かれ契約不適合責任や善管注意義務が問われる可能性がありませんか?きちんと専門家に外注しましょう。
帳票フォームになっているかは再三確認しましたし、クエリが集計にもなっていませんでした!
ありがとうございます。 業務上必要なことが出てきまして。
可能ですよ。でも、やる意味が全くないので、そんな事はやりません。
いつの間にかレコードが1件ずつしか表示されなくなってしまいました。
フォームの[既定のビュー]プロパティを[単票フォーム]にうっかり変更したり、Q_在庫品ラベル出力用の[デザイン]タブの[集計]ボタンをうっかりクリックしたり、していませんか?
hatenaさまへありがとうございます(返信遅くなりました)。 規定値をコードで設定出来るとは知りませんでした。その方が簡単に出来そうですね。試して上手くいかない場合はまた投稿致します。宜しくお願いします。
1行目(先頭レコード)の値は、フォームヘッダーにテキストボックスを配置して、コントロールソースを=First([F1])などとすれば取得できます(必要ないなら非表示にしておく)。代入するときにこのテキストボックスを参照すればいいでしょう。
=First([F1])
ただし、質問内容から判断するに、ご希望のことは1行目といういうより前レコードの値を取得したいということでは。 その場合は下記をご参考に。
フォームで前レコードの値を複写する関数 - hatena chips
ちなみに、いちいちメッセージボックスを表示させて確認するのは、ユーザーにとって面倒だと思うので、自分が設計するなら、F1、F2の更新後処理で、規定値プロパティに入力値を設定すれば、新規レコードに直前に入力した値が規定値として表示されるので、変更があるときのみ入力、選択するようなUIにします。
Private Sub F1_AfterUpdate() Me.F1.DefaultValue = Me.F1.Value End Sub
数字だけのフィールド、数字で始まるフィールド名以外にも、スペースを含むフィールド名、予約語のフィールド名、特殊記号を含むフィールド名などを使うとエラーになります。
Access データベースで特殊文字を使用したエラー - Microsoft 365 Apps | Microsoft Learn
そのような名前を使わないようにするのが原則ですが、どうしても使わなければならないときは、[ ]で囲むと使用できます。
[
]
SELECT [3] FROM おためし WHERE JAN = '1000000000023'
質問したばかりで申し訳ないです。 全角数字は禁止と認識していましたが、数字だけ、もしくはフィールド名の先頭に数字を使ってもエラーになるみたいでした。 多少面倒ですが、先頭にアルファベット1文字加ええることで、回避できました。
txb_品名コード、txb_現在庫数ともに非連結のテキストボックスです。
ならば[F_在庫品作成依頼]が連結フォームである必要はないのではないでしょうか。
ごくありふれた操作なのですね。初めてだったので安心しました。
いわゆる CRUD 機能を Access の非連結フォームに実装する場合、 「新規レコードの追加」を行う手法については、大別して次の 3 種類の方法が挙げられます。
保存済みの追加クエリを実行するマクロまたはプロシージャを呼び出す。
任意の SQL 文(この場合は INSERT INTO ... ステートメント)を実行するマクロまたはプロシージャを呼び出す。
DAO または ADO の Recordset オブジェクトによって任意のテーブルを参照し、AddNew メソッドを呼び出して新規レコードを作成し、そのレコードの各フィールドの値を編集し、Update メソッドを呼び出してそのレコードをテーブルに保存する――という一連の操作を実行するプロシージャを呼び出す。
挙げられた方法は上記 1 に該当します。
フォームのレコードソースをクエリを元にしたテーブルにして、クエリのデータを追加して、フォームでのデータ編集後に 更新クエリで書き戻すのはいかがでしょうか?
直接編集はリスクが大きい気がします。
F_在庫品作成依頼というフォームを作りました。 レコードソースは00品番と00作成というテーブルを品番で繋げたものです。
txb_品名コードの更新後処理で、品名コードでフィルターし、その製品の詳細と作成依頼の履歴(サブフォームで、レコードソースはF_在庫品作成依頼と同一)を表示する
txb_現在庫数に、現在の在庫数を入力する
ここで問題となるのは、[txb_品名コード]と[txb_現在庫数]が 連結テキストボックスであるか、それとも非連結テキストボックスであるか、 ということです。
[txb_品名コード]のコントロールソースがテーブル[00作成]のフィールド[品番]、 [txb_現在庫数]のコントロールソースがテーブル[00作成]のフィールド[現在庫数] であるならば、それらのテキストボックスに対して値を入力する操作は そのままコントロールソースであるフィールドに対しての入力となります。
その際のフォームのカレントレコードが新規レコードなのであれば、 カレントレコードが保存された段階でそのレコードはテーブル[00作成]に 追加されます。 カレントレコードが既存のレコードなのであれば、参照中のレコードが 更新(上書き)されます。
btn_作成手配ボタンを押して、F_在庫品作成依頼のテキストボックスに 表示されている値・今日の日付を00作成という作成履歴を保存するレコードに追加する
「連結フォームのカレントレコードに対する入力操作」によって テーブル[00作成]のレコードの追加/更新が成されているのであれば、 それとは別に(独自に)「追加クエリを用いたレコードの追加」という操作を 実行する必要はありません。
後者の操作を行う必要があるとすれば、それは[F_在庫品作成依頼]が 非連結フォーム(どのテーブルとも連結していない)である場合か、 「連結フォームのカレントレコードに対する入力操作」とは別に 何か特殊なレコードの追加処理を実行しなければならないような場合 ぐらいでしょう。
今までテーブルの表示のないクエリを作成した経験がないため、こういうのは一般的なのか
「各フィールドに出力する値(リテラルや式の結果)をリストで指定して 任意のテーブルに 1 件のレコードを追加する操作」という自体は、 データベースシステムにおいてごくありふれた操作です。
多くの場合は INSERT INTO ... VALUES ... ステートメントを使用します。
INSERT INTO [00作成] ([受注品], [手配日], [現在庫数], [品番]) VALUES (False, Date(), [Forms]![F_在庫品作成依頼]![txb_現在庫数], [Forms]![F_在庫品作成依頼]![txb_品名コード]);
Access の場合は SQL ビューでこのステートメントを用いた追加クエリを 作成することができますが、デザインビューに切り替えてクエリを上書き保存すると INSERT INTO ... SELECT ... ステートメントに置き換わってしまいます。
別スレを見ていて思ったのですが、テーブル構造(主キーなど)の提示、フォームのスクリーンショットの提示が必要ではないかしら?
フォーカスを移動させて値が保存されたらデータシートビューで値が表示される、という認識でしたので、移動させても値が表示されないのはおかしいなあと思って質問させて頂いた次第です。実行するとちゃんと在庫数に入力した数が追加されているので問題はないのですが。原因が気になったもので。。 とりあえず動いているのでよしとします、お手数をお掛け致しました。
フォーカスを移動させてからクエリーを開いても表示されませんか?
ちょっと原因は分からないのですが、実行したら値がきちんと入るのなら問題はないのでは?
デザインビューからデータシートビューを表示させる操作をしたということですか。 そのとき、式1: [Forms]![F_受注品作成依頼]![txb_現在庫数] と設定したフィールドに値が表示されていないということですか。
はい、デザインビューからデータシートビューに切り替えた際、値が表示されませんでした。
その時に、「F_受注品作成依頼」フォームは開いている状態ですか。 また、「txb_現在庫数」に入力したあと、Enterキー(Tabキー)を押下する、あるいは他のコントロールをクリックするなどして、フォーカス移動をしてますか。
はい、当該のフォームは開いた状態で、txb_現在庫数から他のボタンへフォーカスを移動させてみても、データシートビューに値が出ませんでした。
早速のご回答、ありがとうございます。 ちょっとレコード数が多いのですが、まずは試しに設定してみます。 ありがとうございました。
このクエリが正しく作れているかの確認のため、クエリのデータシートビューを見たところ、フォーム上ではテキストボックスに値が正しく入っている(仮に「1000」と入力していたとします)が、データシートビューでは値が入っていませんでした。
デザインビューからデータシートビューを表示させる操作をしたということですか。 そのとき、式1: [Forms]![F_受注品作成依頼]![txb_現在庫数] と設定したフィールドに値が表示されていないということですが。
式1: [Forms]![F_受注品作成依頼]![txb_現在庫数]
上記の認識で間違いないなら下記のことを確認してください。
「btn_作成手配」ボタンのクリック時で"Q_作成手配分追加"クエリを実行するようになっているということですか。
はい、ボタンを押すと、入力項目が不足していないか等のif文を通り、問題なければElseに分岐してDocmdでクエリが実行されます。
このクエリは"Q_作成手配分追加"のことですか。 このクエリをデザインビュー(あるいはSQLビュー)で開いてから、データシートビューで表示させるという操作をしているとうことですか。
クエリはQ_作成手配分追加のことです。 このクエリが正しく作れているかの確認のため、クエリのデータシートビューを見たところ、フォーム上ではテキストボックスに値が正しく入っている(仮に「1000」と入力していたとします)が、データシートビューでは値が入っていませんでした。その状態でクエリを実行すると、きちんとT_作成の現在庫数フィールドに値(1000)が入っています。
btn_作成手配で使用する"Q_作成手配分追加"という追加クエリで
クエリをデータシートビューで見るとこれから追加する値が表示されると思うのですが、それの現在庫数フィールドの値が表示されない、ということです。
「値がクエリに表示されない」というのが良く分かりません。 「txb_現在庫数"(非連結)」に反映されない、というのであれば分かるのですが。
もし上記が正の場合、画面をリフレッシュすればいいのではないでしょうか(違っていたらすみません)
部品の合計金額をDSum関数で取得すればいいでしょう。
クエリのフィールドに
部品合計金額: DSum("部品価格","部品テーブル","製品ID='" & [製品ID] & "'")
テーブル名、フィールド名は実際のものに変更してください。 また、リンクフィールド(製品ID)はテキスト型の場合です。
Accessのテーブルやクエリのデータを貼り付ける場合は下記で、Markdown書式のテーブルに変換して貼り付けてください。
Markdown Tables generator
ですよね、、、フォームが破損していた可能性があるのならば、新しく作り直してよかったです。
そのような仕様があるはずがない。
そのフォームが破損していたということではないでしょうか。
私はそのような経験はないです。
すでに不具合のあったフォームは削除してしまったのですが、そのプロパティについても調べた上で、データ入力用をいいえにしても不具合が改善しませんでした。
最終目的が印刷出力なら、レポートで可能です。下記を参考にしてください。
グループ内のデータを横連結する - hatena chips
クエリでどうしても必要なら、DJoin関数を使用すれば可能です。
下記をご参考に。
DJoin 関数 - リスト文字列を取得する方法
結局どれだけ見直しても直らないので、フォームデザインから同じフォームを作り直しました。
不思議なことに、新しいフォームで帳票形式で表示されることを確認した後、作り直し前のフォームを確認すると、帳票形式で表示されるようになっていました(最後に帳票形式で表示されないことを確認してから変更は加えていません)。
本当に意味が分かりませんが、これはAccessの仕様なのでしょうか?
このような不具合に遭遇した経験がある方はいらっしゃいますでしょうか?
フォームの「データ入力用」プロパティが「はい」になってませんか。
なっていたら、「いいえ」にしてください。
今現在、構文エラーが出てしまいます。
引き続き検討させていただきます。
今現在、構文エラーが出てしまいます。
引き続き検討させていただきます。
質問文で、
間違いがありました。
商品ID 売上数の合計 商品ID(※)
A 80 1,2,5
B 70 3,4
※の部分は、商品IDではなく、売上IDでした。
申し訳ございません。
よろしくお願いします。
ありがとうございます。
試してみたいと思います。
ありがとうございます。
試してみたいと思います。
ACCESSのクエリで
FOR XML PATH ('')
は使えないんじゃないですかねぇグループ内のデータを横連結する(hatena chipsさん)
またはこれでしょうか。
https://webbibouroku.com/Blog/Article/forxmlpath
おそらく下記のSQLを参考につくることができるのではないでしょうか。
https://sql55.com/query/generate-csv-string.php
ありがとうございます。
元々自社開発なのです。
ソフトで作りこむ方法もあるのですが、質問させていただきました。
昭和ならば、それで許されました。現在は、遅かれ早かれ契約不適合責任や善管注意義務が問われる可能性がありませんか?きちんと専門家に外注しましょう。
帳票フォームになっているかは再三確認しましたし、クエリが集計にもなっていませんでした!
ありがとうございます。
業務上必要なことが出てきまして。
可能ですよ。でも、やる意味が全くないので、そんな事はやりません。
フォームの[既定のビュー]プロパティを[単票フォーム]にうっかり変更したり、Q_在庫品ラベル出力用の[デザイン]タブの[集計]ボタンをうっかりクリックしたり、していませんか?
hatenaさまへありがとうございます(返信遅くなりました)。
規定値をコードで設定出来るとは知りませんでした。その方が簡単に出来そうですね。試して上手くいかない場合はまた投稿致します。宜しくお願いします。
1行目(先頭レコード)の値は、フォームヘッダーにテキストボックスを配置して、コントロールソースを
=First([F1])
などとすれば取得できます(必要ないなら非表示にしておく)。代入するときにこのテキストボックスを参照すればいいでしょう。ただし、質問内容から判断するに、ご希望のことは1行目といういうより前レコードの値を取得したいということでは。
その場合は下記をご参考に。
フォームで前レコードの値を複写する関数 - hatena chips
ちなみに、いちいちメッセージボックスを表示させて確認するのは、ユーザーにとって面倒だと思うので、自分が設計するなら、F1、F2の更新後処理で、規定値プロパティに入力値を設定すれば、新規レコードに直前に入力した値が規定値として表示されるので、変更があるときのみ入力、選択するようなUIにします。
数字だけのフィールド、数字で始まるフィールド名以外にも、スペースを含むフィールド名、予約語のフィールド名、特殊記号を含むフィールド名などを使うとエラーになります。
Access データベースで特殊文字を使用したエラー - Microsoft 365 Apps | Microsoft Learn
そのような名前を使わないようにするのが原則ですが、どうしても使わなければならないときは、
[
]
で囲むと使用できます。質問したばかりで申し訳ないです。
全角数字は禁止と認識していましたが、数字だけ、もしくはフィールド名の先頭に数字を使ってもエラーになるみたいでした。
多少面倒ですが、先頭にアルファベット1文字加ええることで、回避できました。
ならば[F_在庫品作成依頼]が連結フォームである必要はないのではないでしょうか。
いわゆる CRUD 機能を Access の非連結フォームに実装する場合、
「新規レコードの追加」を行う手法については、大別して次の 3 種類の方法が挙げられます。
保存済みの追加クエリを実行するマクロまたはプロシージャを呼び出す。
任意の SQL 文(この場合は INSERT INTO ... ステートメント)を実行するマクロまたはプロシージャを呼び出す。
DAO または ADO の Recordset オブジェクトによって任意のテーブルを参照し、AddNew メソッドを呼び出して新規レコードを作成し、そのレコードの各フィールドの値を編集し、Update メソッドを呼び出してそのレコードをテーブルに保存する――という一連の操作を実行するプロシージャを呼び出す。
挙げられた方法は上記 1 に該当します。
ごくありふれた操作なのですね。初めてだったので安心しました。
txb_品名コード、txb_現在庫数ともに非連結のテキストボックスです。
フォームのレコードソースをクエリを元にしたテーブルにして、クエリのデータを追加して、フォームでのデータ編集後に
更新クエリで書き戻すのはいかがでしょうか?
直接編集はリスクが大きい気がします。
ここで問題となるのは、[txb_品名コード]と[txb_現在庫数]が
連結テキストボックスであるか、それとも非連結テキストボックスであるか、
ということです。
[txb_品名コード]のコントロールソースがテーブル[00作成]のフィールド[品番]、
[txb_現在庫数]のコントロールソースがテーブル[00作成]のフィールド[現在庫数]
であるならば、それらのテキストボックスに対して値を入力する操作は
そのままコントロールソースであるフィールドに対しての入力となります。
その際のフォームのカレントレコードが新規レコードなのであれば、
カレントレコードが保存された段階でそのレコードはテーブル[00作成]に
追加されます。
カレントレコードが既存のレコードなのであれば、参照中のレコードが
更新(上書き)されます。
「連結フォームのカレントレコードに対する入力操作」によって
テーブル[00作成]のレコードの追加/更新が成されているのであれば、
それとは別に(独自に)「追加クエリを用いたレコードの追加」という操作を
実行する必要はありません。
後者の操作を行う必要があるとすれば、それは[F_在庫品作成依頼]が
非連結フォーム(どのテーブルとも連結していない)である場合か、
「連結フォームのカレントレコードに対する入力操作」とは別に
何か特殊なレコードの追加処理を実行しなければならないような場合
ぐらいでしょう。
「各フィールドに出力する値(リテラルや式の結果)をリストで指定して
任意のテーブルに 1 件のレコードを追加する操作」という自体は、
データベースシステムにおいてごくありふれた操作です。
多くの場合は INSERT INTO ... VALUES ... ステートメントを使用します。
Access の場合は SQL ビューでこのステートメントを用いた追加クエリを
作成することができますが、デザインビューに切り替えてクエリを上書き保存すると
INSERT INTO ... SELECT ... ステートメントに置き換わってしまいます。
別スレを見ていて思ったのですが、テーブル構造(主キーなど)の提示、フォームのスクリーンショットの提示が必要ではないかしら?
フォーカスを移動させて値が保存されたらデータシートビューで値が表示される、という認識でしたので、移動させても値が表示されないのはおかしいなあと思って質問させて頂いた次第です。実行するとちゃんと在庫数に入力した数が追加されているので問題はないのですが。原因が気になったもので。。
とりあえず動いているのでよしとします、お手数をお掛け致しました。
フォーカスを移動させてからクエリーを開いても表示されませんか?
ちょっと原因は分からないのですが、実行したら値がきちんと入るのなら問題はないのでは?
はい、デザインビューからデータシートビューに切り替えた際、値が表示されませんでした。
はい、当該のフォームは開いた状態で、txb_現在庫数から他のボタンへフォーカスを移動させてみても、データシートビューに値が出ませんでした。
早速のご回答、ありがとうございます。
ちょっとレコード数が多いのですが、まずは試しに設定してみます。
ありがとうございました。
デザインビューからデータシートビューを表示させる操作をしたということですか。
そのとき、
式1: [Forms]![F_受注品作成依頼]![txb_現在庫数]
と設定したフィールドに値が表示されていないということですが。上記の認識で間違いないなら下記のことを確認してください。
その時に、「F_受注品作成依頼」フォームは開いている状態ですか。
また、「txb_現在庫数」に入力したあと、Enterキー(Tabキー)を押下する、あるいは他のコントロールをクリックするなどして、フォーカス移動をしてますか。
はい、ボタンを押すと、入力項目が不足していないか等のif文を通り、問題なければElseに分岐してDocmdでクエリが実行されます。
クエリはQ_作成手配分追加のことです。
このクエリが正しく作れているかの確認のため、クエリのデータシートビューを見たところ、フォーム上ではテキストボックスに値が正しく入っている(仮に「1000」と入力していたとします)が、データシートビューでは値が入っていませんでした。その状態でクエリを実行すると、きちんとT_作成の現在庫数フィールドに値(1000)が入っています。
「btn_作成手配」ボタンのクリック時で"Q_作成手配分追加"クエリを実行するようになっているということですか。
このクエリは"Q_作成手配分追加"のことですか。
このクエリをデザインビュー(あるいはSQLビュー)で開いてから、データシートビューで表示させるという操作をしているとうことですか。
クエリをデータシートビューで見るとこれから追加する値が表示されると思うのですが、それの現在庫数フィールドの値が表示されない、ということです。
「値がクエリに表示されない」というのが良く分かりません。
「txb_現在庫数"(非連結)」に反映されない、というのであれば分かるのですが。
もし上記が正の場合、画面をリフレッシュすればいいのではないでしょうか(違っていたらすみません)
部品の合計金額をDSum関数で取得すればいいでしょう。
クエリのフィールドに
テーブル名、フィールド名は実際のものに変更してください。
また、リンクフィールド(製品ID)はテキスト型の場合です。