.NETでXMLを活用していきます。

インサイダー取引になってしまいます

»

インサイダー取引になってしまいます

 式についてはさっぱり知識がありませんが、かなりドキッとする言葉でした。詳しい話を聞くとその会社では、前もって「株式売買申請書」というWeb申請を出さないと、自社株を売却できないルールになっているそうです。そこで現在は、「売却希望日」に「過去日付」を入力してWeb申請できてしまうから、システムでチェックを入れてほしいという要望でした。

JavaScriptでチェックする

 れなら、サーバー側にPOSTする前に、クライアント側でJavaScriptを使ってチェックすればいいですね。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<script type="text/javascript">

function $(id)
    {
       
return document.getElementById(id);
    }

   
function Apply()
    {
       
if(!$("BuyDate").value.match(/^\d{4}\/\d{2}\/\d{2}$/))
        {
            alert(
"売却希望日の形式が正しくありません。");
            $(
"BuyDate").focus();
            
return;
        }
       
       
var buydate = new Date($("BuyDate").value);
       
var today = new Date();
       
       
if (buydate.getTime() < today.getTime())
        {
            alert(
"申請日より過去の売却希望日は許可されていません。");
            $(
"BuyDate").focus();
            
return;
        }

        document.forms[0].submit();
    }

</script>

 ころがです。なぜか「申請日当日の売買希望日」がエラーになってしまいます。「申請日より過去日付のみエラーにする」という実装でOKだったのですが、どうやらうまく動いていません。なぜ22行目に処理が入ってくるのか、机上デバッグでは分かりませんでした。

時刻はいらない

 うです。今回の現象は、日付型には時刻が入っていることを忘れた為に、発生していました。具体的には、変数buydateには「2009/09/09 00:00:00」が、変数todayには「2009/09/09 14:17:50」が入っていました。なるほど~。確かに「buydate < today」なので、当日もエラーで判定されることには納得できました。

現在日付で00:00:00

 由が分かったところで修正方法を考えてみると、時刻の部分で不等式が狂っているのだから、時刻がなくなればいい。つまり「現在日付で00:00:00」が取得できればOKということになります

 ずは、ググってみました。同じことを過去にやった人がいるはずです。すると、さまざまな実装方法が見つかったのですが、だいたい4パターンで書かれていることに気がつきました。それがさらに大きく2つの派閥に分かれます

1行で書くよ派

 (1)newで頑張る

1
2
// newで頑張る
var today = new Date( new Date().getFullYear(), new Date().getMonth(), new Date().getDate() );

 なり頑張ってます。こんなに同じオブジェクトを繰り返しnewしなければならないなら、一度変数に格納したいところです。作者の「1行への執念」を感じました。

 (2)年月日の部分を文字列にして短く

1
2
// 年月日の部分を文字列にして短く
var today = new Date( new Date().toDateString() );

 ちらは、とてもシンプルです。文字数も少なく、ぱっと全体を把握できる点がいい感じです。

2行で書くよ派

 (3)きっちり個別指定

1
2
3
// きっちり個別指定
var today = new Date();
today =
new Date( today.getFullYear(), today.getMonth(), today.getDate() );

 れは、最初に出てきた(1)の変数使用バージョンです。一番件数が多かったです。ちなみにDateのコンストラクタ内では、getMonth()に「+1」する必要はありません。getMonth()は「0~11」を返すので、文字列にして表示する場合は「+1」する必要があるのですが、そのパターンをまねて「+1」してしまい間違っている例がありました。

 (4)後で時間を0にする

1
2
3
// 後で時間を0にする
var today = new Date();
today.setHours( 0, 0, 0, 0 ); 
// 時間,分,秒,ミリ秒を0にする

 かりやすい。頭の中で考えたフローをそのままコードに落としたような実装です。後から誰が読んでも理解できる点が好印象です。

で、結局どれだい?

 局(2)を採用しました。(※実際は以下のように単純なHTMLではなく、もっと複雑なASPXファイルで実装されています。)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<
html xmlns="http://www.w3.org/1999/xhtml">
<
head>
<title>株式売買申請書</title>

<script type="text/javascript">

function $(id)
        {
            
return document.getElementById(id);
        }

       
function Apply()
        {
            
if (!$("BuyDate").value.match(/^\d{4}\/\d{2}\/\d{2}$/))
            {
                alert(
"売却希望日の形式が正しくありません。");
                $(
"BuyDate").focus();
               
return;
            }

            
var buydate = new Date($("BuyDate").value);
            
var today = new Date(new Date().toDateString());

            
if (buydate.getTime() < today.getTime())
            {
                alert(
"申請日より過去の売却希望日は許可されていません。");
                $(
"BuyDate").focus();
               
return;
            }

            document.forms[0].submit();
        }
   
   
</script>

</
head>
<
body>
<form id="form1" runat="server">
<div>
<input id="BuyDate" type="text" style="width: 70px;" />
<hr />
<input id="btnApply" type="button" value="申請" onclick="Apply();" />
</div>
</form>
</
body>
</
html>

 なりの接戦でした。(4)も(2)と同様にシンプルであり、とても難しい決断でした。しかし今回は、(4)はあまりにも普通であり、(2)ほど感動させたとまでは言い切れないため、最後的には(2)がグランプリに相応しいと判断しました。

 グランプリの(4)も評価されるべき存在です。もしもわたしが新人研修の講師役だったら、無難に(4)で書いておけと言うでしょう。それほどの接戦でした。

最後に

 のコラムでは、「XML」を切り口にしていろいろ書いているのですが、今回はとうとう「XML」が一度も出てこないんじゃないかという勢いでした。しかし、最後の最後に「XHTML」という反則技を使って「XML」を無理やり登場させました。何とか帳尻合わせができたでしょうか?

Comment(0)

コメント

コメントを投稿する