カテゴリ「SharePoint Designer」の32件の投稿 Feed

2015年3月27日 (金)

 SharePoint Designer 2013 を使って SharePoint 2010ベースのワークフローを開発しているとき、ワークフロー発行時に次のようなエラーメッセージが表示され、正常に発行できないことがあります。

「ワークフローのコンパイル中にエラーが発生しました。ワークフロー ファイルは保存されましたが、実行することはできません。」

詳細

(0,0)Activity 'ID436' の検証に失敗しました: IfElseActivity には、IfElseBranchActivity という種類の子を少なくとも 1 つ含める必要があります。)

2015-03-26 23-11-52

 一旦こうしたエラーが出ると、これ以降はこのワークフローも含むすべてのワークフロー発行時に次のエラーが表示され発行できなくなってしまうことがあります。

「ワークフローに関連するサーバーで、不明なエラーが発生しました」

2015-03-26 23-15-01

まず、「ワークフローに関連するサーバーで、不明なエラーが発生しました」のエラー発生原因ですが、本来ワークフローが内部的に書き込むフォルダーが、先のエラーにより削除されてしまうことに起因しています。この場合、次の場所に Temp という名前のフォルダ―を作成すると修正できます。

[SharePoint サーバー上]

C:\Users\spfarm\AppData\Local

※上記のうち、spfarm は、発行先となる SharePoint サイトをホストしている IIS のアプリケーション プールID です。環境に応じて読み替えてください。

Workflow Temp

以上の手順でエラーとなっているワークフローは発行できるようになります。

さて、元々のエラーとなっているワークフローの原因ですが、今回のようなエラーが出る場合は、エラーメッセージ通りに条件分岐の書き方に問題がある場合が多いので慌てずにロジックをしっかり見直してみてください。Else ブロックが正しくないなどないかどうか確認します。しかし、それでも原因がよくわからないこともあります。そこで、内部構造を調べてみたところ、SharePoint Designer 上の不具合が発生している場合があるようです。

大体、エラーメッセージに記載されている 'ID436' ですが、これは何の番号でしょうか? そもそも、SharePoint 2010 ベースのワークフローを作成する際には内部的に XOML と呼ばれる XML 形式のファイルが生成されます。実はこのIDはこの XOML ファイル内に記載されている内部IDであり、SharePoint Designer の UI 上には直接でてこないものです。そこで次のような手順で内容を確認してみます。

  1. サイト コレクションの管理者として、SharePoint Designer 2013 を起動し、SharePoint サイトにアクセスする。
  2. ナビゲーションから[すべてのファイル]>[Workflows]の順にクリックする。
    2015-03-26 23-27-07

  3. 問題が起きているワークフローをクリックする。
    2015-03-26 23-28-09
  4. *.xoml ファイルを選択し、リボン メニューから [ファイルのエクスポート]をクリックし、任意の場所に保存する。
    2015-03-26 23-30-58

  5. 保存した *.xoml ファイルをメモ帳などで開く

ファイルを開いて、エラーメッセージに出ていたIDを検索します。

2015-03-26 23-32-26

上記の場合だと次のような XML要素が見つかります。

<IfElseActivity x:Name='ID436'/>

この IfElseActivity というタグは本来は子要素を持つ必要があるのですが、見ての通り子要素がないまま自己完結しています。これがエラーの問題でした。しかし、この内容は SharePoint Designer の表面上では確認できません。

対処するため、今回、このタグは使っていないので削除します。上書き保存をしてから、再び SharePoint Designer 内の元の場所にインポートして上書きします。

最後に発行すると正常に発行できるはずです。

Course-Banner-Workflow
2013年6月28日 (金)

検証環境としてSharePoint Server 2013 を構築しており、このサーバー上にOfficeクライアントをインストールした後、SharePoint Designer 2013 がインストールできなくなるトラブルがあったため、情報共有しておきます。

SharePoint サーバー上に次の順でOfficeアプリケーションをインストールしました。

1. Microsoft Office Professional Plus 2013
2. Microsoft Visio 2013

この次に SharePoint Designer 2013 をインストールしようとしたところ次のようなエラーが表示され、セットアップができない状態になりました。

2013-06-28 0-46-31

これを修正するにはレジストリを編集する必要があります。レジストリーキーを削除するため、試す場合は念のためレジストリーキーのエクスポートなどの処置をするようにし、自己責任にて行ってください。レジストリーを修正するため、Regedit.exe (レジストリ エディタ)を起動し、次のキーを削除します。

[HKEY_CLASSES_ROOT\Installer\Products\00005119110000000000000000F01FEC]

2013-06-28 1-01-02

ちなみに、私の環境はMicrosoft Office Professional Plus 2013をインストールしているため上記のキーですが、異なるエデションを利用している場合はキーが異なる可能性がありますので注意してください。

[追記]

検証中、上記手順でキー削除後に Office アプリケーションが不安定になるため、削除前にレジストリキーをエクスポートし、SPD2013をインストールした後、再びエクスポートしたキーをインポートしなおすと動作が安定しました。ご参考まで。

 

 

2012年2月16日 (木)

SharePoint Server 2010 SP1 + 2011 June CU Reflesh + 2011 August CU 適用環境でブログサイトを作成している場合に、カテゴリリンクをクリックするとカテゴリ名表示が文字化けします(※オンプレミスだけでなく、SharePoint Online も 2012.2.16現在同様の問題が発生してるようです)。

Blog-trouble-01

