我也有类似的麻烦。我发现动态 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、它的类型的结果, ETC。),
使用 ItemAttributeValues 端点,您应该获得实际存在的属性值(例如,对于某些项目,您碰巧将其“BaseColor”属性设置为“Blue”,您应该获得该属性值的响应,其属性类型为'BaseColor',一个值,作为 'Blue' 以及实体的 ID 等)。
然而,当涉及到项目的任何实例化属性值时,我无法弄清楚如何获得属性与这些项目的关联。我希望“项目属性值映射”选项类似于 item_id - attribute_id 对,以便对于任何有问题的项目,可以使用过滤器之类的东西查询属性列表。但正如您所说,在发现其中一些元素后,它们各自的端点什么也没有返回。你会说“哦……太棒了!有一个价值项目映射。这是有道理的,我绝对可以使用它'。片刻之后,API 会向你吐出一个错误,或者返回一些你不希望的东西,比如空数据集。
这个 api 是一场持续不断的艰苦战斗,并且充满了地雷。一个完整的让我大吃一惊的痛苦。
编辑:2021-06-09
我已经对此进行了更多研究。我能够为有问题的各种表设置导出包,特别是 7500、7501 和 7505。神奇的表是 7505,因为它是属性值与其关联的项目之间的关系。将包导出到 excel 会产生良好的数据。然而,当试图在 OData 资源中公开此信息时,会发生一些奇怪的事情:
- 在 Web 服务中,我尝试打开页面 7505,该页面将对象名称填充为 ItemAttributeValueMapping,并将服务名称设置为“ItemAttributeValueMapping”。这个是正常的。
当我未能指定对象类型是页面时,系统会抱怨。所以,我回到该行并将选择设置为“页面”
当我通过标签发布更改时,对象名称会自动更改为“ItemAttributeValueTranslations”。
编辑:2021-06-15
经过大量的摆弄,我终于达到了一个点,我决定解决这个问题的唯一方法是编写一个 al 查询,该查询将公开适当的值项映射信息。有一个页面提供了一些执行此操作的源代码:
github AL-代码示例
为了从 API 中获得一些东西,我不得不使用 microsoft visual studio 代码。有一些很好的视频介绍了如何启动并运行它以使测试应用程序适用于您的业务中心实例(我使用了 eric hougaar 的视频: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")
{
}
}
}
}
}
}
}
一旦此代码成功上传到您的服务器并返回一个页面(您必须等待它),您就可以使用指定的查询编号通过转到业务中心的“Web 服务”并添加“查询”来公开 API 中的数据' 到项目 50102(或您使用的任何数字)。端点将自动填充,您可以使用它向您发回必要的 JSON,该 JSON 将显示产品及其属性值。
希望有帮助。