- 設計
帳票設計書の書き方と項目一覧 帳票一覧テンプレートと改ページ
帳票設計書とは、システムが出力する帳票(PDF・印刷物・CSVなど)について、「何を・どこから取り・どんな書式で・どの順に・どこで改ページして出すか」を決めて書いた設計書です。 画面と違って帳票は、件数によってページ数が変わり、並び順や小計の位置まで結果に含まれます。そのため、見た目のレイアウト図だけでなく、改ページ・ソート・集計の決めごとを文章と表で書いておくことが大切です。
この記事では、帳票一覧と帳票項目定義書のテンプレートを、備品貸出システムを題材にした記入例つきで載せます。あわせて、総ページ数の計算と端数処理、数値・日付の編集書式をPythonで検算した結果も示します。
確認環境:Ubuntu 24.04 / Python 3.11(標準ライブラリのみ)。掲載したコードと出力は、この環境で実行したものです。
帳票設計書の早見表
帳票設計書は、次の5つの部品で組み立てます。
| 部品 | 書くこと | 主な項目 |
|---|---|---|
| 帳票一覧 | システムが出す帳票の全体 | 帳票ID、名称、出力形式、用紙、出力契機、部数 |
| 帳票概要 | 1帳票ごとの目的と条件 | 目的、利用者、出力条件、想定件数、保存期間 |
| レイアウト | どこに何を置くか | ヘッダー、明細、小計、合計、フッターの配置 |
| 帳票項目定義書 | 1項目ごとの中身 | 項目名、取得元、型、桁、編集書式、出力位置、0件時の扱い |
| 出力制御仕様 | 件数で変わる動き | 改ページ条件、ソート順、小計と合計、繰り返し、総ページ数 |
決め忘れやすい点を、先に一覧にしておきます。
| 決めること | 選択肢の例 |
|---|---|
| 0件のとき | 帳票を出さない/「該当データなし」と書いた1ページを出す |
| 改ページのきっかけ | 行数がいっぱいになったとき/部署などのキーが変わったとき |
| ページ番号 | 通し番号(1/7)/グループごとに1から振り直す |
| 桁あふれ | 切り捨てる/折り返す/文字を小さくする/# で埋める |
| 端数処理 | 四捨五入/切り捨て/切り上げ、どの桁で、明細ごとか合計後か |
| マイナスの表記 | -1,234/△1,234/(1,234) |
| 日付 | 西暦か和暦か、ゼロ埋めの有無、基準は出力日か対象日か |
| NULL と 0 | 空欄にする/0 と書く/ハイフンにする |
本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。
(記載例)出典:株式会社RJC「帳票設計書の書き方と項目一覧 帳票一覧テンプレートと改ページ」
帳票一覧テンプレートと記入例
帳票一覧は、システムが出力する帳票を1行ずつ並べた表です。最初にこの表を作ると、帳票の数と種類が決まり、見積もりや担当分けの土台になります。
| 帳票ID | 帳票名 | 出力形式 | 用紙・向き | 出力契機 | 部数 | 想定件数 | 出力先 |
|---|---|---|---|---|---|---|---|
| RPT-001 | 備品貸出一覧表 | A4 横 | 画面のボタン(随時) | 1 | 最大2,000行 | ダウンロード | |
| RPT-002 | 貸出票 | A4 縦 | 貸出登録の完了時 | 2(利用者控え・管理者控え) | 1件1ページ | プリンター | |
| RPT-003 | 返却期限のお知らせ | A4 縦 | 日次バッチ(毎朝7時) | 対象者ごとに1 | 最大300通 | メール添付 | |
| RPT-004 | 備品台帳 | CSV | ―(UTF-8、カンマ区切り) | 画面のボタン(随時) | ― | 最大10,000行 | ダウンロード |
| RPT-005 | 月次利用集計表 | Excel | A4 横 | 月次バッチ(毎月1日) | 1 | 部署数×備品分類 | 共有フォルダ |
表計算ソフトに貼るときは、次のタブ区切りを使ってください。
帳票ID 帳票名 出力形式 用紙・向き 出力契機 部数 想定件数 出力先
RPT-001 備品貸出一覧表 PDF A4 横 画面のボタン(随時) 1 最大2,000行 ダウンロード
RPT-002 貸出票 PDF A4 縦 貸出登録の完了時 2(利用者控え・管理者控え) 1件1ページ プリンター
RPT-003 返却期限のお知らせ PDF A4 縦 日次バッチ(毎朝7時) 対象者ごとに1 最大300通 メール添付
RPT-004 備品台帳 CSV ―(UTF-8、カンマ区切り) 画面のボタン(随時) ― 最大10,000行 ダウンロード
RPT-005 月次利用集計表 Excel A4 横 月次バッチ(毎月1日) 1 部署数×備品分類 共有フォルダ
各列の書き方です。
| 列 | 書き方 |
|---|---|
| 帳票ID | RPT-3桁連番のように固定の形にする。削除した番号は再利用しない |
| 帳票名 | 帳票の上部に印字する名前と同じにする |
| 出力形式 | PDF/Excel/CSV/プリンター直接。CSVは文字コードと区切り文字も書く |
| 用紙・向き | A4 縦、A4 横など。データファイルは「―」 |
| 出力契機 | 「誰が・何をしたとき」または「いつ動くバッチか」。随時・日次・月次も添える |
| 部数 | 同じ内容を何部出すか。控えの種類があれば名前も書く |
| 想定件数 | 最大の行数やページ数。性能とページ数の検討に使う |
| 出力先 | ダウンロード、プリンター、メール添付、フォルダなど |
「想定件数」を空欄にしないのがポイントです。 最大2,000行なら、1ページ25行で80ページになります。この数字が、生成にかかる時間やファイルの大きさを考える出発点になります。
帳票概要の書き方
1つの帳票について、最初の1ページに次の内容をまとめます。RPT-001 の例です。
| 項目 | 記入例 |
|---|---|
| 帳票ID・帳票名 | RPT-001 備品貸出一覧表 |
| 目的 | 指定した期間の貸出を部署別に一覧し、件数と数量を確かめる |
| 利用者 | 総務部の備品管理担当 |
| 出力条件 | 貸出日(開始〜終了、必須)、部署(任意、未指定は全部署)、状態(貸出中/返却済み/すべて) |
| 対象データ | 貸出テーブルのうち、貸出日が指定期間に入り、取消されていないもの |
| 出力形式・用紙 | PDF、A4 横、1ページの明細エリアは25行 |
| ファイル名 | 備品貸出一覧表_YYYYMMDD_HHMMSS.pdf(出力日時) |
| 0件時 | 「該当するデータはありません」と書いた1ページを出力する |
| 保存 | サーバーには保存しない(その場でダウンロード) |
レイアウトの5つの領域
帳票のレイアウトは、多くの場合、次の5つの領域に分けて考えます。領域ごとに「いつ出るか」が決まります。
| 領域 | 出る場所 | 置くものの例 |
|---|---|---|
| ページヘッダー | 各ページの先頭 | 帳票名、出力条件、出力日時、列見出し |
| グループヘッダー | グループ(部署など)の先頭 | 部署コード、部署名 |
| 明細 | データ1件につき1行 | 貸出日、備品名、数量、利用者 |
| グループフッター | グループの最後 | 部署の小計 |
| ページフッター | 各ページの最後 | ページ番号、帳票ID |
これに、帳票全体の先頭に1回だけ出る表紙と、最後に1回だけ出る総合計を加えることがあります。RPT-001 の配置を文字で表すと、次のようになります。
備品貸出一覧表 出力日時:2026/10/05 09:05
対象期間:2026/09/01〜2026/09/30 部署:営業部(D020)
--------------------------------------------------------------------
No. 貸出日 備品コード 備品名 数量 利用者 状態
--------------------------------------------------------------------
1 2026/09/01 EQ-00042 プロジェクター 1 山田太郎 返却済み
2 2026/09/03 EQ-00108 延長コード 5m 3 鈴木花子 貸出中
…
営業部 小計 24件 数量 31
--------------------------------------------------------------------
RPT-001 2/7
レイアウト図には、用紙の余白、1ページに入る明細の行数、各項目の開始位置と幅を書き込みます。細かい数値は次の項目定義書に持たせ、図と番号で対応させると、図がすっきりします。
帳票項目定義書の項目と記入例
帳票項目定義書は、帳票に出す1項目につき1行で、中身と書式を決める表です。
| No. | 領域 | 項目名 | 取得元 | 型 | 桁 | 編集書式 | 出力位置 | 0件・NULL時 |
|---|---|---|---|---|---|---|---|---|
| 1 | ページヘッダー | 帳票名 | 固定文字「備品貸出一覧表」 | 文字 | 10 | ― | 左・1行目 | 0件でも出力 |
| 2 | ページヘッダー | 出力日時 | システム日時 | 日時 | 16 | YYYY/MM/DD HH:MM | 右・1行目 | 0件でも出力 |
| 3 | ページヘッダー | 対象期間 | 画面の入力値(開始日・終了日) | 日付 | 21 | YYYY/MM/DD〜YYYY/MM/DD | 左・2行目 | 0件でも出力 |
| 4 | グループヘッダー | 部署 | 部署.部署名、部署.部署コード | 文字 | 20 | 部署名(部署コード) | 中央・2行目 | 0件の部署は出力しない |
| 5 | 明細 | No. | 部署内の連番(1から) | 数値 | 3 | 右寄せ、ゼロ埋めなし | 1列目 | ― |
| 6 | 明細 | 貸出日 | 貸出.貸出日 | 日付 | 10 | YYYY/MM/DD | 2列目 | ― |
| 7 | 明細 | 備品コード | 備品.備品コード | 文字 | 8 | EQ-+5桁ゼロ埋め | 3列目 | ― |
| 8 | 明細 | 備品名 | 備品.備品名 | 文字 | 全角10 | 左寄せ、超えた分は切り捨て | 4列目 | ― |
| 9 | 明細 | 数量 | 貸出.数量 | 数値 | 4 | 右寄せ、桁区切りあり | 5列目 | NULLは空欄 |
| 10 | 明細 | 利用者 | 社員.氏名 | 文字 | 全角8 | 左寄せ | 6列目 | 退職者は「(退職)」を付ける |
| 11 | 明細 | 状態 | 貸出.返却日 | 文字 | 全角4 | 返却日がNULLなら「貸出中」、それ以外は「返却済み」 | 7列目 | ― |
| 12 | グループフッター | 小計 件数 | 部署内の明細の件数 | 数値 | 5 | 右寄せ、桁区切り、末尾に「件」 | 右 | ― |
| 13 | グループフッター | 小計 数量 | 部署内の数量の合計 | 数値 | 7 | 右寄せ、桁区切り | 右 | NULLは0として合計 |
| 14 | 最終ページ | 総合計 | 全明細の件数・数量の合計 | 数値 | 7 | 右寄せ、桁区切り | 右 | 0件時は出力しない |
| 15 | ページフッター | ページ番号 | 現在ページ/総ページ数 | 数値 | 7 | N/M | 右 | 0件時は 1/1 |
| 16 | 明細の代わり | 0件メッセージ | 固定文字「該当するデータはありません」 | 文字 | ― | 中央寄せ | 明細エリアの1行目 | 0件のときだけ出力 |
貼り付け用のタブ区切り(見出しと先頭3行)です。
No. 領域 項目名 取得元 型 桁 編集書式 出力位置 0件・NULL時
1 ページヘッダー 帳票名 固定文字「備品貸出一覧表」 文字 10 ― 左・1行目 0件でも出力
2 ページヘッダー 出力日時 システム日時 日時 16 YYYY/MM/DD HH:MM 右・1行目 0件でも出力
3 ページヘッダー 対象期間 画面の入力値(開始日・終了日) 日付 21 YYYY/MM/DD〜YYYY/MM/DD 左・2行目 0件でも出力
各列の書き方のコツです。
| 列 | 書き方 |
|---|---|
| 取得元 | 「テーブル名.列名」で書く。計算する項目は式を、固定の文字は「固定文字」と書く |
| 型 | 文字/数値/日付/日時。編集する前の型を書く |
| 桁 | 編集した後に印字する最大の桁数。桁区切りのカンマやマイナス記号も数える |
| 編集書式 | ゼロ埋め、桁区切り、寄せ、日付の形、条件による出し分け |
| 出力位置 | 列の番号、または左端からの位置と幅 |
| 0件・NULL時 | データが無いとき、値がNULLのときにどう出すか |
「取得元」と「0件・NULL時」の2列が、帳票の項目定義ならではの列です。 この2つが埋まっていれば、SQLと出力処理を迷わず書けます。
改ページ・ソート・小計を仕様として書く型
レイアウト図だけでは、件数が増えたときの動きが伝わりません。次の表のように、「項目・仕様・補足」の3列で文章にして書きます。
| 項目 | 仕様(RPT-001 の例) | 補足 |
|---|---|---|
| ソート順 | 第1キー:部署コードの昇順、第2キー:貸出日の昇順、第3キー:貸出IDの昇順 | 最後のキーを一意な値にして、何度出しても同じ並びにする |
| 改ページ条件1 | 明細エリアが25行に達したら改ページする | 行数は明細・小計・総合計を合わせて数える |
| 改ページ条件2 | 部署コードが変わったら改ページする | ソートの第1キーと同じ項目にする |
| ページヘッダー | すべてのページに繰り返し出力する | 列見出しも含む |
| グループヘッダー | 部署が次のページに続く場合も、部署名を繰り返し出力する | 続きのページだとわかるようにする |
| 小計 | 部署の最後の明細の次の行に、件数と数量の小計を1行出力する | 入らないときは次のページの先頭に出力する |
| 総合計 | 最後の部署の小計の次の行に1行出力する | 入らないときは次のページに出力する |
| ページ番号 | 帳票全体の通し番号を「現在ページ/総ページ数」で出力する | 部署ごとに振り直さない |
| ページフッター | すべてのページに繰り返し出力する | 帳票IDとページ番号 |
| 0件の部署 | 出力しない | ページも小計も作らない |
| 全体が0件 | ヘッダーと0件メッセージを書いた1ページを出力する | ページ番号は 1/1 |
改ページのキーは、必ずソートの上位キーにします。 部署で改ページするのに貸出日で並べると、同じ部署が何度も現れて、そのたびにページが変わってしまいます。
ソート順を書くときは、次の点も決めておくと、開発とテストで結果がそろいます。
| 決めること | 例 |
|---|---|
| 昇順か降順か | キーごとに書く |
| NULLの位置 | 先頭に並べるか、末尾に並べるか |
| 文字の並び | コード順か、読みがな順か(読みがなの列が必要) |
| 同じ値のときの順 | 最後に一意なキー(IDなど)を足す |
総ページ数の計算と端数処理をPythonで検算する
改ページ条件が行数だけのとき
1ページに25行入る帳票で、明細がN行あるときの総ページ数は、N÷25 の切り上げです。0件でも1ページ出す仕様なら、1との大きいほうを取ります。
import math
def total_pages(rows, per_page):
"""改ページ条件なし。0件でも「該当データなし」の1ページを出す仕様。"""
return max(1, math.ceil(rows / per_page))
for rows in (0, 1, 24, 25, 26, 50, 51, 1000):
print(f"明細{rows:>5}行 ÷ 25行/ページ → {total_pages(rows, 25):>3}ページ")
print(-(-51 // 25), (51 + 25 - 1) // 25, math.ceil(51 / 25), round(51 / 25), 51 // 25)
実行結果
明細 0行 ÷ 25行/ページ → 1ページ
明細 1行 ÷ 25行/ページ → 1ページ
明細 24行 ÷ 25行/ページ → 1ページ
明細 25行 ÷ 25行/ページ → 1ページ
明細 26行 ÷ 25行/ページ → 2ページ
明細 50行 ÷ 25行/ページ → 2ページ
明細 51行 ÷ 25行/ページ → 3ページ
明細 1000行 ÷ 25行/ページ → 40ページ
3 3 3 2 2
最後の行は、51行を25行ずつに分けるときの5通りの書き方を比べたものです。左から3つ(-(-51 // 25)、(51 + 25 - 1) // 25、math.ceil(51 / 25))は切り上げで3ページになります。round と //(切り捨て)は2ページになり、最後の1行が入るページが足りなくなります。 ページ数の端数は必ず切り上げます。確かめる値は、24・25・26行のように、ちょうど1ページになる行数とその前後です。
部署ごとの改ページと小計があるとき
改ページ条件にキーの切り替わりが加わると、計算は部署ごとになります。
部署ごとのページ数 = (明細の行数 + 小計1行)÷ 1ページの行数 の切り上げ
総ページ数 = 部署ごとのページ数の合計(総合計の1行が最後のページに入らなければ +1)
この式が正しいかを、1行ずつ並べて数える方法と突き合わせます。総務部12件、営業部24件、開発部25件、企画部61件、広報部0件の例です。
import math
PER_PAGE = 25 # 1ページに入る明細エリアの行数
groups = [("総務部", 12), ("営業部", 24), ("開発部", 25), ("企画部", 61), ("広報部", 0)]
def by_formula(groups, per_page):
"""部署が変わったら改ページ。各部署の最後に小計1行、最終ページに総合計1行。"""
pages = 0
last_used = 0
for _, rows in groups:
if rows == 0:
continue # 0件の部署は出力しない仕様
lines = rows + 1 # 明細 + 小計1行
pages += math.ceil(lines / per_page)
last_used = lines % per_page or per_page
if pages == 0:
return 1 # 全体が0件なら「該当データなし」の1ページ
if last_used + 1 > per_page: # 総合計の1行が入らなければ次のページへ
pages += 1
return pages
def by_layout(groups, per_page):
"""実際に1行ずつ並べてページを作る(検算用)。"""
pages, page = [], []
def put(line):
nonlocal page
if len(page) == per_page:
pages.append(page); page = []
page.append(line)
for name, rows in groups:
if rows == 0:
continue
if page: # 部署が変わったら改ページ
pages.append(page); page = []
for i in range(1, rows + 1):
put(f"{name} 明細{i}")
put(f"{name} 小計")
if not pages and not page:
return [["該当データなし"]]
put("総合計")
pages.append(page)
return pages
pages = by_layout(groups, PER_PAGE)
for no, p in enumerate(pages, 1):
print(f"{no}/{len(pages)}ページ {len(p):>2}行 先頭: {p[0]:<10} 末尾: {p[-1]}")
print("式で求めた総ページ数:", by_formula(groups, PER_PAGE))
print("並べて数えた総ページ数:", len(pages))
for case in ([("総務部", 24)], [("総務部", 23)], [("総務部", 0)], [("総務部", 25), ("営業部", 49)]):
a, b = by_formula(case, PER_PAGE), len(by_layout(case, PER_PAGE))
print(case, "→ 式", a, "/ 並べて", b, "一致" if a == b else "不一致")
実行結果
1/7ページ 13行 先頭: 総務部 明細1 末尾: 総務部 小計
2/7ページ 25行 先頭: 営業部 明細1 末尾: 営業部 小計
3/7ページ 25行 先頭: 開発部 明細1 末尾: 開発部 明細25
4/7ページ 1行 先頭: 開発部 小計 末尾: 開発部 小計
5/7ページ 25行 先頭: 企画部 明細1 末尾: 企画部 明細25
6/7ページ 25行 先頭: 企画部 明細26 末尾: 企画部 明細50
7/7ページ 13行 先頭: 企画部 明細51 末尾: 総合計
式で求めた総ページ数: 7
並べて数えた総ページ数: 7
[('総務部', 24)] → 式 2 / 並べて 2 一致
[('総務部', 23)] → 式 1 / 並べて 1 一致
[('総務部', 0)] → 式 1 / 並べて 1 一致
[('総務部', 25), ('営業部', 49)] → 式 5 / 並べて 5 一致
この結果から、仕様に書いておくべき3つの点が読み取れます。
| 見えたこと | 仕様に書くこと |
|---|---|
| 開発部は明細25行でページが埋まり、小計だけが4ページ目に出た | 小計だけのページを認めるか。認めないなら「最後の明細1行を小計と一緒に次のページへ送る」と書く |
| 総務部24件だけのときは、小計で25行が埋まり、総合計だけの2ページ目ができた | 総合計だけのページを認めるか |
| 122行÷25行の切り上げは5ページだが、帳票は7ページになった | 総ページ数は、全体の行数ではなく部署ごとに計算する |
小計・総合計の行数と、キーによる改ページを含めて計算するのが、総ページ数のポイントです。想定件数から最大ページ数を見積もるときも、同じ式を使います。
数値・日付の編集書式の早見表
編集書式は、同じ値でも書き方がいくつもあります。項目定義書には、下の表の「書式の名前」と「出力例」を組にして書くと伝わりやすくなります。出力例は、表の後のコードで確かめた値です。
数値・文字
| 書式の名前 | 元の値 | 出力例 | 主な用途 |
|---|---|---|---|
| ゼロ埋め5桁 | 42 | 00042 | コード、伝票番号 |
| 右寄せ5桁(空白埋め) | 42 | 42(前に空白3つ) | 数量、件数 |
| 桁区切り | 1234567 | 1,234,567 | 数量、合計 |
| マイナス(符号) | -1234567 | -1,234,567 | 差分 |
| マイナス(三角) | -1234567 | △1,234,567 | 差分 |
| マイナス(かっこ) | -1234567 | (1,234,567) | 差分 |
| 小数2桁+桁区切り | 1234.5 | 1,234.50 | 平均、単位あたりの値 |
| パーセント小数1桁 | 0.125 | 12.5% | 割合 |
| ゼロの表示 | 0 | 0(空欄やハイフンにする場合は明記) | 数量 |
| 左寄せ8桁 | A-12 | A-12(後ろに空白4つ) | コード、名称 |
| 右寄せ8桁 | A-12 | A-12(前に空白4つ) | 右端をそろえる項目 |
| 全角空白で6文字に埋める | 備品 | 備品+全角空白4つ | 固定幅の名称 |
| 先頭10文字で切る | ノートPC 14型 メモリ16GB | ノートPC 14型(後ろに空白1つ) | 桁あふれの対策 |
日付・時刻
| 書式の名前 | 出力例(2026年10月5日 9時5分) |
|---|---|
| 西暦スラッシュ区切り(ゼロ埋め) | 2026/10/05 |
| 西暦ハイフン区切り | 2026-10-05 |
| 西暦の年月日(ゼロ埋めなし) | 2026年10月5日 |
| 西暦下2桁の6桁 | 261005 |
| 曜日 | 月 |
| 時刻(24時間、ゼロ埋め) | 09:05 |
| 和暦(漢字) | 令和8年10月5日 |
| 和暦(記号と2桁) | R08.10.05 |
和暦は、元号が切り替わる日と「元年」の書き方を決めておきます。2019年5月1日は「令和元年5月1日」、その前日は「平成31年4月30日」です。
端数処理
| 元の値 | 四捨五入 | 切り捨て | 切り上げ | 偶数丸め |
|---|---|---|---|---|
| 2.5(整数に) | 3 | 2 | 3 | 2 |
| 3.5(整数に) | 4 | 3 | 4 | 4 |
| 0.125(小数2桁に) | 0.13 | 0.12 | 0.13 | 0.12 |
| -2.5(整数に) | -3 | -2 | -3 | -2 |
Pythonの組み込みの round は偶数丸めで、round(2.5) は2になります。 帳票で四捨五入と決めたら、decimal モジュールの ROUND_HALF_UP のように、丸め方を明示できる方法で実装します。マイナスの値は、切り捨てが「0に近づける」のか「小さいほうへ」なのかも仕様に書きます(上の表は0に近づける切り捨てと、0から遠ざける切り上げです)。
割合を丸めて並べると、合計が100%にならないことがあります。3等分した 33.3% を3つ足すと 99.9% です。「合計欄は明細を足さず100.0%と出す」「差は最大の項目で調整する」など、扱いを決めて書きます。
検算に使ったコード
from datetime import date, datetime
from decimal import Decimal, ROUND_HALF_UP, ROUND_DOWN, ROUND_UP, ROUND_HALF_EVEN
n = 1234567
print(f"{42:05d}", f"{42:>5d}|", f"{n:,}", f"{-n:,}", f"△{abs(-n):,}", f"({abs(-n):,})")
print(f"{1234.5:,.2f}", f"{0.125:.1%}", f"{0:,}", f"{'A-12':<8}|", f"{'A-12':>8}|")
print(str(7).zfill(3), "備品".ljust(6, " ") + "|", "ノートPC 14型 メモリ16GB"[:10])
d = date(2026, 10, 5)
print(d.strftime("%Y/%m/%d"), d.strftime("%Y-%m-%d"), f"{d.year}年{d.month}月{d.day}日", d.strftime("%y%m%d"))
print("月火水木金土日"[d.weekday()], datetime(2026, 10, 5, 9, 5).strftime("%H:%M"))
ERAS = [(date(2019, 5, 1), "令和", "R"), (date(1989, 1, 8), "平成", "H"), (date(1926, 12, 25), "昭和", "S")]
def wareki(d, short=False):
for start, name, initial in ERAS:
if d >= start:
y = d.year - start.year + 1
if short:
return f"{initial}{y:02d}.{d.month:02d}.{d.day:02d}"
return f"{name}{'元' if y == 1 else y}年{d.month}月{d.day}日"
raise ValueError("対象外の日付")
for x in (date(2026, 10, 5), date(2019, 5, 1), date(2019, 4, 30), date(1989, 1, 7)):
print(x, wareki(x), wareki(x, True))
for v in ("2.5", "3.5", "0.125", "-2.5"):
x = Decimal(v)
q = Decimal("1") if v != "0.125" else Decimal("0.01")
print(v, "四捨五入", x.quantize(q, ROUND_HALF_UP), "切り捨て", x.quantize(q, ROUND_DOWN),
"切り上げ", x.quantize(q, ROUND_UP), "偶数丸め", x.quantize(q, ROUND_HALF_EVEN))
print(round(2.5), round(3.5), round(0.125, 2))
parts = [Decimal("33.3"), Decimal("33.3"), Decimal("33.3")]
print(sum(parts), [f"{p}%" for p in parts])
実行結果
00042 42| 1,234,567 -1,234,567 △1,234,567 (1,234,567)
1,234.50 12.5% 0 A-12 | A-12|
007 備品 | ノートPC 14型
2026/10/05 2026-10-05 2026年10月5日 261005
月 09:05
2026-10-05 令和8年10月5日 R08.10.05
2019-05-01 令和元年5月1日 R01.05.01
2019-04-30 平成31年4月30日 H31.04.30
1989-01-07 昭和64年1月7日 S64.01.07
2.5 四捨五入 3 切り捨て 2 切り上げ 3 偶数丸め 2
3.5 四捨五入 4 切り捨て 3 切り上げ 4 偶数丸め 4
0.125 四捨五入 0.13 切り捨て 0.12 切り上げ 0.13 偶数丸め 0.12
-2.5 四捨五入 -3 切り捨て -2 切り上げ -3 偶数丸め -2
2 4 0.12
99.9 ['33.3%', '33.3%', '33.3%']
右寄せや左寄せの結果は、空白がわかるように末尾に縦棒を付けて出力しています。
帳票設計書のレビューチェックリスト
| 観点 | 確かめること |
|---|---|
| 帳票一覧 | すべての帳票に、出力形式・用紙・出力契機・部数・想定件数が書かれているか |
| 取得元 | すべての項目に、テーブル名と列名、または計算式が書かれているか |
| 桁 | 最大の値を入れたとき、桁区切りや符号を含めて枠に収まるか |
| 桁あふれ | 収まらないときの扱い(切り捨て・折り返し)が書かれているか |
| 0件 | 全体が0件のとき、グループが0件のときの出力が決まっているか |
| NULL | NULLのときの表示(空欄・0・ハイフン)が項目ごとに決まっているか |
| ソート | 最後のキーが一意で、何度出しても同じ並びになるか |
| 改ページ | 改ページのキーが、ソートの上位キーと一致しているか |
| 小計・合計 | 出す位置、ページに入らないときの扱いが書かれているか |
| ページ数 | ちょうど1ページになる行数と、その前後でページ数を確かめたか |
| 端数処理 | 丸め方、丸める桁、丸めるタイミング(明細ごとか合計後か)が書かれているか |
| 日付 | 西暦か和暦か、基準が出力日か対象日かが書かれているか |
| 最大件数 | 想定の最大件数で、生成時間とファイルの大きさを見積もったか |
よくある質問
Q. 帳票設計書は基本設計と詳細設計のどちらで書きますか? A. 帳票一覧・帳票概要・レイアウトは基本設計で、項目定義書と出力制御仕様(改ページ・ソート・集計)の細部は詳細設計で書くことが多いです。分け方は開発の進め方によって変わるので、「利用者と合意する内容」を先に、「実装に必要な細部」を後に書くと考えると決めやすくなります。
Q. CSVやExcelの出力にも帳票設計書は必要ですか? A. 必要です。用紙や改ページは無くなりますが、項目の順番、取得元、型、編集書式、ソート順、0件時の扱いは同じように決めます。CSVでは、文字コード、区切り文字、見出し行の有無、改行コード、値にカンマや改行が入るときの囲み方も書きます。
Q. 1ページの行数はどう決めますか? A. 用紙の高さから上下の余白、ページヘッダー、ページフッターの高さを引き、残りを1行の高さで割って、端数を切り捨てます。ページ数は切り上げ、1ページに入る行数は切り捨て、と向きが逆になる点に気をつけてください。
Q. 総ページ数(N/M の M)は、どの時点でわかりますか? A. 全体を最後まで並べ終えた時点で確定します。そのため、先に全ページを組んでから総ページ数を書き込むか、この記事の式で先に計算します。使う帳票ツールが総ページ数の出力に対応しているかは、設計の早い段階で確かめておくと安心です。
まとめ
- 帳票設計書は、帳票一覧・帳票概要・レイアウト・項目定義書・出力制御仕様の5つの部品で書く
- 帳票一覧には、帳票ID・名称・出力形式・用紙・出力契機・部数・想定件数を1行ずつ書く
- 項目定義書は、取得元・型・桁・編集書式・出力位置・0件とNULLの扱いを1項目1行で決める
- 改ページ・ソート・小計と合計・繰り返しは、図だけに頼らず「項目・仕様・補足」の表で文章にする
- 総ページ数は切り上げで求める。キーによる改ページがあるときは、小計の行を足して部署ごとに計算する
- ちょうど1ページになる行数とその前後、0件で、ページ数と小計の位置を確かめる
- 編集書式は書式の名前と出力例を組にして書き、端数処理は丸め方・桁・タイミングまで決める
本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。
(記載例)出典:株式会社RJC「帳票設計書の書き方と項目一覧 帳票一覧テンプレートと改ページ」
株式会社RJC ― SI事業・SES事業・AI駆動開発。RJCは一緒に成長を楽しめる会社です。
WE ARE HIRING
RJCで一緒に開発しながら、
成長を楽しみませんか?
RJCは、Web・モバイル・AIを活用した開発プロジェクトで、テックリードやPM・PMOも活躍するシステム開発会社です。会社を知る、待遇を確かめる、話を聞いてみる。気になるところ見てみてください!
- 127日年間休日
- 12時間平均残業時間
- 毎日ガチャ遊びココロも大切にする福利厚生。アマギフなどの賞品ラインナップ!
ほかにも、チケットレストラン、書籍読み放題、2年ごとの慰労報奨(休暇 or 金一封)、11期連続の黒字決算。