4

ワークフローの 2 つ以上のインスタンスが再起動されるたびにエラーが発生します。オフィスでのネットワーク インシデントの間、ワークフローを一時停止しました。プロセスを中断させたのは、スクリプトのタイムアウトでした。このタイムアウトを再現できなくなったため、ワークフロー アクティビティを再開してプロセスを完了しようとしました。ただし、中断された複数のアクティビティを再開すると、次のエラーが発生します (完全なログはさらに下にあります)。

Cannot insert the value NULL into column 'ITEM_ID', table 'tridion_cm.dbo.ITEM_ASSOCIATIONS'; column does not allow nulls. INSERT fails.
The statement has been terminated.

アクティビティを再開して、1 つずつ終了させるのは問題ありません。

完全なイベント ログ:

An error occurred while executing the Workflow script.
The Script Engine returned the following information:

SOURCE:

    Line = 0
    Column = 0
    Number = -2147220673
    Source = Component.Save
    Description = 
<?xml version="1.0" standalone="yes"?>
<tcm:Error ErrorCode="8004033F" Category="4" Source="Kernel" Severity="1" xmlns:tcm="http://www.tridion.com/ContentManager/5.0">
    <tcm:Line ErrorCode="8004033F" Cause="false" MessageID="16137"><![CDATA[Unable to save Component (tcm:5-32795).]]>
        <tcm:Token>RESID_4574</tcm:Token>
        <tcm:Token>RESID_4418</tcm:Token>
        <tcm:Token>tcm:5-32795</tcm:Token>
    </tcm:Line>
    <tcm:Line ErrorCode="8004033F" Cause="true">CDATA[No data found. ETA_ITEMS, U Cannot insert the value NULL into column 'ITEM_ID', table 'tridion_cm.dbo.ITEM_ASSOCIATIONS'; column does not allow nulls. INSERT fails. The statement has been terminated.
    </tcm:Line>
    <tcm:Line ErrorCode="8004033F" Cause="false"><![CDATA[A database error occurred while executing Stored Procedure "EDA_ITEMS_UPDATE".]]>
        <tcm:Token>EDA_ITEMS_UPDATE</tcm:Token>
    </tcm:Line>
    <tcm:Details>
        <tcm:CallStack>
            <tcm:Location>System.Data.SqlClient.SqlConnection.OnError(SqlException,Boolean)</tcm:Location>
            <tcm:Location>System.Data.SqlClient.SqlInternalConnection.OnError(SqlException,Boolean)</tcm:Location>
            <tcm:Location>System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(</tcm:Location>
            <tcm:Location>System.Data.SqlClient.TdsParser.Run(RunBehavior,SqlCommand,SqlDataReader,BulkCopySimpleResultSet,TdsParserStateObject)</tcm:Location>
            <tcm:Location>System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader,RunBehavior,String)</tcm:Location>
            <tcm:Location>System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior,RunBehavior,Boolean,Boolean)</tcm:Location>
            <tcm:Location>System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior,RunBehavior,Boolean,String,DbAsyncResult)</tcm:Location>
            <tcm:Location>System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(DbAsyncResult,String,Boolean)</tcm:Location>
            <tcm:Location>System.Data.SqlClient.SqlCommand.ExecuteNonQuery()</tcm:Location>
            <tcm:Location>Tridion.ContentManager.Data.AdoNet.DatabaseUtilities.ExecuteNonQuery(StoredProcedureInvocation)</tcm:Location>
            <tcm:Location>Tridion.ContentManager.Data.AdoNet.Sql.SqlDatabaseUtilities.ExecuteNonQuery(StoredProcedureInvocation)</tcm:Location>
            <tcm:Location>Tridion.ContentManager.Data.AdoNet.Sql.SqlDatabaseUtilities.ExecuteNonQuery(StoredProcedureInvocation)</tcm:Location>
            <tcm:Location>Tridion.ContentManager.Data.AdoNet.IdentifiableObjectDataMapper.Tridion.ContentManager.Data.IIdentifiableObjectDataMapper.Update(IdentifiableObjectData)</tcm:Location>
            <tcm:Location>Tridion.ContentManager.IdentifiableObject.Save(SaveEventArgs)</tcm:Location>
            <tcm:Location>Tridion.ContentManager.ContentManagement.VersionedItem.Save(Boolean)</tcm:Location>
            <tcm:Location>Tridion.ContentManager.ContentManagement.VersionedItem.Save()</tcm:Location>
            <tcm:Location>Tridion.ContentManager.BLFacade.ContentManagement.VersionedItemFacade.UpdateAndCheckIn(UserContext,String,Boolean,Boolean)</tcm:Location>
            <tcm:Location>XMLState.Save</tcm:Location>
            <tcm:Location>Component.Save</tcm:Location>
        </tcm:CallStack>
    </tcm:Details>
