2008年3月 のアーカイブ

SharePointのフォームを自前で作ってみよう。UpdateListItemsの使い方

SharePointのフォームを自前で作ってみよう。UpdateListItemsの使い方をはてなブックマークに追加 SharePointのフォームを自前で作ってみよう。UpdateListItemsの使い方をdel.icio.usに追加 Yahoo!ブックマークに登録 SharePointのフォームを自前で作ってみよう。UpdateListItemsの使い方をGoogle Bookmarksに追加

2008年3月31日 月曜日
SharePointのライブラリに対して、スクリプトからアイテム投入・更新したい!ということで、マイクロソフトのMSDNに例が載っていました。例のごとくエレメントやアトリビュートレベルの設定でどうなるのかはあまり記述が無かったので、いろいろと藪コギしてみました。
MSのXMLサンプルは以下のように記述がありました。

<Batch OnError="Continue" ListVersion="1"
ViewName="270C0508-A54F-4387-8AD0-49686D685EB2">
<Method ID="1" Cmd="Update">
<Field Name="ID">4<Field>
<Field Name=""></Field>
</Method>
<Method ID="2" Cmd="Update">
<Field Name="ID" >6</Field>
<Field Name=""></Field>
</Method>
.
.
.
</Batch>

<Batchタグ>

Batchタグのアトリビュートは省略可能のようです。ただ、更新したい項目がビューレベルで存在しなければならないようで、ViewNameは適宜入れておいたほうがいいかもしれません。省略するとデフォルトビューを参照して更新がかかる模様です。

<Methodタグ>

MethodタグのIDはライブラリアイテムのIDとは違っていて、処理IDみたいなものらしいです。要は、ID=1,ID=2といった感じで複数の更新処理をライブラリに加えて、エラーとなった処理があった場合、このIDと紐づいたXMLを返すために必要なんだと思います。ライブラリのID=1をアップデートしたいというバインドの意味ではないようです。Cmd=”Update”はそのままライブラリ更新を表します。”New”にすると新規アイテムを登録するようです。

<Fieldタグ>

■Update

MethodタグにCmd=”Update”と書いた場合、更新するアイテムに対して一意にバインドする必要があります。ので、FieldタグのNameアトリビュートにIDと設定してあげて、バインドしたいIDの値をvalueを与えてあげてください。これで一意にバインドできました。続けて更新したいフィールドをそのままFieldのNameアトリビュートに設定して(例えばTitleとか)valueを与えます。ここで気になるのは、FieldのNameアトリビュートに記述される内容が、アイテムのバインドフィールドなのか、更新したいフィールドなのか、何を持って判別するんだ?と言ったところだと思います。乱暴に言ってしまうとName=”ID”はバインドフィールドでしかないようです。つまり、Author=”ひげもじゃ”とかいうゆるいバインドは出来ないということです。多分。ですのでName=”ID”以外のアトリビュートは、更新フィールドだと言うことになります。多分。同時にName=”ID”というアトリビュートは必須になるのではないかと思います。多分。

■New

MethodタグにCmd=”New”と書いた場合、アイテムが新規登録されます。この場合IDはインクリメンタルに振られるようですので、IDをNameアトリビュートに指定したFieldタグごと、無くても通りました。

<Field Name="ID">New</Field>

とMSDNには記述がありますが、省略可能のようです。
さらに、MSDNのほうにはディレクトリの作成XMLが書いてあったので、試して見ました。どうやらディレクトリを作成しろという命令は

<Field Name="FSObjType">1</Field>

という記述にあるようです。さらにディレクトリ名をつけるには、

<Field Name="BaseName">ディレクトリ名</Field>

を指定する必要があるようです。Name=”Title”からはディレクトリを受け取ってもらえないようです。また、FSObjTypeのvalueが1の場合はディレクトリで、0の場合はアイテムをあらわすようです。
では、ディレクトリ内にアイテムを作りたい場合はどうすればいいのでしょう。これがホントわっかんなくて色々試しました。
結果から言うと、ライブラリの各アイテムには、FileRefというフィールドを持っているらしく、これを指定してあげることでディレクトリ内にアイテムの作成が成功しました。本筋かどうかはわかりません。
まず、普通にアイテムをつくったものをgetListItemsで参照してみると、

