プログラム の記事一覧

| 次のページ


--------(--)

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
2014-12-28(Sun)

SQL ServerのトリガーでViewに対してINSERTやUPDATEを行う

単純なViewであればViewに対してINSERTやUPDATEが可能ですが、そうでない場合にはViewにトリガーを設定することで
任意のテーブルに対してINSERTやUPDATEや実行することが可能です。

Viewに対してはINSTED OF で本来のINSERTやUPDATE動作を置き換えることのみ可能です。
INSERTの場合にはINSERTED.列名で、DELETEの場合にはDELETED.列名で、UPDATEの場合にはINSERTED.列名で更新後の値、DELETED.列名で更新前の値が取得できます。
スポンサーサイト
2014-12-28(Sun)

別セグメントのサーバー間で分散トランザクション

ASP.NETで分散トランザクションを行う必要がありました。
WEBサーバーとDBサーバーが同一サーバーの場合には、MSDTC(Distributed Transaction Coordinator)
が動作していれば分散トランザクションが動作可能ですが、別サーバーとなると話が厄介です。
別セグメントのサーバーで間にファイアウォールがあるとさらに厄介になります。
一応以下の設定を行うことで動作しましたので記録として残しておきます。


1.ローカルDTCのネットワークアクセス設定。
dcomcfg.exeを起動し以下を設定。
[コンポーネントサービス]-[コンピューター]-[マイコンピューター]-[Distributed Transaction Coordinator]-[ローカルDTC]のプロパティの[セキュリティ]タブの以下をチェック。

ネットワークDTCアクセス
 トランザクションマネージャー通信
 ☑受信を許可する  ☑送信を許可する
 ☑認証を必要としない


2.RPCで使用するポートを限定。
regedit.exeを起動し以下を設定。
HKLM\Software\Microsoft\RPC\Internetキーを作成し、以下のエントリを追加。
 Ports(REG_MULTI_SZ):5000-6000
 PortsInternetAvailable(REG_SZ):Y
 UseInternetPorts(REG_SZ):Y
※変更後は再起動が必要。

3.Windowsファイアウォール設定。
Windowsファイアウォールで以下を設定。
☑分散トランザクションコーディネーター

4.NetBIOS名の解決。
双方のサーバーのNetBIOS名の名前解決が出来るようにしておく。
できない場合には、hostsにエントリを追加する。

5.サーバー間のファイアウォール設定。
サーバー間にファイアウォールがある場合に双方向で以下を許可する。
 135/TCP(NetBIOS名前解決)
 5000-6000/TCP(RPC)
※RPCのポートは2.で設定したポートに合わせる。
2014-09-05(Fri)

BATの加減算

前月分のログをアーカイブするため、今日の日付から前月の年月を求めるBATをずっと使ていたのですが、8月、9月が上手く動作しませんでした。

以下前月YYYYMMを求める部分のみ抜粋
--------------------------------------------------
SET YYYY=%DATE:~0,4%
SET MM=%DATE:~5,2%

IF %MM%==01 (
SET /A YYYY=%YYYY%-1
SET MM=12
) ELSE (
SET /A MM=%MM%-1
)
SET MM=0%MM%
SET MM=%MM:~-2%
SET YYYYMM=%YYYY%%MM%
--------------------------------------------------

SET /A MM=%MM%-1 の行で、
「無効な数字です。数値定数は 10 進 (17 桁)、16 進 (0x11 桁)、
または 8 進 (021 桁) です。」
というエラーになってしまいます。

実際には今は9月なので、
SET /A MM=09-1
となっているのですが、どうも"09"の部分がダメなようで
SET /A MM=9-1
となるようにすれば問題ないようです(00~07は大丈夫ですが、08と09がダメです)。
08と09は、何者と見なしているのでしょうか??

これを考慮し、以下のように変更しました。
--------------------------------------------------
SET YYYY=%DATE:~0,4%
SET MM=%DATE:~5,2%

IF %MM%==01 (
SET /A YYYY=%YYYY%-1
SET MM=13
) ELSE (
IF %MM:~0,1%==0 SET MM=%MM:~-1%
)
SET /A MM=%MM%-1
SET MM=0%MM%
SET MM=%MM:~-2%
SET YYYYMM=%YYYY%%MM%
--------------------------------------------------
2014-04-02(Wed)

ASP.NETのDataPagerでページ移動時にメッセージを表示

ASP.NETのListViewコントロールを使用し、行単位ではなくページ単位でデータの更新を行う処理をしているのですが、DataPegerでページ移動を行うときに確認メッセージを表示してからデータの更新を行いたいと思いました。

