三流君ASPで遊ぶ、失敗する

[三流君] Top ken3.orgへ
[ASP解説] ASPの解説TOP
[ASP記事 バックナンバー] 番号順のバックナンバー
[SOHO/在宅プログラマー/派遣] 派遣のお話ほか
[...サイトマップ(総合案内へ)]




分類別ガイド
ADOで[ADO Mdb接続] ,[ADO Excel接続] ,[ADO CSV接続]

[ASP Form データのやりとりPOSTとGET]
[ASPでTextFile操作]
[ASPでVBScriptを使う]
[その他サンプル]

バックナンバー No.15 〜 No.19


No.15 2002/12/12
FormatNumber関数を使用して小数点固定、%を表示
[ページTOPへ戻る]
<FormatNumber関数を使用して小数点固定、%を表示>

こんにちは、Ken3です。

前回は、
世の中、外見重要、男性も化粧する時代(オイオイ、ホントか?)
でした。(上の一行じゃ意味不明だけど)
今回も、アンケート結果の出力を少し変えてみます。
決り文句で、元が悪いと化粧もイミナイって?そんなぁ〜

あまり期待しないでね。

/*
 * 1.少し化粧をほどこした出力ページ
*/

前回までに行った、集計結果の表示パターンは、
http://www.ken3.org/cgi-bin/test/test013-3.asp  ←そのまま人数を表示
http://www.ken3.org/cgi-bin/test/test014-1.asp  ←表(TABLE)にした
http://www.ken3.org/cgi-bin/test/test014-2.asp  ←表にワクをつけた
でした。
どれもなんかしっくりこないと思いつつ、
今回も少しイタズラしてみます。

街中(インターネット上)でアンケート結果ページを見ると、
不満40.1%とか、%表示してますよね。

今回は、その化粧の方法をまねして、%表示にチャレンジしてみます。
なんだぁって感じですよね。

/*
 * 2.回答数÷全体数で計算だよね。
*/

%の計算は、回答数÷全体数で計算だよね。
それでは、軽く追加します。

-- test015-1.asp --
<%@LANGUAGE=VBScript%>
<html>
<head>
<title>%の計算は、回答数÷全体数で計算だよね</title>
</head>
<body>
<h2>%の計算は、回答数÷全体数で計算だよね</h2>
test015-1.asp<br>
<hr>

<%
dim strRECORD  'レコード内容を一時保存
dim nCNT(10)   'カウンター 変数 10個もいらないけど
dim nSUM       '*1回答の合計数

nSUM = 0       '初期化する

'カウンター変数をループで初期化しておく
For i = 0 to 10
    nCNT(i) = 0 
Next 

'FileSystemObjectを生成します、、って英文、そのままジャン。
Set objFS = Server.CreateObject("Scripting.FileSystemObject")

'test013.txt 結果ファイルを読取専用モードで開く
Set ts = objFS.OpenTextFile(Server.MapPath("test013.txt"), 1, True)

Do While ts.AtEndOfStream = False  'ファイルの終端になってない間ループする
    strRECORD = ts.ReadLine   'ファイルからデータを一行を読む
    'Left関数を使って左から1文字目をCintで数値変換
    i = Cint(Left(strRECORD, 1))  '読みこんだレコードの1文字目を数値変換
    'nCNT(i番目)をカウントアップ
    nCNT(i) = nCNT(i) + 1
    '*2合計数は無条件にカウントアップ
    nSUM = nSUM + 1
Loop

ts.close  '使ったファイルは閉じようよ

Response.Write "アンケート回答数<b> " & nSUM & "</b>人です"  '*4回答数表示

'Array関数を使用して、評価コメントを初期化
strBOX = Array("かなり不満", "不満", "少し不満", "どちらとも言えない", _
               "まぁまぁ", "満足", "大変満足")

'結果の表示を<TABLE>タグを使用して表示
Response.Write "<TABLE border=1>"   'border=1で境界線(ワクを表示)
Response.Write "<TR><TD>評価</TD><TD>コメント</TD><TD>人数</TD>"
Response.Write "<TD>%</TD></TR>"   '*3 %の見出しを追加
'ループで回して評価の集計データを表示する
For i = 6 To 0 Step -1   '6〜0のループを作る
	Response.Write "<TR><TD>" & i & "</TD>"
    Response.Write "<TD>" & strBOX(i) & "</TD>"
    Response.Write "<TD>" & nCNT(i) & "</TD>"
    '*5 %を計算して、表示する
    Response.Write "<TD>" & (nCNT(i) / nSUM) * 100 & "%</TD></TR>"
Next

Response.Write "</TABLE>"   '忘れずにテーブルを終わりにする

%>
<hr>
アンケート結果はこんな感じです。<br>
<A HREF="test013.txt" target="_new">元データtest013.txtを見る</A><br>
<br>
</body>
</html>
---

いつもの軽く解説だと、
dim nSUM       '*1回答の合計数
nSUM = 0       '初期化する
で、合計数のカウンターを宣言、初期化してます。

Do While ts.AtEndOfStream = False  'ファイルの終端になってない間ループする
    ・
  ・
  ・
    '*2合計数は無条件にカウントアップ
    nSUM = nSUM + 1
Loop

ループ内で、そのままカウントしてます。
もうひとつの考え方で、回答の合計数だから、
nSUM = nCNT(0) +  nCNT(1) + nCNT(2) + nCNT(3) + nCNT(4) + nCNT(5) + nCNT(6)
の力技や
For i=0 To 6
   nSUM = nSUM + ncnt(i)
Next
でカウントする手もあります。お好みで。

Response.Write "アンケート回答数<b> " & nSUM & "</b>人です"  '*4回答数表示
は、確認の意味も含めて、表示してます。

'ループで回して評価の集計データを表示する
For i = 6 To 0 Step -1   '6〜0のループを作る
	Response.Write "<TR><TD>" & i & "</TD>"
    Response.Write "<TD>" & strBOX(i) & "</TD>"
    Response.Write "<TD>" & nCNT(i) & "</TD>"
    '*5 %を計算して、表示する
    Response.Write "<TD>" & (nCNT(i) / nSUM) * 100 & "%</TD></TR>"
Next

人数÷合計数×100で%を計算し、出力してます。

終了ですね。今日は軽かったですね。では、また。

オイ、三流プログラマー
何?
表示を見たのかよ。
http://www.ken3.org/cgi-bin/test/test015-1.asp
を実行すると、 

アンケート回答数 16人です
評価 コメント          人数 % 
6    大変満足           1   6.25% 
5    満足               2   12.5% 
4    まぁまぁ           1   6.25% 
3    どちらとも言えない 4   25% 
2    少し不満           3   18.75% 
1    不満               3   18.75% 
0    かなり不満         2   12.5% 

と表示されるよ。

気になるのが(見た目でNGなのは)、
6.25% 12.5% 25%
と小数点以下の桁数がそろってないよ。
それと、データは右詰になっていて、
数値は左詰のほうがいいのでは?
人数が10だったら、
1
10
と表示じゃマズイでしょ。

