Recherche…


Introduction

Cette rubrique explique comment exporter des enregistrements à partir d'Acumatica ERP via l'API REST Contract-Based. Contrairement à l'API basée sur écran d'Acumatica ERP, l'API basée sur contrat fournit à la fois des interfaces SOAP et REST. Pour plus d'informations sur l'API basée sur le contrat, consultez la documentation Acumatica ERP.

Remarques

Pour communiquer avec l'API basée sur contrat REST d'Acumatica ERP, votre application client doit toujours effectuer les 3 étapes suivantes:

  1. Connectez-vous à l'instance Acumatica ERP et obtenez des cookies avec des informations de session utilisateur

  2. interagir avec l'un des points de terminaison d'API basés sur le contrat disponible sur l'instance Acumatica ERP

  3. se déconnecter de Acumatica ERP pour fermer la session utilisateur

Tous les exemples fournis dans cette rubrique ont été créés avec le noeud final par défaut , toujours déployé dans le cadre du processus d'installation standard d'Acumatica ERP. Dans l'écran Noeuds de service Web (SM.20.70.60), vous pouvez afficher les détails des noeuds finaux existants ou configurer vos noeuds finaux personnalisés des services Web basés sur un contrat Acumatica ERP:

entrer la description de l'image ici

Pour votre information, vous trouverez ci-dessous l'implémentation de la classe RestService utilisée dans tous les exemples ci-dessus pour interagir avec le service Web basé sur contrat de Acumatica ERP:

public class RestService : IDisposable
{
    private readonly HttpClient _httpClient;
    private readonly string _acumaticaBaseUrl;
    private readonly string _acumaticaEndpointUrl;

    public RestService(string acumaticaBaseUrl, string endpoint,
        string userName, string password,
        string company, string branch)
    {
        _acumaticaBaseUrl = acumaticaBaseUrl;
        _acumaticaEndpointUrl = _acumaticaBaseUrl + "/entity/" + endpoint + "/";
        _httpClient = new HttpClient(
            new HttpClientHandler
            {
                UseCookies = true,
                CookieContainer = new CookieContainer()
            })
        {
            BaseAddress = new Uri(_acumaticaEndpointUrl),
            DefaultRequestHeaders =
            {
                Accept = {MediaTypeWithQualityHeaderValue.Parse("text/json")}
            }
        };

        var str = new StringContent(
            new JavaScriptSerializer()
                .Serialize(
                    new
                    {
                        name = userName,
                        password = password,
                        company = company,
                        branch = branch
                    }),
                    Encoding.UTF8, "application/json");

        _httpClient.PostAsync(acumaticaBaseUrl + "/entity/auth/login", str)
            .Result.EnsureSuccessStatusCode();
    }

    void IDisposable.Dispose()
    {
        _httpClient.PostAsync(_acumaticaBaseUrl + "/entity/auth/logout",
            new ByteArrayContent(new byte[0])).Wait();
        _httpClient.Dispose();
    }

    public string GetList(string entityName)
    {
        var res = _httpClient.GetAsync(_acumaticaEndpointUrl + entityName)
            .Result.EnsureSuccessStatusCode();

        return res.Content.ReadAsStringAsync().Result;
    }

    public string GetList(string entityName, string parameters)
    {
        var res = _httpClient.GetAsync(_acumaticaEndpointUrl + entityName + "?" + parameters)
            .Result.EnsureSuccessStatusCode();

        return res.Content.ReadAsStringAsync().Result;
    }
}

Exportation de données dans un appel REST unique

Dans cet exemple, vous allez explorer comment exporter les données suivantes depuis Acumatica ERP en un seul appel via l'API REST Contract-Based:

  • tous les articles en stock existant dans l'application
  • toute commande client de type IN

Si vous devez exporter des enregistrements à partir d'Acumatica ERP, utilisez l'URL suivante: http://<Acumatica ERP instance URL>/entity/<Endpoint name>/<Endpoint version>/<Top-level entity>

<Top-level entity> est le nom de l'entité que vous allez exporter

Pour exporter tous les articles en stock dans un seul appel REST:

Pour exporter des enregistrements d'articles stockés à partir d'une instance AcumaticaERP locale à l'aide du noeud final par défaut de la version 6.00.001 , vous devez utiliser l'URL suivante: http://localhost/AcumaticaERP/entity/Default/6.00.001/StockItem

Vous trouverez ci-dessous l'exemple de code écrit en C # pour exporter tous les éléments en stock en envoyant un appel REST unique au point de terminaison par défaut de la version 6.00.001 :

using (RestService rs = new RestService(
    @"http://localhost/AcumaticaERP/", "Default/6.00.001",
    username, password, company, branch))
{
    string stockItems = rs.GetList("StockItem");
}

Pour exporter toutes les commandes client du type IN dans un seul appel REST:

Pour exporter des commandes client du type IN à partir d'une instance AcumaticaERP locale à l'aide du point de terminaison par défaut de la version 6.00.001 , vous devez utiliser l'URL suivante: http://localhost/AcumaticaERP/entity/Default/6.00.001/SalesOrder?$filter=OrderType eq 'IN'

