2017-12-21 30 views
0

Acumatica의 겉보기에 쉬운 일은 구현하기가 몹시 복잡해 보입니다. 내가 원하는 것은 그리드의 마지막 행을 새로운 행으로 복사하는 것입니다. 사용자가 직접 변경 내용을 유지하면 코드가 캐시에 저장됩니다. 이것은 지금까지 내 작업입니다 :Acumatica - 마지막 행을 복사

public PXAction<SOOrder> copyLastRow; 
    [PXUIField(DisplayName = "Copy Last Row", MapEnableRights = PXCacheRights.Select, MapViewRights = PXCacheRights.Select)] 
    [PXLookupButton] 
    public virtual IEnumerable CopyLastRow(PXAdapter adapter) 
    { 
     SOLine line = Base.Transactions.Select().LastOrDefault(); 
     int? lineNbr = 0; 

     foreach(SOLine line2 in Base.Transactions.Select())    
      if (line2.LineNbr > lineNbr) 
       lineNbr = line2.LineNbr; 



     line.LineNbr = lineNbr + 1; 
     Base.Transactions.Cache.Insert(line);   

     return adapter.Get(); 
    } 

그래서 어쩌면 내가 내 코드에서 무언가 또는 완전히 잘못을 받고 있지 않다,하지만 난 상관없이 내가 뭘 점점 오류를 해요. 그리드가 내 행으로 새로 고쳐지지 않고 "이 레코드를 저장할 수 없습니다"또는 "다른 프로세스가이 레코드를 업데이트했습니다"와 같이 모든 종류의 오류가 계속 발생합니다. 또한 새 행을 생성하는 방법에 대한 아이디어는 없습니다. 내가 가지고있는 거친 논리? 누구든지 도움을 줄 수 있다면 많은 도움이됩니다.

+0

Acumatica 플랫폼은 4GL 프로그래밍 언어와 유사합니다. 이러한 시스템이 어려운 일을 쉽고 간단하게 어렵게 만드는 것은 일반적입니다. 작은 세부 사항에서 잃어버린 시간은 ORM, 동시성, 보안, 보고서, DB 스크립트 등의 상위 레벨 시스템을 다시 구현할 필요가 없으므로 보완됩니다. 플랫폼 표준 템플릿과 최상의 디자인을 권장합니다. 연습, T100-T200-T300 교육 자료를 사용하면 모든 것을 결합하는 방법을보다 잘 이해할 수 있습니다. –

답변

1

그냥 라인을 먹고 싶어하고 캐시 사본과는 null lineid를 사용할 수있는 모든 값을 복사합니다. 그런 다음 복사 된 라인의 삽입에 자동으로 다음 linenbr을 얻을 것이다 ...

SOLine line = Base.Transactions.Select().LastOrDefault(); 
var copy = (SOLine)Base.Transactions.Cache.CreateCopy(line); 
copy.LineNbr = null; 
Base.Transactions.Cache.Insert(copy); 

이 방법은 또한 경우 새로운 필드 또는 사용자 정의에 친화적 인 업그레이드해야

... 귀하의 질문에 샘플 코드에 추가 SOLine에 추가되어 CreateCopy를 사용하여 복사 할 모든 필드를 선택적으로 포함하지 않아도 계속 복사됩니다.

+0

완벽하게 작동했습니다! 고마워요! 또한 사용자가 스스로를 저장할 수있게되었습니다. –

+0

완벽. 나는 항상 장기간 실행되는 프로세스와 관련하여 절대적으로 필요한 경우가 아니라면 사용자가 지속하도록하려고 노력합니다. 동일한 그래프/레코드에서 변경 작업 버튼을 사용하면 사용자가 저장 작업을 수행 할 수 있습니다. – Brendan

0

내 생각에 Line Number가 자동으로 생성됩니다! 그것은 어쨌든 연속적이지 않습니다.

새 SOline 행을 만들고 선택한 행 (마지막 행)의 입력 가능 필드를 동일하게 삽입하고 삽입하는 것이 좋습니다. 일해야한다.

+0

예, OP는 LineNumber와 같은 키 필드를 복사하지 마십시오. 이것은 "다른 프로세스가이 레코드를 업데이트했습니다"라는 오류로 연결됩니다. –

1

코드는 다음과 같아야합니다

public PXAction<SOOrder> copyLastRow; 
[PXUIField(DisplayName = "Copy Last Row", MapEnableRights = PXCacheRights.Select, MapViewRights = PXCacheRights.Select)] 
[PXProcessButton] 
public virtual IEnumerable CopyLastRow(PXAdapter adapter) 
{ 
    SOLine line = Base.Transactions.Select().LastOrDefault(); 
    SOLine newLine = new SOLine(); 
    ... (copy all you need from line to newLine) 
    Base.Transactions.Cache.Insert(newLine);   
    Base.Actions.PressSave(); 
    return adapter.Get(); 
} 
+0

일리야, PressSave는 db에 대한 변경 사항을 유지합니까? 사용자가 직접 저장 버튼을 누르기를 원합니다. lineNbr은 어떨까요? 나는 그냥 비워 두거나 게시 한 코드와 같이 직접 생성해야 하는가? 고마워, –

+0

GUI에서 "저장"을 누르면 작업에서 변경된 행을 저장하고 다른 스레드는 작동하지 않습니다. 작업에서 "저장"을 누르거나 GUI로 복사하여 저장해야합니다. LineNbr이 자동으로 생성됩니다. SOLine DAC에 대해 선언 된 다음 C# 속성을 볼 수 있습니다. [PXLineNbr (typeof (SOOrder.lineCntr))] Acumatica의 많은 기능이 C# 속성의 논리로 수행됩니다. –

+0

개인적으로 나는이 상황에서 persist/press save를 피할 것입니다. 준비가되면 사용자가 저장 버튼을 클릭하도록하십시오. 이 문제를 해결할 필요는 없습니다. – Brendan