/*
 * 3.FormatNumber関数 と <TD ALIGN=Right>
*/

う〜ん、何かないかなぁ。
第一の問題点は小数点以下の桁数問題かぁ、
関数を探すと、
FormatNumber関数ってのが使えそうです。

使い方は
moji = FormatNumber(値,小数点以下の桁数)
で、調整した文字列を返してくれます。

次は右詰かぁ、
えっと、表作りの<TD>タグにALIGNってあるから、
これをRightにするか。

-- test015-2.asp
<%@LANGUAGE=VBScript%>
<html>
<head>
<title>FormatNumber関数 と <TD ALIGN=Right></title>
</head>
<body>
<h2>FormatNumber関数 と <TD ALIGN=Right></h2>
test015-2.asp<br>
<hr>

<%
dim strRECORD  'レコード内容を一時保存
dim nCNT(10)   'カウンター 変数 10個もいらないけど
dim nSUM       '*1回答の合計数

nSUM = 0       '初期化する

'カウンター変数をループで初期化しておく
For i = 0 to 10
    nCNT(i) = 0 
Next 

'FileSystemObjectを生成します、、って英文、そのままジャン。
Set objFS = Server.CreateObject("Scripting.FileSystemObject")

'test013.txt 結果ファイルを読取専用モードで開く
Set ts = objFS.OpenTextFile(Server.MapPath("test013.txt"), 1, True)

Do While ts.AtEndOfStream = False  'ファイルの終端になってない間ループする
    strRECORD = ts.ReadLine   'ファイルからデータを一行を読む
    'Left関数を使って左から1文字目をCintで数値変換
    i = Cint(Left(strRECORD, 1))  '読みこんだレコードの1文字目を数値変換
    'nCNT(i番目)をカウントアップ
    nCNT(i) = nCNT(i) + 1
    '*2合計数は無条件にカウントアップ
    nSUM = nSUM + 1
Loop

ts.close  '使ったファイルは閉じようよ

Response.Write "アンケート回答数<b> " & nSUM & "</b>人です"  '*4回答数表示

'Array関数を使用して、評価コメントを初期化
strBOX = Array("かなり不満", "不満", "少し不満", "どちらとも言えない", _
               "まぁまぁ", "満足", "大変満足")

'結果の表示を<TABLE>タグを使用して表示
Response.Write "<TABLE border=1>"   'border=1で境界線(ワクを表示)
Response.Write "<TR><TD>評価</TD><TD>コメント</TD><TD>人数</TD>"
Response.Write "<TD>%</TD></TR>"   '*3 %の見出しを追加
'ループで回して評価の集計データを表示する
For i = 6 To 0 Step -1   '6〜0のループを作る
	Response.Write "<TR><TD>" & i & "</TD>"
    Response.Write "<TD>" & strBOX(i) & "</TD>"
    Response.Write "<TD ALIGN=RIGHT>" & nCNT(i) & "</TD>" '*7ALIGN=RIGHT追加
    '*5 %を計算して、表示する
    strMSG = FormatNumber((nCNT(i) / nSUM) * 100, 1)  '*6計算と変換処理
    Response.Write "<TD ALIGN=RIGHT>" & strMSG & "%</TD></TR>"
Next

Response.Write "</TABLE>"   '忘れずにテーブルを終わりにする

%>
<hr>
アンケート結果はこんな感じです。<br>
<A HREF="test013.txt" target="_new">元データtest013.txtを見る</A><br>
<br>
</body>
</html>
---

ポイントは、得に無く、
'ループで回して評価の集計データを表示する
For i = 6 To 0 Step -1   '6〜0のループを作る
	Response.Write "<TR><TD>" & i & "</TD>"
    Response.Write "<TD>" & strBOX(i) & "</TD>"
    Response.Write "<TD ALIGN=RIGHT>" & nCNT(i) & "</TD>" '*7ALIGN=RIGHT追加
    '*5 %を計算して、表示する
    strMSG = FormatNumber((nCNT(i) / nSUM) * 100, 1)  '*6計算と変換処理
    Response.Write "<TD ALIGN=RIGHT>" & strMSG & "%</TD></TR>"
Next

*6で、
strMSG = FormatNumber((nCNT(i) / nSUM) * 100, 1)  '*6計算と変換処理
と、小数点以下を1桁にしたのと

*7で、
Response.Write "<TD ALIGN=RIGHT>" & nCNT(i) & "</TD>" '*7ALIGN=RIGHT追加
と、<TD ALIGN=RIGHT>を使ってみました。

http://www.ken3.org/cgi-bin/test/test015-2.asp
を実行すると、無事にできたみたいです。

/*
 * 4.まだまだ、メイクが上手じゃないよね
*/

ここ2・3回は、出力ばかり気にしてるけど、
なかなか、上達しないよね。

プログラムもセンスでるけど、
HTMLで結果を表示して、ユーザーに見せるのもセンスが必要ですね。

ASPのテクだけじゃなく、
HTMLの見せ方も平行して覚えないと、
本当にいいページはできないと感じる今日この頃。

/*
 * 5.終わりの挨拶
*/

今回は、
・アンケートには%の項目あるよね
・FormatNumber関数を使って小数点以下の調整
・<TD ALIGN=Right>で右詰の表示
でした。

結果の見せ方も、いろいろな書き方あるので、
人を振り向かせる、夢中にさせるページをみなさんは目指してくださいね。

最強ページへの道のりは遠いなぁ〜。

またね(笑)

何か質問・感想があったら、気軽に、
メール、掲示板に書き込んでくださいね。

三流プログラマーのKen3でした。

No.16 2002/12/12
入力、結果表示を1つに、Subで関数分割
[ページTOPへ戻る]
<入力、結果表示を1つに、Subで関数分割>

こんにちは、Ken3です。

前回まで、
世の中、外見、外見、男性も化粧する時代(オイオイ、ホントか?)
で、いろいろと書いてました。(上の一行じゃ意味不明だけど)
今回は、
アンケート処理の入力、結果出力を1つにまとめてみたいと思います。
まとめると、良い面や悪い面あるので参考にして下さい。

あまり期待しないでね。

/*
 * 1.アンケート入力後、途中経過の表示
*/

通常やってる簡単なアンケートのページって、
だいたいのパターンが、
アンケートを入力すると、途中経過が表示されます。

利用しているユーザーは自分の感想と他人の意見が見れて、
親切なページですよね。

そんなページに少しでも近づけるために、
アンケートの入力とファイルへの書き込み、
結果の表示を1つにまとめてみます。

動作仕様は簡単に、
test016.aspがパラメータ無しで呼ばれたら、
<FORM>タグで入力する画面を表示
パラメータ有りの時、
パラメータをチェックして
0〜6の時は、データ書き込み後結果表示
99の時は、結果だけを表示
その他はパラメータエラーにする。

/*
 * 2.Subで関数分割
*/

