2011年8月4日木曜日

ASP.NET GridViewの列を非表示にする

GridViewの列は、VisibleをFalseにすると値が取れなくなる。これに対処する方法はいくつかあるが、DataSourceIdを設定したデータソースバインディングを使用している場合だとうまくいかなかったりなど、何れの方法も難があったりする。

例:http://www.dev102.com/2008/03/05/how-to-hide-columns-of-a-gridview/
※これは、ObjectDataSourceを使用した場合うまくいかなかった

最終手段というわけではないが、結局下記のように消すのが一番良いという結論に達した。
・スタイル定義
<style>
.item-invisible
{
display:none

}
</style>

・GridView列定義
<asp:BoundField DataField="hoge" HeaderText="消す列" ItemStyle-CssClass=item-invisible HeaderStyle-CssClass=item-invisible>
</asp:BoundField>


ItemとHeader(必要があればFooterも)のスタイルをdisplay:noneにすれば消えてくれる。当然html上は出力されているのだが、もうサーバーサイドで値が取れないと四苦八苦するよりこちらの方が断然楽である。



2011年7月29日金曜日

Visual Studio vNext

次期Visual Studioのホワイトペーパー(日本語)が公開されてます


Visual Studio vNext: アプリケーション ライフサイクル管理
http://www.microsoft.com/japan/msdn/vstudio/using/paper/default.aspx


気になった点:StoryBoard Assistant
画面ショットをキャプチャして、簡易アニメーションを作成
というのがどこまで使えるかな?

2011年7月21日木曜日

ASP.NET positionが指定されたdiv内だとComboboxが正常に表示されない

AjaxComponentToolKitのComboboxは様々なバグがある。とりあえず、現時点で確認しているのは下記点。

・position:absolute/relativeが指定されたdiv内で使用すると、コンボボックスのリストの位置がずれる。これは、コンボボックスのリストの表示位置が画面左上からの絶対位置(absolute)で指定してされるためであり、このため親divでposition指定してしまうとうまくテキストボックスの下につかなくなる。

・display:noneで表示を隠している箇所にあるコンボボックスは、ボタンが消えリストも表示されなくなる。これは、display:noneが指定された箇所についてはオブジェクトの長さ(offsetWidth)が0になってしまうため・・・と思われる。

このトラップを回避するには、コンボボックスのスタイルの挙動をこちらでいじってやる必要がある。CSSとJavaScript、両方で対応する。
・CSSでの対応
・コンボボックスを使用するエリアには、以下スタイルを適用
.combo-area{
              position:static !important;
    }
    position absoluteがきくように、親要素のpositionをstaticで初期化する。!importantは、要素のstyleで直接指定されたものより優先される。

・JavaScriptでの対応(JQuery使用)
ComboboxのCssClassにcomboを設定した上で、下記スクリプトをonloadで走らせる。要素をdisplay:noneにするような処理(例:JQuery ui のアコーディオン処理など)がある場合、それより先行させる必要有り。
function adjustCombobox(){
$(".combo .ajax__combobox_itemlist").each(function(){

//コンボボックスの高さ指定(リスト要素×20pxで指定)
var liCount = $(this).find("li").length;
var h = 20 * liCount;
$(this).css("height", h + "px !important");

//コンボボックスの幅指定(テキストボックスの幅とあわせる)
var textId = $(this).attr("id").replace("OptionList","TextBox");
var boxWidth = $("#"+textId).width();
var boxHeight = $("#"+textId).height();
$(this).css("width", boxWidth + "px !important");

//ボタンのサイズ指定(テキストボックスの高さ+6にする(そのままだと小さい))
var btnId = $(this).attr("id").replace("OptionList","Button"); $("#"+btnId).css("width",( boxHeight + 6 )+ "px !important");
$("#"+btnId).css("height",( boxHeight + 6 ) + "px !important");
}) }
デフォルトで設定されるスタイルは、absoluteのposition以外は完全に無視する。これが対応方法・・・である。

2011年6月14日火曜日

Google Chrome のオフラインインストール

認証プロキシを噛ましていて、オンラインインストールが出来ない場合、
下記リンク先より、インストーラーをDL・実行することで、
オフラインインストール可能


http://www.google.com/chrome/eula.html?standalone=1


(現在のバージョン: 12.0.742.91、 DLファイルサイズ: 22.1MB)




2011年6月6日月曜日

Zen Cording

最近知ったZen Cording、確かにこれはラク

HTML+CSSコーディングが10倍速くなるZen Coding
http://web-tan.forum.impressrd.jp/l/5427

実行環境配布先一覧
http://web-tan.forum.impressrd.jp/e/2011/01/11/9397
 
「公式」 Zen Coding - a new way of writing HTML and CSS code
http://code.google.com/p/zen-coding/

