印刷画面で氏名の隣の項目が重なって表示される時の対処法

こんなお問い合わせが届きました
「印刷画面で、患者氏名の横に表示されている性別の文字が、隣の生年月日欄と重なって読めなくなってしまう」というご相談をいただきました。
具体的には、印刷画面のヘッダー部分で
- 患者氏名+性別
- 生年月日+年齢+血液型
が横並びに表示されるレイアウトになっているのですが、その性別の文字が右にずれてしまい、隣接する生年月日欄の文字と二重写しのように重なって表示されてしまう、という症状です。
なぜこの問題が起きるのか
paperChartの印刷レイアウト設定(txtcnf.txt)では、氏名と性別は同じ行の中で「氏名の直後に性別を続けて表示する」形になっています。座標としては、例えば氏名欄の開始位置から次の生年月日欄の開始位置まで、わずかな余白しか確保されていません。
このレイアウトは、氏名の文字数が一定範囲に収まっていることが前提になっています。ところが、電子カルテ側から患者氏名を取り込む連携処理において、氏名データの末尾に見えないスペースが付与された状態で取り込まれるケースがあることが分かりました。このスペース分だけ氏名の表示幅が想定より長くなり、続く性別の表示位置が右へ押し出され、隣の生年月日欄と重なってしまう、というのが今回の原因でした。
解決策
対応の基本方針は、「氏名データの末尾スペースを、印刷用の計算式の段階で取り除く」というものです。paperChartの設定ファイル文法には、区切り文字を指定して文字列の一部を取り出すsubstr関数が用意されているので、これを利用します。
dmgcnf.txtの計算式定義部分(calc節)に、次のような計算式を追加します。
姓名文字列トリム = substr(' ', 0, 姓名文字列) | substr(' ', 0, 姓名文字列) | 姓名文字列 ;
考え方はこうです。
- まず全角スペースを区切り文字として、氏名の先頭から最初のスペースまでを取り出す
- それが取得できなければ、次に半角スペースを区切り文字として同様に試す
- どちらのスペースも含まれていない氏名(=もともと問題のないデータ)であれば、元の文字列をそのまま使う
この3段階を、論理和(|)という「左側の値が有効ならそれを、無効なら右側の値を返す」演算子でつないでいます。
そして、印刷レイアウト設定(txtcnf.txt)側で、氏名を表示している箇所の参照先を、元の$(姓名文字列)から、新しく定義した$(姓名文字列トリム)に変更すれば完了です。
補足・注意点
対応の途中で、実は一段階シンプルな式(substr(' ', 0, 姓名文字列)のみ)を先に試したところ、別の不具合が発生しました。substr関数は、指定した区切り文字が対象の文字列に含まれていない場合、値が「欠損値」として扱われる仕様になっています。つまり、末尾スペースが付いていない(本来問題のない)通常の氏名データでは区切り文字が見つからず、結果として氏名が丸ごと空欄で印刷されてしまったのです。
この点は見落としやすいポイントでした。区切り文字が必ず存在するとは限らない文字列に対してsubstrを使う場合は、今回のように論理和で元データへのフォールバックを用意しておくと安全です。
また、末尾に付与されるスペースが全角か半角かはシステムや連携経路によって異なる可能性があるため、両方のパターンに対応できるよう式を組んでおくと、他院への横展開時にも安心です。
まとめ
| 項目 | 内容 |
|---|---|
| 症状 | 印刷画面で氏名横の性別表示が、隣接する生年月日欄と重なって表示される |
| 原因 | 電子カルテ連携時、氏名データの末尾にスペースが付与されるため、後続の表示位置がずれる |
| 対応ファイル | dmgcnf.txt(計算式追加)、txtcnf.txt(参照先変更) |
| 対応方法 | substr関数と論理和を組み合わせ、末尾スペースを除去した計算式を新規定義し、印刷レイアウト側から参照するよう変更 |
| 注意点 | substrは区切り文字が見つからないと欠損値になる仕様があるため、論理和によるフォールバックが必須 |
本記事はpaperChart(自動麻酔記録ソフトウェア)の設定・運用に関するTips情報です。
