<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>InfoPath質問箱</title><link>http://blogs.sqlpassj.org/hotikisu/category/526.aspx</link><description>InfoPathについての質問を受け付けます。</description><managingEditor>ホチキス先生</managingEditor><dc:language>ja-JP</dc:language><generator>.Text Version 0.95.2004.102</generator><item><dc:creator>ホチキス先生</dc:creator><title>TechEd 2008 Yokohamaでライトニング・トークに出る</title><link>http://blogs.sqlpassj.org/hotikisu/archive/2008/08/06/25435.aspx</link><pubDate>Wed, 06 Aug 2008 21:38:00 GMT</pubDate><guid>http://blogs.sqlpassj.org/hotikisu/archive/2008/08/06/25435.aspx</guid><wfw:comment>http://blogs.sqlpassj.org/hotikisu/comments/25435.aspx</wfw:comment><comments>http://blogs.sqlpassj.org/hotikisu/archive/2008/08/06/25435.aspx#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://blogs.sqlpassj.org/hotikisu/comments/commentRss/25435.aspx</wfw:commentRss><trackback:ping>http://blogs.sqlpassj.org/hotikisu/services/trackbacks/25435.aspx</trackback:ping><description>&lt;P&gt;今年は昨年と少し趣向が変わったTechEdのコミュニティ・プログラム。「ライトニング・トーク」というプログラムで「簡単! InfoPath と SQL Server でリッチなインターフェイスのクライアント サーバー システム構築」という話をさせてもらえることになった。&lt;/P&gt;
&lt;P&gt;5分程度ということで詳しい説明はできないが、いま業務としてやっているデータベースについて話す。InfoPathをクライアントのフロントエンドに使い、データベースSQL Serverに接続するクライアント・サーバー・アプリケーションについてだ。&lt;/P&gt;
&lt;P&gt;俺はもともとプログラマーではなく、どちらかといえば管理運用の仕事をしている立場にいる。学校のデータベースを日常業務の空き時間を使って構築してきた経験から、実際の業務に直接携わっている人間、運用についてよく知っている人間がデータベースを構築することが、最も効率よく成功するシステムを構築できると確信している。&lt;/P&gt;
&lt;P&gt;マイクロソフトのSQL Server、InfoPathやAccessといったオフィス製品、Active Directoryなど使いやすいシステムを組み合わせて利用することで、たいていのデータベースは自前で構築できる。その可能性を実感してもらえれば嬉しい。&lt;/P&gt;
&lt;P&gt;マイクロソフトTeceED 2008 Yokohama公式サイト&lt;BR&gt;&lt;A href="http://www.microsoft.com/japan/teched/2008/default.mspx"&gt;http://www.microsoft.com/japan/teched/2008/default.mspx&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;Birds of a Feather &amp;amp; ライトニング・トーク&lt;BR&gt;&lt;A href="http://www.event-marketing.jp/events/te08/special/bof.htm"&gt;http://www.event-marketing.jp/events/te08/special/bof.htm&lt;/A&gt;&lt;/P&gt;&lt;img src ="http://blogs.sqlpassj.org/hotikisu/aggbug/25435.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>ホチキス先生</dc:creator><title>セカンダリデータ接続で必要なデータだけを取得するには（SQL Serverにサブクエリのビューを作る）</title><link>http://blogs.sqlpassj.org/hotikisu/archive/2008/06/12/25019.aspx</link><pubDate>Thu, 12 Jun 2008 22:40:00 GMT</pubDate><guid>http://blogs.sqlpassj.org/hotikisu/archive/2008/06/12/25019.aspx</guid><wfw:comment>http://blogs.sqlpassj.org/hotikisu/comments/25019.aspx</wfw:comment><comments>http://blogs.sqlpassj.org/hotikisu/archive/2008/06/12/25019.aspx#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://blogs.sqlpassj.org/hotikisu/comments/commentRss/25019.aspx</wfw:commentRss><trackback:ping>http://blogs.sqlpassj.org/hotikisu/services/trackbacks/25019.aspx</trackback:ping><description>&lt;P&gt;InfoPathのセカンダリデータ接続でサブクエリーを書いてデータを絞り込む手法を紹介した。&lt;/P&gt;
&lt;P&gt;InfoPathでSQL Serverから自分の氏名を取得するには（データ接続にサブクエリーを書く）&lt;BR&gt;&lt;A href="http://blogs.sqlpassj.org/hotikisu/archive/2008/06/12/25016.aspx"&gt;http://blogs.sqlpassj.org/hotikisu/archive/2008/06/12/25016.aspx&lt;/A&gt;&lt;BR&gt;セカンダリデータ接続で必要なデータだけを取得するには（データ接続にサブクエリーを書く）&lt;A href="http://blogs.sqlpassj.org/hotikisu/archive/2008/06/12/25018.aspx"&gt;http://blogs.sqlpassj.org/hotikisu/archive/2008/06/12/25018.aspx&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;このサブクエリーを書く方法は、SQL Serverにビューを作ってもできる。次のようなテーブルがSQL Serverにあるとする。&lt;/P&gt;
&lt;P&gt;　　生徒（学籍番号,生徒氏名,担任ユーザーID）&lt;/P&gt;
&lt;P&gt;このとき、次のようなビューをSQL Serverに作る&lt;/P&gt;
&lt;P&gt;　　select 学籍番号 from dbo.生徒 where ('（ドメイン名）' + 担任ユーザーID = (select suser_sname() as Expr 1))&lt;/P&gt;
&lt;P&gt;もし担任ユーザーIDにドメイン名も含んだユーザーデータを作っておくなら次のようでいい&lt;/P&gt;
&lt;P&gt;　　select 学籍番号 from dbo.生徒 where 担任ユーザーID = (select suser_sname() as Expr 1)&lt;/P&gt;
&lt;P&gt;このビューに対してInfoPathでセカンダリデータ接続を作る。つまり、SQL Serverに書かれたビューも、それを呼び出すアクティブディレクトリユーザー名に対してsuser_sname()関数が正しく実行されるのだ。&lt;/P&gt;&lt;img src ="http://blogs.sqlpassj.org/hotikisu/aggbug/25019.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>ホチキス先生</dc:creator><title>セカンダリデータ接続で必要なデータだけを取得するには（データ接続にサブクエリーを書く）</title><link>http://blogs.sqlpassj.org/hotikisu/archive/2008/06/12/25018.aspx</link><pubDate>Thu, 12 Jun 2008 22:28:00 GMT</pubDate><guid>http://blogs.sqlpassj.org/hotikisu/archive/2008/06/12/25018.aspx</guid><wfw:comment>http://blogs.sqlpassj.org/hotikisu/comments/25018.aspx</wfw:comment><comments>http://blogs.sqlpassj.org/hotikisu/archive/2008/06/12/25018.aspx#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://blogs.sqlpassj.org/hotikisu/comments/commentRss/25018.aspx</wfw:commentRss><trackback:ping>http://blogs.sqlpassj.org/hotikisu/services/trackbacks/25018.aspx</trackback:ping><description>&lt;P&gt;InfoPathではメイン接続以外にセカンダリデータ接続を作ることができ、でデータを取得することができ、セカンダリデータ接続で取得したリストをフォームのドロップダウンリストボックスなどで選択要素として利用できる。これはとても便利だ。しかしセカンダリデータ接続では動的にクエリを行ってデータを選択することができないため、対象のテーブルの全部のデータを取得するしかない。このときに問題となるのが、ある程度のデータ量を超えたとき、フォームの実行速度が極端に低下することだ。フリーズしたのではないか、と思うほどパフォーマンスが低下する。これはぜひ後のバージョンでは解決してもらいたいが、現状では次のようなサブクエリを使って、動的にクエリを行う工夫ができる。&lt;/P&gt;
&lt;P&gt;たとえば生徒40人のクラスが30学級あれば、全校生徒のデータは120人になる。このうち自分の担任するクラスのリストだけをセカンダリデータ接続で取得したいときには、次のようにする。&lt;/P&gt;
&lt;P&gt;（１）次のテーブルを作る&lt;BR&gt;　　生徒（学籍番号,生徒氏名,担任ユーザーID）&lt;BR&gt;（２）InfoPathでデータ接続ウィザードを実行し、SQL文を次のように書き換える&lt;BR&gt;　　　select "生徒氏名" from "dbo"."生徒" as "生徒" where '（ドメイン名）' + 担任ユーザーID = (select suser_sname())&lt;/P&gt;
&lt;P&gt;つまりSQL Serverから自分のアクティブディレクトリユーザー名を取得するsuser_sname()関数を利用してサブクエリーを書き、生徒テーブルから自分のクラスの生徒データだけを取得するのだ。&lt;/P&gt;
&lt;P&gt;このとき、テーブルの担任ユーザーIDにドメイン名も含めてデータを登録しているなら次のようでいい&lt;/P&gt;
&lt;P&gt;　　　select "生徒氏名" from "dbo"."生徒" as "生徒" where 担任ユーザーID = (select suser_sname())&lt;/P&gt;
&lt;P&gt;ここでは学校のクラスで担任が自分のクラスの生徒名をリストとして取得する例を説明したが、一般企業でも社員の中から自分が所属する支店の社員情報だけのリストを取得したい、といった事例が考えられるだろう。&lt;/P&gt;&lt;img src ="http://blogs.sqlpassj.org/hotikisu/aggbug/25018.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>ホチキス先生</dc:creator><title>InfoPathでSQL Serverから自分の氏名を取得するには（データ接続にサブクエリーを書く）</title><link>http://blogs.sqlpassj.org/hotikisu/archive/2008/06/12/25016.aspx</link><pubDate>Thu, 12 Jun 2008 22:11:00 GMT</pubDate><guid>http://blogs.sqlpassj.org/hotikisu/archive/2008/06/12/25016.aspx</guid><wfw:comment>http://blogs.sqlpassj.org/hotikisu/comments/25016.aspx</wfw:comment><comments>http://blogs.sqlpassj.org/hotikisu/archive/2008/06/12/25016.aspx#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://blogs.sqlpassj.org/hotikisu/comments/commentRss/25016.aspx</wfw:commentRss><trackback:ping>http://blogs.sqlpassj.org/hotikisu/services/trackbacks/25016.aspx</trackback:ping><description>&lt;P&gt;以前、InfoPathのデータ接続でSQL Serverからアクティブディレクトリのユーザー名を取得する方法を書いた。&lt;/P&gt;
&lt;P&gt;&lt;A href="http://blogs.sqlpassj.org/hotikisu/articles/16073.aspx"&gt;http://blogs.sqlpassj.org/hotikisu/articles/16073.aspx&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;ここで使ったsuser_sname()関数を使って、InfoPathでSQL Serverから自分の氏名を取得するデータ接続を作ってみた。方法は次のとおり。&lt;/P&gt;
&lt;P&gt;（１）SQL Serverに次のようなユーザー情報のテーブルを作っておく&lt;BR&gt;　　ユーザー（ログオンID,ユーザー氏名）&lt;BR&gt;（２）InfoPathでデータ接続を作る&lt;BR&gt;（３）ウィザードで適当なテーブルを選択し、SQLの編集を行う&lt;BR&gt;（４）SQL文を次のように書き換える&lt;/P&gt;
&lt;P&gt;select "ユーザー氏名" from "dbo"."ユーザー" as "ユーザー" where '（ドメイン名\）' +&amp;nbsp;ログオンID = (select suser_sname())&lt;/P&gt;
&lt;P&gt;もしユーザーテーブルのログオンIDにドメイン名も含んだデータを格納しているなら、次のようでいい。&lt;/P&gt;
&lt;P&gt;select "ユーザー氏名" from "dbo"."ユーザー" as "ユーザー" where&amp;nbsp;ログオンID = (select suser_sname())&lt;/P&gt;
&lt;P&gt;&amp;nbsp;つまりInfoPathのデータ接続にサブクエリを書くだけでいいのだ。この手法は応用がきくだろう。&lt;/P&gt;&lt;img src ="http://blogs.sqlpassj.org/hotikisu/aggbug/25016.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>ホチキス先生</dc:creator><title>InfoPathの「繰り返しテーブル」の表を整える（２)繰り返しテーブルの罫線 </title><link>http://blogs.sqlpassj.org/hotikisu/archive/2008/05/21/24793.aspx</link><pubDate>Wed, 21 May 2008 01:35:00 GMT</pubDate><guid>http://blogs.sqlpassj.org/hotikisu/archive/2008/05/21/24793.aspx</guid><wfw:comment>http://blogs.sqlpassj.org/hotikisu/comments/24793.aspx</wfw:comment><comments>http://blogs.sqlpassj.org/hotikisu/archive/2008/05/21/24793.aspx#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://blogs.sqlpassj.org/hotikisu/comments/commentRss/24793.aspx</wfw:commentRss><trackback:ping>http://blogs.sqlpassj.org/hotikisu/services/trackbacks/24793.aspx</trackback:ping><description>&lt;P&gt;繰り返しテーブルを作ると、テーブルの罫線とセル内のテキストボックスの周囲が淡いグレーに設定される。これはフォームをプレビューしたときに、画面上でテーブルやテキストボックスを確認しやすいための設定だろうと思われる。しかし印刷時にはあまり美しくない。&lt;/P&gt;
&lt;P&gt;自分で罫線を設定するには、表を右クリックして「罫線と網掛けの設定」で行うが、バリエーションがあまり多くない。決定的に困るのは、線の太さの最低が1pxであることだ。この罫線は太すぎる。たとえばAccessのビューでは、1ptの実線の罫線より細い「細線」があるし、Excelでも実線以外により細い罫線が用意されている。Wordではより細かい設定があり、0.25pt、0.5pt、0.75ptなど0.25ポイント刻みで罫線の太さが選択できる。しかしInfoPathには1pt以下の実線はない。また点線を選ぶこともできるが、なぜか点線は太さの最小値が2.25ptである。&lt;/P&gt;
&lt;P&gt;このようにデフォルトでは太すぎる繰り返しテーブルの罫線だが、罫線を淡いグレーに変更することによって、細い奇麗な罫線に見えるようになる。ただしプリンタによっては印刷の具合は異なるかもしれない。&lt;/P&gt;
&lt;P&gt;（１）テキストボックスの枠線をとる&lt;BR&gt;表内のテキストボックスを選択し、右クリックして「罫線と網掛けの設定」を選択する。「罫線」タブでプリセットから「なし」を選択して罫線を取る。&lt;/P&gt;
&lt;P&gt;（２）テーブルの罫線をグレーにする&lt;BR&gt;繰り返しテーブルを選択し、右クリックして「罫線と網掛けの設定」を選択する。「罫線」タブで「スタイル」は実線のまま、「色」をクリックしてパレットの右端上から3番目の淡いグレーに変更する。「線の太さ」は1ptのまま。プリセットから「外枠」と「内側」をクリックして罫線を設定する。&lt;/P&gt;&lt;img src ="http://blogs.sqlpassj.org/hotikisu/aggbug/24793.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>ホチキス先生</dc:creator><title>InfoPathの「繰り返しテーブル」の表を整える（１)繰り返しテーブルの行間</title><link>http://blogs.sqlpassj.org/hotikisu/archive/2008/05/08/24764.aspx</link><pubDate>Thu, 08 May 2008 01:23:00 GMT</pubDate><guid>http://blogs.sqlpassj.org/hotikisu/archive/2008/05/08/24764.aspx</guid><wfw:comment>http://blogs.sqlpassj.org/hotikisu/comments/24764.aspx</wfw:comment><comments>http://blogs.sqlpassj.org/hotikisu/archive/2008/05/08/24764.aspx#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://blogs.sqlpassj.org/hotikisu/comments/commentRss/24764.aspx</wfw:commentRss><trackback:ping>http://blogs.sqlpassj.org/hotikisu/services/trackbacks/24764.aspx</trackback:ping><description>&lt;P&gt;繰り返しテーブルで表を作って整形するというケースは多いと思われる。このとき、マウスでドラッグして行間を変えることもある程度できるが、繰り返しテーブルとセルの中にあるテキストボックスなどのコントロールの「すき間」の調節ができないなど、マウス操作だけでは思ったとおりの表にすることができない。ここでは繰り返しテーブルの行間に限ってまとめる。&lt;/P&gt;
&lt;P&gt;繰り返しテーブルの行間に関係する値には次のものがある。（１）繰り返しテーブルのセルの高さ、（２）繰り返しテーブルのセルに設定する、中のコントロールに対する余白である「セル内のスペース」、（３）コントロールの高さ、（４）コントロールの中のテキストに対する間隔をあける「スペース」、（５）コントロールに設定する、周囲の余白を設定する「余白」。&lt;/P&gt;
&lt;P&gt;（１）繰り返しテーブルのセルの高さ&lt;BR&gt;繰り返しテーブルを右クリックし「表のプロパティ」を開き「行」タブで設定する。デフォルトで「自動的に行の高さを設定する」になっており、セルの中に書かれた文字のフォントやコントロールの大きさによって高さが伸縮する設定である。文字のフォントやコントロールの大きさ如何にかかわらず行間をあけたいときは、行の高さの最小値に値を入力して決める。&lt;/P&gt;
&lt;P&gt;（２）セル内のスペース&lt;BR&gt;繰り返しテーブルを右クリックし「表のプロパティ」を開き「セル」タブで設定する。デフォルトでは上1ピクセル、下1ピクセルに設定されている。この値は、セルの罫線と中に書かれた文字やコントロールの間の余白の値である。&lt;/P&gt;
&lt;P&gt;（３）コントロールの高さ&lt;BR&gt;セル内のコントロールを右クリックし「プロパティ」を開き「サイズ」タブで「高さ」を設定する。デフォルトでは「自動」になっており、フォントサイズによって自動的に調節される設定である。高さを決めたいときはここに数値を入れる。&lt;/P&gt;
&lt;P&gt;（４）スペース&lt;BR&gt;上記と同じくコントロールの「プロパティ」の「サイズ」タブで設定する「スペース」は、コントロールの内側のテキストとの間に間隔をあける値である。&lt;/P&gt;
&lt;P&gt;（５）余白&lt;BR&gt;上記と同じくコントロールの「プロパティ」の「サイズ」タブで設定する「余白」は、コントロールの周囲の余白を設定する値である。&lt;/P&gt;
&lt;P&gt;セルの高さやコントロールの高さ以外に行間を決める要素として、余白に関する値が3つある。このうち「スペース」は、コントロールの中に表示されるテキストの上下にできる間隔であるが、コントロールの一般的にはセルの中に一つのコントロールまたは一つの文字列が入るので、「セル内のスペース」と「余白」は同じ余白を設定する値のよう思えるが、これらは別の設定値である。&lt;/P&gt;
&lt;P&gt;例えば一つのセル内にテキストボックスを縦に2つ並べて作ったとき、セルに対して「セル内のスペース」を上30pxにすると、上のテキストボックスとセルの上罫線の間だけに30pxの間隔ができる。テキストボックスの「余白」を上30pxにすると、両方のテキストボックスの上に30pxの間隔ができる。&lt;/P&gt;
&lt;P&gt;行間の狭い表を作るためには、余白に関与するこれら3つの値を、すべて0に設定すればよい。&lt;/P&gt;&lt;img src ="http://blogs.sqlpassj.org/hotikisu/aggbug/24764.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>ホチキス先生</dc:creator><title>InfoPathのフォームにデータベースと連携した画像を表示するには</title><link>http://blogs.sqlpassj.org/hotikisu/archive/2008/01/24/24511.aspx</link><pubDate>Thu, 24 Jan 2008 00:54:00 GMT</pubDate><guid>http://blogs.sqlpassj.org/hotikisu/archive/2008/01/24/24511.aspx</guid><wfw:comment>http://blogs.sqlpassj.org/hotikisu/comments/24511.aspx</wfw:comment><comments>http://blogs.sqlpassj.org/hotikisu/archive/2008/01/24/24511.aspx#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://blogs.sqlpassj.org/hotikisu/comments/commentRss/24511.aspx</wfw:commentRss><trackback:ping>http://blogs.sqlpassj.org/hotikisu/services/trackbacks/24511.aspx</trackback:ping><description>&lt;P&gt;学籍番号で管理された生徒の写真を、InfoPathのフォーム上で表示したい。このとき、生徒の写真を学籍番号でネットワーク上の共有フォルダに保存しておき、アクセスできるようにしておく。そしてデータベースには次のようなデータを登録しておく。&lt;/P&gt;
&lt;P&gt;学籍番号、写真のファイル名&lt;BR&gt;0900001,\\SERVERNAME\SHARE\0900001.jpg&lt;/P&gt;
&lt;P&gt;InfoPathでデータ接続を作り、データを取得する。フォーム上で「写真のファイル名」フィールドを「画像」コントロールとして作成する。これで写真のファイル名に相当する画像がフォーム上に呼び出されて表示される。&lt;/P&gt;&lt;img src ="http://blogs.sqlpassj.org/hotikisu/aggbug/24511.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>ホチキス先生</dc:creator><title>InfoPathのデータ接続とSET NOCOUNT ON</title><link>http://blogs.sqlpassj.org/hotikisu/archive/2008/01/24/24510.aspx</link><pubDate>Thu, 24 Jan 2008 00:48:00 GMT</pubDate><guid>http://blogs.sqlpassj.org/hotikisu/archive/2008/01/24/24510.aspx</guid><wfw:comment>http://blogs.sqlpassj.org/hotikisu/comments/24510.aspx</wfw:comment><comments>http://blogs.sqlpassj.org/hotikisu/archive/2008/01/24/24510.aspx#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://blogs.sqlpassj.org/hotikisu/comments/commentRss/24510.aspx</wfw:commentRss><trackback:ping>http://blogs.sqlpassj.org/hotikisu/services/trackbacks/24510.aspx</trackback:ping><description>&lt;P&gt;InfoPathでデータ接続を作るとき、自動的にSQL文が作成されるが、それを自分で書き換えてもかまわない。しかしデータセットが返ってこないDELETE,INSERT,UPDATE文を書いても、InfoPathがチェックをしてエラーになり、データセットを作成することができない。&lt;/P&gt;
&lt;P&gt;私はこれをInfoPathの仕様だと思っていたが、実はそうではなくて、ADO(OLEDB) の仕様であることがわかった。したがってInfoPathのデータ接続でSET NOCOUNT ONを使うと次のようなことができる。&lt;/P&gt;
&lt;P&gt;たとえば、ボタンをクリックしたときに、データベースのレコードを一括で削除したいとする。このとき、データ接続をウィザードで作り、次のようにSQL文を書き換える。&lt;/P&gt;
&lt;P&gt;---------------------------------&lt;BR&gt;DELETE FROM WorkRecord&lt;BR&gt;---------------------------------&lt;/P&gt;
&lt;P&gt;ここで実現したいのは、「WorkRecord」というテーブルのデータをすべて削除する、ということである。上記のSQL文は正しいが、データセットが返ってこないのでInfoPathは「テストに失敗しました」となり、データセットを作ることができない。&lt;/P&gt;
&lt;P&gt;しかし、ここで、SET NOCOUNT ONを使って次のように変更するとうまくいく。&lt;/P&gt;
&lt;P&gt;-----------------------&lt;BR&gt;SET NOCOUNT　ON&lt;BR&gt;SELECT 'Dummy'&lt;BR&gt;DELETE FROM WorkRecord&lt;BR&gt;-----------------------&lt;/P&gt;
&lt;P&gt;上記のようなデータ接続をつくっておき、ボタンをフォームに配置して、クリックしたときにクエリを送信するようにすれば、データの一括削除ボタンが実現できる。&lt;/P&gt;&lt;img src ="http://blogs.sqlpassj.org/hotikisu/aggbug/24510.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>ホチキス先生</dc:creator><title>InfoPathからストアドプロシージャを動かす（３）ストアドプロシージャに引数を渡す</title><link>http://blogs.sqlpassj.org/hotikisu/archive/2008/01/24/24509.aspx</link><pubDate>Thu, 24 Jan 2008 00:48:00 GMT</pubDate><guid>http://blogs.sqlpassj.org/hotikisu/archive/2008/01/24/24509.aspx</guid><wfw:comment>http://blogs.sqlpassj.org/hotikisu/comments/24509.aspx</wfw:comment><comments>http://blogs.sqlpassj.org/hotikisu/archive/2008/01/24/24509.aspx#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://blogs.sqlpassj.org/hotikisu/comments/commentRss/24509.aspx</wfw:commentRss><trackback:ping>http://blogs.sqlpassj.org/hotikisu/services/trackbacks/24509.aspx</trackback:ping><description>&lt;P&gt;InfoPathからストアドプロシージャに引数を渡すには、テーブルを使う方法がある。テーブルを使って引数を渡すと、あるテーブルに、指定した範囲の日付データを作成する、といったことができるようになる。&lt;/P&gt;
&lt;P&gt;例として、次のようなテーブルがあるとする。&lt;/P&gt;
&lt;P&gt;----------------------------&lt;BR&gt;テーブル名　WorkRecord&lt;BR&gt;----------------------------&lt;BR&gt;TeacherId(varchar(50)&lt;BR&gt;WorkDate(smalldatetime)&lt;BR&gt;WorkName(varchar(50)&lt;BR&gt;----------------------------&lt;/P&gt;
&lt;P&gt;このテーブルは、TeacherIdに教員番号を入れ、WorkDateに勤務日データを作り、WorkNameにその日の仕事内容を入力する、といったようなものだ。このとき、仕事内容を入力するために、あらかじめ○月&amp;#215;日から●月△日までのテーブルデータを作っておきたいとする。このためのストアドプロシージャは次のようなクエリで作ることができる。&lt;/P&gt;
&lt;P&gt;----------------------------------------------&lt;BR&gt;CREATE PROCEDURE MakeWorkRecord&lt;BR&gt;@TeachersId varchar(10),&lt;BR&gt;@FirstDate smalldatetime,&lt;BR&gt;@LastDate smalldatetime&lt;BR&gt;AS&lt;BR&gt;DECLARE @AddDate smalldatetime&lt;BR&gt;set @AddDate = @FirstDate&lt;BR&gt;WHILE @AddDate &amp;lt; @LastDate&lt;BR&gt;BEGIN&lt;BR&gt;INSERT INTO WorkRecord(TeacherId,WorkDate)&lt;BR&gt;VALUES (@TeachersId,@AddDate)&lt;BR&gt;SET @AddDate = @AddDate + 1&lt;BR&gt;END&lt;BR&gt;----------------------------------------------&lt;/P&gt;
&lt;P&gt;このストアドプロシージャを実行するためには、次のように3つの引数を指定する。&lt;/P&gt;
&lt;P&gt;EXECUTE MakeWorkRecord 教員番号,開始年月日,終了年月日の次の日&lt;/P&gt;
&lt;P&gt;しかし、InfoPathでこのストアドプロシージャを動かそうと思っても、データ接続に動的に引数を指定できないので使うことはできない。そこで、InfoPathからボタンをクリックすることで動かすことができるようにするために、まず、引数をストアしておく次のようなテーブルを作っておく。&lt;/P&gt;
&lt;P&gt;---------------------------&lt;BR&gt;テーブル名　FunctionExp&lt;BR&gt;---------------------------&lt;BR&gt;UserId(varchar(50)&lt;BR&gt;exp1(varchar(50)&lt;BR&gt;exp2(smalldatetime)&lt;BR&gt;exp3(smalldatetime)&lt;BR&gt;---------------------------&lt;/P&gt;
&lt;P&gt;このテーブルは、ストアドプロシージャに渡したい引数を入れるために使う。exp1に教員番号、exp2に開始日、exp3に終了日の次の日を入れ、ストアドプロシージャ側からこのテーブルの内容を見るようにする。&lt;/P&gt;
&lt;P&gt;このテーブルを使ったストアドプロシージャは次のようになる。&lt;/P&gt;
&lt;P&gt;--------------------------------------------------&lt;BR&gt;CREATE PROCEDURE MakeWorkRecordSub&lt;BR&gt;AS&lt;BR&gt;SET NOCOUNT ON&lt;BR&gt;SELECT 'Dummy'&lt;BR&gt;DECLARE @TeachersId varchar(10),&lt;BR&gt;@FirstDate smalldatetime,&lt;BR&gt;@LastDate smalldatetime,&lt;BR&gt;@AddDate smalldatetime&lt;BR&gt;SELECT @TeachersId = Exp1 FROM FunctionExp&lt;BR&gt;SELECT @FirstDate = Exp2 FROM FunctionExp&lt;BR&gt;SELECT @LastDate = Exp3 FROM FunctionExp&lt;BR&gt;set @AddDate = @FirstDate&lt;BR&gt;WHILE @AddDate &amp;lt; @LastDate&lt;BR&gt;BEGIN&lt;BR&gt;INSERT INTO WorkRecord(TeacherId,WorkDate)&lt;BR&gt;VALUES (@TeachersId,@AddDate)&lt;BR&gt;SET @AddDate = @AddDate + 1&lt;BR&gt;END&lt;BR&gt;--------------------------------------------------&lt;/P&gt;
&lt;P&gt;このストアドプロシージャを実行するには、まず引数をFunctionExpテーブルにセットしておく。そしてストアドプロシージャの実行は次のようになる。&lt;/P&gt;
&lt;P&gt;EXECUTE MakeWorkRecordSub&lt;/P&gt;
&lt;P&gt;このストアドプロシージャを実行すれば、その時点でFunctionExpテーブルにセットされている値が引数として読み込まれて実行される。&lt;/P&gt;
&lt;P&gt;このストアドプロシージャをInfoPathで実行するには、次のような作業を行う。&lt;/P&gt;
&lt;P&gt;(1)引数をセットするテーブルに対するメインデータ接続を作る。&lt;BR&gt;(2)EXECUTE MakeWorkRecordSubを実行するセカンダリデータ接続を作る。&lt;BR&gt;(3)フォームにメインデータ接続で引数をストアするフィールドを作る。&lt;BR&gt;(4)ボタンを作りセカンダリデータソースのクエリを実行する動作を設定する。&lt;/P&gt;
&lt;P&gt;これで、InfoPathのフォーム上で、教員番号と開始日、終了日の次の日を指定し、ボタンを押すことで当該期間中の日付データをテーブルに一括して作成するフォームができる。もちろん、これの応用で、一定範囲のデータを一括で削除する、というフォームも作ることができる。&lt;/P&gt;
&lt;P&gt;InfoPathは個々のデータを操作するには格好のツールであるが、データを一括で操作する管理者的な操作には不向きである。しかし、この方法を使えば、管理者的な作業に役立つフォームも実現することができる。&lt;/P&gt;
&lt;P&gt;なお、この方法でストアドプロシージャにテーブルの値で引数を渡すには、複数のユーザーが同じテーブルを使わないような工夫をしなければならない。&lt;/P&gt;&lt;img src ="http://blogs.sqlpassj.org/hotikisu/aggbug/24509.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>ホチキス先生</dc:creator><title>InfoPathからストアドプロシージャを動かす（２）insert,update,delete</title><link>http://blogs.sqlpassj.org/hotikisu/archive/2008/01/24/24508.aspx</link><pubDate>Thu, 24 Jan 2008 00:47:00 GMT</pubDate><guid>http://blogs.sqlpassj.org/hotikisu/archive/2008/01/24/24508.aspx</guid><wfw:comment>http://blogs.sqlpassj.org/hotikisu/comments/24508.aspx</wfw:comment><comments>http://blogs.sqlpassj.org/hotikisu/archive/2008/01/24/24508.aspx#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://blogs.sqlpassj.org/hotikisu/comments/commentRss/24508.aspx</wfw:commentRss><trackback:ping>http://blogs.sqlpassj.org/hotikisu/services/trackbacks/24508.aspx</trackback:ping><description>&lt;P&gt;selectのストアドプロシージャーは単純に動くが、insert,update,deleteのストアドプロシージャーは単純には動かない。たとえば次のようなクエリでストアドプロシージャを作ってみる。&lt;/P&gt;
&lt;P&gt;------------------------------------------------------&lt;BR&gt;Create Procedure test01&lt;BR&gt;As&lt;BR&gt;INSERT INTO Teacher&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (TeacherId,YearId,TeacherName)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; VALUES&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ('222222','2006','Japan Taro')&lt;BR&gt;------------------------------------------------------&lt;BR&gt;Create Procedure test02&lt;BR&gt;As&lt;BR&gt;UPDATE Teacher&lt;BR&gt;&amp;nbsp;&amp;nbsp; SET TeacherName = 'Yoshio Yamaguchi'&lt;BR&gt;&amp;nbsp;&amp;nbsp; WHERE TeacherId = '1111111'&lt;BR&gt;------------------------------------------------------&lt;BR&gt;Create Procedure test03&lt;BR&gt;As&lt;BR&gt;DELETE FROM Teacher&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; WHERE TeacherId = '111111' , YearId = '2005'&lt;BR&gt;------------------------------------------------------&lt;/P&gt;
&lt;P&gt;Test01はデータを挿入する、Test02は氏名を変更する、Test03は特定の年度のデータを削除するストアドプロシージャである。これらのストアドプロシージャを実行するSQLをInfoPathのデータセットに書いても、ウィザードで次のようなメッセージが表示されてエラーになる。&lt;/P&gt;
&lt;P&gt;「テストに失敗しました」&lt;/P&gt;
&lt;P&gt;「詳細の表示」ボタンをクリックすると、&lt;/P&gt;
&lt;P&gt;「ADO アダプタはスキーマを取得できませんでした。指定されたクエリで返されるレコードセットはありません。SQL ステートメントを確認してください。」&lt;/P&gt;
&lt;P&gt;つまり、InfoPathのデータ接続ウィザードでは、データセットが返ることをチェックしているのである。そこでselect文以外ではエラーになり、ウィザードを完了することもできない。&lt;/P&gt;
&lt;P&gt;そこでこれらのストアドプロシージャに、データセットを返すselect文を加えてみる。たとえば次のように変更してみるのである。&lt;/P&gt;
&lt;P&gt;------------------------------------------------------&lt;BR&gt;Create Procedure test01&lt;BR&gt;As&lt;BR&gt;SELECT 'dummy'&lt;BR&gt;INSERT INTO Teacher&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (TeacherId,YearId,TeacherName)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; VALUES&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ('222222','2006','Japan Taro')&lt;BR&gt;------------------------------------------------------&lt;BR&gt;Create Procedure test02&lt;BR&gt;As&lt;BR&gt;SELECT 'dummy'&lt;BR&gt;UPDATE Teacher&lt;BR&gt;&amp;nbsp;&amp;nbsp; SET TeacherName = 'Yoshio Yamaguchi'&lt;BR&gt;&amp;nbsp;&amp;nbsp; WHERE TeacherId = '1111111'&lt;BR&gt;------------------------------------------------------&lt;BR&gt;Create Procedure test03&lt;BR&gt;As&lt;BR&gt;SELECT 'dummy'&lt;BR&gt;DELETE FROM Teacher&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; WHERE TeacherId = '111111' , YearId = '2005'&lt;BR&gt;------------------------------------------------------&lt;/P&gt;
&lt;P&gt;SELECT 'dummy'の文で「dummy」というテキストを返すことにしている。これでデータ接続を試してみると、期待に反してうまくいかないのだ。&lt;/P&gt;
&lt;P&gt;「テストに失敗しました」&lt;/P&gt;
&lt;P&gt;「ADO アダプタはスキーマを取得できませんでした。複数のレコードセットはサポートされていません。SQL ステートメントを確認してください。」&lt;/P&gt;
&lt;P&gt;つまりInfoPathは、select文に加えて、insert、update、deleteの実行もデータセットが返ってきていると思ってしまうのだ。これはT-SQL開発者にとっては既知の現象とのことで、ストアドプロシージャで処理された行数を示すメッセージが結果セットの一部として返されるためである。&lt;/P&gt;
&lt;P&gt;これを回避するためには、SET NOCOUNT ON文を使って、次のストアドプロシージャにする。&lt;/P&gt;
&lt;P&gt;------------------------------------------------------&lt;BR&gt;Create Procedure test01&lt;BR&gt;As&lt;BR&gt;SET NOCOUNT ON&lt;BR&gt;SELECT 'dummy'&lt;BR&gt;INSERT INTO Teacher&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (TeacherId,YearId,TeacherName)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; VALUES&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ('222222','2006','Japan Taro')&lt;BR&gt;------------------------------------------------------&lt;BR&gt;Create Procedure test02&lt;BR&gt;As&lt;BR&gt;SET NOCOUNT ON&lt;BR&gt;SELECT 'dummy'&lt;BR&gt;UPDATE Teacher&lt;BR&gt;&amp;nbsp;&amp;nbsp; SET TeacherName = 'Yoshio Yamaguchi'&lt;BR&gt;&amp;nbsp;&amp;nbsp; WHERE TeacherId = '1111111'&lt;BR&gt;------------------------------------------------------&lt;BR&gt;Create Procedure test03&lt;BR&gt;As&lt;BR&gt;SET NOCOUNT ON&lt;BR&gt;SELECT 'dummy'&lt;BR&gt;DELETE FROM Teacher&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; WHERE TeacherId = '111111' , YearId = '2005'&lt;BR&gt;------------------------------------------------------&lt;/P&gt;
&lt;P&gt;ストアドプロシージャをこのようにすると、insert、update、deleteを実行するストアドプロシージャがInfoPathのデータ接続に指定できる。あとは「クエリの実行」ボタンを作ってフォームに配置するだけだ。&lt;/P&gt;
&lt;P&gt;※この件については、Microsoft MVPの小川貢氏に御指導をいただきました。ありがとうございました。&lt;/P&gt;&lt;img src ="http://blogs.sqlpassj.org/hotikisu/aggbug/24508.aspx" width = "1" height = "1" /&gt;</description></item></channel></rss>