</tcm:Error>
    HelpFile = 
    HelpContext = 1000440
caused by: Component.Save
and description: 
<?xml version="1.0" standalone="yes"?>
<tcm:Error ErrorCode="8004033F" Category="4" Source="Kernel" Severity="1" xmlns:tcm="http://www.tridion.com/ContentManager/5.0">
    <tcm:Line ErrorCode="8004033F" Cause="false" MessageID="16137"><![CDATA[Unable to save Component (tcm:5-32795).]]>
        <tcm:Token>RESID_4574</tcm:Token>
        <tcm:Token>RESID_4418</tcm:Token>
        <tcm:Token>tcm:5-32795</tcm:Token>
    </tcm:Line>
    <tcm:Line ErrorCode="8004033F" Cause="true">CDATA[No data found. ETA_ITEMS, U Cannot insert the value NULL into column 'ITEM_ID', table 'tridion_cm.dbo.ITEM_ASSOCIATIONS'; column does not allow nulls. INSERT fails. The statement has been terminated.
    </tcm:Line>
    <tcm:Line ErrorCode="8004033F" Cause="false"><![CDATA[A database error occurred while executing Stored Procedure "EDA_ITEMS_UPDATE".]]>
        <tcm:Token>EDA_ITEMS_UPDATE</tcm:Token>
    </tcm:Line>
    <tcm:Details>
        <tcm:CallStack>
            <tcm:Location>System.Data.SqlClient.SqlConnection.OnError(SqlException,Boolean)</tcm:Location>
            <tcm:Location>System.Data.SqlClient.SqlInternalConnection.OnError(SqlException,Boolean)</tcm:Location>
            <tcm:Location>System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(</tcm:Location>
            <tcm:Location>System.Data.SqlClient.TdsParser.Run(RunBehavior,SqlCommand,SqlDataReader,BulkCopySimpleResultSet,TdsParserStateObject)</tcm:Location>
            <tcm:Location>System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader,RunBehavior,String)</tcm:Location>
            <tcm:Location>System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior,RunBehavior,Boolean,Boolean)</tcm:Location>
            <tcm:Location>System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior,RunBehavior,Boolean,String,DbAsyncResult)</tcm:Location>
            <tcm:Location>System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(DbAsyncResult,String,Boolean)</tcm:Location>
            <tcm:Location>System.Data.SqlClient.SqlCommand.ExecuteNonQuery()</tcm:Location>
            <tcm:Location>Tridion.ContentManager.Data.AdoNet.DatabaseUtilities.ExecuteNonQuery(StoredProcedureInvocation)</tcm:Location>
            <tcm:Location>Tridion.ContentManager.Data.AdoNet.Sql.SqlDatabaseUtilities.ExecuteNonQuery(StoredProcedureInvocation)</tcm:Location>
            <tcm:Location>Tridion.ContentManager.Data.AdoNet.Sql.SqlDatabaseUtilities.ExecuteNonQuery(StoredProcedureInvocation)</tcm:Location>
            <tcm:Location>Tridion.ContentManager.Data.AdoNet.IdentifiableObjectDataMapper.Tridion.ContentManager.Data.IIdentifiableObjectDataMapper.Update(IdentifiableObjectData)</tcm:Location>
            <tcm:Location>Tridion.ContentManager.IdentifiableObject.Save(SaveEventArgs)</tcm:Location>
            <tcm:Location>Tridion.ContentManager.ContentManagement.VersionedItem.Save(Boolean)</tcm:Location>
            <tcm:Location>Tridion.ContentManager.ContentManagement.VersionedItem.Save()</tcm:Location>
            <tcm:Location>Tridion.ContentManager.BLFacade.ContentManagement.VersionedItemFacade.UpdateAndCheckIn(UserContext,String,Boolean,Boolean)</tcm:Location>
            <tcm:Location>XMLState.Save</tcm:Location>
            <tcm:Location>Component.Save</tcm:Location>
        </tcm:CallStack>
    </tcm:Details>
</tcm:Error>
Source:
    LogScriptError

ワークフロー情報

