機械翻訳について

JBO-25030: 行キーYを持つ詳細エンティティXは、その所有エンティティを検出または無効化できません

  • 問題摘要

    所有する親オブジェクトの識別に必要なコンテキスト情報を指定せずに、タイプX行の新しい子オブジェクト行を作成しようとしました。 子行の作成時に正しい所有親コンテキストを指定する必要があります。そうしないと、作成される新しい子行は「孤立」になります。

    たとえば、Activityという名前の子オブジェクトを持つTroubleTicketという名前のカスタム・オブジェクトがあるとします。 新規アクティビティを作成しようとする次のスクリプトでは、このエラーが発生します:

    def activityVO = newView('Activity')
    // PROBLEM: Attempting to create a new child activity row
    // -------  without providing context about which owning
    //          TroubleTicket row this activity belongs to.
    def newActivity = activityVO.createRow()

    これにより、スクリプトが新しいアクティビティ行を作成しようとしているため、その新しい行が属するTroubleTicketを認識できるコンテキストを指定せずに、「JBO-25030: 行キーがnullの詳細エンティティ・アクティビティは、その所有エンティティを検出または無効化できません」例外が生成されます。

  • 解決方法

    新しい子オブジェクト行を作成するときに、適切な親オブジェクト・コンテキストを提供する方法は2つあります。 最初の方法は、新しい子行を追加する所有親行を取得し、親行の子コレクション属性を使用してcreateRow()insertRow()の組合せを実行することです。 たとえば、Idが100000000272002のTroubleTicketのコンテキストで新しいActivity行を作成するには、「IDによるオブジェクトの検索」に示されているヘルパー関数を使用して次を実行できます。 この方法を使用する場合、親行の子コレクションに対して処理を実行しているため、親オブジェクトのコンテキストは暗黙的です。

    def idParent = 100000000272002
    def ttVO = newView('TroubleTicket')
    def parent = adf.util.findRowByKey(ttVO,idParent)
    if (parent != null) {
      // Access the collection of Activity child rows for 
      // this TroubleTicket parent object
      def activities = parent.ActivityCollection
      // Use this child collection to create/insert the new row
      def newActivity = activities.createRow()
      activities.insertRow(newActivity);
      // Set other field values of the new activity here...
    } 

    使用できる2つ目の方法は、子行の作成時に親TroubleTicket行のIDを識別するコンテキストを渡すことです。 これを行うには、次に示すように、createAndInitRow()という名前の代替関数を使用します。 この場合、親の行を手元に持ったり、親のTroubleTicketビュー・オブジェクトを使用する必要はありません。 子アクティビティ行の作成時に、所有する親行にIDを指定すると十分です。

    def idParent = 100000000272002
    // Create an name/value pairs object to pass the parent id
    def parentAttrs = new oracle.jbo.NameValuePairs()
    parentAttrs.setAttribute('Id',idParent)
    // Use this name/value pairs object to pass the parent
    // context information while creating the new child row
    def activityVO = newView('Activity')
    def newActivity = activityVO.createAndInitRow(parentAttrs)
    activityVO.insertRow(newActivity);
    // Set other field values of the new activity here...