はじめに
これは設計時の見落とし Advent Calendar 2018の24日目の記事となります。
業務アプリケーションの設計をするときに、見落としがちなところに焦点をあてて紹介します。
下流工程からの手戻りを少なくして 双方の負担を減らしましょう。
帳票系とDB系とファイル系について書いてみます。ただ元記事が10年前なので今となっては古いところがあるかも知れません。
帳票系の考慮点
- 出力位置(左寄せ、右寄せ、中央)の統一
- タイトルや項目のフォントサイズの統一
社外用はMS明朝やメイリオ - 印字領域が足りない場合どうするかの確認
- 区切り横線/縦線 太さや出力有無など
小計 グループ計・総計 - オーバーフロー時の出力方法
「*」マークにするとか - 窓空け封筒、専用帳票の確認
位置調整などが必要なので早めに確認する - 日付の出力形式の確認
西暦でいいのか、和暦にするのか
月・日は0埋めするのか、空白埋めとするのか - グループ毎にページ番号を振りなおすかの確認
- マスタ名など正式名称か略名を出力するかの確認
- 正副の出力順番の確認
正正副副 正副正副 - 合計欄の出力領域の確保
合計欄が途中で改ページされて見にくくならないように出力領域を確保しておく - 出力時間の印字について
開始時間で統一かページ毎に出力時間を印字するか - 小数点の出力形式や位置を揃えの確認
0の付与 .5 → 0.5 や 0.2 → 0.20 とするかなど
5 5
0.2 → 0.2 .(小数点)の位置に揃える
0.35 0.35
DB系の考慮点
Oracle や SQLServer や PostgreSQL による違い。
NULL と 空文字の扱い
- Oracle は、NULL と空文字はNULL扱い(同一視)。
- SQLServerとPostgreSQLは、NULLと空文字は別物扱い。
NULLデータ有りの並び替え出力順序
- Oracle:(Order by句でNULLS FIRSTとNULLS LASTで指定が可能)
デフォルトではNULLS LASTなので昇順ではNULLは最後に、降順では最初に表示される。 - SQLServer: NULL値は、昇順に並べ替えるとNULL、空文字、一般文字の順に並びます。降順だとその逆です。
- PostgreSQL:(Order by句でNULLS FIRSTとNULLS LASTで指定が可能)
デフォルトではNULLS FIRSTなのでSQLServerと同じ
Oracleを使用していてもプログラム内でDataTable型やDataView型を使用した並び替えを行うとSQLServerと同じ扱いになります。
排他制御の考慮点
種類 | 内容 |
---|---|
悲観的ロック | 如何なる状況下においても確実に行われるロック制御 |
楽観的ロック | 確実性に欠けるが事実上は問題が出ないであろうというレベルのロック制御 |
ロックしない | 他のユーザーによる編集結果を無視し、後書き優先として扱う |
DBに排他項目(排他日時、排他端末)を用意し、データ読込み時に保持しDB登録する場合に最新の排他項目を参照し比較して同一ならDB更新、不一致なら排他エラーとする。
ロック専用のテーブル(各キーを登録)を作成して、ロックテーブルにキーがあるなら排他エラーとする。
ファイル出力系
ファイル出力時の注意点
自動的にファイルを作成する機能があった場合、そのファイル名に対する心遣いが必要。
- 保存するフォルダ先の考慮
- ファイル名の命名規則
- 上書きしてしまう危険性を考慮する必要がある。ファイル名に作成日を挿入するなどする。
CSVの注意点
仕様書に「CSV出力する。」とだけ書かれても、決めてもらわないと困ることがあります。
- 見出し名はどうするのか
- 項目順はどうするのか
- タイトルを入れるのか
- 抽出条件を入れるのか
- 二重引用符で囲むのか(文字列型のみか、数値型もするのか)
- CSVのファイル名の命名規則
- EXCELで開いた場合に、コードの0頭が消えてしまう。
0 を消さない為には、「="xxxxx"」とする、アポストロフィ「'」を頭にセット - EXCELでの最大行数を超える場合はどうするのか
最大行数は、Excel97~2003は65536行、 Excel2007以降は1048576行
Excelによる表示形式の適用
Microsoft Excel は、次の条件に基づいて、セルに組み込みの表示形式を自動的に適用します。
- 数値にスラッシュ記号 (/) またはハイフン (-) が含まれている場合は、日付形式に変換されることがあります。
- 数値にコロン (:) が含まれているか、または数値の後にスペースと A または P の文字 が続いている場合は、 時刻形式に変換されることがあります。
- 数値に文字の E (大文字または小文字、たとえば 10e5) が含まれているか、 または数値に列の幅とフォントに基づいて表示可能な文字数を超える文字が含まれている場合は、その数値が指数表記の形式に変換されることがあります。
- 数値の先頭に 0 が含まれている場合、その 0 は削除されます。
- 数値を引用符で囲んでいても文字列として扱ってはくれません。
- 入力した数字が12桁を超えると指数表示される。
※12桁以下でも列の幅が狭いと指数表示される。 - 15桁しか有効表示されない。
12345678901234567 → 12345678901234500 と16桁目以降は丸められる。 - 数値に文字の"E"が含まれている場合、指数表示される値として底を10としたときの指数部、
約-307から約+307まで。
例 1E307 → 1.00E+307
※1E308以降は、指数部がオーバーフローしているため数値として認識されず文字列として扱われる。 - 数値に引用符を付けてカンマ区切りにすると通貨型で表示されるが、小数3桁目は四捨五入され2桁までしか表示されない
"1,234.567" → 1,234.57