<   2008年 11月 ( 23 )   > この月の画像一覧
(HTML)JavaScriptの有効、無効でページの内容を切り替える方法
こちらを参考にしました。
↑で記述されているように2つの方法があるみたいです。
1. 基本エラーページを表示していて、JS 有効時に正常なページを表示する
2. JS が無効なら noscript タグの部分に META でエラーページへ誘導する


これで、1の方法でやってみました。

<html><head>
....
</head>
<body>

<!--JavaScript無効対策-->
<div id="JSNG" class="nonJs">
<p>JavaScriptが無効にされています。本サイトはJavaScriptを有効にしてご覧ください。</p>
</div>
<script type="text/javascript">
document.getElementById("JSNG").style.display = "none";
</script>

<div class="mainContents" id="mainContents" >
ここにメインコンテンツを記述。
</div>
<!--JavaScript無効化対策-->
<script type="text/javascript">
document.getElementById("mainContents").style.display = "inline-block";
</script>

</body>
</html>

(なんかエキサイトブログの厚かましい使用のせいでdocument.のdを全角にしてるのでコピペする場合は注意してください)
これで、JavaScriptが無効なら id=JSNG のブロック要素のみが表示され、有効なら id=mainContents のブロック要素のみが表示される仕組みです。
[PR]
by jehoshaphat | 2008-11-29 22:23 | Webがらみ | Trackback | Comments(0)
(VB.Net、SQL)OLEDBでのパラメータクエリ
.NetからOLE DBでmdb(Access)に対してパラメータクエリをする方法です。
OLEDBでは名前付きパラメータは使えず、パラメータの順序で対応するプレースホルダが決まるみたいなので注意が必要です。
(でも、パラメータに名前があっても問題は無いようです)

下記がVB.NetからOLEDBでクエリを投げる例です。

Dim cn As New OleDb.OleDbConnection
cn.ConnectionString = m_adpCustomer.Connection.ConnectionString
Dim cmd As New OleDb.OleDbCommand()
cmd.Connection = cn
 
'SQL文字列生成
Dim strSQL As New System.Text.StringBuilder()
strSQL.AppendLine("SELECT * ")
strSQL.AppendLine("FROM Customer ")
strSQL.AppendLine("WHERE CustomerNo>=?")
strSQL.AppendLine(" AND CustomerNo<=?")
'パラメータクエリ(プレースホルダ)指定
Dim plam1 As New OleDb.OleDbParameter("@CondNoFrom", System.Data.OleDb.OleDbType.Integer)
plam1.Value = "10"
cmd.Parameters.Add(plam1)
Dim plam2 As New OleDb.OleDbParameter("@CondNoTo", System.Data.OleDb.OleDbType.Integer)
plam2.Value = "20"
cmd.Parameters.Add(plam2)
 
'SQLコマンドの設定
cmd.Connection = cn
cmd.CommandText = strSQL.ToString()
Dim dAdp As New OleDb.OleDbDataAdapter(cmd)
Dim dset As New DataSet()
'クエリ実行
dAdp.Fill(dset)
For Each row As DataRow In dset.Tables(0).Rows
Console.WriteLine(row(0).ToString())
Next


参考:
OleDb接続で、パラメータクエリ
【C#】【OLE DB】SQLを発行する際の名前付きパラメータ(プレースホルダ)
[PR]
by jehoshaphat | 2008-11-29 21:52 | .Net開発 | Trackback | Comments(0)
エキサイトブログで表(罫線)を表現したい
普通のHTMLであれば、tableタグを用いることで表(テーブル)を表現できるのですが、エキサイトブログは table タグが使えません。

で、いろいろ探してみたところ、CSSでborderを設定することで罫線を引くことができるようです。
その方法が<table> タグを使えないExciteブログの記事内に表を挿入する方法
ただ、この方法だと列幅が固定になってしまいます。
そして、一番の欠点はDBのテーブル例とかで列数が多い時に表示しきれないうえ、列幅を超える文字数を指定すると次の列とダブってしまうということです。
こんな感じになってしまいます。
あいうえおあいうえお
かきくけこかきくけこ
かきくけこかきくけこ
かきくけこかきくけこ

行1-1
行1-2
行1-3
行1-4

行2-1
行2-2
行2-3
行2-4





で、考えたのは結局シンプルにテキスト記述の罫線表を作ることです。
これもいちいち手で書いてると時間かかるので、mkTableなどのツールを使って表を作ります。
これを普通にエキサイトブログに張り付けるとフォントが等幅じゃないので崩れます。
で pre タグで囲ってやると意図どおりになります。
こんな感じです。