2011年5月27日金曜日

JavaScript、CSSファイルをまとめて読込み

1つのJavaScriptファイルの読込みで、複数のJSファイル、CSSファイルを
まとめて読込む方法


 サンプル例:
  親PGのHEADタグ内で、aaa.jsを読み込み指定
   ⇒ aaa.js内で、bbb.js、ccc.js、xxx.css、yyy.cssを読み込み

---------------------------------------------------------------------
【親PG】

 <script type="text/javascript" src="aaa.js"></script>

---------------------------------------------------------------------
【aaa.js】
 function include(stFile)
 {
  var script = document.createElement('script');
  script.src = stFile;
  script.type = 'text/javascript';
  script.defer = true;
  document.getElementsByTagName('head').item(0).appendChild(script);
 }
 include('bbb.js');
 include('ccc.js');

 document.write('xxx.css');
 document.write('yyy.css');
 

2011年5月25日水曜日

ユーザーコントロール:runat=server を含む form タグの内側に置かなければ成りません。

ユーザーコントロールにコントロールを入れると表題のようなエラーが発生することがある。
エラー回避のために下記コードを追記すればOK。

Public Overrides Sub VerifyRenderingInServerForm(ByVal control As Control)

End Sub

ユーザ-コントロールの動的追加

ユーザーコントロールを動的に作成する

Dim usrcontrol As hogehoge = CType(LoadControl("hogehoge.ascx"), hogehoge)
Page.Controls.Add(usrcontrol)

コントロールにIDを指定することも可能
usrcontrol.ID = id

2011年5月20日金曜日

ASP.NET NPOI セルの書式設定を行う上での注意点

NPOIというライブラリを使用すると、サーバーサイドでのExcelファイルの作成が簡単に出来る(NPOIについてはこちらを参照 NPOI使用方法 。Javaで作られたPOIの.NET版)。

おそらくPOIにもいえることだが、セルの書式設定をする際には注意が必要。

同じ書式のセルのCellStyleは同一とみなされる模様

同じ書式が設定されているセルのCellStyleは同じオブジェクトとなる。例えば、同じ色のついているセルのうち、ある一箇所にだけ罫線をつけたいといった場合、下記のようにすると同じ色の付いている全セル(同じスタイルの全セル)に罫線がついてしまう
'※targetCellはHSSFCellオブジェクト
Dim boarderdCellStyle As CellStyle = targetCell.CellStyle
boarderdCellStyle.BorderBottom = CellBorderType.THIN
'→targetCellだけでなく、同じ色のセル全てに罫線が付く

これを回避するには、以下のようにする必要がある

'※hssfはHSSFWorkbookオブジェクト
Dim boarderdCellStyle As CellStyle = hssf.CreateCellStyle
boarderdCellStyle.CloneStyleFrom(targetCell.CellStyle)
boarderdCellStyle.BorderBottom = CellBorderType.THIN
'→新しいCellStyleを作成し、既存のスタイル設定をコピーする。その後に書式を設定

CellStyleの適用はこうしないと既存のスタイルが上書きされるか、他の同一スタイルのセルがダメージを受けることになるので、注意が必要。
※ただ、作りすぎるとExcelを開く際「書式が多すぎます」といったようなエラーになる。いったん作成した書式は使いまわしたほうが吉(Dictionary(Of String,CellStyle)というような感じで格納しておくなど・・・)。

なお、なぜかFontについてはCloneのメソッドが存在しない?ため、手動でCloneに当たる操作(プロパティをコピーしていく)を行う必要がある。

ASP.NET サイト内のページのURLを作成する

サイト内のページ(aspxファイル)のhttpアドレスを作成したい場合は以下のようにする。
ファイル出力をする際リンクを埋め込みたい、などといった場合などに使用できる


Request.Url.GetComponents(UriComponents.SchemeAndServer, UriFormat.SafeUnescaped) + _
ResolveUrl("./hoge.aspx")

前半部分でhttp://サーバー名・・・を作成していて、後の部分でサイト内ページのアドレスを作成している。
※ASP.NET MVCではまた違う可能性がある(というよりControlerでルーティングするはずなので)また違う可能性アリ

2011年5月17日火曜日

VBScriptでメール送信 - Microsoft Collaboration Data Objects

Microsoft Collaboration Data Objects を利用することで、VBScriptからメール送信する機能を簡単に実現することが可能

メール通知によるプッシュ型の業務プロセス向け


<サンプル>

'---定数---
Const MSCDOCONF = "http://schemas.microsoft.com/cdo/configuration/" '固定URI
Const SMTPSRV = "xxx.xxx.xxx.xxx" 'SMTPサーバ:IP or FQDNで指定
Const SMTPPORT = 25 'ポート番号

