unicodeになると

まずはクイズをひとつ。
「CHAR(40)で定義されている項目に『ひらがな』は何文字はいるでしょう?」
ここでは『ひらがな』に代表させたが、要は『全角文字』が何文字入るか?という問題だ。
我々(日本人)の「常識」では、CHAR(40)は40バイトに相当し、全角文字ひとつは2バイト必要だから、「『ひらがな』は20文字入る。」というものだ。
実際に、やってみた*1

(R/3 Enterpriseの画面)
MMの購買発注伝票を作成する時に、品目マスタを参照せず、品目テキスト欄に発注品を直接入力することができる。
non-unicode(日本語の場合はS-JIS)環境で試してみると、確かに20文字しか入らない。それ以上入れようとしても、はねられる。
この項目属性を[F1]キーで参照してみると


当該項目TXZ01はCHAR(40)で定義されていることがわかる。
同じトランザクション(ME21N)をunicode環境で試してみると、実は40文字入るのだ。

(ERP2005の画面。Enterpriseとほとんど違いはないが、一部変更点が見られる。間違い探しのつもりでチェックすると面白いかも。)
明細で使われている表(ALV)は、列幅をマウス操作でExcelのように変更できるので、入力文字列を全部表示させることが可能。しかし固定幅の場合は、ほとんど半角40文字分だ。この場合、左右にスクロールするので技術上は問題ないと言えるが、実用上、少々使いにくい。

そもそもCHAR(40)とは、どういう意味なのだろう。
もちろん"40 CHARACTERS" = "40 letters"、すなわち「40文字」を意味し、それがアルファベットであろうが、カタカナであろうが、はたまた全角の漢字やひらがなであっても、本来は40文字であってしかるべきなのだ。ところが全角文字を2バイトで表現した結果、CHAR(2)=Byte(2)=半角2文字=全角1文字、という暗黙の了解が常識となり、データ設計、画面設計、帳票設計、あらゆる場所でこの常識が幅を利かせるようになった....
まて.....まてよ。問題はデータ設計でも、画面設計でもなく、帳票設計なのだ。CHAR(40)を等幅半角40文字分、全角20文字分でレイアウトしていなかったか?

はみ出る!!

特に、日本の帳票は縦の罫線も駆使して、綺麗に仕上げるカルチャーがある。その枠をはみ出して隣の項目ラベルや出力項目に印字が被るなんて!
もしかしたら、伝票の紙を印刷文字が大きくはみ出してしまうかもしれない。

これまでどおり全角20文字に運用で制限できないか?という質問はもっともだ。しかしそのチェックルーチンを組み込むことは難しい。チェックルーチンがなければ、運用ルールを設けても、それが守られる保証はない。
事はSAPアプリケーションに限定される問題でないことも、やっかいだ。B2Bの相手方から来る注文書のテキスト欄CHAR(40)に、全角20文字を超える文字列が入力されていることも大いにあり得る。仮に21文字目以降を打ち切って自社へ入力し、相手方への請書や出荷伝票に全角20文字しか出力されなかったら、不都合が発生しないだろうか。

今のところ、自分の頭では「帳票設計を見直してください」しか解法が見当たらないが、実際にはどう対処したらいいのだろう。皆様の英知を求む。

*1:ここは「トリビアの泉」風に読むと雰囲気が出るかも