問題の原因はブログサイトの Default.aspx に配置されているカテゴリ表示のWebパーツです。このWebパーツが生成するリンクが正しい情報を取得していません。内部的にXMLでデータを取得し、XSTLを使ってリンクを生成しているのですが、XSLTに不正があります。どうもマイクロソフト社の既知の問題とはなっているようですが、とにかくこのままでは使えません。

現状の回避策としては、SharePoint Designer 2010 で Default.aspx (/Lists/Categories/Category.aspxも同様)にアクセスし、Webパーツのリンクを直接編集するのが最善策です。

1. SharePoint Designer 2010 を使ってWeb パーツのリンク部分のハイパーリンクを編集する

Blog-trouble-02

2. 下記通りのアドレス部分のリンクを修正する

(誤) {$HttpVDir}/{$thisNode/../@resource.wss.lists_Folder}/{$thisNode/../@resource.wss.blogcategories_Folder}/Category.aspx?CategoryId={$thisNode/@ID}&Name={$CategoryTitle}

(正){$HttpVDir}/{$thisNode/../@resource.wss.lists_Folder}/{$thisNode/../@resource.wss.blogcategories_Folder}/Category.aspx?CategoryId={$thisNode/@ID}&Name={$thisNode/@Title}

Blog-trouble-03
3. [OK]をクリックし、ページを上書き保存する。

4. 検証する (以上の操作をリンクごとに行う)

Blog-trouble-04

こんなチマチマと作業するのはいたたまれませんが、英語圏以外は同様の状況のようですので、いずれはHot Fix が出てくれるとよいのですが。。。

[参考]

http://blog.bugrapostaci.com/2012/01/27/sharepoint-2010-charecter-problem-in-category-titles-in-blog-site-for-different-languages/#comment-584

 

2009年6月17日 (水)

ワークフローではファイルを別のユーザーが更新したら、またはあるプロパティ値が変更されたらメールを送信するなどの機能が必要になることがあります。これをSharePoint Designer 2007で行い、特定のプロパティ変更をトリガにワークフローを開始するにはちょっと工夫が必要です。

理由は、変更前の情報と変更後の情報をSharePoint Designer では認識してくれないからです。ということは、変更前の情報をどこかに持たせて、変更後の情報と比較してやれば、トリガにできるということになりますね?

こうしたフローを実装するには次のように行います。

[1st Step]

  1. 特定のフィールドの以前の値を格納する列(たとえば、beforeとします)を作成する
  2. SharePoint Designer でワークフローを作成する(詳細は2nd Stepで)

[2nd Step]

  1. ワークフローの起動オプションを「アイテム変更時に自動的にワークフローを開始するよう」に設定する
  2. 1つめの条件とアクションを次のように構成する
    "before列が空の場合に、トリガにしたい既存の列の値を格納する"
  3. 2つめの条件とアクションを次のように構成する
    "既存の列の値とbefore列の値が一致する場合はワークフローを中止する"
  4. 3つめは使用したいアクションのみを構成する

上記のステップは、次のURLにあるストリーミング コンテンツ(英語)で手順が確認できます。

[参考] http://office.microsoft.com/en-us/sharepointdesigner/HA102564191033.aspx (英語)

※上記URLは、Officeオンラインです。Office オンラインは基本的に英語の文書がありその対となる日本語文書がそろっているのですが、実際には日本語よりも英語のほうが情報が充実していまるようです。時には、英語で文献を探すことをお勧めします。またブログでも、日本語にはなっていないもので、役立ちそうなものは取り上げるようにしたいと思います。confident

2009年5月20日 (水)

SharePoint Designer 2007を使用してリストやライブラリのNewForm.aspx(アイテムの新規作成)やEditForm.aspx(アイテムのプロパティ編集)を編集し、カスタムのJavaScriptを実装することで日付などの入力フィールドの妥当性の検証が可能です。たとえば、開始日と終了日の2つのフィールドがあったとして、終了日が開始日より前の日付となっているような場合、SharePoint Server 2007ではエラーとして扱ってくれません。そこで、JavaScript を実装して2つのフィールド値の比較をしてエラーを検出するようにします。この時、「PreSaveAction」という名前の関数を定義すると、[OK]ボタンクリック時の既定の処理を制御できます。実際には、このPreSaveAction関数はSharePointが既定で持っている関数であり、これを上書きして既定の動作を少し変えてやります。

参考までに、"開始日"と"終了日"という名前の2つの"日付と時刻(日付のみ)"のフィールドがあることを前提としたサンプルコードを記載しておきます。

PreSaveAction 関数を上書きするコードサンプル

function PreSaveAction()
{
     var startDate=getTagFromIdentifierAndTitle("input","DateTimeFieldDate","開始日");
     var endDate=getTagFromIdentifierAndTitle("input","DateTimeFieldDate","終了日");

  var date1Array=startDate.value.split("/");
  var date1=new Date(date1Array[0],date1Array[1]-1,date1Array[2]);
  var date2Array=endDate.value.split("/");
  var date2=new Date(date2Array[0],date2Array[1]-1,date2Array[2]);

    if (date1>date2)
    {
         alert("日付の指定が正しくありません");
         return false;
    }//if
    return true;
} //function

//SharePointのフィールドを取得するための関数
function getTagFromIdentifierAndTitle(tagName,identifier,title)
{
var len=identifier.length;
var tags=document.getElementByTagName(tagName);

  for(var i=0;i<tags.length;i++)
  {
     var tempString=tags[i].id;
     if(tags[i].title==title&&(identifier==""||tempString.indexOf(identifier)==tempString.length-len))
     {
           return tags[i];
      }//if
      return null;
  }//for
}//function