読者です 読者をやめる 読者になる 読者になる

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

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

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

SharePoint 2013 Access Service 2013 SQLServer コンピューティングティップス

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

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 を呼び出すという方法で進めていくことにしたのだが、これが、悪夢のはじまりだった。。。。(つづく)