SELECT T_ひらがな表示.ID, M_ひらがなマスター.[ひらがな], M_ひらがなマスター_1.[ひらがな] FROM (M_ひらがなマスター RIGHT JOIN T_ひらがな表示 ON M_ひらがなマスター.[ひらがなID] = T_ひらがな表示.[ひらがなID]) LEFT JOIN M_ひらがなマスター AS M_ひらがなマスター_1 ON T_ひらがな表示.[ひらがなID2] = M_ひらがなマスター_1.[ひらがなID];
テーブルの表示でM_ひらがなマスターを2つ表示することでレポート用のクエリを作ることが出来ました。 でもこれだと、例えばひらがな3、ひらがな4、、、と増えていくと、その分だけM_ひらがなマスターのテーブルの表示を増やさないといけないですよね? 何か根本的に間違えているような気がするのですが、スマートな実現方法や、間違い等を指摘して頂きたいです。
その後、気がついたのですがそのフォームをフォームビューで開いてからデザインビューにした時にエラーメッセージがでます。そうせずに直接デザインビューで開く時はエラーメッセージはでません。何かコードに問題?
TimeValue 関数
その計算式でなぜうまくいくのかhirotonには理解できません
hirotonは段階を追って処理を提示していますが、どの部分でエラーになりますか? クエリで各段階をそれぞれフィールドにして確認してみてください。解説の都合で[月終時]、[月始時]と適当に名前を作っていますのでうまいこと解釈していただくか、分からなければ質問してください
[月終時]
[月始時]
この結果をフォームに表示させようとすると [Q実労働時間クエリ]![月時] Name?というエラーになってしまいます。
この結果をフォームに表示させようとすると [Q実労働時間クエリ]![月時]
Name?というエラーになってしまいます。
フォームのレコードソース、表示させようとしているコントロールの種類(テキストボックスやコンボボックスなど)、そのコントロールのコントロールソースを確認してください
レコードソースに指定されているソースに[Q実労働時間クエリ]![月時]という名前のフィールドは含まれていますか?普通はこのような名前のフィールドはないと思います
[Q実労働時間クエリ]![月時]
おっしゃる通りなんだと思います。 ただ、スタートがきちんと構築しよう!という取り組みではなく 頻々に入れ替わるパートさんの雇用契約書の作成を従業員リストから出来ないかなぁ~というところから始まったので こんなふうに計算することも考えずにテキストを追加して、今になって「あ~計算も出来たら楽だ」と思った次第です。 なかなかじっくり取り組む時間が取れず、やっつけで作っては相談している、というのが現状です。
ただ、このような問題点が発生することはわかりましたので、次回このようなものを作るときは 今後どんな風に利用する可能性があるか、というのをしっかり考えて作らないと、と思いました。
わかりやすく解説していただいてありがとうございます。上記でエラーが出てしまったので 上記の式をチャットGPTに貼って相談したところ、
月時: IIf(TimeValue([月終])>TimeValue([月始]),((Hour(TimeValue([月終]))-Hour(TimeValue([月始])))60+Minute(TimeValue([月終]))-Minute(TimeValue([月始])))-[月休],((Hour(TimeValue([月終]))-Hour(TimeValue([月始])))60+Minute(TimeValue([月終]))-Minute(TimeValue([月始])))+IIf(TimeValue([月終])>TimeValue([月始]),0,24*60)-[月休])/60
こんなふうにすることで時間を表示させることが出来ました。
ところが、別の質問になってしまいますが、この結果をフォームに表示させようとすると [Q実労働時間クエリ]![月時]
何か考えられる原因等ありますでしょうか。
hirotonさま:ありがとうございます。初歩的なミスをしてました。確かにそうですね、修正したら機能しました。フォームの入力内容とクエリ値がごっちゃになってました。 hatenaさま:ありがとうございました。なるほどです。ちょっとした事ですが中々思いつかないアイデアです。参考にします。
flArray.Add .Cells(i, 1), .Cells(i, 2)
とすると、セルの値ではなく、キーとアイテムにセルオブジェクトがセットされてしまいます。 下記のようにValueを明示的に指定するようにしましょう。
flArray.Add .Cells(i, 1).Value, .Cells(i, 2).Value
ただし、.Cells(i, 1).Value に重複がないことが前提です。 重複があるとエラーになります。
メイン・サブフォームがあります(メインIDでリレーション)。
サブフォームのリンク親フィールド、リンク子フィールドに「メインID」が設定されている状態でしょうか。
サブフォームのフォームヘッダーかフォームフッターにテキストボックスを配置して 下記のように設定します。
名前 サブチェック コントロールソース =Sum([F1]=90+[F2]=90)<>0
If Me.F_Sub.Form!サムチェック Then kaeri = MsgBox("項目90がありますが、そのまま閉じていいですか?", vbYesNo) End If
Falseは0、Tureは-1なので、90の-件数になることを利用しています。 このようなことを使うのはちょっとという場合は、
コントロールソース =Sum(IIf([F1]=90,1,0)+IIf([F2]=90,1,0))<>0
きちんと「クエリ1」に存在するフィールドを指定するだけでは?
DCount("*", "クエリ1", "[F1]=90 Or [F2]=90")
質問文の状態では、「クエリ1」とは無関係の内容を抽出条件にしているので、「『クエリ1』とは無関係な内容の真偽によって、『クエリ1』の全件数または0どちらかの数値を得る」という計算になっています
月始 短いテキスト 定型入力09\時99\分;; 月終 短いテキスト 定型入力09\時99\分;; 月休 短いテキスト 定型入力999\分;;_
これのそれぞれの意味は、 月始 → 月曜日の開始時刻 月終 → 月曜日の終了時刻 月休 → 月曜日の休憩時間(分) ということですよね。 それが、月曜から日曜まである。
このようなテーブル設計ではデータベースとしては使い物になりません。 テーブル設計の見直しから始めましょう。
とりあえず勤怠管理のテーブル設計のサンプルは下記などを参考に作成してみてください。
Access:勤怠管理のテーブル|社員マスターとクエリを作成
ただ、これを見ても、おそらく なぜそのような設計のなるのか、 これをどのように使うのか、 さっぱりわからないかと思います。
その場合は、まずは入門書、入門サイトなどでAccessの基本から学習しなおした方が速いかもしれません。
ある程度のところまでできたら、その時点でわからない部分を再質問されるのがいいかと思います。
数値に見えるテキストを計算させると数値として扱ってくれるのでそこは問題ないでしょう。ただし、時分をそのまま並べているのでそのまま数値計算させるわけにはいきません
入力不備を考慮して4桁(以上)に合わせる
[月始] & "0000"
時分を分け、分を時にする
時 :Left([月始] & "0000",2) 分->時:Mid([月始] & "0000",3,2)/60
[月終]が0時を超えてしまうようなときは24を超えた入力をするようにすればいいんですが(25時00分など)簡易的に計算するのであれば
([月終時]+24-[月始時]) Mod 24
で、できます。Mod演算子は余りを求める演算子で、負の値にならないよう24を加算しておいて、24をオーバーした分はMod演算子で捨てるようにしています
Mod
※簡易計算なので1日の労働時間が24時間以上になる場合は正確な数値になりません
これらを組み合わせると、
(Left([月終] & "0000",2)+Mid([月終] & "0000",3,2)/60)+24-(Left([月始] & "0000",2)+Mid([月始] & "0000",3,2)/60)) Mod 24-[月休]/60
で計算できます
ありがとうございます、通常のCtrl+C・Vだと上手くいかず困っていました。 タブコントロールを選択してから貼り付けると上手く配置できました、ありがとうございました。
(フォームをデザインビューで開いている状態で)任意のテキストボックスを選択する。
Ctrl + X キーなどの操作により切り取る。
任意のタブコントロール上の任意のページコントロールを選択する。
Ctrl + V キーなどの操作により貼り付ける。
皆様ありがとうございます。 設定の仕方が悪かったのかコンボボックスに数字が出たりテーブルに商品名が格納されたりして頭がこんがらがってしまっていました。 頂いたリンク等を参考に勉強したいと思います。
>ACCESSのクエリでFOR XML PATH ('')は使えない そうでしたか・・・失礼しました!😱
詳細は、hirotonさんのリンク先から学習してもらうとして、とりあえず下記のように設定すればいいでしょう。
かなり基本的なことなので、まずは自分で調べてみましょう
https://www.google.com/search?q=ACCESS コンボボックス 使い方
※ヒント コントロールソース、連結列、列数、列幅
コンボボックスの選択行を決定したら、フォームのレコードソースのカレントレコードの該当フィールドに(コンボボックスの)値が代入されるように、作ればいいんじゃない?
みなさまアドバイスありがとうございます。 結局、その集計した値を色々なところで使いたいので、INSERT INTO 文を使い、テーブルに出力しました。 そのテーブルとリレーションしましたので、製品の項目を編集できるようになりました。
Enterを押すたびにレコード数は増えていってます
処理待ちに原因があったのかな?
ありがとうございます!
ですよね、、、フォームが破損していた可能性があるのならば、新しく作り直してよかったです。
本当に意味が分かりませんが、これは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
ありがとうございます。 元々自社開発なのです。 ソフトで作りこむ方法もあるのですが、質問させていただきました。
昭和ならば、それで許されました。現在は、遅かれ早かれ契約不適合責任や善管注意義務が問われる可能性がありませんか?きちんと専門家に外注しましょう。
帳票フォームになっているかは再三確認しましたし、クエリが集計にもなっていませんでした!
ありがとうございます。 業務上必要なことが出てきまして。
可能ですよ。でも、やる意味が全くないので、そんな事はやりません。
Accessのテーブルやクエリのデータを貼り付ける場合は下記で、Markdown書式のテーブルに変換して貼り付けてください。
Markdown Tables generator
テーブルの表示でM_ひらがなマスターを2つ表示することでレポート用のクエリを作ることが出来ました。
でもこれだと、例えばひらがな3、ひらがな4、、、と増えていくと、その分だけM_ひらがなマスターのテーブルの表示を増やさないといけないですよね?
何か根本的に間違えているような気がするのですが、スマートな実現方法や、間違い等を指摘して頂きたいです。
その後、気がついたのですがそのフォームをフォームビューで開いてからデザインビューにした時にエラーメッセージがでます。そうせずに直接デザインビューで開く時はエラーメッセージはでません。何かコードに問題?
TimeValue 関数
その計算式でなぜうまくいくのかhirotonには理解できません
hirotonは段階を追って処理を提示していますが、どの部分でエラーになりますか?
クエリで各段階をそれぞれフィールドにして確認してみてください。解説の都合で
[月終時]、[月始時]と適当に名前を作っていますのでうまいこと解釈していただくか、分からなければ質問してくださいフォームのレコードソース、表示させようとしているコントロールの種類(テキストボックスやコンボボックスなど)、そのコントロールのコントロールソースを確認してください
レコードソースに指定されているソースに
[Q実労働時間クエリ]![月時]という名前のフィールドは含まれていますか?普通はこのような名前のフィールドはないと思いますおっしゃる通りなんだと思います。
ただ、スタートがきちんと構築しよう!という取り組みではなく
頻々に入れ替わるパートさんの雇用契約書の作成を従業員リストから出来ないかなぁ~というところから始まったので
こんなふうに計算することも考えずにテキストを追加して、今になって「あ~計算も出来たら楽だ」と思った次第です。
なかなかじっくり取り組む時間が取れず、やっつけで作っては相談している、というのが現状です。
ただ、このような問題点が発生することはわかりましたので、次回このようなものを作るときは
今後どんな風に利用する可能性があるか、というのをしっかり考えて作らないと、と思いました。
わかりやすく解説していただいてありがとうございます。上記でエラーが出てしまったので
上記の式をチャットGPTに貼って相談したところ、
月時: IIf(TimeValue([月終])>TimeValue([月始]),((Hour(TimeValue([月終]))-Hour(TimeValue([月始])))60+Minute(TimeValue([月終]))-Minute(TimeValue([月始])))-[月休],((Hour(TimeValue([月終]))-Hour(TimeValue([月始])))60+Minute(TimeValue([月終]))-Minute(TimeValue([月始])))+IIf(TimeValue([月終])>TimeValue([月始]),0,24*60)-[月休])/60
こんなふうにすることで時間を表示させることが出来ました。
ところが、別の質問になってしまいますが、この結果をフォームに表示させようとすると
[Q実労働時間クエリ]![月時]
Name?というエラーになってしまいます。
何か考えられる原因等ありますでしょうか。
hirotonさま:ありがとうございます。初歩的なミスをしてました。確かにそうですね、修正したら機能しました。フォームの入力内容とクエリ値がごっちゃになってました。
hatenaさま:ありがとうございました。なるほどです。ちょっとした事ですが中々思いつかないアイデアです。参考にします。
とすると、セルの値ではなく、キーとアイテムにセルオブジェクトがセットされてしまいます。
下記のようにValueを明示的に指定するようにしましょう。
ただし、.Cells(i, 1).Value に重複がないことが前提です。
重複があるとエラーになります。
サブフォームのリンク親フィールド、リンク子フィールドに「メインID」が設定されている状態でしょうか。
サブフォームのフォームヘッダーかフォームフッターにテキストボックスを配置して
下記のように設定します。
名前 サブチェック
コントロールソース =Sum([F1]=90+[F2]=90)<>0
Falseは0、Tureは-1なので、90の-件数になることを利用しています。
このようなことを使うのはちょっとという場合は、
コントロールソース =Sum(IIf([F1]=90,1,0)+IIf([F2]=90,1,0))<>0
きちんと「クエリ1」に存在するフィールドを指定するだけでは?
質問文の状態では、「クエリ1」とは無関係の内容を抽出条件にしているので、「『クエリ1』とは無関係な内容の真偽によって、『クエリ1』の全件数または0どちらかの数値を得る」という計算になっています
これのそれぞれの意味は、
月始 → 月曜日の開始時刻
月終 → 月曜日の終了時刻
月休 → 月曜日の休憩時間(分)
ということですよね。
それが、月曜から日曜まである。
このようなテーブル設計ではデータベースとしては使い物になりません。
テーブル設計の見直しから始めましょう。
とりあえず勤怠管理のテーブル設計のサンプルは下記などを参考に作成してみてください。
Access:勤怠管理のテーブル|社員マスターとクエリを作成
ただ、これを見ても、おそらく
なぜそのような設計のなるのか、
これをどのように使うのか、
さっぱりわからないかと思います。
その場合は、まずは入門書、入門サイトなどでAccessの基本から学習しなおした方が速いかもしれません。
ある程度のところまでできたら、その時点でわからない部分を再質問されるのがいいかと思います。
数値に見えるテキストを計算させると数値として扱ってくれるのでそこは問題ないでしょう。ただし、時分をそのまま並べているのでそのまま数値計算させるわけにはいきません
入力不備を考慮して4桁(以上)に合わせる
時分を分け、分を時にする
[月終]が0時を超えてしまうようなときは24を超えた入力をするようにすればいいんですが(25時00分など)簡易的に計算するのであれば
で、できます。
Mod演算子は余りを求める演算子で、負の値にならないよう24を加算しておいて、24をオーバーした分はMod演算子で捨てるようにしています※簡易計算なので1日の労働時間が24時間以上になる場合は正確な数値になりません
これらを組み合わせると、
で計算できます
ありがとうございます、通常のCtrl+C・Vだと上手くいかず困っていました。
タブコントロールを選択してから貼り付けると上手く配置できました、ありがとうございました。
(フォームをデザインビューで開いている状態で)任意のテキストボックスを選択する。
Ctrl + X キーなどの操作により切り取る。
任意のタブコントロール上の任意のページコントロールを選択する。
Ctrl + V キーなどの操作により貼り付ける。
皆様ありがとうございます。
設定の仕方が悪かったのかコンボボックスに数字が出たりテーブルに商品名が格納されたりして頭がこんがらがってしまっていました。
頂いたリンク等を参考に勉強したいと思います。
>ACCESSのクエリでFOR XML PATH ('')は使えない
そうでしたか・・・失礼しました!😱
詳細は、hirotonさんのリンク先から学習してもらうとして、とりあえず下記のように設定すればいいでしょう。
かなり基本的なことなので、まずは自分で調べてみましょう
https://www.google.com/search?q=ACCESS コンボボックス 使い方
※ヒント
コントロールソース、連結列、列数、列幅
コンボボックスの選択行を決定したら、フォームのレコードソースのカレントレコードの該当フィールドに(コンボボックスの)値が代入されるように、作ればいいんじゃない?
みなさまアドバイスありがとうございます。
結局、その集計した値を色々なところで使いたいので、INSERT INTO 文を使い、テーブルに出力しました。
そのテーブルとリレーションしましたので、製品の項目を編集できるようになりました。
処理待ちに原因があったのかな?
ありがとうございます!
ですよね、、、フォームが破損していた可能性があるのならば、新しく作り直してよかったです。
そのような仕様があるはずがない。
そのフォームが破損していたということではないでしょうか。
私はそのような経験はないです。
すでに不具合のあったフォームは削除してしまったのですが、そのプロパティについても調べた上で、データ入力用をいいえにしても不具合が改善しませんでした。
最終目的が印刷出力なら、レポートで可能です。下記を参考にしてください。
グループ内のデータを横連結する - 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
ありがとうございます。
元々自社開発なのです。
ソフトで作りこむ方法もあるのですが、質問させていただきました。
昭和ならば、それで許されました。現在は、遅かれ早かれ契約不適合責任や善管注意義務が問われる可能性がありませんか?きちんと専門家に外注しましょう。
帳票フォームになっているかは再三確認しましたし、クエリが集計にもなっていませんでした!
ありがとうございます。
業務上必要なことが出てきまして。
可能ですよ。でも、やる意味が全くないので、そんな事はやりません。