元々分割されたプログラムとHTMLを1つにするので、
Subで分割して書きたいと思います。

メインの流れを考えると、

HTMLヘッダ処理
まずは、パラメータの判断かぁ
IF バラメーター有り then
  パラメータの処理へ飛ばす
ELSE
   フォームの入力処理を書く
END IF
/HTML
--
パラメータの処理
IF 0から6か? THEN
  データを書きこむ
  結果の表示
ELSE IF 99か? THEN
  結果の表示
ELSE 
  エラーの時はエラーメッセージを表示
END IF

何か長いけど、こんな感じで行くか。

おっと、その前にサブ関数って?だよね。
えっ、知ってる?なんだぁ、でも聞いた事無い人も居ると思うので。

Sub aaa()
 処理
 処理
End Sub

Sub bbb()
  処理B
 処理B
End Sub

Call aaa() とやると、
Sub aaa()を呼んで(流れが移って)、
終了すると戻ってくる。

Sub ccc()
  Call bbb()
  Call aaa()
End Sub

と、関数から関数を呼んで、処理することも出来ます。

まぁ、慣れてください。
(えっ、逃げるなって?)

/*
 * 3.こんな感じに長くまとまりました
*/
-- test016-1.asp --
<%@LANGUAGE=VBScript%>
<html>
<head>
<title>入力、結果表示を1つのASPファイルにまとめた</title>
</head>
<body>
<h2>入力、結果表示を1つのASPファイルにまとめた</h2>
test016-1.asp<br>
<hr>

<% 'まずは、パラメータ有無の判断を行う
    If IsEmpty(Request.QueryString("a")) = False Then
        'バラメーター有りの時
        If Request.QueryString("a") = "99" Then
            Call test016_SUM()   '結果表示の関数を呼ぶ
        Else
            Call test016_WRITE() '書き込みの関数を呼ぶ
        End If
    Else '↓フォームの入力処理を書く(普通のHTML)
%>
        <FORM ACTION="test016-1.asp" METHOD="GET">
        このメルマガの満足度は?選択後、送信ボタンを押してください。<br>
        <INPUT TYPE="RADIO" NAME="a" VALUE="6">6.大変満足、知人に教えます<br>
        <INPUT TYPE="RADIO" NAME="a" VALUE="5">5.満足<br>
        <INPUT TYPE="RADIO" NAME="a" VALUE="4">4.まぁまぁ<br>
        <INPUT TYPE="RADIO" NAME="a" VALUE="3">3.どちらとも言えない<br>
        <INPUT TYPE="RADIO" NAME="a" VALUE="2">2.少し不満<br>
        <INPUT TYPE="RADIO" NAME="a" VALUE="1">1.不満<br>
        <INPUT TYPE="RADIO" NAME="a" VALUE="0">0.かなり不満、解除します<br>
        <br>
        <INPUT TYPE="submit" VALUE="送 信">
        <INPUT TYPE="reset"  VALUE="入力クリア">
        </FORM>
<%  End If %>

<hr>
</body>
</html>

<%  'ここから下にSUB関数をまとめてみました。

Sub test016_WRITE() '入力値を判断して書き込む

  'アンケートの結果をまず判断する
  strMSG = "不正なパラメーターです"  'エラーメッセージを初期値として代入
  if Request.QueryString("a") = "6" then strMSG = "大変満足"    'asp013追加
  if Request.QueryString("a") = "5" then strMSG = "満足" 
  if Request.QueryString("a") = "4" then strMSG = "まぁまぁ" 
  if Request.QueryString("a") = "3" then strMSG = "どちらとも言えない" 
  if Request.QueryString("a") = "2" then strMSG = "少し不満" 
  if Request.QueryString("a") = "1" then strMSG = "不満" 
  if Request.QueryString("a") = "0" then strMSG = "かなり不満"  'asp013追加

  If strMSG = "不正なパラメーターです" Then 'エラーパラメータのままか?チェック
    Response.Write "データを正しく受け取れませんでした<br>"
  Else
    'FileSystemObjectを生成します。
    Set objFS = Server.CreateObject("Scripting.FileSystemObject")

    'test016.txt を追加モードで開く
    Set ts = objFS.OpenTextFile(Server.MapPath("test016.txt"), 8, True)

    'ファイルにアンケート結果のデータを書き込む
    ts.write Request.QueryString("a") & ","   '結果0〜6を書く
    ts.write strMSG & ","    'ファイルに結果を書き込む
    ts.write Now             '時刻を書く

    ts.write chr(13) & chr(10)  '改行する

    '使ったファイルは閉じようよ
    ts.close

    Response.Write "あなたの回答は<b>" & strMSG & "</b>でした<BR>"

    Call test016_SUM()  '結果表示を呼ぶ 016追加

  End if

End Sub

Sub test016_SUM()  '結果の表示関数

  dim strRECORD  'レコード内容を一時保存
  dim nCNT(10)   'カウンター 変数 10個もいらないけど
  dim nSUM       '回答の合計数

  nSUM = 0       '初期化する

  'カウンター変数をループで初期化しておく
  For i = 0 to 10
      nCNT(i) = 0 
  Next 

  'FileSystemObjectを生成します、、って英文、そのままジャン。
  Set objFS = Server.CreateObject("Scripting.FileSystemObject")

  'test016.txt 結果ファイルを読取専用モードで開く
  Set ts = objFS.OpenTextFile(Server.MapPath("test016.txt"), 1, True)

  Do While ts.AtEndOfStream = False  'ファイルの終端になってない間ループする
    strRECORD = ts.ReadLine   'ファイルからデータを一行を読む
    'Left関数を使って左から1文字目をCintで数値変換
    i = Cint(Left(strRECORD, 1))  '読みこんだレコードの1文字目を数値変換
    'nCNT(i番目)をカウントアップ
    nCNT(i) = nCNT(i) + 1
    '*2合計数は無条件にカウントアップ
    nSUM = nSUM + 1
  Loop

  ts.close  '使ったファイルは閉じようよ

  Response.Write "<hr><h3>アンケート集計結果</h3><hr>"
  Response.Write "アンケート回答数<b> " & nSUM & "</b>人です"  '*4回答数表示

  'Array関数を使用して、評価コメントを初期化
  strBOX = Array("かなり不満", "不満", "少し不満", "どちらとも言えない", _
                 "まぁまぁ", "満足", "大変満足")

  '結果の表示を<TABLE>タグを使用して表示
  Response.Write "<TABLE border=1>"   'border=1で境界線(ワクを表示)
  Response.Write "<TR><TD>評価</TD><TD>コメント</TD><TD>人数</TD>"
  Response.Write "<TD>%</TD></TR>"   '*3 %の見出しを追加
  'ループで回して評価の集計データを表示する
  For i = 6 To 0 Step -1   '6〜0のループを作る
    Response.Write "<TR><TD>" & i & "</TD>"
    Response.Write "<TD>" & strBOX(i) & "</TD>"
    Response.Write "<TD ALIGN=RIGHT>" & nCNT(i) & "</TD>" 'ALIGN=RIGHT追加
    '%を計算して、表示する
    strMSG = FormatNumber((nCNT(i) / nSUM) * 100, 1)  '計算と変換処理
    Response.Write "<TD ALIGN=RIGHT>" & strMSG & "%</TD></TR>"
  Next

  Response.Write "</TABLE>"   '忘れずにテーブルを終わりにする