'---メール送信---
function cdo_mail_send( _
byVal stSubject,byVal stFrom,byVal stTo,byVal stCc,byVal stBcc,byVal stBody,byVal stTempfile)
  on error resume next

  Set oCDO = CreateObject("CDO.Message") '「Collaboration Data Objects」作成

  oCDO.Subject = stSubject '件名
  oCDO.From = stFrom '送信元アドレス
  oCDO.To = stTo '送信先アドレス(複数指定はセミコロン区切り)

  if stCc <> "" then oCDO.Cc = stCc 'Ccアドレス
  if stBcc <> "" then oCDO.Bcc = stBcc 'Bccアドレス

  oCDO.TextBody = stBody '本文:テキスト形式
  'oCDO.HTMLBody = stBody '本文:HTML形式

  if stTempfile<>"" then oCDO.AddAttachment(stTempfile) 'ファイル添付(物理パス指定)

  with oCDO.Configuration.Fields
   .Item( MSCDOCONF & "sendusing" ) = 2 '固定値:SMTPポートに接続して送信
   .Item( MSCDOCONF & "smtpserver" ) = SMTPSRV
   .Item( MSCDOCONF & "smtpserverport" ) = SMTPPORT
   .Update
  end with

  oCDO.Send 'メール送信

  Set oCDO = Nothing '破棄

  if err.number <> 0 then
   '(エラー処理)
  end if

end function

2011年5月12日木曜日

ASP.NET デバッガが機能しない(ブレークポイントは、現在の設定ではヒットしません。)

いつの間にか起こる悪魔のエラー。設定したブレークポイントが無効になり止ってくれなくなる。
そこには、「ブレークポイントは、現在の設定ではヒットしません・・・」という謎のメッセージ。

一応この現象を解消することが出来たので、やったことをメモ。
・Webサイトのビルド
→意味無し
・VisualStudio再起動
→意味無し
・PC再起動(おまじないのようなものだが・・・)
→意味無し
・開いているファイルを一旦全て閉じ、VisualStudio再起動後再度開く
→再び機能するようになった!


どうやらファイルのバージョンが古いということを言っているようなので、一旦ファイルを閉じて
開くのは効果があるようだ。

2011年5月10日火曜日

ASP.NET jQueryでラジオボタンリストの選択されている値を取得

ASP.NETのラジオボタンリストのコントロールは非常に扱いづらい形でHTML出力されるため、JavaScript側でその値を取得するには非常に骨が折れる。

ASP.NET上
<asp:RadioButtonList ID="rbltest" CssClass="xxxx" >

実際のHTML

<span id="rbltest" class="xxxx">
  <input id="rbltest_0" type="radio" name="(配置場所で変化?)$rbltest" value="1"     /><label for="rbltest_0">①<label>
  <input id="rbltest_1" type="radio" name="(配置場所で変化?)$rbltest" value="2" /><label for="rbltest_1">②<label>
  <input id="rbltest_2" type="radio" name="(配置場所で変化?)$rbltest" value="3" /><label for="rbltest_2">③<label>
</span>

→SPANタグで囲われ、しかもCssはそのSAPNにしかつかない。idは個別に設定され、nameも不定になるようなので、チェックされているものの値の取得が非常に困難(場合によってはnameは使えるかも)。


jQueryでの値の取得
$("span[id='rbltest'] > :input[type='radio']").each(function () {
                if ($(this).attr("checked") == true) {
                    alert($(this).val(););
                }
            });

→SPANをまず検索し、その子要素であるラジオボタンについて、チェックがついているものを取得する

function化したものを追記・・・

function getCheckedRadioButtonList(id){
 var val = "";
 $("span[id='" + id + "'] > :input[type='radio']").each(function () {
  if ($(this).attr("checked") == true) {
      val = $(this).val();
  }
 });
 return val;
}

-------------------------------------------------------------
追記
実はRadioButtonListはVerticalとHorizontalで出力される方法が異なり、HorizontalはTableタグ
で囲まれるため上記方法では対応できない。
そのため、最終的には以下のようにした


function getCheckedRadioButtonList(id) {
    var val = "";
    $("#" + id).find(":radio").each(function () {
        if ($(this).attr("checked") == true) {
            val = $(this).val();
        }
    });
    return val;
}

Oracle PL/SQL XMLデータをFunctionで受け取る2

前回はXMLDOMを使用した形式だったが、Xpathを使用しての処理も可能。


・特定ノードの件数を取得(件数をlvCountに設定・XMLTYPEのデータをpvXmlとする)
 SELECT count(*) INTO lvCount FROM TABLE(XMLSequence(pvXml.extract('/STUDENTS/STUDENT')));
  各要素へは以下のようにアクセス可能
FOR i IN 1 .. lvCount LOOP
  pvXml.extract('/STUDENTS/STUDENT['|| i || ']');
