Szukaj…


Wprowadzenie

W tym temacie zademonstrujemy, jak eksportować rekordy z Acumatica ERP za pośrednictwem interfejsu API opartego na ekranie. Interfejs API Acumatica oparty na ekranie zapewnia tylko interfejs SOAP. Jeśli Twoja platforma programistyczna ma ograniczoną obsługę usług sieciowych SOAP, rozważ interfejs API oparty na umowach, oferujący zarówno interfejsy SOAP, jak i REST. Aby uzyskać więcej informacji na temat interfejsu API opartego na ekranie, zobacz dokumentację Acumatica ERP

Uwagi

Wszystkie próbki podane w tym temacie zostały utworzone za pomocą interfejsu API opartego na ekranie. Jeśli chcesz, aby twoja aplikacja kliencka nie zależała od zmian interfejsu użytkownika w aplikacji Acumatica ERP, powinieneś użyć ekranowego opakowania API, które opisano w dokumentacji Acumatica ERP

Eksport danych z formularza zgłoszeniowego z jednym kluczem podstawowym

Ekran pozycji magazynowych (IN.20.25.00) jest jedną z najczęściej używanych form wprowadzania danych Acumatica ERP do eksportowania danych. Identyfikator zapasów jest jedynym kluczem podstawowym na ekranie pozycji magazynowych : wprowadź opis zdjęcia tutaj

Aby wyeksportować rekordy z formularza wprowadzania danych, żądanie SOAP musi zawsze zaczynać się od ServiceCommands.Every[Key] , gdzie [Key] należy zastąpić nazwą klucza podstawowego.

Aby wyeksportować wszystkie towary magazynowe w jednym wywołaniu usługi internetowej:

Screen context = new Screen();
context.CookieContainer = new System.Net.CookieContainer();
context.Url = "http://localhost/AcumaticaERP/Soap/IN202500.asmx";
context.Login(username, password);
try
{
    Content stockItemsSchema = PX.Soap.Helper.GetSchema<Content>(context);
    Field lastModifiedField = new Field
    {
        ObjectName = stockItemsSchema.StockItemSummary.InventoryID.ObjectName,
        FieldName = "LastModifiedDateTime"
    };
    var commands = new Command[]
    {
        stockItemsSchema.StockItemSummary.ServiceCommands.EveryInventoryID,
        stockItemsSchema.StockItemSummary.InventoryID,
        stockItemsSchema.StockItemSummary.Description,
        stockItemsSchema.GeneralSettingsItemDefaults.ItemClass,
        stockItemsSchema.GeneralSettingsUnitOfMeasureBaseUnit.BaseUnit,
        lastModifiedField
    };
    var items = context.Export(commands, null, 0, false, false);
}
finally
{
    context.Logout();
}

Z czasem ilość danych w dowolnej aplikacji ERP rośnie. Jeśli będziesz eksportować wszystkie rekordy z instancji Acumatica ERP w jednym wywołaniu usługi internetowej, wkrótce możesz zauważyć błędy przekroczenia limitu czasu. Zwiększenie limitu czasu jest możliwe jednorazowe, ale niezbyt dobre długoterminowe rozwiązanie. Najlepszą opcją na rozwiązanie tego problemu jest eksport pozycji magazynowych w partiach po kilka rekordów.

Aby wyeksportować towary magazynowe w partiach po 10 rekordów:

Screen context = new Screen();
context.CookieContainer = new System.Net.CookieContainer();
context.Url = "http://localhost/AcumaticaERP/Soap/IN202500.asmx";
context.Login(username, password);
try
{
    Content stockItemsSchema = PX.Soap.Helper.GetSchema<Content>(context);
    Field lastModifiedField = new Field
    {
        ObjectName = stockItemsSchema.StockItemSummary.InventoryID.ObjectName,
        FieldName = "LastModifiedDateTime"
    };
    var commands = new Command[]
    {
        stockItemsSchema.StockItemSummary.ServiceCommands.EveryInventoryID,
        stockItemsSchema.StockItemSummary.InventoryID,
        stockItemsSchema.StockItemSummary.Description,
        stockItemsSchema.GeneralSettingsItemDefaults.ItemClass,
        stockItemsSchema.GeneralSettingsUnitOfMeasureBaseUnit.BaseUnit,
        lastModifiedField
    };
    var items = context.Export(commands, null, 10, false, false);

    while (items.Length == 10)
    {
        var filters = new Filter[]
        {
            new Filter
            {
                Field = stockItemsSchema.StockItemSummary.InventoryID,
                Condition = FilterCondition.Greater,
                Value = items[items.Length - 1][0]
            }
        };
        items = context.Export(commands, filters, 10, false, false);
    }
}
finally
{
    context.Logout();
}

Istnieją 2 główne różnice między podejściem pojedynczego połączenia a eksportem w partiach:

  • Parametr topCount polecenia Export był zawsze ustawiony na 0 w podejściu pojedynczego wywołania

  • podczas eksportowania rekordów w partiach rozmiar partii jest konfigurowany przez parametr topCount uzupełniony przez tablicę Filter, aby zażądać następnego zestawu wyników

Eksport danych z formularza zgłoszeniowego ze złożonym kluczem podstawowym

Ekran Zamówienia sprzedaży (SO.30.10.00) jest doskonałym przykładem formularza wprowadzania danych ze złożonym kluczem podstawowym. Klucz podstawowy na ekranie Zamówienia sprzedaży składa się z typu zamówienia i numeru zamówienia : wprowadź opis zdjęcia tutaj

Zalecana 2-etapowa strategia eksportu danych z ekranu Zamówienia sprzedaży lub dowolnego innego formularza wprowadzania danych ze złożonym kluczem podstawowym za pośrednictwem interfejsu API opartego na ekranie:

  • w kroku 1 zażądasz wszystkich rodzajów zamówień utworzonych wcześniej w aplikacji Acumatica ERP

  • Drugim krokiem jest eksportowanie zamówień każdego rodzaju niezależnie, w ramach jednego połączenia lub w partiach

Aby zażądać wszystkich rodzajów istniejących zamówień:

Screen context = new Screen();
context.CookieContainer = new System.Net.CookieContainer();
context.Url = "http://localhost/AcumaticaERP/Soap/SO301000.asmx";
context.Login(username, password);
try
{
    Content orderSchema = PX.Soap.Helper.GetSchema<Content>(context);
    var commands = new Command[]
    {
        orderSchema.OrderSummary.ServiceCommands.EveryOrderType,
        orderSchema.OrderSummary.OrderType,
    };

    var types = context.Export(commands, null, 1, false, false);
}
finally
{
    context.Logout();
}

W powyższym wywołaniu SOAP zwróć uwagę na parametr topCount polecenia Export ustawiony na 1 . Celem tego żądania jest uzyskanie wszystkich rodzajów zamówień utworzonych wcześniej w aplikacji Acumatica ERP, a nie eksport danych.

Aby eksportować rekordy każdego typu niezależnie w partiach:

Screen context = new Screen();
context.CookieContainer = new System.Net.CookieContainer();
context.Url = "http://localhost/AcumaticaERP/Soap/SO301000.asmx";
context.Login(username, password);
try
{
    Content orderSchema = PX.Soap.Helper.GetSchema<Content>(context);
    var commands = new Command[]
    {
        orderSchema.OrderSummary.ServiceCommands.EveryOrderType,
        orderSchema.OrderSummary.OrderType,
    };
    var types = context.Export(commands, null, 1, false, false);

    for (int i = 0; i < types.Length; i++)
    {
        commands = new Command[]
        {
            new Value
            {
                LinkedCommand = orderSchema.OrderSummary.OrderType,
                Value = types[i][0]
            },
            orderSchema.OrderSummary.ServiceCommands.EveryOrderNbr,
            orderSchema.OrderSummary.OrderType,
            orderSchema.OrderSummary.OrderNbr,
            orderSchema.OrderSummary.Customer,
            orderSchema.OrderSummary.CustomerOrder,
            orderSchema.OrderSummary.Date,
            orderSchema.OrderSummary.OrderedQty,
            orderSchema.OrderSummary.OrderTotal
        };
        var orders = context.Export(commands, null, 100, false, false);
        while (orders.Length == 100)
        {
            var filters = new Filter[]
            {
                new Filter
                {
                    Field = orderSchema.OrderSummary.OrderNbr,
                    Condition = FilterCondition.Greater,
                    Value = orders[orders.Length - 1][1]
                }
            };
            orders = context.Export(commands, filters, 100, false, false);
        }
    }
}
finally
{
    context.Logout();
}

Powyższy przykład pokazuje, jak wyeksportować wszystkie zamówienia sprzedaży z Acumatica ERP w partiach po 100 rekordów. Aby eksportować zamówienia sprzedaży każdego typu niezależnie, żądanie SOAP musi zawsze zaczynać się od polecenia Value , które określa typ zamówień do eksportu. Po poleceniu Value ustawionym na pierwszą wartość klucza następuje polecenie ServiceCommands.Every[Key] , gdzie [Key] należy zastąpić nazwą drugiego klucza.

Aby wyeksportować rekordy określonego typu:

W przypadku konieczności wyeksportowania zamówień sprzedaży określonego typu, możliwe jest jawne zdefiniowanie rodzaju zamówień za pomocą polecenia Value na początku żądania SOAP, a następnie podejście pojedynczego wywołania lub eksport partii.

Aby wyeksportować wszystkie zamówienia sprzedaży typu IN w jednym wywołaniu:

Screen context = new Screen();
context.CookieContainer = new System.Net.CookieContainer();
context.Url = "http://localhost/AcumaticaERP/Soap/SO301000.asmx";
context.Login(username, password);
try
{
    Content orderSchema = PX.Soap.Helper.GetSchema<Content>(context);
    var commands = new Command[]
    {
        new Value
        {
            LinkedCommand = orderSchema.OrderSummary.OrderType,
            Value = "IN"
        },
        orderSchema.OrderSummary.ServiceCommands.EveryOrderNbr,
        orderSchema.OrderSummary.OrderType,
        orderSchema.OrderSummary.OrderNbr,
        orderSchema.OrderSummary.Customer,
        orderSchema.OrderSummary.CustomerOrder,
        orderSchema.OrderSummary.Date,
        orderSchema.OrderSummary.OrderedQty,
        orderSchema.OrderSummary.OrderTotal
    };
    var orders = context.Export(commands, null, 0, false, false);
}
finally
{
    context.Logout();
}


Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow