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のエラー・・・。ORA-01008:バインドされていない変数があります。

今日も今日とて、ORA-01008のエラーに悩まされる。 無慈悲に「バインドされていない変数があります。」ってメッセージは出してくれるんだけど、ビンゴの位置は教えてくれないわけで・・・ 何度目だろう・ …

c#:高DPI環境化で、画面レイアウトが崩れる問題

自分の環境は高DPI(125%以上)ではないので、意識していなかったけど、客先環境でハマッたので。 状況は、Multirowを使った表部分が、高DPI環境下(125%)だと、レイアウトが崩れる問題。 …

[C#]NumericUpDownコントロールで、上下キーでの値変更を禁止する

結論から言うと、「InterceptArrowKeys」プロパティをfalseにしてやることで解決。 NumericUpDownコントロールを使うメリット 画面構築をしている際、ユーザーの任意入力項目 …

[C#]TextBoxで、マウスクリック(1回目)だけ、内容を全選択させる

TextBoxの内容を全選択させるには、SelectAll()を使用 マウスの1回目も含めるなら、BeginInvoke~を使用 VB.net版はこちら。 日本の中心付近で仕様変更と闘うSE日記[VB …

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

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


カテゴリー