END LOOP;

・テキストノードの値取得(注意事項あり。他記事参照)
pvXml.extract('/STUDENTS/STUDENT/NAME/text()').getStringVal();
・属性値の取得
pvXml.extract('/STUDENTS/STUDENT/@ID').getStringVal();
※なお、単純なextractの結果はXMLTYPEとして扱われる。複数の形式のデータが混在する場合は、これを使用し切り分けることが可能
xmlTeacher := pvXml.extract('/PEOPLE/TEACHERS');
xmlStudent := pvXml.extract('/PEOPLE/STUDENTS');








2011年5月6日金曜日

Google AJAX Feed API - Dynamic Feed Control Wizard

RSSフィードの検索~自サイト設置用のソース生成まで出来て便利!

http://www.google.com/uds/solutions/wizards/dynamicfeed.html


生成されたソースは、オプションをいじることでカスタマイズ可

var options = {
numResults : 12, // ①
displayTime : 3000, // ②
fadeOutTime : 2000, // ③
pauseOnHover : true, // ④
linkTarget : google.feeds.LINK_TARGET_BLANK, // ⑤
stacked : true,
horizontal : false,
title : "RSS feed"
}

①1サイトあたりの表示件数
②1つの記事を表示する時間(ミリ秒)
③記事の表示切替時間(ミリ秒)
④マウスオーバーで記事切替を停止する/しない
⑤記事クリック時の表示先Window(自分自身:google.feeds.LINK_TARGET_SELF)

2011年5月2日月曜日

Oracle ソース内の全文検索方法

プロシージャ、ファンクション等のソース内を、指定した単語で全文検索する方法

【例】
「あいうえお」と記述しているソース名、オブジェクトタイプ、行番号、ソース行内容を一覧表示

 select name,type,line,text   from user_source
  where text like '%あいうえお%'   order by 1,2,3;

2011年4月28日木曜日

Oracle XPathを使用してテキストノードの値を取得する場合の注意点

Pl/SQLでもXpathを使用して簡単にXMLノードの値を取得することが可能だが、以下のような空ノードの値を取得する際は注意が必要。
<document>
<content></content>
</document>
この状態で extract('/document/content/text()').getStringVal()を行うと「ORA-30625: NULL SELF引数のメソッド・ディスパッチは使用できません」のエラーが発生する。

これを回避したい場合は一旦EXISTSNODEでノード内に値があるかを確認し、ある場合に取得するといった対応が必要となる。

以下は、そのための簡単なFUNCTIONの例。

・安全にテキストノードの値を取得するための関数

  FUNCTION GET_TEXT_NODE_VALUE(xmlData XMLTYPE,xpathStr VARCHAR2 ) RETURN VARCHAR2 IS
lvJudge NUMBER(1);
  BEGIN
lvJudge := xmlData.existsNode(xpathStr);
IF lvJudge = 0 THEN --空ノードの場合
RETURN NULL;
ELSE
RETURN xmlData.extract(xpathStr).getStringVal();
END IF;
  END;


・使い方
GET_TEXT_NODE_VALUE(xmlData,'/document/content/text()');


参考リンク
Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス
10g リリース2(10.2) - 198 XMLTYPE

GAE BigTableをJQueryで操作

Google App Engine の BigTable をJQueryで処理できるgaedirectというツールがあるそうだ。

http://www.atmarkit.co.jp/fwcr/rensai2/gaedirect01/01.html

JavaScriptがクライアントサイドのリソースをくってしまう点やMVCの観点から言えば邪道な
気もするが、記事にあるように「すぐに簡単なサイトを・・・」というときにいちいちJavaで開発
するのも確かに面倒だ。

内内で使用する出席管理のツールとか、それこそ災害時の安否連絡などには十分使える
のではないかと思う。

2011年4月27日水曜日

Google デザイン10原則

Googleにおける「ユーザー エクスペリエンス向上のためのデザイン10原則」と要点を転載


1. Focus on people their lives, their work, their dreams. ユーザー(ユーザーの生活、仕事、夢)を大切にする

・言葉では表現できないようなニーズを含め、常にユーザーが実際に必要としていることを発見すべく努力する


2. Every millisecond counts. 1ミリ秒も無駄にしない

・ユーザーにとってスピードは大きなメリット


3. Simplicity is powerful. シンプルが強みになる

・最適な設計は、ユーザーが目的を果たすうえで、必要最低限の機能のみが含まれている設計

・大がかりな機能と複雑なデザインが必要な場合であっても、それをシンプルかつパワフルなサービスにする


4. Engage beginners and attract experts. 初心者もエキスパートも魅了する


・最高の設計とは、見た目は非常にシンプルでありながら、高度な機能を必要とするユーザーがその機能を簡単に手に入れられるような設計


5. Dare to innovate. 大胆に革新する