┌──────────┬──────────┬──────────┬──────────┐
│あいうえおあいうえお│かきくけこかきくけこ│さしすせそさしすせそ│たちつてとたちつてと│
├──────────┼──────────┼──────────┼──────────┤
│行1-1 │行1-2 │行1-3 │行1-4 │
├──────────┼──────────┼──────────┼──────────┤
│行2-1 │行2-2 │行2-3 │行2-4 │
└──────────┴──────────┴──────────┴──────────┘


追記:
preタグを使ってやる場合、フォントを等幅にしないとうまく表示されません。
スタイルシートで下記のように等幅をフォントを指定してやりましょう

font-family:"MS ゴシック","IPAゴシック",monospace,sans-serif;

。MacとLinuxの等幅フォントがわからなかったので、とりあえず、MSゴシックとIPAゴシックだけ指定しました。monospaceでも等幅になりますが、スペースが等幅にならなかったりします。
また、IE8,Chrome,Firefox3ではOKだったんですが、Firefox4ではわずかにずれます。
[PR]
by jehoshaphat | 2008-11-29 21:12 | Webがらみ | Trackback | Comments(0)
(VB.Net)フォームの表示位置を設定
したいこと:親フォームから別のフォームを表示するときに、親フォームと同じ位置に表示したい

DesktopLocationプロパティで設定できます。
注意しないといけないのはStartPositionプロパティをFormStartPosition.Manualに設定しないといけないことです。
このStartPositionプロパティに気付くのに無駄な時間を費やしました。


Dim frmChild As New frmChild()
'フォームの表示位置は手動指定
frmChild.StartPosition = FormStartPosition.Manual
'親フォームの位置を子フォームに設定
frmChild.DesktopLocation = Me.DesktopLocation


(ちなみに Locationプロパティと DesktopLocationプロパティの違いはDesktopLocationプロパティがツールバーやタスク・バーなどを除外した画面領域になるという点です。)

参考:Windowsフォームの開始表示位置を設定するには?
[PR]
by jehoshaphat | 2008-11-29 20:27 | .Net開発 | Trackback | Comments(0)
(SQL)Accessでは結合条件にLiteralが書けない!?
この直前の記事(SQL)SQLで区分などの複数の意味を持たせてるテーブルを何回も結合する方法でSQLを紹介しましたが、あのSQLをAccessで実行したら「JOIN式はサポートされていません。」というエラーが出ました。

いろいろ試したところどうやら結合条件(ON句)で下記のようにリテラルが使えないようです。

Customer.SettingDiv = 1 ←この1というリテラルがダメっぽい。

ということで、途方に暮れたのですが、同僚に聞いたところ副問い合わせを駆使することで解決しました。
下記のような感じです。(Access方言のため、JOINに括弧が入ってます)

SELECT Customer.ID ,
Customer.CustomerName ,
Customer.BloodType ,
BloodTypeText.Contents ,
Customer.Sex ,
SexText.Contents ,
Customer.Job ,
JobText.Contents
FROM (((Customer
LEFT OUTER JOIN
(SELECT *
FROM Setting
WHERE SettingDiv =1
) BloodTypeText
ON Customer.BloodType= BloodTypeText.SettingID)
LEFT OUTER JOIN
(SELECT *
FROM Setting
WHERE SettingDiv =2
) SexText
ON Customer.Sex = SexText.SettingID)
LEFT OUTER JOIN
(SELECT *
FROM Setting
WHERE SettingDiv =3
) JobText
ON Customer.Job = JobText.SettingID)


まったく、AccessのSQLにはやられますわ。
本当は使いたくないんですが、スタンドアロンアプリのデータ保存にはmdbが一番手軽なので、OLEDB経由で仕方なく使ってます。
[PR]
by jehoshaphat | 2008-11-29 19:57 | SQL | Trackback | Comments(1)
(SQL)SQLで区分などの複数の意味を持たせてるテーブルを何回も結合する方法
ちょっと題名の意味がわけわかめですが、つまりまあこういうことです。
データベースで区分とか設定情報とかは意味が異なったとしても1つのテーブルにまとめることが多いと思います。
下記は区分の名称を1つのテーブルでもたした例です。
"SettingDiv"列が区分IDで、"SettingID"列が各区分毎のデータを識別するIDです。
テーブル名は "Setting" とします。
ここで血液型区分が 1, 性別区分が 2, 職業区分が 3 と決めています。
┌─────┬─────┬────┐
│SettingDiv│SettingID │Contents│
├─────┼─────┼────┤
│1 │1 │A型 │
├─────┼─────┼────┤
│1 │2 │B型 │
├─────┼─────┼────┤
│1 │3 │O型 │
├─────┼─────┼────┤
│1 │4 │AB型 │
├─────┼─────┼────┤
│2 │1 │男性 │
├─────┼─────┼────┤
│2 │2 │女性 │
├─────┼─────┼────┤
│3 │1 │会社員 │
├─────┼─────┼────┤
│3 │2 │ニート │
├─────┼─────┼────┤
│3 │3 │自営業 │
├─────┼─────┼────┤
│3 │4 │学生 │
└─────┴─────┴────┘

これとは別に"Customer"テーブルがあり、各設定項目が設定テーブルのSettingと結びついています。
┌─┬──────┬─────┬──┬──┐
│ID│CustomerName│BloodType │Sex │Job │
├─┼──────┼─────┼──┼──┤
│1 │テスト1 │2 │1 │1 │
├─┼──────┼─────┼──┼──┤
│2 │テスト2 │ │2 │2 │
├─┼──────┼─────┼──┼──┤
│3 │テスト3 │3 │2 │ │
└─┴──────┴─────┴──┴──┘

で、下記のような出力を出すようなSQLを書きたいのです。
┌─┬──────┬─────┬───────────┬──┬────────┬──┬────────┐
│ID│CustomerName│BloodType │BloodTypeText.Contents│Sex │SexText.Contents│Job │JobText.Contents│
├─┼──────┼─────┼───────────┼──┼────────┼──┼────────┤
│1 │テスト1 │2 │B型 │1 │男性 │1 │会社員 │
├─┼──────┼─────┼───────────┼──┼────────┼──┼────────┤
│2 │テスト2 │ │ │2 │女性 │2 │ニート │
├─┼──────┼─────┼───────────┼──┼────────┼──┼────────┤
│3 │テスト3 │3 │O型 │2 │女性 │ │ │
└─┴──────┴─────┴───────────┴──┴────────┴──┴────────┘

要は、Costomerテーブルと複数の区分を持たせてあるSettingテーブルを結合したいわけです。
そして、Customerの各区分の値がnullでも結合させます。

で、この結果を出すにはSQLには下記のように結合すればいいみたいです。

SELECT Customer.ID ,
Customer.CustomerName ,
Customer.BloodType ,
BloodTypeText.Contents ,
Customer.Sex ,
SexText.Contents ,
Customer.Job ,
JobText.Contents
FROM Customer
LEFT OUTER JOIN Setting BloodTypeText
ON Customer.BloodType = BloodTypeText.SettingID
AND Customer.SettingDiv = 1
LEFT OUTER JOIN Setting SexText
ON Customer.Sex = SexText.SettingID
AND Customer.SettingDiv = 2
LEFT OUTER JOIN Setting JobText
ON Customer.Job = JobText.SettingID
AND Customer.SettingDiv = 3

LEFT OUTER JOINでSettingテーブルを区分回数分結合します。
区分はリテラルとして、結合条件に記述します。
[PR]
by jehoshaphat | 2008-11-29 19:37 | SQL | Trackback | Comments(0)
(.Net)DataGridViewでリンク列の値とDataSourceの列の値を対応させる方法
したいこと:DataTableの"Mail"列の値をDataGridViewのリンク列(DataGridViewLinkColumn)で表示したい。

最初は、ループでリンクセルの Value プロパティに値を入れてたのですが、それだと値が表示されませんでした。

で、いろいろMSDN徘徊してるうちによーやく目的のことができるプロパティ見つけました。
DataGridViewColumn.DataPropertyNameプロパティです。
こいつの値にデータソースとなっているDataTableの"Mail"列の名前を指定することでできました。

いちおうサンプルソースです。
DataTableはすでに作成済で、DataTableの"Mail"列にDataGridViewのリンクセルに表示したい文字列が入ってるとします。

'DataGridView上の各種設定 (dtblは DataTable オブジェクト )
frmDataExt.dgvExtract.DataSource = dtbl
'奇数行の背景を変更
frmDataExt.dgvExtract.AlternatingRowsDefaultCellStyle.BackColor = Color.PeachPuff