ows_FileRef='1;#<yourSitePath>/Lists/<yourListName>/1_.000'

こんな感じでFileRefに値が格納されています。これはID=1のアイテムを拾ったものです。この1_.000というところを一意に出来れば、ディレクトリ内にアイテムを作成することが出来るようです。アイテムの実体が存在するかどうかはわかりませんが、同じディレクトリ空間には重複した値は入れられないようです。当然と言えば当然なのですが。

<Field Name="FileRef">/<yourSitePath>/Lists/<yourListName>/<yourDirectory1>/<yourDirectory2>/1_.000</Field>

と言った感じで、ライブラリのディレクトリ空間をまたいでアイテムが作成できます。
それでは、

  • アイテムを2つ新規作成して
  • ID=2のほうのタイトルを更新して
  • ディレクトリを作って
  • そのなかにアイテムを登録する

XMLを組み立ててみると以下のようになります。

<Batch>
<Method ID="1" Cmd="New">
<Field Name="Title">FirstPost</Field>
</Method>
<Method ID="2" Cmd="New">
<Field Name="Title">SecondPost</Field>
</Method>
<Method ID="3" Cmd="Update">
<Field Name="ID">2</Field>
<Field Name="Title">SecondPost_updated</Field>
</Method>
<Method ID="4" Cmd="New">
<Field Name="BaseName">Directory</Field>
<Field Name="FSObjType">1</Field>
</Method>
<Method ID="5" Cmd="New">
<Field Name="FileRef">/<yourSitePath>/Lists/<yourLibName>/Directory/item</Field>
<Field Name="Title">ThirdPost</Field>
</Method>
</Batch>

最後のMethod ID=”5″でつくるアイテムのFileRef(itemの部分)はスタティックに持つと、もう一回処理を走らせるとエラーとなります。タイムスタンプなんかを設定するか、一番新しいIDを拾ってきて設定したほうがいいかもしれません。あるいは、もっと他のやり方があるかもしれません。それではサンプルソースを置いておきます。

function getHttpReq(){
return window.XMLHttpRequest ? new XMLHttpRequest() : ( function() {
try        { return new ActiveXObject( "Msxml2.XMLHTTP" );    }
catch( e ) { return new ActiveXObject( "Microsoft.XMLHTTP" ); }
}());
}
function updateListItems()
{
var httpInst = getHttpReq();
var libName = '<yourLibName>';
httpInst.open( "POST", "<yourSitePath>/_vti_bin/Lists.asmx", false );
httpInst.setRequestHeader( 'Content-Type','text/xml; charset=utf-8' );
httpInst.setRequestHeader( 'SOAPAction','http://schemas.microsoft.com/sharepoint/soap/UpdateListItems' );
var sendXml = '<Batch><Method ID="1" Cmd="New"><Field Name="Title">FirstPost</Field></Method><Method ID="2" Cmd="New"><Field Name="Title">SecondPost</Field></Method><Method ID="3" Cmd="Update"><Field Name="ID">2</Field><Field Name="Title">SecondPost_updated</Field></Method><Method ID="4" Cmd="New"><Field Name="BaseName">Directory</Field><Field Name="FSObjType">1</Field></Method><Method ID="5" Cmd="New"><Field Name="FileRef">/<yourSitePath>/Lists/<yourLibName>/Directory/item</Field><Field Name="Title">ThirdPost</Field></Method></Batch>';
var postBody = '<?xml version="1.0" encoding="utf-8"?><soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><UpdateListItems xmlns="http://schemas.microsoft.com/sharepoint/soap/"><listName>' + libName + '</listName><updates>' + sendXml + '</updates></UpdateListItems></soap:Body></soap:Envelope>';
httpInst.onreadystatechange = function()
{
if ( httpInst.readyState == 4 ){
xmlDoc = new ActiveXObject( "Microsoft.XMLDOM" );
xmlDoc.async = false;
alert( httpInst.responseText );
}
}
httpInst.send( postBody );
}