・ユーザーのニーズを満たすためであれば、失敗を恐れず革新的な設計を採用する


6. Design for the world. 世界仕様の設計を導入する


・ユーザーにとって合理的なメディアや方法で利用できるようにすること


7. Plan for today's and tomorrow's business. 現在と将来のビジネスを見据える


・すべてのサービスで収益を上げる必要はありません

・すべてのユーザーに役立つサービスを提供することが重要


8. Delight the eye without distracting the mind. 見て楽しくても気は散らない


・第一印象が良いサービスは、ユーザーを快適にし、安心感と信頼感を抱かせるだけでなく、サービスを積極的に利用しようとする意欲をかきたてる


9. Be worthy of people's trust. 人々の信頼に応える


・信頼感の土台になるのは、基本的なことの積み重ね

・自分のデータは自分で制御できるというユーザーの権利を尊重すること

・「Don't be evil(悪になるな)」というモットーを体現すること


10. Add a human touch. 人間味を加える

・設計にも個性

・文章やデザインは、親しみやすくユーモアにあふれスマートにする


*** 詳細はリンク参照 ***

ユーザー エクスペリエンス向上のための 10 原則
http://www.google.com/corporate/ux.html

What makes a design "Googley"?
http://googleblog.blogspot.com/2008/04/what-makes-design-googley.html

IE6からIE8への移行 検証ポイント リンク集

セッション共有
http://blogs.wankuma.com/oakbow/archive/2009/09/13/181169.aspx

MS拡張CSS
http://msdn.microsoft.com/ja-jp/ie/dd218499.aspx

IEのバージョンと使用できるCSSプロパティ
http://msdn.microsoft.com/en-us/library/ms531207(VS.85).aspx
http://www.tutorialfeed.org/2009/10/visual-cheat-sheet-css-compatiblity.html
http://msdn.microsoft.com/library/cc351024.aspx
http://msdn.microsoft.com/ja-jp/library/cc351024(v=VS.85).aspx
http://msdn.microsoft.com/ja-jp/library/bb250395

標準モード・互換モード間の違い
http://www.justmystage.com/home/hodogaya/css09.html
http://w3g.jp/others/data/doctype_switching
http://html-coding.co.jp/knowhow/tips/000015/

IE6バグ
http://mb.blog7.fc2.com/blog-entry-83.html
http://webtech-walker.com/archive/2007/05/21215114.html
http://css-bug.jp/win/ie/
http://technet.microsoft.com/ja-jp/library/ff943760(WS.10).aspx
http://www10.plala.or.jp/palm84/css_memo.html

2011年4月26日火曜日

DOSからのレジストリ操作

DOSバッチ間で、レジストリを経由して情報共有するケースのメモ

※ケース説明
ある2本のプログラム(PG-A、PG-B)において、PG-Bが時間起動で稼動した際、
PG-Aが実行中か否かで処理を分岐させるケース

※レジストリ取得
reg queryの戻り値はOSに依存、環境に応じてfor文を要調整

(以下はWinXPpro環境での例)


<PG-A>
rem ***レジストリ初期化***
REG DELETE HKLM\Software\TESTFD /v CHKPG_DATE /f
REG DELETE HKLM\Software\TESTFD /v CHKPG_FLG /f
REG DELETE HKLM\Software\TESTFD /v CHKPG_NAME /f

rem ***レジストリSET*** システム日付,フラグ(=1),PG名
REG ADD HKLM\Software\TESTFD /v CHKPG_DATE /d %date:~-10,4%%date:~-5,2%%date:~-2% /f
REG ADD HKLM\Software\TESTFD /v CHKPG_FLG /d 1 /f
REG ADD HKLM\Software\TESTFD /v CHKPG_NAME /d HOGE0123 /f


(処理記述)


rem ***レジストリ削除***
REG DELETE HKLM\Software\TESTFD /v CHKPG_FLG /f

rem ***レジストリSET*** フラグ(=0)
REG ADD HKLM\Software\TESTFD /v CHKPG_FLG /d 0


<PG-B>
rem ***レジストリ値取得***
FOR /F "TOKENS=1,2,*" %%I IN ('REG QUERY "HKLM\Software\TESTFD" /v "CHKPG_DATE"') DO IF "%%I"=="CHKPG_DATE" SET CHKPGDATE=%%K
FOR /F "TOKENS=1,2,*" %%I IN ('REG QUERY "HKLM\Software\TESTFD" /v "CHKPG_FLG"') DO IF "%%I"=="CHKPG_FLG" SET CHKPGFLG=%%K
FOR /F "TOKENS=1,2,*" %%I IN ('REG QUERY "HKLM\Software\TESTFD" /v "CHKPG_NAME"') DO IF "%%I"=="CHKPG_NAME" SET CHKPGNAME=%%K

