TRANSFORM Sum(業務日報.月内合計売上額) AS 合計売上額
SELECT "合計売上額" AS 担当者名
FROM 業務日報
WHERE 業務日報.登録日=DMax("登録日","業務日報")
GROUP BY "合計売上額"
PIVOT 業務日報.担当者名 In ("鈴木","山田","伊藤","田中");
SELECT
T1.ID, T1.日付, T1.内容, T1.開始, T2.終了
FROM
T_日報マスタ AS T1 INNER JOIN T_日報マスタ AS T2
ON (T1.日付 = T2.日付) AND (T1.内容 = T2.内容) AND (T1.終了 = T2.開始) ;
クエリ名 Q_日報マスタ
SELECT
T1.日付, T1.内容, Min(T1.開始) AS 開始, Nz([Q1].[終了],[T1].[終了]) AS 終了
FROM
T_日報マスタ AS T1 LEFT JOIN Q_日報1 AS Q1
ON (T1.開始 = Q1.開始) AND (T1.内容 = Q1.内容) AND (T1.日付 = Q1.日付)
GROUP BY
T1.日付, T1.内容, Nz([Q1].[終了],[T1].[終了])
ORDER BY
T1.日付, Min(T1.開始);
ご返答ありがとうございます。
hirotonさん
間違っておりました。
参考にさせて頂いたサイトの2つ目でチャレンジしても、ページヘッダーの部分を表すことができていません。
また太い罫線を設定しているのは、それぞれの小計、合計を太くして強調させたいためで、出来れば太い罫線は
このまま残しておきたいと考えています。
hatenaさん
明細行は別に17行固定ではなくても大丈夫です。
おっしゃる通り、「次頁へづづく」など表示できれば一番いいのかもしれませんが、どうやって表示させれるか
わからない状態です。
あいまいな説明ばかりで申し訳ありません。
ご回答ありがとうございます。
Printメソッド以外でも、APIか何かで解決出来ればと思っていたのですが、やはり無理なようですね。
横罫線は、詳細セクションの下辺に配置すれば、隙間が空いたり、2重に重なったりはしなくなると思います。
画像をみると明細行は17行固定のようですが、
もし、データ件数が17件の場合はどのように表示しますか。
1ページ目に17件表示して、合計は2ページの17行目ですか。
仕様的には、1ページ目の17行目は、「次頁へづづく」などと表示させるのがいいように思えます。
どうでしょうか。
Printメソッドは、Unicode文字(Shift JISにない文字)に対応していないようです。
テキストボックスに表示させることで対応するしかなさそうです。
2番目の方法でデータの出力がうまく言っているならそこから煮詰めればいいんじゃないかな
最初の画像で太さの違う罫線が含まれてるからそのあたりが原因だと思うけど情報がなさ過ぎてどうこう言えないけども
罫線の書式が完全に固定ならレコードがない場合も用紙の最後まで罫線を出力すると組み合わせるとか
ご丁寧なご回答ありがとうございます。
解決策まで分かりやすくご提示いただき助かります。
エクセルのように、単純にコピー複製とはいかないのですね。
初めてaccessでの作業をしているので特徴を把握できず悩んでおりました。
問題点がはっきり分かって気分が軽くなりました。
ちょっと作業が増えそうですが、解決策1でコツコツ作業したいと思います。
ありがとうございました。
サブフォームを使ったフォームでしたか・・・
サブフォームも外部のフォームを参照するという仕組みなので、コピーしただけのフォームではすべて同じサブフォームを使っていることになります。当然、どこかで修正を入れればそのサブフォームを使っているフォームすべてに影響がでます。
また、フィルターを使ってと回答しましたが、この場合、フィルターもサブフォームそのものに設定することになりますので、すべて共通の設定となってしまいます。
解決策1
サブフォームも各月分用意する
(フォームをコピーした後サブフォームのソースオブジェクトを変更する)
解決策2
VBAを使いフォームを開くたびにサブフォームのフィルターを設定する
アドバイスありがとうございます。
「4月管理フォーム」の場合、サブフォームに「Q-4月日報一覧」というクエリを「▽ボタン」から指定しました。
一時的にはこれで、4月分のクエリが正しく表示されますが、他に複製したフォームにも同じクエリが表示されてしまいます。
「Q-4月日報一覧」のクエリは、1か月毎に12個あり、それぞれ「Q-5月日報一覧」、「Q-6月日報一覧」と分けられています。
(↑のクエリは、皆、同じテーブル(T-日報マスタデータ)から1か月毎にデータが抽出されているものです)
フィルターの抽出条件を使ったことがなく、抽出条件式について自分でも調べてみたいと思います。
hirotonさんの回答と同じですが、
レコードソースはテーブルを設定するか、クエリなら抽出条件を設定していないクエリを設定します。
そのうえで、フォームの「フィルター」プロパティに抽出条件式を設定するといいでしょう。
抽出条件式が分からない場合は、現状のテーブル名とフィールド名を提示してください。
クエリなら、SQLビューにしてSQL文をコピーして貼り付けてください。
それぞれのフォームの「レコードソース」にはどのような値を設定していますか?
作成済みのクエリを「レコードソース」として指定した場合は、それは、作成済みのクエリを参照するという形になります。
この場合は、「レコードソース」からクエリを修正すると大本のクエリが変更されますので、このようなフォームをコピーして「レコードソース」からクエリを修正すると同様のフォームすべてに影響がでます。
共通のクエリを基にそのフォームだけのデータを表示したいのであれば各フォームのプロパティで「フィルター」に抽出条件を設定し、「読み込み時にフィルターを適用」をはいにすると良いでしょう。
kさん、解決できてよかったですね。
しかし、これでは、せっかく回答してくださった回答者、後からここを閲覧した人にとっては、まったく無価値のスレッドになってしまいます。(何が原因で、どうして解決したのかが、質問者以外にはまったく不明)
私の回答で情報追加の依頼をした件について、情報を提示してもらえませんか。
みなさん回答ありがとうございました。
もう一度考え直した結果、以下のコードでうまくいきました。
IIf( C >= KARA And C <= MADE ,IIf(Date()> C , B , A ), A )
情報が不足しているので、下記の点について情報を補足してください。
まずは、これはどこに記述しているのか、明確にしてください。
コントロールソース、クエリの抽出条件欄などに式として記述しているのか。
SQLビュー、レコードソース、値集合ソースなどにSQLコードとして記述しているのか。
VBAウィンドウにVBAコードとして記述しているのか。
上記のどれにしても、一部ではなく全体を提示してください。
(式全体、SQL文全体、VBAならプロシージャ全体)
変数への代入に問題があると思われます。関係するコードをすべて提示してください
横から失礼します。 変数の前後に"#"で囲まないといけないのでは?
日付型の条件式では#で囲む必要があります。 変数で対応するときは#をダブルクォーテーションで囲み
アンパサンド(&)で続く文字列を連結します。
今日の日付もToday()で対応かなと思います。 カッコは不要であれば入力後に自動で消えると思います。
iif("#" & today() & "#" < C , A , iif( C >= "#" & KARA & "#" & and C <= "#" & MADE & "#" , B , A ))
2020/3/1をKARA、2020/3/31をMADEとして式を入れてみました。
一番下の整理した式ではうまくいきませんでしたので
iif(今日 < C , A , iif( C >= KARA and C <= MADE , B , A ))
で、実行しましたが、やはりうまくいきません。
今日がCを過ぎていて、CがKARAとMADEの期間内であればB、期間外であればAを表示したいのですが
すべてAが表示されてしまいます。。。
日付をコード上に直接日付の書式を使って記述する場合は「#」で囲む必要があります。
✖ 2020/3/1
〇 #2020/3/1#
VBAにはある期間に含まれるを直接的に表現する方法はありませんので、2つの条件(開始条件、終了条件)を組み合わせて表現します。条件の組み合わせなのでiifをネストさせても表現できますが論理演算子を用いると簡単です。
2020/3/1から2020/3/31の間にある場合
これを組み合わせて質問の条件をそのまま書けば
となりますが条件を整理して
とするとすっきりして良いと思います。(
今日 > C
部分で上の式と比較演算子が変わっているところに注意してください)中央寄せは、下記を参考にしてください。
Accessウィンドウをディスクトップの中央に表示する - hatena chips
サイズ変更不可は、下記を参考にしてください。
Accessウィンドウを表示しない方法 Access2007以降版 - hatena chips
上記の内容を理解して組み合わせる必要はありますが。
hatena様
お返事ありがとうございます。
>左上に開く場合は、Accessウィンドウを中央に移動させてから終了してください。
>次回からその位置で開くはずです。
確かに終了時の場所で開きました。
この場合ユーザーは一人だと問題ないのですが、私が作成しているデータベースは10人以上で共有しています。なので、
>左上に開く場合は、Accessウィンドウを中央に移動させてから終了してください。
が徹底できないリスクがあります。
できれば、位置移動不可、サイズ変更不可としたいのです。
何か良い方法はございますでしょうか?
SetWindowPos hwnd, HWND_TOP, 0, 0, 800, 600, SWP_NOMOVE
上記の部分で引数に SWP_NOMOVE を設定しています。これは位置は変更しないという意味です。
また、Accessは前回終了したときの位置を覚えておいて、次に開く時にその位置で開きます。
左上に開く場合は、Accessウィンドウを中央に移動させてから終了してください。
次回からその位置で開くはずです。
返答が遅くなり大変申し訳ございません。
原因は、サブフォームのソースオブジェクトが空だったことと思われます。
クエリを作成しておいて、サブフォームのソースオブジェクトプロパティに
そのクエリを入れてから、RecordSourceにSQL文を入れることで解決出来ました。
ご回答いただき、大変助かりました。
本当にありがとうございました。
度々のご回答誠にありがとうございます。
Where条件でDmax関数の第三引数に期間を指定してみましたが、演算子のエラーが出てしまい、
私の入力にミスがあるのだと思います。
アドバイスを完璧に生かせず申し訳ありませんが、かなり近いところまで来れたと思いますので、
引き続き調整してトライしてみたいと思います。
拙い私にお付き合い下さり、心からお礼申し上げます。
また、頂いた疑問について、少し込み入った業務の話になるのですが、
日々の営業活動による売上額と、別枠の売上項目があり、
各担当によって、それが有ったり、無かったりする上に、日によって増減もするので把握が難しく、
いちいち聞いて合計しているのが手間になり、この度、アクセスで管理してみたいと思いました。
初めてアクセスに挑戦しているので、躓きも多く大変なのですが、
助けて頂き本当に救われました。
これからも頑張っていきたいと思います。
期間内の最新(の1レコードのみ)を抽出するなら>> 5のWhere条件でDmax関数の第三引数に期間を指定すればできますよ
ところで疑問に思ったんですが日報で月内合計を入力するんですか?
日報は日々の売上額を入力するにとどめて合計(集計作業)はACCESSにやらせるというのが普通だと思います
この形であれば月内のデータを取得したクエリで日々の売上額に合計を設定するだけで済みますよ
引き続きアドバイスありがとうございます。
「2020年3月以内」+「各担当の最新登録日のデータ」の部分について説明不足で申し訳ありません。
最終的な目標は、昨日ご回答いただいた表に、
「月内の範囲」で「最新登録日」の「月内合計売上額」を
各担当毎に表示できるようにしたいと考えています。
(担当は6名なので、6つのレコードが並ぶようになる予定です)
毎日、各担当者に業務日報として「月内合計売上額」を入力してもらう予定です。
(「月内合計売上額」は、当月1日から、当日売上分を含めた月内合計売上額です)
売上合計額を表示するフォームは、1か月単位で区切られるものを作成しているので、
自分でもBetweenを使って、月内のデータを取得するまではできたのですが、
さらに、「月内に限った、最新の登録日」の「月内合計売上額」のみ表示するという、
絞り込みをする条件設定が分からないため、
1日から月末までのデータが、ズラッと並んで表示される結果になってしまいました。
たびたびお手数をお掛けして申し訳ございません。
アドバイスを頂いているおかげで、さらに詳しいクエリについて学ぶ機会になっています。
申し訳ございませんが、アドバイス頂ければ幸甚でございます。
「2020年3月以内」+「各担当の最新登録日のデータ」
の説明をデータ例をもとに具体的に説明してもらえますか。
とりあえず、
「登録日」が2020年3月内ということなら、
任意の年月を指定したい場合は、
丁寧なご回答誠にありがとうございます。
今回はじめてAccessを使用しているので、なかなか躓きが多く苦労しており、
アドバイス頂けて助かっています。
教えて頂いたWHERE句の期間についてですが「2020年3月以内」+「各担当の最新登録日のデータ」
を取得する設定にしたい場合はどのようになりますでしょうか?
月毎に表示フォームを分割したいと考えており、月毎に月内合計売上額を完結できたらと思っています。
重ねてご面倒をお掛けいたしますが、アドバイス頂けましたら幸甚でございます。
下記のクエリを作成します。
これのクエリをもとにフォームウィザードでフォームを作成するか、
フォームのデザインビューでレコードソースにこのクエリを設定して、
フィールドをご希望のレイアウトで配置してください。
In () の中は固定の担当者名をカンマ区切りで入力してください。
また、最新日を抽出条件にしてますが、WHERE句を変更すれば期間に変更できます。
例えば、直近10日間なら、
ご回答ありがとうございます。
はい!ご回答いただいた表をフォームに表示したいと考えております。
担当は固定しています。(6名の間違えでした、申し訳ありません)
合計売上額は「月内合計売上額」です。
担当者は2名で固定ということですか。
フォーム表示は下記のような感じでしょうか。
合計売上額は、直近の「月内合計売上額」を表示でしょうか。
さっそくのお声がけありがとうございます。
テーブル名:業務日報
フィールド名:データID(主キー)、登録日、担当者名、月内合計売上額
表示:売上管理フォームを作成して、直近の合計売上額を表示
レイアウト:2列2行の表(1行:担当名、2行:担当毎合計売上額)
以上、よろしくお願いします。
追記です。
手順通り行ったところ、まさに希望通りの表現ができました!
グループ毎連番の記事は以前拝見しましたが、この作業に応用できるという発想には全く至りませんでした。
それに 全体連番 - グループ連番 でグループを作るとは・・・
これならレコード件数が増えても処理が重くなることがなさそうなので二重に助かります。
ご教授いただきありがとうございました。
回答するには情報不足ですので、下記の点について補足してください。
mayu様ご返信ありがとうございます。
Window 関数についてや詳細な手順まで載せて頂き大変感謝致します。
(旅人算、面白い名前ですね)
まずはご教授していただいた内容にてトライしてみます。
もし不明点あれば恐縮ですがまた質問させていただきます。
( 続き )
ここまで出来たら、あとは単純な集計クエリで表現可能です。
■ SQL
■ 結果
Window 関数は、Oracle や SQLServer など本格的なデータベースには標準で搭載されている機能ですが、
Access には移植されておらず、LAG や LEAD といった関数は、模倣するのが難しいですから
「 旅人算 」という手段を用いて実現する方法 をご紹介します。
【 手順1 】
hatenaさんのコンテンツで紹介されている下記の関数を使いますから
ご自身のデータベースに、モジュール( SetSequenceNumber関数 )をインポートしておいてください。
【 手順2 】
T_日報マスタ テーブルに 数値型のフィールドを2つ追加します。
追加するフィールドの名前は
全体連番
グループ連番
とします。
【 手順3 】
追加した2つのフィールドに VBA で連番を振ります。
(
※ 全体連番には、日付 + 開始時刻 の昇順で ユニークな番号を付与します。
※ グループ連番には 日付・内容 を母集団とし、開始時刻の昇順で 集団内での連番を付与します。
)
■ set_number実行前
■ set_number実行後
追記です。
ご教授していただいた内容で、2つまでなら希望通りのクエリが作成できました。ありがとうございます。
ですが確かに3つ以上はうまくいきません。別の方法が必要なのですね。
同じ日付で内容が連続した場合、そのレコードの中から開始の最小値と終了の最大値を取得するには・・・
早々のご返信ありがとうございます。
取り急ぎ、3つ以上連続する場合もあります。
省略してしまいましたが、テーブルには下記のような内訳あります。
内容によって3つ以上になる場合があります。サンプルが情報不足で申し訳ございません…
まずはご返信された内容にて確認させていただきます。
連続するデータが2つのまでなら、下記のような二段階のクエリでできそうです。
クエリ名 Q_日報1
クエリ名 Q_日報マスタ
3つ以上連続する場合があるとちょっと面倒そうです。
早々のご返信ありがとうございます。
内容不足で申し訳ございません。
テーブル名:T_日報マスタ
主務キー:ID
これを
クエリ名:Q_日報マスタ
のような形にしたいと思っています。
前提として
同じ日付の場合、ID番号の「終了」とID番号+1の「開始」は同じ時刻が入ります。
やりたい作業:ID2、3が同じ日付(3/10)、同内容(作業)で9:00~10:00、10:00~15:00と続いているので9:00~15:00にまとめたい
ただし、ID4が違う作業(15:00~16:00に「移動」)なのでID5はまとめない
同内容の判断基準は、同じ日付、作業 でID番号の「終了」とID番号+1の「開始」の時間:分 が一致する場合です。
ご確認よろしくお願い致します。