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″ が設定されます。
あとは、動作規則や条件付き書式で、この値を条件にして、コントロールを無効化したり、入力不可にしてしまえば良いわけです。
シンプルですが活用の幅は広いと思います。
是非、お試し下さい。
login