Vous trouverez ci-dessous l'exemple de code écrit en C # pour exporter toutes les commandes client de type IN en envoyant un appel REST unique au noeud final par défaut de la version 6.00.001 :

using (RestService rs = new RestService(
    @"http://localhost/StackOverflow/", "Default/6.00.001",
    username, password, company, branch))
{
    var parameters = "$filter=OrderType eq 'IN'";
    string inSalesOrders = rs.GetList("SalesOrder", parameters);
}

Implémentation de la pagination sur plusieurs demandes REST

Dans cet exemple, vous allez explorer comment exporter les données suivantes à partir d'Acumatica ERP par lots via l'API REST Contract-Based:

  • articles en stock existant dans l'application par lots de 10 enregistrements
  • toutes les commandes en lots de 100 enregistrements

Pour exporter des articles en stock par lots de 10 enregistrements avec plusieurs appels REST:

Pour exporter les 10 premiers articles en stock à partir d'une instance AcumaticaERP locale à l'aide du noeud final par défaut de la version 6.00.001 , vous devez utiliser l'URL suivante: http://localhost/AcumaticaERP/entity/Default/6.00.001/StockItem?$top=10

En conséquence, pour demander des articles en stock de 10 à 20, il vous suffit d'étendre l'URL ci-dessus avec le paramètre filter : http://localhost/AcumaticaERP/entity/Default/6.00.001/StockItem?$top=10&$filter=InventoryID gt '<InventoryID>'

<InventoryID> est l'ID du dernier article en stock exporté avec un appel REST précédent

Vous trouverez ci-dessous un exemple de code écrit en C # pour exporter tous les articles en stock par lots de 10 enregistrements en envoyant plusieurs appels REST vers le noeud final par défaut de la version 6.00.001 :

using (RestService rs = new RestService(
    @"http://localhost/StackOverflow/", "Default/6.00.001",
    username, password, company, branch))
{
    var json = new JavaScriptSerializer();
    string parameters = "$top=10";
    string items = rs.GetList("StockItem", parameters);
    var records = json.Deserialize<List<Dictionary<string, object>>>(items);

    while (records.Count == 10)
    {
        var inventoryID = records[records.Count - 1]["InventoryID"] as Dictionary<string, object>;
        var inventoryIDValue = inventoryID.Values.First();
        string nextParameters = parameters + "&" + 
            "$filter=" + string.Format("InventoryID gt '{0}'", inventoryIDValue);
        items = rs.GetList("StockItem", nextParameters);
        records = json.Deserialize<List<Dictionary<string, object>>>(items);
    }
}

Pour exporter toutes les commandes client par lots de 100 enregistrements avec plusieurs appels REST:

Pour exporter les 100 premières commandes à partir d'une instance AcumaticaERP locale à l'aide du noeud final par défaut de la version 6.00.001 , vous devez utiliser l'URL suivante: http://localhost/AcumaticaERP/entity/Default/6.00.001/SalesOrder?$top=100

Étant donné que la clé primaire de l'entité Commande client est composée du type de commande et du numéro de commande , vous utiliserez dans cet exemple une combinaison de paramètres de filtrage pour les champs Type de commande et Numéro de commande :

  • pour demander des commandes de vente de 100 à 200 du type SO , vous devez utiliser l'URL suivante: http://localhost/AcumaticaERP/entity/Default/6.00.001/SalesOrder?$top=100&$filter=OrderType eq 'SO' and OrderNbr gt '<OrderNbr>'

<OrderNbr> est le numéro de la dernière commande exportée avec un appel REST précédent

  • en conséquence, pour demander les 100 premières commandes de vente du type SO à côté, vous devez utiliser l'URL suivante: http://localhost/AcumaticaERP/entity/Default/6.00.001/SalesOrder?$top=100&$filter=OrderType gt 'SO' and OrderNbr gt ''

Vous trouverez ci-dessous l'exemple de code écrit en C # pour exporter toutes les commandes clients par lots de 100 enregistrements avec plusieurs appels REST vers le point de terminaison par défaut de la version 6.00.001 :

using (RestService rs = new RestService(
    @"http://localhost/StackOverflow/", "Default/6.00.001",
    username, password, company, branch))
{
    var json = new JavaScriptSerializer();
    string parameters = "$top=100";
    string items = rs.GetList("SalesOrder", parameters);
    var records = json.Deserialize<List<Dictionary<string, object>>>(items);

    bool sameOrderType = true;
    while (records.Count > 0 && (records.Count == 100 || !sameOrderType))
    {
        var orderType = records[records.Count - 1]["OrderType"] as Dictionary<string, object>;
        var orderTypeValue = orderType.Values.First();
        var orderNbr = records[records.Count - 1]["OrderNbr"] as Dictionary<string, object>;
        var orderNbrValue = orderNbr.Values.First();

        string nextParameters = parameters + "&" + "$filter=" +
            string.Format("OrderType {0} '{1}'", sameOrderType ? "eq" : "gt", orderTypeValue) + " and " +
            string.Format("OrderNbr gt '{0}'", sameOrderType ? orderNbrValue : "''" );
        items = rs.GetList("SalesOrder", nextParameters);
        records = json.Deserialize<List<Dictionary<string, object>>>(items);
        sameOrderType = records.Count == 100;
    }
}


Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow