2017-12-28 28 views
0

Ich erstelle einen Prozess, um Elemente aus einer externen API-Quelle in Datensätze in Acumatica zu importieren.Verwendung von ungebundenen DACs im Prozessdiagramm kann nicht ausgeführt werden. Verarbeitungsfunktionen

Ich habe einen ungebundenen DAC erstellt, der verwendet wird, um die Einträge darzustellen, die von der externen API verfügbar sind.

[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 { } 
} 

in einem Prozess Diagramm I die Delegierten der Hauptansicht Umsetzung die Ergebnismenge zu erstellen und zurück (in der Regel aus den API-Daten erzeugt). Ich habe dann einen Bildschirm, der an dieses Diagramm gebunden ist, mit einer Rasteransicht, die die Elemente anzeigt, damit der Benutzer die zu importierenden auswählen kann. Der Haupt-Prozessdelegierte erstellt dann die Datensätze in Acumatica für die ausgewählten Elemente.

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

Und die ASPX-Seite:

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

Wenn als vereinfachtes Beispiel geschrieben hier der Prozess Delegierten nie aufgerufen wird. Ich vermute, dass etwas damit zu tun hat, wenn die Schaltfläche Prozess angeklickt wird, der Callback zum Server die Delegate-Funktion der View ausführt, die die Liste der ImportItem-Objekte neu erstellt und das Framework die neu erstellten Objekte nicht mit denen im Postback verknüpfen kann ohne ein Schlüsselfeld. Wenn ich jedoch ein IsKey Attribut auf den RefNbr des DAC hinzufügen ...

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

... nun, wenn auf dem Bildschirm ein Element der Auswahl habe ich sofort ein Line-Level-Fehler mit der Meldung gegeben bin „Fehler : Das Argument liegt außerhalb des zulässigen Bereichs. Parametername: table ".

Antwort

0

Versuchen Sie zuerst, abstrakte Klassen für Ihre DAC-Felder hinzuzufügen. Wenn das Ihr Problem nicht löst, fügen Sie bitte Ihren ASPX-Code zu Ihrer Frage hinzu.

+0

Ich habe versucht, mit den abstrakten BQL-Klassen und das Ergebnis ist das gleiche. Ich habe den ursprünglichen Post mit den Klassen und der ASPX-Seite aktualisiert. –

+0

Ich denke, das Hauptproblem ist der ungebundene DAC. Ersetzen ImportItem: IBqlTable von ImportItem: SOShipment und nur diese Zeile in der Delegate 'Return PXSelect . Select (this)' wird den Prozessdelegaten aufrufen. –

+0

Ich mag ein Missverständnis, aber das funktioniert auch nicht. Wenn die ImportItem-Klasse von SOShipment abgeleitet wird, wird ein Objekt (und dann eine Zeile im Grid) für jede SO-Sendung in der Datenbank generiert. Das hat zu diesem Zeitpunkt nichts mit vorhandenen Datensätzen zu tun. Ich muss die Datensatzobjekte aus Daten erstellen, die über einen API-Aufruf abgerufen werden. In der Delegate des Views habe ich versucht, .Clear den Cache und füllen Sie es mit den manuell erstellten Objekte vor einer 'Rückkehr PXSelect . Wählen Sie (diese)' aber auch kein Glück damit. –

0

Im Delegaten der Datenansicht müssen Sie die Elemente zusätzlich zum Zurückgeben der Elemente zum Cache hinzufügen. Versuchen Sie unten:

Viel Glück!

Verwandte Themen