ながさわさんのアレグロモデラート

アレグロモデラート(Allegro moderato)は、速さを示す演奏記号で「穏やかに速く」

Access Web データベースから Oracle のトリガーを呼び出す(導入編)

ゴールデンウィークでちょっと時間があるので、以前よりまとめようと思っていたテーマをポスト。

SharePointAccess Web データベースから、Oracle のトリガーを呼び出す必要があり、これまでは、ボタンが押されたときに、Web ブラウザーコントロールの URL を変更し、Oracle のトリガーを呼び出す SharePoint のアプリケーションページを呼び出していた。

code.msdn.microsoft.com

しかし、この方法だと、うまく動かないというケースが出てきた。要約すると、

  • 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"/>

を追加する必要がある。

blogs.technet.microsoft.com

さて、この方法で、Super Visual Formade による帳票の呼び出し(PDF のダウンロード)も行っていたのだが、こちらのほうは、印刷ボタンを、ハイパーリンクコントロールにして、新しいウィンドウで呼び出すことで、確実にアプリケーションページを呼び出すということで回避した。
ちなみに、マクロからハイパーリンクの表示テキストを変更するには、以下のように「文字列#URL」という値をセットすればよい。

f:id:lakeside_shinnosuke:20160429214426p:plain

PDF のダウンロードのように、Octet-Sterm を返すのであれば、結果的に新しいウィンドウ(タブ)は開かないので、見た目の変更がなく、違和感がなかったのだが、トリガーの場合は、保存ボタンが押されるたびに、新しいタブが開くというのは、ユーザーインタフェースとして適切なものではない。

そこで、Access Services は、実データを SQLServer に書いているから、そのテーブルにトリガーに仕掛け、SQL Server のトリガーには、CLR トリガーという、.NET アセンブリを呼び出す機構があり、そこから Oracle を呼び出すという方法で進めていくことにしたのだが、これが、悪夢のはじまりだった。。。。(つづく)