レポートのレコードソースには1人に対しいくつものレコードがあります。
そのレコード数はその人によって違います。
例えば
社員番号 発令日 異動部署
123 2012年3月1日 営業3課
123 2018年3月1日 営業2課
123 2020年3月1日 営業1課
のようなデータがあります。
レポートで辞令を出したいとき
元の部署と新しい部署を記載するのですが、上の例でいうと元の部署を営業2課、新しい部署を営業1課として出力したいです。
文書例としては、
2020年3月1日をもって営業2課から営業1課の勤務を命じます。
このように辞令の中に表記させたいです。
どのようにしたら新しい部署と新しい部署が登録されている1つ前のレコードをレポートに呼びだせるでしょうか?
教えていただけると幸いです。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/11/11 05:00
回答4件
0
自己結合する訳なので、それぞれの情報を繋ぐ情報を作り出す必要があります。
元にするテーブルを「異動」テーブルとすると、以下のようなSQLで取り出す事が出来ます。
SQL
1元にするテーブルを「異動」テーブルとすると、 2select 異動基準.*, 異動前.異動部署 3from ( 4 select * 5 ,(select max(発令日) 6 from 異動 as 異動前 7 where 異動前.社員番号=異動.社員番号 8 and 異動前.発令日<異動.発令日 9 ) as 異動前発令日 10 from 異動 11 ) as 異動基準 12 left join 異動 as 異動前 13 on 異動基準.社員番号=異動前.社員番号 and 異動基準.異動前発令日=異動前.発令日 14
時間が掛かるようなら、SQL中にある異動前発令日をテーブル作成クエリーで作成するとか、インデックスの見直しを行って下さい。
投稿2020/11/11 06:40
編集2020/11/11 06:59総合スコア25327
0
ベストアンサー
テーブルをレコードソースとするレポート上にテキストボックスを3つ配置して下記のように設定します。
テーブル名は「移動履歴」と仮定してます。
名前 前発令日
コントロールソース
=DMax("発令日","異動履歴","社員番号=" & [社員番号] & " AND 発令日<#" & [発令日] & "#")
可視 いいえ
名前 前部署
コントロールソース
=DLookUp("異動部署","異動履歴","社員番号=" & [社員番号] & " AND 発令日=#" & Nz([前発令日],"1000/1/1") & "#")
可視 いいえ
名前 辞令
コントロールソース
=Format([発令日],"yyyy年m月d日") & "をもって" & [前部署] & IIf([前部署] Is Null,"","から") & [異動部署] & "の勤務を命じます。"
可視 はい
以上です。
辞令文を自由に入力、編集したい場合
辞令文格納用のテーブルを作成します。テーブル名「辞令文マスター」
フィールドの型は「長いテキスト」にします。フィールド名「辞令文」
このテーブルをレコードソースとするフォームを作成して、テキストボックスを配置してコントロールソースは「辞令文」にします。
このフォームを保存します。名前は「F_辞令文」とします。
フォームを開いて辞令文を入力します。
入力例
text
1{発令日}をもって{前部署}から{異動部署}の勤務を命じます。
改行も入力可です。{発令日} {前部署} {異動部署} というように参照する項目を{}で囲むのがポイントです。
{}でなくても 【】とか[]とかでもいいです。
このテーブルをレポートのレコードソースのクエリに追加します。連結はしません。
テキストボックス「前発令日」「前部署」は上記の説明のままで、テキストボックス「辞令」のコントロールソースを下記のように設定します。
= Replace(Replace(Replace([辞令文],"{発令日}",Format([発令日],"yyyy年m月d日")),"{前部署}",[前部署]),"{異動部署}",[異動部署])
ちなみに、上記では前部署を取得するのにDMax関数、DLOokup関数を使いましたが、サブクエリを使って同様に取得することもできます。SQLが理解できるならこれでもいいでしょう。
sql
1SELECT 2 a.*, 3 異動履歴.異動部署 AS 前部署 4FROM 5 ( 6 SELECT b.社員番号, b.異動部署, b.発令日,Max(c.発令日) AS 前発令日 7 FROM 異動履歴 AS b INNER JOIN 異動履歴 AS c ON b.社員番号 = c.社員番号 8 WHERE c.発令日 < b.発令日 9 GROUP BY b.社員番号, b.異動部署, b.発令日 10 ) AS a 11 INNER JOIN 異動履歴 As d 12 ON a.前発令日 = d.発令日 AND a.社員番号 = d.社員番号;
あるいは、
sql
1SELECT 2 b.*, 3 ( SELECT TOP 1 異動部署 FROM 移動履歴 AS b 4 WHERE a.社員番号 = b.社員番号 AND a.発令日 < b.発令日 5 ORDER BY 発令日 DESC 6 ) AS 前部署 7FROM 異動履歴 AS a;
投稿2020/11/11 03:24
編集2020/11/12 02:14総合スコア34075
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/11/11 04:44
2020/11/11 05:08
2020/11/11 05:50 編集
2020/11/11 06:08
2020/11/11 06:15
2020/11/11 07:52
2020/11/12 01:04
2020/11/12 02:59
2020/11/12 04:09
2020/11/13 01:14 編集
2020/11/13 01:25
2020/11/13 06:12 編集
0
レコードソースを基にして2個のクエリを作成。(AクエリとBクエリとします。)
このクエリを社員番号で結合したクエリをさらに1個作ります。
この結合クエリをソースとしてレポートで読み込ませる事で可能と思います。
単純に結合した場合には、このケースでは9レコードが表示される筈です。
後は、結合クエリに対して発令日で条件を絞って1レコードが出るようにします。
例えば:
A.発令日<>B.発令日
A.発令日>=2018年3月1日
B.発令日>=2020年3月1日
といった条件を付けてレコードを絞り込みます。
条件は、データの種類や運用方法で色々と出来ると思いますので、試してみて下さい。
投稿2020/11/11 03:09
編集2020/11/11 03:10総合スコア553
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
こんにちは。
ベタなやり方かもしれませんが、、、
社員番号・発令日・異動部署のテーブルをAとして
社員番号・発令日・異動前部署・異動後部署というテーブルBを作成し、テーブルBをレポートに関連付けします。
- テーブルBをdeleteします。
- テーブルAを社員番号・発令日順にSelectします。
- SelectしたテーブルAのレコードを順に取得します。(ループ処理)
- テーブルBのレコードを追加します。(AddNew)
- 社員番号・発令日・異動部署をそれぞれテーブルBの社員番号・発令日・異動後部署に設定します。
- 移動後部署を保持します。
- ループの初回または前回と社員番号が異なる場合、移動前部署には何も設定せず、そうでない場合保持している異動後部署を異動前部署に設定します。
- テーブルBのレコードを確定(UPDATE)します。
これでレポートを出力すれば良いと思います。
投稿2020/11/11 02:33
総合スコア1095
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。