オーデュボンの祈り 著:伊坂幸太郎を読んだよ!

オーデュボンの祈り 著:伊坂幸太郎を読んだよ!をはてなブックマークに追加 オーデュボンの祈り 著:伊坂幸太郎を読んだよ!をdel.icio.usに追加 Yahoo!ブックマークに登録 オーデュボンの祈り 著:伊坂幸太郎を読んだよ!をGoogle Bookmarksに追加

2008年3月30日 日曜日
DSCF2328.jpg
伊坂幸太郎の「オーデュボンの祈り」を読みました。伊坂幸太郎のデビュー作とのことです。伊坂幸太郎はモーニングの巻末でもモダンタイムスってのを連載してますね。こっちは見てないんですけど。

主人公は以前システムエンジニアをやっていた「伊藤」という青年。28歳。舞台は「荻島」という江戸以来外界から遮断された空間です。ここは異世界だよーという舞台装置です。その荻島に佇む、人語を操り、未来が見えるカカシの優午が殺されてから、物語は転がり始めます。

このオーデュボンの祈り。なかなか夢中になりましたよ。ワタシの好きな類の物語です。つまりミステリーだと思うのですが、「これは複線ですよー」と明示的に伏線が張られる。そして、読み手はアタマのフックにそれを何気なく引っ掛けておく。が、その複線が何を示しているのかはもちろん最終章まで引っ張られます。主人公もわからないし、しょっちゅうミスリードする。読み手もあれこれ想像を膨らましたりしてみる。そして、最後の最後に電気がビビッと通電するようにして、あるいはドミノがドダダーと倒れるようにして、絵を描いてくれるわけです。まるで1つのプログラムのようです。
「その絵が、これまでの複線や物語そのものをどれだけ内包できているか」。あるいは「その絵が物語と独立して圧倒的に美しいか」なんてのがワタシのモノサシのひとつなのですが、オーデュボンの祈りは、読後、拍手喝采でしたよ。非常に面白かったです。

グダグダと設定がどうだ、複線がどうだという説明もありますが、とりあえず個性あふれる登場人物にとても惹かれます。えげつないバイオレンス担当の城山。悪意の塊の警察官です。サイテー。未来の見えるカカシの優午。未来が見えるくせに頼りないし、殺される。未来見えるんじゃないの?奥さんが殺されて頭がおかしくなっちゃった絵描きの園山。非常に切ないです。奥さんが殺されてから嘘しか言えなくなっちゃったんです。ほかにも個性的な登場人物はわんさといます。

サーカスのピエロがボールの上でバランスをとりながら前へ進んだり後ろへ下がったりと滑稽に演じますが、登場人物みんなでくんづほぐれつしながら、いっぺんにそのボールに乗っかっているかのようです。乱暴に言ってしまうとそんな物語。はまると1日で読めちゃいます。オススメですよ

China WAS,IS,and ALWAYS WILL BE

China WAS,IS,and ALWAYS WILL BEをはてなブックマークに追加 China WAS,IS,and ALWAYS WILL BEをdel.icio.usに追加 Yahoo!ブックマークに登録 China WAS,IS,and ALWAYS WILL BEをGoogle Bookmarksに追加

2008年3月27日 木曜日
この動画はkarate styleさんのとこで見つけたエントリなのですが、中国側から見たチベットについて、とあるカナダ系の中国人がyoutubeにポストしていたようです。(和訳はkarate styleさんのとこにあります。是非読んでいただきたいと思います。)

こんな針がミエミエの餌には釣られないクマー!とありたいものですが、この人、ずいぶんと悪意を練って動画作ってポストしたもんだなと思いました。正直ワタシ、憤りすぎてしんどかったです。どうしよう。このことについて今日は冷静にポストできなさそうなので、一晩か二晩寝かそうと思います。

“Tibet WAS,IS,and ALWAYS WILL BE a part of China”