とりあえず今回のケースではページ移動ボタン文字が<<,<,>,>>となっているという前提ですが、ちょっと作りが強引すぎたかもしれません・・・

aspxのwindow.onloadやJQueryの$(document).readyでページャーの移動ボタンやページ番号リンククリック時に呼び出すJavaScriptを登録するSetPagerFunctionを実行するだけです。

■aspxファイル
$(document).ready(function () {
SetPagerFunction('changePager');
});



/*
*ページャー変更時の確認メッセージ表示(ページャー変更時にこの関数が呼び出されます)
*/
function changePager() {
if (document.getElementById('<%=hidPageDirty.ClientID %>').value == 'true') {
if (confirm('変更内容を保存しますか?')) {
return true;
} else {
return false;
}
} else {
return true;
}
}


■共通で使用するJavaScript関数
/*
*ページャーの移動ボタンに確認メッセージを設定
*/
function SetPagerFunction(pScript) {
//移動ボタン(<<, <, >, >>)
var strText1 = ['<<', '<', '>', '>>'];
var ctl1 = document.getElementsByTagName("input");
for (var i = 0; i < ctl1.length; i++) {
if ($.inArray(ctl1[i].value, strText1) > -1) {
if (ctl1[i].onclick) {
var strJs = ctl1[i].onclick.toString();
var i1 = strJs.indexOf('__doPostBack');
var i2 = strJs.indexOf(';', i1);
strJs = 'if(' + pScript + '()){' + strJs.substr(i1, i2);
ctl1[i].onclick = new Function(strJs);
}
}
}
//ページ番号リンク(1~1000までを想定)
var ctl2 = document.getElementsByTagName("a");
for (var i = 0; i < ctl2.length; i++) {
if (parseInt(ctl2[i].innerText) > 0 && parseInt(ctl2[i].innerText) < 1000) {
var strJs = ctl2[i].getAttribute('href');
if (strJs.indexOf('javascript:') > -1) {
strJs = 'javascript:' + 'if(' + pScript + '()){' + strJs.substr(11) + ';}';
ctl2[i].setAttribute('href', strJs);
}
}
}
}
2014-02-28(Fri)

JavaScriptで文字の部分選択

ASP.NETでAjaxControlToolkitのMaskedEditExtenderを使って入力チェックをかけてみました。
入力項目がフォーカスを得た時には、文字を選択状態にし即座に上書き入力ができるようにという条件があります。
ところが、文字を選択状態にすると小数点のある数値の入力がうまくいきません。
いろいろ試してみると、整数部のみを選択状態にしておくと入力がうまくいくようなので、入力項目がフォーカス
を得た時に通常は全文字を選択し、小数点項目については整数部のみ選択するようにしてみました。

なお、前提としてMaskedEditExtenderのIDは入力項目のID + "Mee"という名前になっています。


