2017-12-28 46 views
0

외부 API 소스의 항목을 Acumatica의 레코드로 가져 오는 프로세스를 만들고 있습니다.프로세스 그래프에서 언 바운드 DAC 사용 처리 기능이 작동하지 않습니다.

외부 API에서 사용할 수있는 항목을 나타내는 데 사용되는 언 바운드 DAC를 만들었습니다.

프로세스 그래프에서 기본보기의 대리인을 생성하여 ResultSet (일반적으로 API 데이터에서 생성)을 생성하고 반환합니다. 그런 다음 사용자가 가져올 항목을 선택할 수 있도록 항목을 표시하는 격자보기로이 그래프에 바인딩 된 화면을 가져옵니다. 그러면 주 프로세스 대리인이 선택한 항목에 대한 Acumatica의 레코드를 만듭니다.

public class ImportItemsProcess : PXGraph<ImportItemsProcess> 
{ 
    public PXProcessing<ImportItem> ImportItems; 
    public PXCancel<ImportItem> Cancel; 

    public ImportItemsProcess() 
    { 
     ImportItems.SetProcessCaption("Import"); 
     ImportItems.SetProcessAllCaption("Import All"); 
     ImportItems.SetProcessDelegate(ProcessImportItems); 
    } 

    protected virtual IEnumerable importItems(PXAdapter adapter) 
    { 
     PXResultset<ImportItem> items = new PXResultset<ImportItem>(); 

     /* Would create ImportItems from external API data here */ 
     items.Add(new PXResult<ImportItem>(new ImportItem() { RefNbr = "1" })); 
     items.Add(new PXResult<ImportItem>(new ImportItem() { RefNbr = "2" })); 
     items.Add(new PXResult<ImportItem>(new ImportItem() { RefNbr = "3" })); 

     return items; 
    } 

    public static void ProcessImportItems(List<ImportItem> importItems) 
    { 
     throw new PXException("ProcessImportItems() has been called"); 
    } 
} 

그리고 ASPX 페이지 : 여기 프로세스 대리인이 호출되지 않습니다 단순화 된 예로서 작성

<asp:Content ID="cont1" ContentPlaceHolderID="phDS" runat="Server"> 
    <px:PXDataSource ID="ds" runat="server" Visible="True" Width="100%" PrimaryView="ImportItems" TypeName="APIImporter.ImportItemsProcess" > 
    </px:PXDataSource> 
</asp:Content> 
<asp:Content ID="cont2" ContentPlaceHolderID="phL" runat="Server"> 
    <px:PXGrid ID="grid" runat="server" Height="400px" Width="100%" Style="z-index: 100" 
     AllowPaging="True" AllowSearch="True" AdjustPageSize="Auto" DataSourceID="ds" SkinID="Primary" TabIndex="1500" TemporaryFilterCaption="Filter Applied"> 
     <Levels> 
      <px:PXGridLevel DataMember="ImportItems"> 
       <RowTemplate> 
        <px:PXCheckBox ID="edSelected" runat="server" AlreadyLocalized="False" DataField="Selected" Text="Selected" CommitChanges="true"> 
        </px:PXCheckBox> 
        <px:PXTextEdit ID="edRefNbr" runat="server" AlreadyLocalized="False" DataField="RefNbr" DefaultLocale=""> 
        </px:PXTextEdit> 
       </RowTemplate> 
       <Columns> 
        <px:PXGridColumn DataField="Selected" TextAlign="Center" Type="CheckBox" Width="60px" CommitChanges="true"> 
        </px:PXGridColumn> 
        <px:PXGridColumn DataField="RefNbr"> 
        </px:PXGridColumn> 
       </Columns> 
      </px:PXGridLevel> 
     </Levels> 
     <AutoSize Container="Window" Enabled="True" MinHeight="200" /> 
    </px:PXGrid> 
</asp:Content> 

. 나는 프로세스 버튼을 클릭 할 때 무언가가 있다고 생각한다. 서버 콜백은 ImportItem 객체의리스트를 다시 만드는 뷰의 델리게이트 함수를 실행하고 포스트 백에서 새롭게 생성 된 객체를 프레임 워크와 연관시킬 수 없다. 키 필드없이 그러나, 나는이 DAC의 RefNbr에 ISKEY 속성 ...

[PXString(IsKey = true)] 
    [PXUIField(DisplayName = "External Ref Nbr")] 
    public string RefNbr { get; set; } 

를 추가하면 ... 내가 바로 메시지와 함께 라인 레벨의 에러를 제공하고있어 화면의 항목을 선택 이제 "오류 : 인수가 범위를 벗어났습니다 매개 변수 이름 : table ".

답변

0

DAC 필드에 대한 추상 클래스를 먼저 추가하십시오. 그래도 문제가 해결되지 않으면 질문에 ASPX 코드를 추가하십시오.

[Serializable] 
public class ImportItem : IBqlTable 
{ 
    #region Selected 
    public abstract class selected : IBqlField { } 

    [PXBool] 
    [PXUIField(DisplayName = "Selected")] 
    public bool? Selected { get; set; } 
    #endregion 

    #region RefNbr 
    public abstract class refNbr : IBqlField { } 

    [PXString] 
    [PXUIField(DisplayName = "External Ref Nbr")] 
    public string RefNbr { get; set; } 
    #endregion 
} 
+0

나는 추상적 인 BQL 클래스로 시도해 본 결과는 같습니다. 원본 게시물을 클래스 및 ASPX 페이지로 업데이트했습니다. –

+0

나는 주된 문제는 언 바운드 DAC라고 생각한다. ImportItem 바꾸기 : ImportItem에 의해 IB5Table : SOShipment 및 대리인 '반환 선 PXSelect .Select (이)에서이 줄만 데 프로세스 위임을 호출합니다. –

+0

오해의 소지가 있지만 작동하지 않습니다. ImportItem 클래스가 SOShipment에서 파생되면 데이터베이스의 모든 SO Shipment에 대해 객체 (그리드의 행)가 생성됩니다. 이 단계에서는 기존 레코드와 아무 관련이 없습니다. API 호출을 통해 검색된 데이터에서 레코드 개체를 만들어야합니다. 뷰의 위임에서 캐시를 지우고 'PXSelect 반환.'을 선택하기 전에 수동으로 생성 된 개체로 채 웁니다. 그러나 그 중 하나도 행운이 아닙니다. –

0

데이터보기 대리인의 경우 캐시에 항목을 추가하고 캐시에 추가해야합니다. 아래에서 시도하십시오.

 protected virtual IEnumerable importItems() 
     {  
      int iCachedData = 0; 
      foreach (var row in ImportItems.Cache.Cached) 
      { 
       iCachedData++; 
       yield return row; 
      } 

      if (iCachedData == 0) 
      { 
       for (int iCounter = 1; iCounter <= 5; iCounter++) 
       { 
        ImportItem item = new ImportItem() { RefNbr = iCounter }; 
        item = ImportItems.Insert(item); 
        ImportItems.Cache.SetStatus(item, PXEntryStatus.Held); 
        yield return item; 
       } 
      } 
     } 

행운을 비네!