rem ***PG-A稼動チェック(システム日付とフラグ(=1)で判定)***
if not %CHKPGDATE%==%date:~-10,4%%date:~-5,2%%date:~-2% goto STEP_OK
if not %CHKPGFLG%==1 goto STEP_OK

rem ***NG***
:STEP_NG
echo 「%CHKPGNAME%」は実行中です


(処理記述)


goto STEP_END

rem ***OK***
:STEP_OK


(処理記述)



rem ***終了***
:STEP_END

2011年4月22日金曜日

ASP.NETでネットワーク BIOS コマンド制限に達しましたが発生する

Visual Studioで開発サーバーを使用していると、唐突に表題のメッセージが出ることがある。
そんなときは以下リンクを参考に対応。

マイクロソフトサポート

設定する値については、以下のようにした。
MaxCmds :64
MaxMpxCt:800

ここの画面写真を参照

ASP.NET Site.Masterに設定するJavaScriptファイルのパスについて

ASP.NETでは、SiteMasterを使用することでレイアウトや読み込むCSS/JavaScriptファイルを共有できる
(各ページで別々に設定しなくていい)。

ただ、このときJavaScriptファイルへのパスの設定には注意が必要。以下のようにしておかないと、
ページの階層によってはリンクのパスが切れてしまう。
※cssファイルの方は、なぜか相対パスが自動的に解釈される。

<script src="<%= ResolveUrl("~/Scripts/jquery.min.js") %>" type="text/javascript"></script>

2011年4月21日木曜日

VB.NETにおけるstatic

VB.NETにおけるstaticとJavaなどの言語におけるstaticは意味が違う!ので備忘的に記載。

参考サイト

・VB.NETにおけるstatic
 メソッドの呼び出し間で値を維持する静的ローカル変数のために使われる。
 (ABAPにおけるSTATICSと同じ・・・といってもぴんと来る人はいないか・・・)。
 →前に呼び出されたときに計算した値を保持しておくことが出来る

 Javaなどの言語におけるstaticと同じ意味を持つのはShared。ただ、Const型には使用できないのでpublic static final のような使い方は出来ない(単純にPublic Constとする)

・Javaなどにおけるstatic
 インスタンスに属さずクラスに属するメンバを宣言するために使用される

Oracle PL/SQL XMLデータをFunctionで受け取る

PL/SQLでXMLデータを受け取り、処理する方法。
ASP.NET側で入力フォームの情報をXML化し、そのXMLをPL/SQLで受け取って更新処理をするという寸法。
・OracleへのアクセスはODP.NETを使用。更新対象のテーブルはOracleのデフォルト環境scott/tigerにあるDEPTテーブルとしている。

ASP.NET側 ※msgLabelに処理結果を出力する想定
'XML型のデータを作成し更新を行う
Dim blr As StringBuilder = New StringBuilder()

'Oracle更新処理
Dim conStr As String = ConfigurationManager.ConnectionStrings("ConnectionString").ToString()
Dim ocon As OracleConnection = New OracleConnection(conStr)
Dim oCommand As OracleCommand = New OracleCommand("XML_UPDATER.XML_UPDATE", ocon)
oCommand.CommandType = CommandType.StoredProcedure

Dim rv As OracleParameter = oCommand.Parameters.Add("rv", OracleDbType.Varchar2)
rv.Direction = ParameterDirection.ReturnValue
rv.Size = 10000 'サイズは適当

Dim p1 As OracleParameter = oCommand.Parameters.Add("p1", OracleDbType.XmlType)
p1.Direction = ParameterDirection.Input

