2017-12-28 15 views
0

外部APIソースからAcumaticaのレコードにアイテムをインポートするプロセスを作成しています。プロセスグラフ内のバインドされていないDACを使用すると処理が実行されない

私は、外部APIから利用可能なエントリを表すために使用されるバインドされていないDACを作成しました。 I(通常はAPIデータから生成された)結果セットを作成して返すためにメインビューのデリゲートを実装するプロセスグラフで

[Serializable] 
public class ImportItem : IBqlTable 
{ 
    [PXBool] 
    [PXUIField(DisplayName = "Selected")] 
    public bool? Selected { get; set; } 
    public abstract class selected : IBqlField { } 

    [PXString] 
    [PXUIField(DisplayName = "External Ref Nbr")] 
    public string RefNbr { get; set; } 
    public abstract class refNbr : IBqlField { } 
} 

。私はその後、ユーザーがインポートするものを選択できるように項目を表示するグリッドビューでこのグラフにバインドされた画面を持っています。メインのプロセス代理人は、選択したアイテムの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の置き換え:IBSQLTable :SOShipment:代理人のこの行のみを返す 'PXSelect .Select(this)'はプロセスデリゲートを呼び出します。 –

+0

私は誤解しているかもしれませんが、それはうまくいきません。 ImportItemクラスをSOShipmentから派生させると、データベース内のすべてのSO Shipmentに対してオブジェクトが生成されます(グリッド内の行が生成されます)。これは、この段階では既存のレコードとは関係がありません。API呼び出しで取得したデータからレコードオブジェクトを作成する必要があります。 ビューのデリゲートで、キャッシュをクリアして、手動で作成したオブジェクトを「返すPXSelect .Select(これ)」の前に挿入しようとしましたが、そのいずれにも不運です。 –

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; 
       } 
      } 
     } 

幸運を祈る!

関連する問題