2016-08-05 26 views
0

시간별 일정으로 ARTan 테이블에 레코드를 삽입하는 "가져 오기 시나리오"가 있습니다. 내가 가진 문제는 레코드가 두 번 삽입되지 않도록하는 방법이 없다는 것입니다. AR 레코드가 한 번만 삽입되어야하는 FeeDueID라는 기본 키가 있습니다. 여러 사용자가 실수로 여러 레코드를 삽입 할 수 없도록 Acumatica에서 이것을 잠그는 방법이 있습니까?Acumatica ARtran 테이블 가져 오기 고유 필드

나는 Acumatica "Data Provider"의 고유 필드를 키 필드로 선택하면 복제본을 삽입 할 수 없다고 들었습니다. 그러나 이것은 사실이 아닙니다. 저는 Acuamtica 프레임 워크에 내 사용자 정의 기본 키를 기반으로 한 AR 레코드 만 허용하는 방법을 찾고 있습니다. 테이블에 방아쇠를 당겨이 문제를 해결할 수있었습니다. Acumatica가 트리거를 지원하지 않는다고 들었습니다.

enter image description here

추가 정보 :

· 스키마의 "키"속성은 가져 오기 시나리오의 "준비"부분에서 독특한 기록을 식별 할 수 있도록하는 것입니다. 이 깃발을 사용할 때 약간의 혼란이있을 것 같습니다. 우리가 Acumatica에 연락하여 명확히 설명 할 수있는 지점입니다. 기록이 준비되고 나면 가져 오기 시나리오는 현재 처리중인 경우

는 데이터 시나리오의 설정은 실제 가져 오기 프로세스

·의 직접적인 개입이없는 ·과 제 2의 실행을 준비한다면, Acumatica가 처리합니다 수입/가공으로 표시되지 않은 품목. 여기에는 이전에 준비된 항목이 포함됩니다.

답변

0

문서에 잘못된 합계가 있기 때문에 트리거별로 레코드를 건너 뛰는 것은 올바르지 않습니다.

트리거로 처리해도 괜찮 으면 시스템이 메시지없이 자동으로이 항목을 건너 뛰어도 괜찮다고 가정합니다.

예인 경우이 맞춤 설정이 유용 할 수 있습니다. 그것은 데이터베이스에서 유사한 레코드를 확인하고 삭제 만합니다. 요구 사항이 다른 경우이 코드를 변경하고 오류를 던지거나 다른 선택 항목으로 변경할 수 있습니다.

데이터 크기에 따라 성능에 영향을 미칠 수 있습니다. 열에 맞춤 색인을 만드는 것이 좋습니다.

public class ARInvoiceEntry_Extension : PXGraphExtension<ARInvoiceEntry> 
{ 
    public delegate void PersistDelegate(); 
    [PXOverride] 
    public void Persist(PersistDelegate baseMethod) 
    { 
     if (Base.IsImport) 
     { 
      PXView _view = new PXView(Base, false, BqlCommand.CreateInstance(typeof(Select<ARTran, Where<ARTranExt.usrCustomKey, Equal<Required<ARTranExt.usrCustomKey>>>>))); 

      //Checking Unique Value 
      foreach (ARTran tran in Base.Transactions.Select()) 
      { 
       ARTranExt ext = Base.Transactions.Cache.GetExtension<ARTranExt>(tran); 
       String search = ext.UsrCustomKey; 

       if (search != null) 
       { 
        int startRow = 0, maxRows = 2, totalRows = 0; 
        List<object> records = _view.Select(null, new[] { search }, null, null, null, null, ref startRow, maxRows, ref totalRows); 

        bool found = false; 
        foreach (ARTran record in records) 
        { 
         if (found) // if it's not the same record 
         { 
          Base.Transactions.Delete(record); 
         } 
         found = true; 
        } 
       } 
      } 
     } 
     baseMethod(); 
    } 
}