コンポーネントは、BusinessConnector を介して別のアプリケーションによって新しく作成されます。アクティビティを終了する前にリビジョンの保存を実行します。WFの目的は

  1. 他のシステムからのテキスト値に基づいて、必要なコンポーネント リンクを割り当てます。
  2. ページを作成;
  3. ターゲットに公開します。

これは他の方法でもっとうまくできたかもしれないことは知っていますが、それが今のやり方です。実装については我慢してください。

モデル/スキーマ

Product
    - modelName (text)
    - categoryName (text)
    - categoryCL (component link)
    - statusName (text)
    - statusCL (component link)
    - blah1 (text)
    - blah2 (text)
    - blah3 (text)
    - blah4 (text)

自動アクティビティ スクリプト:

' COMPONENT WORKFLOW for PRODUCT SCHEMA (START)

' Load common functions
ExecuteGlobal oTDSE.GetObject("/webdav/200%20Design/Building%20Blocks/Library/Design/Workflow/Common/Workflow%20Functions.tbbs", 1).Content

' Initialize
Set objComp = CurrentWorkItem.GetItem()
Set oContentPub = objComp.Publication
Set oWebsitePub = oTDSE.GetObject(GetStagingLangPub("EN", "website1"), 1)
modelName = objComp.Fields.Item("modelName").Value.Item(1)

' Search and Assign component links based on some text fields from BC client
Set compListRowFilter = oTDSE.CreateListRowFilter()
Call compListRowFilter.SetCondition("ShowNewItems", TRUE)
Call compListRowFilter.SetCondition("ItemType", 16)

' Assign the first component link (categoryCL)
categoryName = objComp.Fields.Item("categoryName").Value.Item(1)
Set categoryComp = GetObjectFromFolder(categoryName, oTDSE.GetObject(categoryFolderWebDav, 1), compListRowFilter)
If Not categoryComp is Nothing Then
    objComp.Fields.Item("categoryCL").Value.RemoveAll
    objComp.Fields.Item("categoryCL").Value.Add(categoryComp)
    Call objComp.Save(True)
Else
    Call SendNoObjectEmail("Category", categoryName, "categoryCL", GetEmailsFromGroup(oContentPub, categoryOwner), "")
End if

' Assign the second component link (statusCL)
statusName = objComp.Fields.Item("statusName").Value.Item(1)
Set statusComp = GetObjectFromFolder(statusName, oTDSE.GetObject(statusFolderWebDav, 1), compListRowFilter)
If Not statusComp is Nothing Then
    objComp.Fields.Item("statusCL").Value.RemoveAll
    objComp.Fields.Item("statusCL").Value.Add(statusComp)
    Call objComp.Save(True)
Else
    Call SendNoObjectEmail("Status", statusName, "statusCL", GetEmailsFromGroup(oContentPub, statusOwner), "")
End if

' Create a page with the component in WF
Set oPage = CreateDefaultPage(modelName, oWebSitePub, SaveToFolderWebDav, PageTemplateWebDav)
Call oPage.ComponentPresentations.Add(oWebSitePub, oTDSE.GetObject(ComponentTemplateWebDav, 1))
oPage.Save(True)

' Publish the page
....

' Send email
....

' Finish the Activity
Call CurrentWorkItem.ActivityInstance.FinishActivity("someMsg")

' COMPONENT WORKFLOW for PRODUCT SCHEMA (END)

私はそれがどこで起こっているかを正確にズームインしていませんが、それは categoryCL または statusCL のobjComp.Save(True)行であると思います.

4

2 に答える 2

1

あなたが呼んでいることに気づきましたCall objComp.Save(True)-「True」パラメータは「編集完了」を意味するため、「チェックイン」を強制します。

これは2回発生する可能性があるようです(つまり、statusCLとcategoryCLがある場合)。これが問題の原因である可能性があります。変更が加えられた場合は最後にメソッドを呼び出すだけで、Save()2回保存しないように、動作を変更してみます。

于 2012-11-16T14:14:21.460 に答える
0

問題は、null をコンポーネント リンクとして割り当てようとしているということです。これら 2 つのコンポーネントを相互にリンクしようとしていませんか? 作成しようとしているリンクは、ワークフロー内の新しいコンポーネントへのリンクである可能性があります (まだチェックイン バージョンがないため)。そのため、そのリンクを作成することはできません。スクリプトにログを追加してみてください。これにより、正確にどこで失敗したか、およびパラメーターが何であるかを確認できます。

そして、この例外は欠陥レポートの価値があるというフランクの意見に同意します。

于 2012-11-16T07:42:48.667 に答える