|
|||||||||||||||||||||||||||||||||||||||||||||||||||
2012 2010 2009 2008 2007 |
October 3, 2007. またも設計変更 またもテーブル設計の変更やそれに伴うプログラム設計の変更が発生した。原因は自分である。昨日楽観主義と悲観主義の利点欠点について述べたが、悲観主義で長考の後に設計してもやはりミスの根絶は厳しい。楽観的設計をスパイラルしてXPを行なうことの良さを図らずも証明してしまった形になる。困ったものだ。
さて、今日も忘れないうちに情報系っぽい話題を。「あるTBLの通し番号の最大値を取得して別の場所にセットして欲しい」と、PGさんにお願いしました。で、しばらくすると、「maxが上手く取得できません」との質問有り。確かに、番号が10, 20, ... 50 ... 200, 300..とあるのにmax(XXX_NO)の結果が50になってしまう。さて何故でしょうか。正解はCMの後!
...と書いて、ここにgoogleの広告でも貼ってみようかと思ったのですが、面倒なのでやめました。正解は、型がcharだったから。文字列として評価されると、200や300より50の方が大きいと評価されるのです。解決策はこんな感じ。
max(cast(XXX_NO as int))
数値型にキャストすればよいと言う単純な話です。ところが今回のシステムでは、入力に制限がかかっていないため、'1'や'050'なんかが混在する可能性がある。結果、上記の実装例では'050'が50として取得されてしまう。かといって0で埋めると'1'が'001'になってしまう。ってなわけで面倒なSQLを書いてもらう羽目になりました。興味のある人はトライしてみて下さいませ。こういうときの判断って人間の頭だと簡単なのにプログラムにやらせると途端に複雑になるんだよねぇ。 そうそう、今日もcoalesceが活躍しました。case whenとかってSQLが一気に醜くなるので嫌いなのです。NVLとかDECODEとかオラクル慣れしてしまった体にSQLServerはつらい...。一番つらいのはMERGE文の不在だったりしますが...。
さて、今日もネタ画像をUPしておきましょう。調べ物をしていたらMS様のサイトにて発見いたしました。「署名しなさい」だそうな。原文はSign up!ぐらいかな?他のサイトでみてもさほどなにも感じませんがMS様のサイトでみると、無いはずの意図を感じてしまいます。 MS製ソフトの日本語訳は結構いいかげんなものが多い。VSSにチェックインする際の「ファイルxxxは既に開かれています。」なんかかなり酷い。始めてみたときには何を怒られたのか30秒ぐらい固まりました。英語版を使ったことが無いので想像ですが、had been openedとかいう感じで過去完了形が使われていて、本来は「過去に開いて、その後ずっと開きっぱなしで閉じてないから駄目ですよ」つまり、意訳すると「ファイルxxxxは編集中のためチェックインできません」って程度でしょう。完了形 == 「既に」っていう直訳はちょっとねぇ....。 ※パスにはこの日記のタイトルをコピペして下さい。 Copyright 2007 barista. All rights reserved. |
|