Access Web データベースから Oracle のトリガーを呼び出す(導入編)
ゴールデンウィークでちょっと時間があるので、以前よりまとめようと思っていたテーマをポスト。
SharePoint の Access Web データベースから、Oracle のトリガーを呼び出す必要があり、これまでは、ボタンが押されたときに、Web ブラウザーコントロールの URL を変更し、Oracle のトリガーを呼び出す SharePoint のアプリケーションページを呼び出していた。
しかし、この方法だと、うまく動かないというケースが出てきた。要約すると、
- GET パラメータを取得して、データベースを読み込み、PDF を作成して Octet-Stream を返す アプリケーションページを用意する
- Access Web データベースのビュー(フォーム)に、更新ボタンと、Web ブラウザーコントロールを用意する
- Web ブラウザーコントロールは、URL のフィールドをバインドする(Web ブラウザーコントロールには、値を直接セットできない)
- 更新ボタンが押されたときに、レコードを保存→バインドされているレコードの ID を GET パラメータに付与したアプリケーションページの URL を作成→URL のフィールドにセット→ページのリフレッシュ
- さらに、レコード移動時のイベントで、URL のフィールド値を消去する(そうしないと、レコードが表示されるたびに、アプリケーションページが呼ばれる)
このような処理だが、iframe に展開される Web ブラウザーコントロールの URL がうまく切り替わらないというケースが頻発し、原因究明よりも、このような信頼性に欠く方法はやめようということになった。
ちなみに、SharePoint のアプリケーションページを iframe から呼び出せるようにするには、aspx に、
<%@ Register tagprefix="WebPartPages" namespace="Microsoft.SharePoint.WebPartPages" assembly="Microsoft.SharePoint, Version=15.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %>
が、なければ追加して、
<WebPartPages:AllowFraming runat="server"/>
を追加する必要がある。
さて、この方法で、Super Visual Formade による帳票の呼び出し(PDF のダウンロード)も行っていたのだが、こちらのほうは、印刷ボタンを、ハイパーリンクコントロールにして、新しいウィンドウで呼び出すことで、確実にアプリケーションページを呼び出すということで回避した。
ちなみに、マクロからハイパーリンクの表示テキストを変更するには、以下のように「文字列#URL」という値をセットすればよい。
PDF のダウンロードのように、Octet-Sterm を返すのであれば、結果的に新しいウィンドウ(タブ)は開かないので、見た目の変更がなく、違和感がなかったのだが、トリガーの場合は、保存ボタンが押されるたびに、新しいタブが開くというのは、ユーザーインタフェースとして適切なものではない。
そこで、Access Services は、実データを SQLServer に書いているから、そのテーブルにトリガーに仕掛け、SQL Server のトリガーには、CLR トリガーという、.NET アセンブリを呼び出す機構があり、そこから Oracle を呼び出すという方法で進めていくことにしたのだが、これが、悪夢のはじまりだった。。。。(つづく)