6

イベント システムでアクティビティに関連付けられたコンポーネントを取得する必要があります。

次を使用してコンポーネント ID を取得しようとしています。

    public void OnActivityInstanceFinishPost(ActivityInstance activityInstance, string finishMessage, string nextActivity, string dynamicAssignee)
    {

        if (activityInstance.ProcessInstance.ProcessDefinition.Title.Equals("Component Process IESE"))
        {
            if (activityInstance.ActivityDefinition.Title.Equals("Create or Edit Component"))
            {
                WFE workflow = tdse.GetWFE();
                try
                {
                    Component comp = (Component)activityInstance.ProcessInstance.Item;

                    XMLReadFilter filter = new XMLReadFilter();
                    String processHistoryId = activityInstance.ProcessInstance.ID.Replace("131076", "131080");

                   ProcessHistory hist = (ProcessHistory)tdse.GetObject(activityInstance.ProcessInstance.ID, EnumOpenMode.OpenModeView, Constants.URINULL, filter);

                }
                catch (Exception e)
                { }

            }
        }
    }

さまざまなオプションを試します。

    Component comp = (Component)activityInstance.ProcessInstance.Item;

しかし、このソリューションは null を返します。

次に、インターネットで次の解決策を見つけました。

 XMLReadFilter filter = new XMLReadFilter();
 String processHistoryId = activityInstance.ProcessInstance.ID.Replace("131076", "131080");

 ProcessHistory hist = (ProcessHistory)tdse.GetObject(activityInstance.ProcessInstance.ID, EnumOpenMode.OpenModeView, Constants.URINULL, filter);
 Component comp = hist.Item as Component;

しかし、ProcessHistory オブジェクトは null です。

activityInstance に関連付けられているコンポーネントを特定するにはどうすればよいですか?

ありがとうございました。

4

3 に答える 3

5

Guskermitt が必要とする機能を確認した後、必要なことを行うためのより適切な方法を示しました。つまり、この場合 EventSystem は必要ありません。

彼の目標は、コンポーネントが承認された後に電子メールを送信することです。アプローチは次のようになります。

  1. ワークフローに新しい自動アクティビティを追加します。
  2. 新しい .NET アセンブリを作成します。この場合は、必要なことを行うための C# クラスです。
  3. アセンブリを GAC に登録します。
  4. ワークフローの新しい自動アクティビティにロジックを追加して、.NET アセンブリを使用します。

2#

[ProgId("WfHelper")]
[ComVisible(true)]
public class Helper
{    
public void SendMail(string workItemId)
{
var session = new Session();
.
.
.

4#

dim helper 
set helper = CreateObject("WfHelper")
call helper.SendMail(CurrentWorkItem.ID)
set helper = nothing 
FinishActivity “Email has been sent"
于 2013-02-14T15:15:51.490 に答える
3

ActivityInstanceには、への参照を含むWorkItems( から継承された) プロパティがあります。ActivityComponent

于 2013-02-13T08:46:58.440 に答える
2

OnActivityInstanceFinishPost は、アクティビティが終了したことを意味します。したがって、それに関連付けられている作業項目はもうありません。ただし、プロセス インスタンスとそれに関連付けられた作業項目を取得しています。そこで null を取得した場合は、ワークフロー プロセスが完了し、コンポーネントがワークフローから移動したことを示しています。コードを見ると、ProcessInstance が完了している可能性が非常に高くなります (null にはなりませんが、アイテムが関連付けられていません)。

この投稿http://www.tridiondeveloper.com/autopublishing-on-workflow-finishを読んで、履歴を調べることを提案していると思います。CM GUI を介して履歴を調べましたか?履歴項目はありますか? そうでない場合は、それが null になる理由です。ワークフロー プロセスは、完了すると履歴に移動されます。そのため、履歴を見る前に、最後のワークフロー アクティビティにいることを再確認してください。

コードを見ると、エラーは activityInstance.ProcessInstance.ID を使用して履歴オブジェクトを取得しようとしているようです。GetObject() はアイテムを返す必要がありますが、ProcessHistory へのキャストは中断され、静かに例外を食べます。次のように、ProcessInstance ID ではなく、履歴 ID を渡す必要があります。

ProcessHistory hist = (ProcessHistory)tdse.GetObject(processHistoryId, EnumOpenMode.OpenModeView, Constants.URINULL, filter);
于 2013-02-13T14:58:05.087 に答える