2017-05-12 9 views
0

UI5를 사용하여 작업 목록 응용 프로그램을 만들고 있습니다. 문제는 내가 항목을 작성한 후 바로 다른 항목을 작성하면 Default Changeset Implementation allows only one operation 오류가 발생한다는 것입니다. $ 배치 헤더를 확인한 결과, MERGE와 POST가 있는데, MERGE가 어떤 이유로 이전 항목을 업데이트하는 것을 볼 수 있습니다. 누구든지 약간의 빛을 비추 수 있습니까? 그것은 백엔드 오류가 아닌 UI5 오류 수 있을까요? 이것은 하나/생성/업데이트 호출을 삭제 이상을 포함하는 일괄 요청에만 발생과는 관련이 있어요 :-) 난 당신이 SAP GW를 사용하고 있어야합니다 말할 수있는 오류에서 새 항목submitChanges 두 요청 전송

_onMetadataLoaded: function() { 
    var oModel = this._oView.getModel(); 
    this.resetAllCombos(); 
    var that = this; 
    sap.ui.core.BusyIndicator.show(); 
    oModel.read("/USERS_SET", { 
     success: function(oData) {    
      var oProperties = { 
       Qmnum: "0", 
       Otherstuff: "cool" 
      }; 

      that._oContext = that._oView.getModel().createEntry("/ENTITYSET", { 
           properties: oProperties 
      }); 

      that._oView.setBindingContext(that._oContext); 

      sap.ui.core.BusyIndicator.hide(); 
      //update plant based dialogs 
      that._setPlantDialogFilters(that, that._oView, splant); 
     } 
    }); 
}, 

handleSavePress: function(oEvent) { 
    //prevent duplicate presses 
    var oSource = oEvent.getSource(); 
    oSource.setEnabled(false); 

    var oView = this.oView; 
    var oRouter = this._oRouter; 
    var oResourceBundle = this._oResourceBundle; 

     if (this.checkErrors()){ 
      var that = this; 
      sap.ui.core.BusyIndicator.show(); 
      oView.getModel().submitChanges({ 
       success: function(oData) { 
        var x = that; 

        // navigate to the new product's object view 
        var sQmnum = oView.byId("Qmnum").getValue(); 

        // unbind the view to not show this object again 
        if (sQmnum !== 0 && sQmnum !== "" && that._oView.getModel().hasPendingChanges() === false){ 
         oView.unbindObject(); 

         // show success messge 
         var sMessage = oResourceBundle.getText("newIssueCreated", sQmnum); 
         MessageToast.show(sMessage, { 
            closeOnBrowserNavigation: false 
         }); 
         sap.ui.core.BusyIndicator.hide(); 

         x.returnToMainPage(); 
        }else{ 
         oSource.setEnabled(true); 
         sap.ui.core.BusyIndicator.hide(); 
        } 
       }, 
       error: function(oError) { 
       } 
      }); 
     }else{ 
      oSource.setEnabled(true); 
     } 
    }, 
} 

답변

0

만들기

트랜잭션 보안 ("all or nothing"). 당신이해야 할 일은 대응하는 GW 메소드를 재정의하는 것입니다. CHANGESET_BEGIN이라고 생각합니다. 자세한 내용은 https://archive.sap.com/discussions/thread/3562720을 참조하십시오 (지금은 더 이상 제공 할 수 없습니다 ...).

0

tl-dr : 분명히 SAP 게이트웨이를 사용해야합니다. 하나의 트랜잭션에서 이러한 요청을 처리 할 필요가 없다면 다른 변경 집합으로 요청을 보냅니다. 배치 호출이 전혀 필요하지 않은 경우 모델에 "useBatch"를 제공하여 인스턴스를 끄는 것이 좋습니다. 인스턴스화시 false입니다. 그러나 하나의 트랜잭션에서 요청을 함께 처리해야하는 경우 아래 세부 정보를 읽어야합니다.

문제를 이해하려면 게이트웨이와 일괄 처리 및 변경 집합 요청이 어떻게 작동하는지 이해해야합니다.

일괄 요청은 여러 요청이 함께 번들로 구성됩니다. 목적은 하나의 연결 만 열고 관련 요청을 그룹화하여 오버 헤드가 최소화되도록하는 것입니다. 변경 집합은 일괄 처리 요청 내에서 작은 블록을 형성하며, 수정 요청을 모두 번들로 처리하여 모두 또는 일부 특성을 보장합니다.

그래서 게이트웨이 측에서 SAP 게이트웨이 서비스 작성기 (SEGW 트랜잭션)를 사용했다고 가정하고 OData 서비스에 대한 두 개의 관련 클래스가 있습니다. 엔딩 ... DPC와 DPC_EXT 중 하나가 있습니다. 전자를 만지지 마십시오. 서비스 작성기에서 서비스를 업데이트하면 항상 재생성됩니다. 후자가이 예에서 우리가 필요로하는 것입니다.

  • /IWBEP/IF_MGW_APPL_SRV_RUNTIME ~ CHANGESET_BEGIN changeset_begin 방법은 변경 집합 경우에 변경 집합 처리를 허용 기본적으로
  • /IWBEP/IF_MGW_APPL_SRV_RUNTIME ~ CHANGESET_PROCESS

: 당신은 적어도 두 가지 방법을 재정의해야합니다 요청의 수는 1과 같습니다. 이것은 자동으로 처리 될 수 있기 때문에 제한이 존재합니다. 요청이 더 많으면 서로에 대한 비즈니스 종속성을 가질 수 있으므로 처리를 자동으로 보장 할 수 없습니다.

그래서 원하는 조건 변경 집합의 번들 (지연 모드) 처리를 허용해야합니다 :

  • /IWBEP/IF_MGW_APPL_SRV_RUNTIME ~ CHANGESET_BEGIN : 전화를 먼저 슈퍼 ->/iwbep/if_mgw_appl_srv_runtime ~ changeset_begin 방법에 try catch 블록을 실행 한 다음 it_operation_info에서 반복하여 선택한 경우에만 처리를 결정하고 범위를 좁히고 선택한 사례에 대해서만 cv_defer_mode를 허용하십시오. 그렇지 않으면/iwbep/cx_mgw_tech_exception => changeset_not_supported 예외가 발생합니다.
  • /IWBEP/IF_MGW_APPL_SRV_RUNTIME ~ CHANGESET_PROCESS : 모든 요청은 it_changeset_request에서 사용할 수 있습니다. 응답으로 ct_changeset_response 테이블을 채우십시오.