'列の自動順番を解除
frmDataExt.dgvExtract.AutoGenerateColumns = False
 
'メールリンク列作成
Dim clmMail As New DataGridViewLinkColumn()

clmMail.Name = "メール"
'リンク押下後の色指定
clmMail.VisitedLinkColor = Color.DeepPink
'DataSoureに設定したDataTableのどの列の値をこの列の値として使用するか設定
clmMail.DataPropertyName = dtbl.Columns("Mail").ColumnName

'DataDridViewに列追加
frmDataExt.dgvExtract.Columns.Add(clmMail)

このプロパティの詳細はMSDN参照のこと。

このプロパティはSystem.Windows.Forms.DataGridViewColumnにあるので、それを継承している他のDataGirdViewでの列(DataGridViewButtonColumn , DataGridViewCheckBoxColumn , DataGridViewComboBoxColumn , DataGridViewImageColumn , DataGridViewTextBoxColumn)でもおそらく使えると思われます。

.Netはプロパティが膨大過ぎてなかなか覚えれませんね。
[PR]
by jehoshaphat | 2008-11-28 19:04 | .Net開発 | Trackback | Comments(0)
生年月日(誕生日)から簡単に年齢出す方法
ITProに載ってました。こちらです。
ちょうどDBに文字列形式で yyyyMMdd 形式で保存された生年月日から年齢を求める必要があったので助かりました。

具体的にはこう書けばいいみたいです。

(今日の日付-誕生日)/10000の小数点以下切捨て。


ということで、VB.Netバージョンのソースです。
DataTableのBirthday列に文字列で yyyyMMdd と保存されるとした場合です。

(CInt(DateTime.Today.ToString("yyyyMMdd")) - CInt(dtbl.Rows(0).Item("Birthday"))) / 10000


ちなみにこれだと小数点形式で帰ってくるので、小数点以下を切り捨てて、文字列で出す方法です。
.ToStringメソッドで書式指定してやります。

((CInt(DateTime.Today.ToString("yyyyMMdd")) - CInt(dtbl.Rows(0).Item("Birthday"))) / 10000).ToString("##")


数値型.ToString()での書式指定は結構便利なものですね。


ただ、この年齢求める方法は業務による年齢定義によって異なるという点が重要です。(たとえば誕生日の前日段階ですでの年齢がインクリメントするような定義など)
そこらへんの細かい話はこちらに論議されてました。
まあ、今回作ってるソフトの要件では概算年齢でもかまわないみたいなので、そのへんは深く考えていません。


追伸:
AccessのSQLで書くとこうなります。
(生年月日が文字列として "yyyyMMdd" 形式で列に格納されているとします。列名は "Birthday")
int((int(Format(Date(),"yyyymmdd")) - int(Birthday) )/ 10000)

[PR]
by jehoshaphat | 2008-11-27 21:33 | .Net開発 | Trackback | Comments(0)
(.Net)DataGridViewで列の順番指定しているのに指定どおりにならない。
題のままですが、DataGridView.Columns("CulumName").DisplayIndexプロパティで列の順番を指定したにも関わらず、意図どおりになりませんでした。

いろいろ悩んだ結果、原因は単純でした。
DataGridView.AutoGenerateColumns プロパティ が true になっていたためです。

このプロパティを false にすれば DisplayIndex で指定した通りの順番で表示されました。

しかし、MSDNのDisplayIndexプロパティのヘルプにはそのことは一切書いてません。
しっかりしてくれ、MS
[PR]
by jehoshaphat | 2008-11-27 21:23 | .Net開発 | Trackback | Comments(4)
SQLを整形してくれるオンラインツール
デバッグ中にウォッチ式から抽出したSQLとかアクセスのSQLとかは普通にテキストエディタに貼り付けただけではインデントがきれいになってないため非常に可読性が低いです。

ということで、SQLの構文を整形してくれるサイト見つけました。
http://www.sqlinform.com/

デスクトップ版もあるみたいです。
オンライン版はページ中ほどの「ACCEPT」ボタンを押下して、左側のテキストエリアにSQLをペーストし、右上の「Format」ボタンを押すと整形完了です。
SQLのキーワードはハイライトもしてくれます。
DBMSの種類もいろいろ選べるので、便利ですね。

ただ、このツールはJavaアプレットを使ってるっぽいのでJavaが入っている環境が必要です。
[PR]
by jehoshaphat | 2008-11-27 20:49 | SQL | Trackback | Comments(2)