End Sub

%>
---
長い(笑)、
なんか見るほうも疲れるし、これから解説する私も疲れそう。
なんて言って無いで、ポイントを簡単に書くと、

<% 'まずは、パラメータ有無の判断を行う
    If IsEmpty(Request.QueryString("a")) = False Then
        'バラメーター有りの時
        If Request.QueryString("a") = "99" Then
            Call test016_SUM()   '結果表示の関数を呼ぶ
        Else
            Call test016_WRITE() '書き込みの関数を呼ぶ
        End If
    Else '↓フォームの入力処理を書く(普通のHTML)
%>
        <FORM ACTION="test016-1.asp" METHOD="GET">

の部分ですが、
IsEmpty(Request.QueryString("a")) = False
でaパラが入っているかチェックして、
さらに、それが=99か判断、99なら結果表示関数に処理を飛ばしてます。
99以外の時はパラメータの書き込み関数を呼んでます。
と
何かしらパラメータをもらった時は、上記の判断をします。

で、パラメータをもらわない呼び出しの時は、
フォームを表示します。
ここでのポイントは、なぜかACTIONで自分自身を呼んでるんですよね。
<FORM ACTION="test016-1.asp" METHOD="GET">
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
これは、回答を選択して、
<INPUT TYPE="submit" VALUE="送 信">
送信を押すと、再度test016-1.aspが呼ばれた時は、
パラメータ?a=Xが付いているので、
2回目に来た時は上のIF文で書き込み関数の流れに行ってくれます。

RPGでアイテムを持って帰り、再度スタート地点に戻ると
違う道が開けるみたいで、面白いでしょ。
*チョット表現が違うけど

フォームの出力が終わったら
        </FORM>
<%  End If %>
と、End If でIF文を終わらせるのを忘れないで、

<hr>
</body>
</html>

まぁ自然な流れで、HTMLが終了します。

自作関数は、下にまとめて書きました。

<%  'ここから下にSUB関数をまとめてみました。
Sub test016_WRITE() '入力値を判断して書き込む

ほとんど、前の講座で作成したASPの頭にSubと付けただけかなぁ。

変わってるのは、test016_WRITEの中で、test016_SUMを呼んでるとこかなぁ。
これで、書き込み後、結果表示を行ってます。

/*
 * 4.テスト
*/

http://www.ken3.org/cgi-bin/test/test016-1.asp
をそのまま呼ぶと、

何とか、入力画面が表示されたね。
適当に回答を選んで送信。

データが書き込まれて、結果も無事表示されました。

次は、URLからクリックのテストと
http://www.ken3.org/cgi-bin/test/test016-1.asp?a=3
のURLにパラメータ付きをクリック。

データが書き込まれて、結果も無事表示されました。
ほっと一息ついて、

結果表示の99パラメータのテストは
http://www.ken3.org/cgi-bin/test/test016-1.asp?a=99
これも、なんとか表示されました。

/*
 * 5.終わりの挨拶
*/

今回は、
・入力、結果表示を1つにまとめる
・Subで関数を作成
でした。

う〜ん、
死語な例だと、
アッシー君、メッシー君が1人ってのも(まとめてみるのも)
一つの手だったけど、
まとめないで、別れている方が(別々に一人一人なほうが)
機能が1つでわかりやすかったかも。

まぁ、別々に居ても管理が大変な時もあるし、
どちらとも言えないか?
*管理がうまい女性にコツを聞いてみるか、
 メンテナンス方法もいろいろなテクがあったんだろうなぁ???

三流君、アッシー君、メッシー君って?何?
えっと、話すと長くなるので、
30代おっさんの先輩や
お父さんに聞くときは、
「お父さんはお母さんのアッシー君だったってホント?」
と聞いてみな(嘘ですよ)

そんな若い人、このメルマガ見てないと思いつつ、
今日も逃げるようにサヨナラかな。

読者層のアンケートやその他、
可変のアンケート処理をやらないとなぁ。
(でも、そろそろ、アンケート系も飽きてきたのも事実、
 違うネタも考えないと、、、)

最強ページへの道のりは遠いなぁ〜。

またね(笑)

何か質問・感想があったら、気軽に、
メール、掲示板に書き込んでくださいね。

三流プログラマーのKen3でした。

No.17 2002/12/14
中身を表示、Server.HTMLEncodeでソースの表示
[ページTOPへ戻る]
<中身を表示、Server.HTMLEncodeでソースの表示>

こんにちは、Ken3です。

前回までのギャグは、
世の中、外見、外見、男性も化粧する時代(オイオイ、ホントか?)
でした。

今回は、
男も女も隠し事しないで中身を表示
です。

あまり期待しないでね。

/*
 * 1.読者からのご意見は新たなネタになるから歓迎ですね
*/

下記、読者メールの一部引用です。
In message "感想",
*****8さん wrote...
 >広告見せるならソース見せろ

なるほど、作者の小金稼ぎをみごとに指摘されましたね。
小金っていっても、クリックだけだと稼げないのが現実。
*一日1〜2クリックあればいいほうかなぁ。

そっか、それなら実行結果とソースファイルを一緒に見せるほうが、
読者が来てくれるページになるよね。

今回は、そんな思いから、
男も女も隠し事しないで中身を表示です。

寒いよ三流君、、、そんなタイトル考えてないで、
中身を充実させてよ。

はい、了解です。
(くだらないタイトル、言いまわしのファンってヤッパ居ないのかなぁ)

/*
 * 2.簡単な方法
*/

私がバックナンバーのページでやってるんだけど、
ソースをテキストエディターに貼りつけて、
<HTML>の<を&lt;に>を&gt;
と置き換えて、
&lt;HTML&gt;
みたいにしてから、
<PRE>
&lt;HTML&gt;
</PRE>
とPREのタグで処理してます。

この処理を同じくやって、ASPの後ろに貼り付けるのって、
なんかバカらしいよね。

三流君らしいけどね。

グサっとくるなぁ、
よし、
ASPのソースファイルを読んで、
置きかえるかぁ。

/*
 * 3.置き換えの関数を探していたら、Server.HTMLEncodeと出会う
*/

ボクは、置き換えの関数お嬢を探してました。
そしたら、途中で、
Server.HTMLEncode 関数(お嬢さん)
と運命的な出会いをしました(なんだかなぁ)

この関数、
<>などを変換して、結果を返してくれます。

置き換え処理を作るより楽だったので、
この関数を使ってみます。

使い方は簡単で
Server.HTMLEncode("文字列")
で
変換結果を返してくれます。

/*
 * 4.サンプルの作成
*/

