【问题标题】:How to get item attributes via api?如何通过api获取物品属性?
【发布时间】:2019-06-04 12:19:58
【问题描述】:

我们正在使用云 Dynamics 365 Business Central 并尝试通过 OData 获取具有所有属性的项目。

在 Microsoft 文档中,我们发现了这个端点:

api.businesscentral.dynamics.com/v1.0[our tenant id]/Sandbox/ODataV4/Company('CRONUS%20DE')/items

但很遗憾,响应中不包含物品属性和值,例如 Farbe、Tiefe 等。

接下来,我们尝试添加新的 Web 服务。但是其中一些端点返回空值,其中一些(7506、7507、7508、7510)不起作用并返回:

No HTTP resource was found that matches the request URI

对象 7500、7501、7503 包含有关属性的信息。但其中没有一个(7500 - 7510)不包含项目、属性和值之间的关系。

也许还有另一种方法可以获取带有属性值的项目?我们也尝试过研究microsoft graph,但没有成功。

【问题讨论】:

    标签: microsoft-dynamics dynamics-365 dynamics-business-central


    【解决方案1】:

    我也遇到了类似的问题。我发现动态 api 非常不直观且难以使用。我能做到的最远的事情是进入动态的api设置并发现一些项目属性的表格(我相信表格编号如下:

    • 7500 - 物品属性
    • 7501 - 物品属性值
    • 7502 - 物品属性翻译
    • 7504 - 物品属性值选择
    • 7505 - 项目属性值映射

    我无法评论为什么缺少 7503。

    以 7500 为例,当你发现表时,系统会提供一个结果端点(不幸的是,他们总是推广 OData 和过时的 SOAP 资源;我不明白为什么他们对简单的和易于使用的 REST 端点)。

    https://api.businesscentral.dynamics.com/v2.0/<TENANT_ID>/<ENVIRONMENT_NAME>/ODataV4/Company('COMPANY_IDENTIFIER')/ItemAttributes

    使用此端点,您可以获得属性类型本身的列表(例如,假设您定义了一个名为“BaseColor”的属性,您应该在此处获得属性名称“BaseColor”的结果,它的 ID , 它的类型等),

    使用 ItemAttributeValues 端点,您应该获得实际存在的属性值(例如,对于某些项目,您碰巧将其“BaseColor”属性设置为“Blue”,您应该获得对该属性值的响应,其中包含'BaseColor' 的属性类型,一个值,如 'Blue' 以及实体的 ID 等)。

    然而,当涉及到项目的任何实例化属性值时,我无法弄清楚如何获得属性与这些项目的关联。我希望“项目属性值映射”选项类似于 item_id - attribute_id 对,因此对于任何有问题的项目,都可以使用过滤器之类的东西查询属性列表。但正如您所说,在发现其中一些元素后,它们各自的端点什么也没有返回。你会说“哦……太棒了!有一个价值项目映射。这是有道理的,我绝对可以使用它'。片刻之后,API 会向您吐出一个错误,或者返回一些您不期望的东西,例如空数据集。

    这个 api 是一场持续的艰苦战斗,并且充满了地雷。彻底的让我大吃一惊。

    编辑:2021-06-09

    我已经对此进行了更多研究。我能够为有问题的各种表设置导出包,特别是 7500、7501 和 7505。神奇的表是 7505,因为它是属性值与其关联的项目之间的关系。将包导出到 excel 会产生良好的数据。然而,当试图在 OData 资源中公开这些信息时,会发生一些奇怪的事情:

    1. 在 Web 服务中,我尝试打开页面 7505,该页面将对象名称填充为 ItemAttributeValueMapping,并将服务名称设置为“ItemAttributeValueMapping”。这是正常的。

    1. 当我未能指定对象类型是页面时,系统会报错。所以,我回到这一行并将选择设置为“页面”

    2. 当我通过 Tab 键发布更改时,对象名称会自动更改为“ItemAttributeValueTranslations”。

    编辑:2021-06-15

    经过一番折腾,我终于达到了一个点,我决定解决这个问题的唯一方法是编写一个 al 查询,该查询将公开适当的值项映射信息。有一个页面提供了一些执行此操作的源代码:

    github AL-Code-Samples

    要从 API 中获得一些东西,我必须使用 microsoft Visual Studio 代码。有一些很好的视频介绍了如何启动并运行它以使测试应用程序为您的业务中心实例工作(我使用了 eric hougaar 的视频:Getting started with Business Central AL Development)。

    当您通过插入您的租户并输入您的凭据来设置您的应用以连接到您的实例后,您可以修改源代码,如下所示在您的系统中创建一个查询。

    query 50102 "<YOUR_QUERY_NAME>"
    {
    
        QueryType = API;
        APIPublisher = '<YOUR_NAME>';
        APIGroup = '<YOUR_APP_GROUP>';
        APIVersion = 'v1.0';
        Caption = '<YOUR CAPTION>';
        EntityName = '<YOUR_QUERY_NAME>';
        EntitySetName = '<YOUR_API_ENDPOINT_NAME>';
        elements
        {
            dataitem(Item; Item)
            {
                column(No_; "No.")
                {
                }
                column(Description; Description)
                {
                }
    
                column(Unit_Cost; "Unit Cost")
                {
                }
    
                dataitem(Item_Attribute_Value_Mapping; "Item Attribute Value Mapping")
                {
                    DataItemLink = "No." = Item."No.";
    
                    column(Item_Attribute_ID; "Item Attribute ID")
                    {
                    }
    
                    column(Item_Attribute_Value_ID; "Item Attribute Value ID")
                    {
                    }
                    dataitem(QueryElement6; "Item Attribute")
                    {
                        DataItemLink = ID = Item_Attribute_Value_Mapping."Item Attribute ID";
                        column(Name; Name)
                        {
                        }
                        dataItem(Queryelement10; "Item Attribute Value")
                        {
                            DataItemLink = "Attribute ID" = Item_Attribute_Value_Mapping."Item Attribute ID",
                            ID = Item_Attribute_Value_Mapping."Item Attribute Value ID";
                            column(Value; Value)
                            {
                            }
                            column(Numeric_Value; "Numeric Value")
                            {
                            }
                        }
                    }
                }
    
            }
        }
    }
    

    一旦此代码成功上传到您的服务器并返回一个页面(您必须等待它),您就可以使用指定的查询号在 API 中公开数据,方法是转到业务中心的“Web 服务”并添加对项目 50102(或您使用的任何数字)的“查询”。端点将自动填充,您可以使用它向您发回必要的 JSON,该 JSON 将显示产品及其属性值。

    希望有帮助。

    【讨论】:

    • 审稿人注意:来自How do I write a good answer?:“问题仍然没有答案,你也有同样的问题吗?通过研究问题帮助我们找到解决方案,然后贡献您的研究结果以及您尝试过的任何其他内容作为部分答案。这样一来,即使我们无法弄清楚,下一个人还有更多工作要做。”
    【解决方案2】:

    您应该尝试以下端点:

    /v2.0/tenant_id/enviornment_name/ODataV4/Company(company_id)/Items
    

    【讨论】:

    • 引用“items”这个词需要大写这一事实并不能解决手头的问题,即如何提取项目属性。
    猜你喜欢
    • 1970-01-01
    • 2018-01-31
    • 2016-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多