ORACLEでTO_CHARを使用し、カンマ区切りデータを出力する

投稿日:

帳票出力を行うPGで困った。

数値形式のデータのため、カンマ区切りで表示したいんだけど、テンプレートの制約のせいで上手く行かなくて時の解決方法。

帳票のテンプレートとなるファイルのセルは文字列形式

それだけなら、書式を数値に変更すれば解決するじゃない?って思ったんだけど、そうは問屋が卸さなかったw

帳票テンプレートのせいで、書式設定だけじゃ対応できない

表示したいところは、こんな感じのセル。
セルは結合されていなくて、罫線でのみ枠を作ってある。

更に、値は直接セルに入力するのではなく、別のデータ用シートにまとめて出力し、表示用シートから参照するという形。
で、データ用シートのセル書式も文字列。

試しに、データ用シートのセル書式を数値に変更してみる。
すると、残念な結果に・・・

表示が「##」となってしまって、入力された数値が見えなくなる。

ちなみに、セルの列幅を広げてやれば表示は出来る。

列幅の調整では対応できない

画像のとおり、列幅を広げれば表示出来るんだけど、じゃあ、どこまで?っていうことになる訳で。

更に桁数を増やす。
表示が変わり、全桁表示出来なくなる。

列幅を広げれば表示できる。

データ上の上限桁数は分かっているものの、何桁の数字が来るか分からないセルのために、必要以上に列幅は割けない。
当然ながら、帳票なので、この行だけの話ではなくなってしまってる。
丈夫には別のデータが表示されるので、この行のためだけに他の部分のレイアウトにまで影響を与えることは避けたい。

というか、他のレイアウト調整なんて、面倒くさくてやってられないので、どうにかこのまま表示したいっていうのが本音。

元々の書式「文字列」でなら、表示は問題ない

そう、もともとの文字列の書式なら、桁数が増えても表示に影響は無い訳ですよ。

桁数が増えてもカンマが増えて問題なし。

なので、プログラムからExcelのデータ用シートに出力する時にカンマ区切りのデータとして出力してやればいい。
もっと言えば、SQLでデータを取得した時点でカンマ区切りのデータになっていれば、手を入れることなく解決する。

Oracleでカンマ区切りのデータを出力するには「TO_CHAR」を使用する

使い方は、


select to_char(20000,'99G999') from dual;

こんな感じ。

結果は以下。

「G」のところでカンマ区切りになる。

んだけど・・・
最大桁数は決まっているものの、何桁になるか分からない。
例えば、13桁の数字なら、こんな風になってしまう。


select to_char(2000000000000,'99G999') from dual;

13桁分の表示するためには、


select to_char(2000000000000,'9G999G999G999G999') from dual;

こうする必要がある。

ただ、このままだと実は問題があって・・・
200とか、設定した桁数以下の数値が来ると、前方に空白が詰められる。
数値を右揃えにしてくれているので、当たり前っちゃ当たり前なんだけど。


でもね、ちょっと待ってw
普通に使うなら全く問題ないんだけど。
分かりやすい画像だと、

なんだけど・・・
数値なのに、左揃えなのw
これも、レイアウトの制限なので、こちらで勝手に変更が出来ない部分・・・

ちなみに、さっきの200をそのまま出力するとこうなる。

アウト/(^o^)\

「TRIM」で空白を除去

Excelの文字列操作でも、TRIM関数をよく使ったりするんだけど、ORACLEでも使える。


select trim(to_char(200,'9G999G999G999G999')) from dual;

結果は

となる。

これで、当初のレイアウトを崩すことなく、カンマ区切りの表示(桁数不明)にも対応出来る。

「TO_CHAR」で0埋めも可能


select trim(to_char(200,'0G000G000G000G000')) from dual;

結果は

となる。

社員番号とか、扱う時に「00001」とか桁数分を0で埋めなきゃいけないときに使えまっせ。

まとめ

  • お客さん仕様の帳票
  • レイアウトの修正が現実的じゃない
    (他のセルへの影響がでかくて、レイアウト修正に時間がかかりすぎる)
  • カンマ区切り
  • ゼロ埋め

っていう時に使えます。

でも、実際にあるのが、こうやって苦心して上記のような要求を満たしたものを作っても、

「やっぱ、数値だし右詰でヨロシク♪」

っていう一声で、再修正が入るんだよ\(^o^#)/

最初に、「数値だし、右詰で良くないすか?」って聞いても、要求どおりやれって言われるんだけどねw

 







-C#, ORACLE
-,

関連記事

Oracleで複数レコードを更新する方法

UPDATE文で、複数のレコードを一回のトランザクション内で更新する必要に迫られました。 基本的に、今まで使ってきたUPDATE文では、 UPDATE tableA set COL1 = 1 ,COL …

[ORACLE]今接続しているサーバー・スキーマとかを確認する

Oracle使ってる時に、今どのサーバーに繋いでるの?とか、今どのスキーマに繋いでるの? ってなるとき無いですか? そんなときの確認法。 今、どのサーバーに接続してるんだ? 先日の仮想マシンにOrac …

[ORACLE]ORA-01950: 表領域’USERS’に対する権限がありません。のエラー対処法

  Oracle 12c R2(R1でも同様のエラーが発生)で ORA-01950: 表領域’USERS’に対する権限がありません のエラーが発生しました。 状況とし …

ORACLEでORA-01861: リテラルが書式文字列と一致しません

ORA-01861: リテラルが書式文字列と一致しません このエラー、ぶっちゃけ、意味が分からないところでもある。 日付の指定時に発生してて、原因が判明するまでに結構回り道をしました。 ネットで検索し …

C#で計算時の切り上げ・切捨て・四捨五入を行う方法

普段使わないと馴染みが薄いですが、日常で行う計算にも切り上げ・切捨て・四捨五入は割りと使われていたりします。 今回はそんな計算のお話。 例えば、クルマ購入時の端数の切捨てとかね。 「千円の位を負けてく …


カテゴリー