-- test017-1.asp --
<%@LANGUAGE=VBScript%>
<html>
<head>
<title>html asp のソースを表示したい Server.HTMLEncode</title>
</head>
<body>
<h2>html asp のソースを表示したい Server.HTMLEncode</h2>
test017-1.asp<br>
<hr>
Server.HTMLEncode(文字列)で、変換された結果<br>
使用例)Response.Write Server.HTMLEncode(strDATA)<br>
<hr>
<%
' FileSystemObjectを生成します、、って英文、そのままジャン。
Set objFS = Server.CreateObject("Scripting.FileSystemObject")

' tset017-1.asp を読取専用モードで開きデータを読む
Set ts = objFS.OpenTextFile(Server.MapPath("test017-1.asp"), 1, True)

Do While ts.AtEndOfStream = False  'ファイルの終端になってない間ループ
    strDATA = ts.ReadLine   'ファイルからデータを一行を読む
    '*1読み込んだデータをServer.HTMLEncodeで変換表示
    Response.Write Server.HTMLEncode(strDATA)
    Response.Write "<BR>"   '改行のタグを入れる
Loop

'使ったファイルは閉じようよ
ts.close
%>

<hr>
</body>
</html>
---

ポイントは得に無く、
    strDATA = ts.ReadLine   'ファイルからデータを一行を読む
    '*1読み込んだデータをServer.HTMLEncodeで変換表示
    Response.Write Server.HTMLEncode(strDATA)
    Response.Write "<BR>"   '改行のタグを入れる

読みこんだ1行を
Server.HTMLEncode(strDATA)
で変換表示、
改行のタグを入れて完成です。

http://www.ken3.org/cgi-bin/test/test017-1.asp
をテストで実行すると、
おっ、ソースが下に表示されるよ。

なんかしっくり来ないよね。
あっ、三流君らしいところ発見。
なに?どこ?

ソースの字下げで使っているスペースがとれてるよ。
あっ、ホントだぁ。<PRE>で囲うのか、なんかイヤだけど。

あと、これを全てのASPファイルに追加するんだぁ。
そのつもりだけど。

だったら、関数化したり、後ろに持って行ったり、
変更ヵ所少なくする工夫をしたら

/*
 * 5.関数化
*/

わかったよ、関数化して、</body></HTML>の前に呼ぶことにするよ。

-- tset017-2.asp 
<%@LANGUAGE=VBScript%>
<html>
<head>
<title>ソースの表示関数を後ろにプラスする Server.HTMLEncode</title>
</head>
<body>
<h2>ソースの表示関数を後ろにプラスする Server.HTMLEncode</h2>
test017-2.asp<br>
<hr>
Server.HTMLEncode(文字列)で、変換された結果<br>
使用例)Response.Write Server.HTMLEncode(strDATA)<br>

<% Call OUT_SRC() '*4ソースの表示関数を呼ぶ %>

</body>
</html>

<% '*3ソースの表示関数  SUB OUT_SRC() を作成

Sub OUT_SRC() 

  '見出しの表示
  Response.Write "<HR><h3>test017-2.asp ソース</h3><HR>"
  Response.Write "<PRE>"  'スペースを有効にするため

  ' FileSystemObjectを生成します、、って英文、そのままジャン。
  Set objFS = Server.CreateObject("Scripting.FileSystemObject")

  ' tset017-2.asp を読取専用モードで開きデータを読む
  Set ts = objFS.OpenTextFile(Server.MapPath("test017-2.asp"), 1, True)

  Do While ts.AtEndOfStream = False  'ファイルの終端になってない間ループ
    strDATA = ts.ReadLine   'ファイルからデータを一行を読む
    '*1読み込んだデータをServer.HTMLEncodeで変換表示
    Response.Write Server.HTMLEncode(strDATA)
    Response.Write "<BR>"   '改行のタグを入れる
  Loop

  '使ったファイルは閉じようよ
  ts.close

  Response.Write "</PRE>"  'ここまで
  Response.Write "<HR>"    '<HR>で区切る

End Sub  '関数はここまでですよ。

%>

よし、これでOKと。
料理のポイントは、
<% '*3ソースの表示関数  SUB OUT_SRC() を作成
Sub OUT_SRC() 
で、
関数を後ろに追加して、

<% Call OUT_SRC() '*4ソースの表示関数を呼ぶ %>
</body>
</html>

と、
終了前に呼んだしね。

http://www.ken3.org/cgi-bin/test/test017-2.asp
をテストで実行すると、
おっ、スペースも表示されてるし、OKかなぁ。

何か変?じゃない。空白行が表示されて無いよ。
あっ、ホントだ。
<PRE>にしたから<BR>が効かなくなってる、
これを実際の改行に変えないとマズイみたい、
ゴメンネ。

あとさ、
これってさ(この関数って)、
test017-2.aspからtest018-1.aspとかファイル名変わったら、
関数の固定値も変えるの?

そうだよ。それくらいはやってよ。
えっ?汎用の関数じゃないでしょそれじゃ。

/*
 * 6.環境変数から自分の名前を取得する
*/

アナタの名前は何ですか?
Ken3だよ。

じゃなくって、ASPファイルの名前だよ。
そんなの書いた時に決めてるから不明だよ。
だからその時に書き換えてよ。

これだよ三流作者は。。。
テメエが書いた、
In message "[ASPで遊ぶ No.007] - ブラウザ(端末情報)をGetする",
mag2 ID 0000099248さん wrote...
 >Request.ServerVariables("HTTP_USER_AGENT")
 >Request.ServerVariables("REMOTE_ADDR")
 >で値の取得は、なんとなくわかったけど、
 >そのほかにどんなの?あるの?
 >
 >う〜ん、私もよくわからないので、
 >For Each でServerVariables の名前を 表示してみました。
 >
 >http://www.ken3.org/cgi-bin/test/test007-2.asp 
 >をテストすると下記のようになります。テスト結果は、(長いです)
 >
 >PATH_INFO↓
 >/cgi-bin/test/test007-2.asp
 >
 >PATH_TRANSLATED↓
 >d:\users\ken3_org\cgi-bin\test\test007-2.asp
 >
 >QUERY_STRING↓
 >
 >SCRIPT_NAME↓
 >/cgi-bin/test/test007-2.asp
---
途中カットしたけど、
使えそうな環境変数あるんじゃないの?

http://www.ken3.org/cgi-bin/test/test007-2.asp
が環境変数を表示するサンプルです。
使えそうな値、再度確認しますか。

SCRIPT_NAME
ってのが、使えそうなので、使ってみます。
Request.ServerVariables("SCRIPT_NAME")
で値が取れるから、

-- test017-3.asp
<%@LANGUAGE=VBScript%>
<html>
<head>
<title>Request.ServerVariables("SCRIPT_NAME")を使用</title>
</head>
<body>
<h2>Request.ServerVariables("SCRIPT_NAME")を使用</h2>
test017-3.asp<br>
<hr>
Request.ServerVariables("SCRIPT_NAME")=
<%=Request.ServerVariables("SCRIPT_NAME")%>

