Infopath で「読み取り専用」状態をフォームに認識させる方法

Infopath はあまり知られていませんが(苦笑) Offce 製品のひとつですので、Word や Excel と同じように、ネットワーク上で共有していると排他制御がかかります。ようは誰かが既に開いていると、「読み取り専用」でしか開けませんよ─という奴です。

※余談ですが、この前とある SharePoint 関連ソリューションを販売している SE?さんと話をしたら、Infopath を知らなかった!…いくらなんでもそりゃ…。

これは非常に優れた機能だと思うのですが、一方で難点でもあります。

誰かが「閲覧」しているだけで、「編集」したい人が編集できません。
ノーツのように「閲覧モード」「編集モード」という制御ができれが良いのですが…。
まあ、設計思想が根本から違うので難しいんでしょうけど。


さて、「読み取り専用」になるのは仕様ですから仕方ないとして。
私が問題だと思うのは「読み取り専用状態でもコントロールは動く」という点です。

例えば、ボタンクリックでフォーム内の値を設定したり、マスタから情報を読み込んだり。
テキストフィールドに情報を入力したり。
でも最後には保存できない訳ですよ。

もちろんフォームを開く際に、警告がでて [OK] を押している訳ですが。
全てのユーザがこの仕様を正しく理解して、infopath を利用してくれるかと言うと─ちょっと難しい。

特にボタンクリックによるフォームの送信(保存)を行っていると、厄介です。
送信すると(ユーザ視点で)意味不明なエラー。
これは困ります。

動作規則や条件付き書式で縛ることが出来れば良いのですが。
残念ながら、そもそもの条件として「読み取り専用時」を指定できないので無理なんです。

─で、ここからが本題。(前置きが長くて申し訳ない)

Infopath の U/I 上から「読み取り専用」を認識させるのは無理ですが。
実はコードで書けば、可能なんです!

それが XDocument.IsReadOnly プロパティ。

function XDocument::OnLoad(eventObj)
{
if (XDocument.IsReadOnly) {
XDocument.UI.Alert(“このフォームは読み取り専用です!”);
}
}

このコードでは、読み取り専用時に警告ダイアログが表示されます。
私がよく使うのはこのパターン

function XDocument::OnLoad(eventObj)
{
if (XDocument.IsReadOnly) {
var setReadOnly = XDocument.DOM.selectSingleNode( “my:マイフィールド/my:EditFlag”);
setReadOnly.text = “9”;
}
}

読み取り専用時に、自動的 EditFlag に、”9″ が設定されます。
あとは、動作規則や条件付き書式で、この値を条件にして、コントロールを無効化したり、入力不可にしてしまえば良いわけです。

シンプルですが活用の幅は広いと思います。
是非、お試し下さい。

IsReadOnly Property


Author

中村 和彦(シンプレッソ・コンサルティング株式会社 代表)が「ユーザ視点の SharePoint 情報」を発信します。元大手製造業 SharePoint 運用担当。現SharePoint コンサルタント。お仕事のお問い合わせはこちらまでお願いします。当ブログにおける発信内容は個人に帰属し所属組織の公式発信/見解ではありません。
FB : 中村 和彦
blog: Be・Better!
MS MVP SharePoint 2009/10-2011/9
MS MVP Office 365 2012/10-2014/9