$(document).ready(function () {
$('input[type=text], input[type=password], textarea').focus(function () {
var str = this.id + 'Mee';
if ($find(str)) {
//MaskedEditExtender項目
var mee = $find(str);
if (mee._Mask.indexOf('.') > -1) {
//Mask文字に小数点あり
if (this.createTextRange) {
//createTextRangeをサポート(IE)
var rng = this.createTextRange();
setTimeout(function () { rng.moveStart("character", 0); }, 0);
setTimeout(function () { rng.moveEnd("character", mee._Mask.indexOf('.') - mee._Mask.length); }, 0);
setTimeout(function () { rng.select(); }, 0);
} else {
//createTextRangeを非サポート(IE以外)
var self = this;
setTimeout(function () { self.setSelectionRange(0, mee._Mask.indexOf('.') + mee._AcceptNegative); }, 0);
}
} else {
//Mask文字に小数点なし
var self = this;
setTimeout(function () { $(self).select(); }, 0);
}
} else {
//MaskedEditExtender項目以外
var self = this;
setTimeout(function () { $(self).select(); }, 0);
}
}
});


かなり特殊な用途なので必要になることは少ないと思いますが、IE、IE互換モード、Safari、Chromeで動作確認しました。

2014-02-13(Thu)

JavaScriptでscrollTopとscrollLeftの値が取得できない

Elementの位置やサイズ計算の為、JavaScriptでscrollTopとscrollLeftの値を取得しようとしていたのですが、なぜか値が0になります。

以下がコードサンプルです。

$(document).ready(function () {
alert(document.documentElement.scrollLeft || document.body.scrollLeft);
});


いろいろとテストしてみると、jQuery(document).readyはDOMツリーが作成されると実行されるようで、この時点ではscrollの値が取れないようです。
これに対しwindow.onloadはページがロードされ画面表示されてから実行されるので、scrollの値が取れるようです。
以下のサンプルコードでは問題なく取得できました。

window.onload = function () {
alert(document.documentElement.scrollLeft || document.body.scrollLeft);
}

2013-11-28(Thu)

Excel2013をスクリプトで操作すると遅い

最近、あまりスクリプト等でExcel Bookを操作することがなかったのですが、Excel2013を操作するとExcel2010までと比べて異常に時間がかかるようになったと聞きました。

たしかに、Excel2013は画面アニメーションが派手になったので画面表示に時間がかかっている気がし、最初に Application.ScreenUpdating = False を入れてみると快適に更新が終了しました。

以前は当たり前のように入れていたのですが、最近触っていなかったのですっかり忘れていました。
2013-10-10(Thu)

ASP.NETで新しいウィンドウ(タブ)に表示(タブレット編)。

以前ASP.NETで新しいウィンドウ(タブ)に表示で紹介した以下の方法ですが、タブレットでは通用しませんでした。
確認したのはiPad、Android(標準ブラウザ、Chrome)です。

this.form.target = '_blank';

よく確認してはいないのですが、とりあえず以下であればほとんどの環境でいけそうです。

document.forms(0).target = '_blank'
※複数のフォームがあるときは、それなりに考慮してくださいね。
2013-09-13(Fri)

SQL Server の OUTPUT句

あるテーブルにレコードの追加、更新、削除を行ったときに、ログテーブルに履歴を残す処理を行いたいと思いました。
この、あるテーブルはIdentity列が主キーとなっており、自動的に発番された主キーの値をどう取得しようかと思っていたのですが、いろいろ調べてみるとSQL Server 2005以降であればOUTPUT句なるものがあり、これが便利に使えそうなので早速テストしてみました。

------------------------------------------------
あるテーブル:[DAT]
 列[ID]:int、identity、主キー
 列[NAME]:nvarchar

ログテーブル:[LOG]
 列[ID]:int
 列[KUBUN]:nvarchar
------------------------------------------------


上記のあるテーブルを更新した記録をログテーブルに残すと仮定します。

------------------------------------------------
レコード追加
------------------------------------------------
INSERT INTO DAT (NAME)
OUTPUT INSERTED.ID, '追加'
INTO LOG (ID, KUBUN)
VALUES ('青木')


------------------------------------------------
レコード更新
------------------------------------------------
UPDATE DAT
SET NAME = '笹木'
OUTPUT INSERTED.ID, '更新'
INTO LOG (ID, KUBUN)
WHERE ID = 1


------------------------------------------------
レコード削除
------------------------------------------------
DELETE FROM DAT
OUTPUT DELETED.ID, '削除'
INTO LOG (ID, KUBUN)
WHERE ID = 2


これだけで、あるテーブルを更新すると同時にログテーブルに履歴を残すことが出来ます。
追加や更新したIdentity列の値はINSERTED.[列名]、削除したIdentity列の値はDELETED.[列名]で取得できました。
SQL Server 2005以降の環境限定ですが、非常に便利だと感じました。
2013-05-14(Tue)

ASP.NETで新しいウィンドウ(タブ)に表示。

ASP.NETで処理結果を新しいページ(タブ)に表示する方法です。

ASP.NETのHyperLinkコントロールであれば、Targetプロパティを_blankにすることで可能です。


汎用的に使うために、以下のようなメソッドを作成することも可能です。
Sub OpenNewWindow()
Dim strUrl As String = String.Format("")
pPage.ClientScript.RegisterStartupScript(Page.GetType, "key1", strUrl)
End Sub

クライアントJavaScriptであれば、以下で可能です。
window.open([URL文字列], "", "");

今回はクライアントに処理を返さずにサーバー側だけで行う必要があったので、以下のようにしてみました。
目的の処理を実行させるボタンに、目印としてtarget=_blankを設定(なんでもいいのですが・・・)
JQueryで以下を記述。

$('input[target=_blank]').focus(function () {
this.form.target = '_blank';
});

$('input[target=_blank]').blur(function () {
this.form.target = '_self';
});

あとはボタンのクリックイベントに、Server.Transfer('URL文字')を記述します。
もちろん、一旦クライアントに処理を返すのであれば、Response.Redirect('URL文字')でもかまいません。

最初はクライアント側のclickイベントでで行ってみたのですが、どうも先にPostBackされるようで思った動作になりませんでした。


 
プロフィール
Author:OMEGAT
FC2ブログへようこそ!
カレンダー
07 | 2017/08 | 09
- - 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 - -
FC2カウンター
最新記事
最新コメント
最新トラックバック
月別アーカイブ
忍者AdMax
検索フォーム
カテゴリ
ブロとも申請フォーム

この人とブロともになる

amazonお奨め商品



上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。