<% Call OUT_SRC() '*4ソースの表示関数を呼ぶ %>

</body>
</html>

<% '*3ソースの表示関数  SUB OUT_SRC() を作成

Sub OUT_SRC() 

  Dim strSCR_NAME

  strSCR_NAME = Request.ServerVariables("SCRIPT_NAME")  '名前を代入

  '見出しの表示
  Response.Write "<HR><b>" & strSCR_NAME & "</b><HR>"
  Response.Write "<PRE>"  'スペースを有効にするため

  ' FileSystemObjectを生成します、、って英文、そのままジャン。
  Set objFS = Server.CreateObject("Scripting.FileSystemObject")

  '*5 スクリプト(strSCR_NAME)を読取専用モードで開きデータを読む
  Set ts = objFS.OpenTextFile(Server.MapPath(strSCR_NAME), 1, True)

  Do While ts.AtEndOfStream = False  'ファイルの終端になってない間ループ
    strDATA = ts.ReadLine   'ファイルからデータを一行を読む
    '*1読み込んだデータをServer.HTMLEncodeで変換表示
    Response.Write Server.HTMLEncode(strDATA)
    Response.Write chr(13) & chr(10)   '改行する
  Loop

  '使ったファイルは閉じようよ
  ts.close

  Response.Write "</PRE>"  'ここまで
  Response.Write "<HR>"    '<HR>で区切る

End Sub  '関数はここまでですよ。

%>
--

修正ポイントは、
  strSCR_NAME = Request.ServerVariables("SCRIPT_NAME")  '名前を代入
で、Request.ServerVariables("SCRIPT_NAME")の値、スクリプト名を保存し、

  '*5 スクリプト(strSCR_NAME)を読取専用モードで開きデータを読む
  Set ts = objFS.OpenTextFile(Server.MapPath(strSCR_NAME), 1, True)
で、そのファイルを開いて、処理してます。

これなら、関数をコピーするだけで、
自分自身の名前は、
Request.ServerVariables("SCRIPT_NAME")
から取得するので、
プログラムの変更が無くてすみます。

ここまで来るの、長かったね。
読者は途中でメールゴミ箱じゃない?

えっ、、、そんなぁ(笑)

http://www.ken3.org/cgi-bin/test/test017-3.asp
でテストできます。お時間の有る人は試してください。

/*
 * 7.終わりの挨拶
*/

今回は、
・クレーム、広告表示するならソース表示しろ(そんなにキツクは無かったけど)
・Server.HTMLEncode 関数 で 変換してみた
・Request.ServerVariables("SCRIPT_NAME")で名前を取得
でした。

修正の少ないプログラム作成でヒントになれば幸いです。
今日も逃げるようにサヨナラかな。

最強ページへの道のりは遠いなぁ〜。

またね(笑)

何か質問・感想があったら、気軽に、
メール、掲示板に書き込んでくださいね。

三流プログラマーのKen3でした。

No.18 2002/12/15
Mod演算子 で 余りを計算する
[ページTOPへ戻る]
<Mod演算子 で 余りを計算する>

こんにちは、Ken3です。

今回は、
軽くハシ休めで、
MOD で 余りを計算する
です。

あまり期待しないでね。

/*
 * 1.データの表示方法、そのまま流すより、区切りが入ってたほうがいいよね。
*/