blr.Append("<?xml version=""1.0""?><depts>")
blr.Append("<dept>")
blr.Append("<dept><dname>DNAME_HOGE</DNAME><LOC ADRCODE=""1"">LOC_HOGE</LOC>
</DEPT>")
blr.Append("</DEPT>")
blr.Append("</DEPTS>")
p1.Size = blr.Length
p1.Value = blr.ToString

Try
ocon.Open()
oCommand.ExecuteNonQuery()
If IsDBNull(oCommand.Parameters("rv").Value) Or oCommand.Parameters("rv").Value.ToString = "null" Then
msgLabel.Text = "SUCCESS"
Else
msgLabel.Text = oCommand.Parameters("rv").Value.ToString
End If
Catch ex As Exception
msgLabel.Text = "Oracle:" + oCommand.Parameters("rv").Value.ToString + " ASP:" + ex.Message
Finally
ocon.Close()

End Try



PL/SQL側(パッケージを作成。パッケージヘッドは省略)
CREATE OR REPLACE PACKAGE BODY SCOTT.XML_UPDATER
IS
FUNCTION XML_UPDATE(pvXml XMLTYPE ) RETURN VARCHAR2 IS
xmlDoc dbms_xmldom.DomDocument;
nodeList dbms_xmldom.DomNodeList;
lvList dbms_xmldom.DomNode;
lvRow SCOTT.DEPT%ROWTYPE;
BEGIN
xmlDoc := xmldom.newDomDOcument(pvXml);
nodeList := xmldom.getElementsByTagName(xmlDoc, 'DEPT');

IF NOT xmldom.isNull(nodeList) THEN
FOR i IN 0 .. xmldom.getLength(nodeList) - 1 LOOP
lvList := xmldom.item(nodeList,i);
lvRow.DNAME := GET_ELEMENT_VALUE_BY_TAG_NAME(lvList,'DNAME');

lvRow.LOC := GET_ELEMENT_ATTR_BY_TAG_NAME(lvList,'LOC','ADRCODE');
lvRow.LOC := GET_ELEMENT_VALUE_BY_TAG_NAME(lvList,'LOC') || '-' || lvRow.LOC;

lvRow.DEPTNO := GET_ELEMENT_VALUE_BY_TAG_NAME(lvList,'DEPTNO');
IF lvRow.DEPTNO IS NULL OR lvRow.DEPTNO = '' THEN
SELECT MAX(DEPTNO) INTO lvRow.DEPTNO FROM SCOTT.DEPT;
lvRow.DEPTNO := lvRow.DEPTNO + 1;
INSERT INTO SCOTT.DEPT VALUES lvRow;
ELSE
UPDATE SCOTT.DEPT SET ROW = lvRow WHERE DEPTNO = lvRow.DEPTNO;
END IF;
END LOOP;
END IF;

COMMIT;
RETURN NULL;

EXCEPTION
WHEN OTHERS THEN
ROLLBACK;
RETURN SQLERRM;
END ;

--テキストノードの値を取得
FUNCTION GET_ELEMENT_VALUE_BY_TAG_NAME(domEl dbms_xmldom.DomElement,tagName VARCHAR2) RETURN VARCHAR2 IS
tempList dbms_xmldom.DomNodeList;
oneItem dbms_xmldom.DomNode;
BEGIN
tempList := xmldom.getElementsByTagName(domEl,tagName);
oneItem := xmldom.item(tempList,0); --要素内に、タグ名に合致するノードは1つしかないと想定
RETURN xmldom.getNodeValue(xmldom.getFirstChild(oneItem));
END ;

FUNCTION GET_ELEMENT_VALUE_BY_TAG_NAME(domNd dbms_xmldom.DomNode,tagName VARCHAR2) RETURN VARCHAR2 IS
BEGIN
RETURN GET_ELEMENT_VALUE_BY_TAG_NAME(xmldom.makeElement(domNd),tagName);
END ;

--ノードの属性値を取得
FUNCTION GET_ELEMENT_ATTR_BY_TAG_NAME(domEl dbms_xmldom.DomElement,tagName VARCHAR2,attrName VARCHAR2) RETURN VARCHAR2 IS
tempList dbms_xmldom.DomNodeList;
oneItem dbms_xmldom.DomElement;
BEGIN
tempList := xmldom.getElementsByTagName(domEl,tagName);
oneItem := xmldom.makeElement(xmldom.item(tempList,0));
RETURN xmldom.getAttribute(oneItem,attrName);
END;

FUNCTION GET_ELEMENT_ATTR_BY_TAG_NAME(domNd dbms_xmldom.DomNode,tagName VARCHAR2,attrName VARCHAR2) RETURN VARCHAR2 IS

BEGIN
RETURN GET_ELEMENT_ATTR_BY_TAG_NAME(xmldom.makeElement(domNd),tagName,attrName);
END;

END XML_UPDATER;
/

2011年4月18日月曜日

Oracleクライアントインストールディレクトリ

いつからか、クライアントのインストール先が変わっている模様

(少なくとも)8まで
C:\oracle\

(少なくとも)11g以降
C:\app\(ユーザー名)\product
→ODP.NETを入れている場合、有用なサンプルコードが以下フォルダにあるので要チェック
 C:\app\\(ユーザー名)\product\11.2.0\client_3\odp.net\samples

Oracleでテーブルの列定義を取得する

以下SQLで可能。

select * from USER_TAB_COLUMNS

ORDER BY COLUMN_ID をつけると、実際の定義順でデータを取得できる。
ALL_TAB_COLUMNS だとそれ以外のテーブル定義も取れる模様。

2011年4月15日金曜日

ASP.NETからの、ODPを使用したOracleFunctionの呼出

ODPを使用する場合の一番のネックになるのは、最初に設定するパラメータは返り値でないといけないということ。
これをミスるとパラメータの長さが違いますみたいなエラーが延々と出てドハマリする

参考リンク

Oracle側
CREATE OR REPLACE FUNCTION SaveData(en varchar2) RETURN VARCHAR2 IS
hoge varchar2(100);
Begin
hoge := en || ' is inputed ';
Insert into TestSaveData values(hoge);
Return hoge;
End;


ASP.NET側
Try
Dim cnn As New Oracle.DataAccess.Client.OracleConnection("Data Source=OracleG;User Id=Scott;password=Tiger")
Dim cmd As New Oracle.DataAccess.Client.OracleCommand("SAVEDATA", cnn)
cmd.CommandType = CommandType.StoredProcedure

cmd.Parameters.Add("RS", Oracle.DataAccess.Client.OracleDbType.Varchar2, ParameterDirection.ReturnValue)
cmd.Parameters.Add("EN", Oracle.DataAccess.Client.OracleDbType.Varchar2, 100, "INPUT", ParameterDirection.Input)

cnn.Open()
Dim ooo As Object = cmd.ExecuteScalar()
Dim q As Object = cmd.Parameters("RS").OracleDbType.ToString()
Dim s As String = q
cnn.Close()
Catch ex As Oracle.DataAccess.Client.OracleException
MsgBox(ex.Message())
End Try

2011年3月31日木曜日

OracleでLINQ/EntityDataFrameworkを使用する

今までサポートがなかったがとうとう公式対応したもよう。ただ、ベータ版で「本番機には使用するな」との注意書きつき

32-bit ODAC (11.2.0.2.30) Entity Framework and LINQ to Entities

なお、これまではLINQのみオープンソースのツールがあった(それ以外は有償のツールのみ)
DBlinq

2012/2/3追記
2011/12/28に正式版がリリースされていた模様。宛先はこちら。
32-bit Oracle Data Access Components (ODAC)

2011年3月20日日曜日

RubyOnRailsでJQueryMobileを使用するのは注意

RubyOnRailsのフレームワークではurlに厳密な意味があり、コントローラーではこのurlにより処理が振り分けられたりする。
ところが、JqueryMobileはスマートフォン風の動作を実現するためこのurlを書き換えてしまい、
そうするとrailsは正しくリクエストを処理することができなくなりドハマリする
(ちなみに、railsの更新処理がどうしてもうまくいかず、原因がJQueryMobileである事に気づくのに2日を要した・・・)。
通常の更新はうまくいくのだが、input typeがfileの時になんだかうまくいかない。

・RailsでJQueryMobileを使用する
RailsでJqueryMobile
・JQueryMobileのAjax設定をオフにする
Ajax設定の変更

ただ、Rubyを使用したスマートフォン向けの開発はRhodesが提供されているので、Rubyを使用したいなら
こちらのほうがいいかも

Rhodes

2011年3月1日火曜日

Oracle PL/SQL パイプライン表関数の使い方について

・概要
パイプライン表関数は、率直に言えばFUNCTIONの返り値をそのままビュー出力として使える機能である。
(この時のFUNCTIONの返り値は当然レコードセット的なものである必要があるが、後述)

・前提
パイプライン表関数が返すレコードセットのデータ型はどこかで定義されている必要がある。
どこか→PACKAGEならPACKAGEヘッド、あとは素直にTYPEを作成しておく。

・作成方法
任意のSQLに対するカーソルを作成し、LOOP中にPIPE ROWでレコード出力
参考

・使いどころ
出力するデータ型を定義するのは手間であるため、項目が多い出力に向かない。
そのため、キー情報のみ取得しWHERE EXIST区で使うなどするほうがベターと思われる

SAPからのデータ抽出

SIS社 ConnectPlus(※SAP認定ツール)
アドオン不要の外部システム連携ツール(画からするとバーコードリーダーなど割とリアルタイムなものを想定?)
ConnectPlus Et の方は、BIツールなど向けにSAPクエリからデータを抜くツール。安い。

株式会社アプレッソ DataSpider(※BCアダプタはSAP認定ツール)
JCoでアクセスするコネクタと、SAP Business Connector(※本体とは別のSAPアプリケーション)
を経由するコネクタの2種類がある(認定を受けているのは後者。カネの問題?)。
スクラッチで使用するとしたらたぶん前者。

ウイングアーク社 Business SPECTRE
BIツール用にデータを抜くツール(逆に、伝票登録などに使えるリアルタイム連携というわけではなさそう)。
差分抽出も可能な模様

サーバーサイドJavaScript

サーバーサイドの処理もJavaScriptでかけるようになってきているらしい。

@ITの記事へのリンク

2011年2月19日土曜日

javaScriptテスト

やっぱりサンプルを乗せる上ではjqueryとかつかえないとだめっしょ。

jquery


これはタブの中のコンテンツ1でありまして
ここはタブの中のコンテンツ2でありまして
このように改行なぞしてみるわけです。。。