test008.txt ( http://www.ken3.org/cgi-bin/test/test008.txt )
に時刻と評価が下記のように書かれています。
2002/12/05 8:11:04 , 満足
2002/12/05 8:14:12 , 普通
2002/12/05 15:53:28 , 満足
 ・
 ・
 ・
2002/12/07 15:36:54 , 満足
2002/12/07 15:56:49 , 満足
2002/12/07 15:57:22 , 不正なパラメーターです

とテキストファイルがあって、
これを表示するプログラム、

In message "[ASPで遊ぶ No.010] - テキストファイルからデータを読む",
 >' FileSystemObjectを生成します、、って英文、そのままジャン。
 >Set objFS = Server.CreateObject("Scripting.FileSystemObject")
 >
 >' test008.txt を読取専用モードで開く
 >Set ts = objFS.OpenTextFile(Server.MapPath("test008.txt"), 1, True)
 >
 >Do While ts.AtEndOfStream = False  '*6ファイルの終端になってない間ループ
 >    strDATA = ts.ReadLine   'ファイルからデータを一行を読む
 >    Response.Write strDATA  '読み込んだデータを表示
 >    Response.Write "<BR>"   '改行のタグを入れる
 >Loop
 >
 >ts.close  '使ったファイルは閉じようよ
---

http://www.ken3.org/cgi-bin/test/test010-2.asp
で、そのまま流して、表示してました。

今回は、それだと見にくいので、
5行単位で、区切りの線を入れてみたいと思います。

/*
 * 2.余りを求めるのはMod演算子
*/
考え方のポイントは、
まず、行番号を数えないといけないか。
で、その行番号が5、10、15の後に区切りの線を引きたいなぁ。
区切りの線は<HR>タグを出力するとして、
さて、どうしようかなぁ。
5で割って余りが0の時に出力にしよう。

余りを求める演算子でMod演算子があるので、
これを使ってみます。
11 Mod 5 とやると、11を5で割った余りの1と演算されます。
もちろん
n Mod 5 とか変数の使用もOKです。

-- test018-1.asp
<%@LANGUAGE=VBScript%>
<html>
<head>
<title>MOD で 余りを計算する</title>
</head>
<body>
<h2>MOD で 余りを計算する</h2>
test018-1.asp<br>
動作仕様:test008.txtを読み込み、5行単位で線を引く(<HR>タグを入れる)
<hr>
<%
'FileSystemObjectを生成します
Set objFS = Server.CreateObject("Scripting.FileSystemObject")

'test008.txt を読取専用モードで開く
Set ts = objFS.OpenTextFile(Server.MapPath("test008.txt"), 1, True)

Dim nLINE  '*1行数のカウンター
nLINE = 0  'カウンターを初期化

Do While ts.AtEndOfStream = False  '*6ファイルの終端になってない間ループ
    strDATA = ts.ReadLine   'ファイルからデータを一行を読む
    nLINE   = nline + 1     '*2行カウンタを+1する
    Response.Write nLINE & "行目 " '行番号の表示
    Response.Write strDATA  '読み込んだデータを表示
    Response.Write "<BR>"   '改行のタグを入れる
    '*3行カウンタが5、10、15、、5で/って余りが0なら
    '<HR>タグを挿入する
    If nLINE Mod 5 = 0 Then
        Response.Write "<HR>"   'タグを入れる
    End If
Loop

ts.close  '使ったファイルは閉じようよ

%>
<hr>
<A HREF="test008.txt">使用したtest008.txtを見る</A><br>
<br>

</body>
</html>
---

いつものポイント解説は、

Dim nLINE  '*1行数のカウンター
nLINE = 0  'カウンターを初期化
で、変数の宣言と初期化

Do While ts.AtEndOfStream = False  '*6ファイルの終端になってない間ループ
    strDATA = ts.ReadLine   'ファイルからデータを一行を読む
    nLINE   = nline + 1     '*2行カウンタを+1する
    Response.Write nLINE & "行目 " '行番号の表示
    Response.Write strDATA  '読み込んだデータを表示
    Response.Write "<BR>"   '改行のタグを入れる
    '*3行カウンタが5、10、15、、5で/って余りが0なら
    '<HR>タグを挿入する
    If nLINE Mod 5 = 0 Then
        Response.Write "<HR>"   'タグを入れる
    End If
Loop

ループの中で、
    nLINE   = nline + 1     '*2行カウンタを+1する
とカウントアップして、
    If nLINE Mod 5 = 0 Then
        Response.Write "<HR>"   'タグを入れる
    End If
で、判断してます。

http://www.ken3.org/cgi-bin/test/test018-1.asp
をテストで実行すると、
おっ、なんとか線で区切られました。

/*
 * 3.もう一つのアプローチ方法
*/

1行目 2002/12/05 8:11:04 , 満足
2行目 2002/12/05 8:14:12 , 普通
3行目 2002/12/05 15:53:28 , 満足
4行目 2002/12/05 15:53:44 , 不満
5行目 2002/12/05 19:41:41 , 不満
--------------------------------------
6行目 2002/12/06 13:10:22 , 満足

と行番号を表示しないなら、
別な考え方もあります。

行番号が5、10、15...の後に区切りの線を引きたいなぁ。
区切りの線は<HR>タグを出力するとして、
さて、どうしようかなぁ。
5で割って余りが0の時に出力にしよう。

と初めの考え方は、余りが0の時にHRを出力しましょうでした。

この考え方を変えて、
1、2、3、4、5、はいここで区切りを出力、
再度1から数えて、
1、2、3、4、5、はいここで区切りを出力
と、
1〜5まで数えて、5の時に区切りを出力、
出力後はまた1から数えさせる、
なんて考え方もアリかなぁ。

/*
 * 4.カウンターの初期化をうまく使う
*/

下記がサンプルです。

-- test018-2.asp
<%@LANGUAGE=VBScript%>
<html>
<head>
<title>カウンター初期化のタイミング</title>
</head>
<body>
<h2>カウンター初期化のタイミング</h2>
test018-2.asp<br>
動作仕様:test008.txtを読み込み、5行単位で線を引く(<HR>タグを入れる)
<hr>
<%
'FileSystemObjectを生成します
Set objFS = Server.CreateObject("Scripting.FileSystemObject")

'test008.txt を読取専用モードで開く
Set ts = objFS.OpenTextFile(Server.MapPath("test008.txt"), 1, True)

Dim nLINE  '*1行数のカウンター
nLINE = 0  'カウンターを初期化

Do While ts.AtEndOfStream = False  'ファイルの終端になってない間ループ
    strDATA = ts.ReadLine   'ファイルからデータを一行を読む
    nLINE   = nline + 1     '*2行カウンタを+1する
    Response.Write strDATA  '読み込んだデータを表示
    Response.Write "<BR>"   '改行のタグを入れる
    '*3行カウンタが5なら<HR>タグを挿入、カウンタクリア
    If nLINE = 5 Then       'カウンタが5になったか?
        Response.Write "<HR>"   'タグを入れる
        nLINE = 0               'カウンターをクリアする
    End If
Loop

ts.close  '使ったファイルは閉じようよ

%>
<hr>
<A HREF="test008.txt">使用したtest008.txtを見る</A><br>
<br>

</body>
</html>
---

ポイントは、
Dim nLINE  '*1行数のカウンター
nLINE = 0  'カウンターを初期化

Do While ts.AtEndOfStream = False  'ファイルの終端になってない間ループ
    strDATA = ts.ReadLine   'ファイルからデータを一行を読む
    nLINE   = nline + 1     '*2行カウンタを+1する
    Response.Write strDATA  '読み込んだデータを表示
    Response.Write "<BR>"   '改行のタグを入れる
    '*3行カウンタが5なら<HR>タグを挿入、カウンタクリア
    If nLINE = 5 Then       'カウンタが5になったか?
        Response.Write "<HR>"   'タグを入れる
        nLINE = 0               'カウンターをクリアする
    End If
Loop

で、
If nLINE = 5 Then
カウンタが5になったか確認して、
5の時は、<HR>タグの出力
そして忘れてはいけない
カウンターを初期化の
nLINE = 0
です。

行番号を表示しないなら、
こんな考え方もありってことで。

http://www.ken3.org/cgi-bin/test/test018-2.asp
をテストで実行出来ます。
*なんか行番号が無いと、、、落ち着かないかも。

/*
 * 5.終わりの挨拶
*/

今回は、
・Mod演算子を使って、5行区切りに挑戦
・カウンター初期化のタイミングを考えて同じ処理に挑戦
でした。

プログラムは、いろいろな考え方があるので、
楽しいでしょ?
えっ、楽しくない、、、う〜ん、例題のキレがまだイマイチでしたね。

MOD演算子はほかでも使うと思うので、覚えておいて損は無いと思います。

最強ページへの道のりは遠いなぁ〜。

またね(笑)

何か質問・感想があったら、気軽に、
メール、掲示板に書き込んでくださいね。

三流プログラマーのKen3でした。

No.19 2002/12/16
001行目と表示したくてRight関数を使う
[ページTOPへ戻る]
<001行目と表示したくてRight関数を使う>

こんにちは、Ken3です。

今回も、軽くで、
001と表示したくてRight関数を使う
です。

あまり期待しないでね。

/*
 * 1.001行目と桁をそろえて表示してみたいとフト思う
*/

前回の
http://www.ken3.org/cgi-bin/test/test018-1.asp
をテストで実行すると、
行番号と5行単位で区切られて表示してました。

1行目 2002/12/05 8:11:04 , 満足
2行目 2002/12/05 8:14:12 , 普通
3行目 2002/12/05 15:53:28 , 満足
4行目 2002/12/05 15:53:44 , 不満
5行目 2002/12/05 19:41:41 , 不満
---------------------------------
6行目 2002/12/06 13:10:22 , 満足
7行目 2002/12/06 13:10:40 , 不正なパラメーターです
8行目 2002/12/06 15:28:53 , 満足
9行目 2002/12/06 15:29:34 , 普通
10行目 2002/12/06 15:29:35 , 不満
---------------------------------
11行目 2002/12/06 16:19:12 , 不満

これでもいいんだけど、
ふと、
1行目
の行番号を
001行目
と桁数を3桁固定にしてみたくなりました。

/*
 * 2.あれ?Format関数って使えないの?
*/

VBAも少し知ってる私は、
有名なFormat関数を使用して、
Format(カウンター,"000")
にすればOKだと思い軽く修正しました。

Do While ts.AtEndOfStream = False  '*6ファイルの終端になってない間ループ
    strDATA = ts.ReadLine   'ファイルからデータを一行を読む
    nLINE   = nline + 1     '行カウンタを+1する
    Response.Write Format(nLINE,"000") & "行目 " '*1行番号の表示
    Response.Write strDATA  '読み込んだデータを表示
    Response.Write "<BR>"   '改行のタグを入れる
    '行カウンタが5、10、15、、5で/って余りが0なら
    '<HR>タグを挿入する
    If nLINE Mod 5 = 0 Then
        Response.Write "<HR>"   'タグを入れる
    End If
Loop

の表示部分を、
    Response.Write Format(nLINE,"000") & "行目 " '*1行番号の表示
に変えました、余裕でしょ。

あれ?

エラー タイプ
Microsoft VBScript 実行時エラー (0x800A000D)
型が一致しません。: 'Format'
/test/test019-1.asp, line 26

ウソでしょ?エラーだよ。
なんで?

何でジャねぇダロ三流君、
ASP(VBScript)に、
Format関数は無いんだよ。存在しないの。

またまたぁ。
と
思い、少し調べてみると、やはり無いみたい。

/*
 * 3.違う関数で代用するか(Right関数を使用する)
*/

無いものはしょうがない、作るか。
なんて話を大きくしないで、
違う関数で代用してみます。

代用?どんな感じで?

よく使っている&の文字列連結
と
文字列の右から取ってくるRight関数
を組み合わせて使ってみます。

Right関数の書式は、
Right(文字列,抜き出す文字数)
なので、
Right("000" & カウンタ変数, 3)
で、
頭に000を強引に付けてから、右3文字を取ります。

カウンタが1の時は"000"に1を連結後の
0001の右から3文字取るので、
001となり
カウンタが12の時は、"000"に12を連結後の
00012の右から3文字取るので
012となります。

/*
 * 4.Right("000" & nLINE, 3)でなんとか完成
*/

Right("000" & nLINE, 3)に修正すると、

-- test019-1.asp
<%@LANGUAGE=VBScript%>
<html>
<head>
<title>Right("000" & nLINE, 3)を使用して001の三桁で表示</title>
</head>
<body>
<h2>Right("000" & nLINE, 3)を使用して001の三桁で表示</h2>
test019-1.asp<br>
動作仕様:<br>
test008.txtを読み込み、5行単位で線を引く(<HR>タグを入れる)<br>
行番号を001の三桁0付きで表示する<br>
<hr>
<%
'FileSystemObjectを生成します
Set objFS = Server.CreateObject("Scripting.FileSystemObject")

'test008.txt を読取専用モードで開く
Set ts = objFS.OpenTextFile(Server.MapPath("test008.txt"), 1, True)

Dim nLINE  '行数のカウンター
nLINE = 0  'カウンターを初期化

Do While ts.AtEndOfStream = False  '*6ファイルの終端になってない間ループ
    strDATA = ts.ReadLine   'ファイルからデータを一行を読む
    nLINE   = nline + 1     '行カウンタを+1する
    Response.Write Right("000" & nLINE, 3) & "行目 " '*1行番号の表示
    Response.Write strDATA  '読み込んだデータを表示
    Response.Write "<BR>"   '改行のタグを入れる
    '行カウンタが5、10、15、、5で/って余りが0なら
    '<HR>タグを挿入する
    If nLINE Mod 5 = 0 Then
        Response.Write "<HR>"   'タグを入れる
    End If
Loop

ts.close  '使ったファイルは閉じようよ

%>
<hr>
<A HREF="test008.txt">使用したtest008.txtを見る</A><br>
<br>

</body>
</html>
---

なんとか、
Response.Write Right("000" & nLINE, 3) & "行目 " '*1行番号の表示
で無事にできました。

http://www.ken3.org/cgi-bin/test/test019-1.asp
を見て笑ってください。

/*
 * 5.終わりの挨拶
*/

今回は、
・えっ、VBAで有名なFormat関数無いの?
・Right("000" & nLINE, 3)でかわしてみました
でした。

できないとあせるけど、
プログラムって、楽しいでしょ?

Right("000" & nLINE, 3)
は
苦肉の策だったけどね。

最強ページへの道のりは遠いなぁ〜。

またね(笑)

何か質問・感想があったら、気軽に、
メール、掲示板に書き込んでくださいね。

三流プログラマーのKen3でした。



ページフッター リンクや広告、質問送信など

三流解説を読んでいただき、どうもです。ここから下は、三流君宛のメッセージ送信や 三流君のホームページの紹介・案内です
目的の情報が見つかったか?少々心配しつつ、、、※質問や感想は、気軽に送ってくださいね。

まぁ、基本はデータの受け取りかなぁ。
・[Form等を使用したデータのやり取り]・・・ASPと言っても、HTMLの入力フォームからデータを受け取ります。POSTやGETでやりとりを押さえますか。

次は、データの入出力 で ADOを使った(ADOで接続) と SQLの解説を少々
・[ADOでMdbファイルを使う]・・・MDBと接続して、簡単な追加・更新・削除を行った。
・[ADOでExcelと接続してみた]・・・.xlsと接続してSQLを使ってみた。
・[ADOでCSVと接続してみた]・・・.CSV テキストを読み出した。※更新・削除はできません

DBが使えるので、あまり使用しないけど、普通のテキストファイル処理
・[テキストファイル処理]・・・ファイルを開いて、書き込む。1行読み込みなどを軽く

VBScriptでFormat関数が無いなど、微妙にVBAと違うけど
[VBScript関数関係の説明]・・・少し、処理を書いてみた。
[その他処理サンプル]・・・あまり良いサンプル作れなかったけど。。。
何かの参考となれば幸いです。

ニガテな環境設定系など
[Win2003 Server に IIS を Setup]・・・ポイントの無い、ほぼ一本道解説だけど。
[IIS 仮想ディレクトの作成とASP動作TEST]・・・Web拡張でASPを有効にしただけです。

Blog:[三流君の作業日記]/ [サンプルコードのゴミ箱]/ 広告-[通販人気商品の足跡]

質問や要望など メッセージを送る(三流君に連絡する)

質問や要望など連絡方法でお互い確認が取りやすく、便利なのが掲示板なのですが、私の対応のまずさから不定期で荒れてしまい、掲示板は現在封鎖中です。(反省しなきゃ)
感想や質問・要望・苦情など 三流君へメッセージを送る。
時間的余裕のある要望・質問・苦情の場合は、下記のフォームからメッセージを送ることができます。

あなたのお名前(ニックネーム):さん
返信は?: 不用(HP更新を待つ) , E-mail→ アドレス:に返事をもらいたい



(感想や質問・要望 メッセージはHPで記事に載せることがあります。)


急ぎで連絡がほしい、そんな時は:[三流君連絡先アドレス]を見て連絡してください。



[三流君(TOP ken3.org へ戻る)] / [ASPで遊ぶ、失敗する] / [ASP記事 バックナンバー目次]