使用OData和Python在Microsoft Dynamics中创建销售订单和销售线



我正在将Microsoft Dynamics NAV 2013 R2与我的Python应用程序集成。我的集成目标是:

  1. 查询所有销售订单
  2. 创建新的销售订单和相关的销售行

在Dynamics NAV方面,我使用的是与OData 1.0-3.0兼容的web服务。我正在从web服务中公开Sales Order和Sales Line对象。我可以通过浏览器访问web服务。

在Python方面,我使用pyodata与DynamicsNAV进行通信。

我的测试代码如下:

import pyodata
import requests
from requests_ntlm import HttpNtlmAuth
import logging
# Logging to get more information
Log_Format = "%(levelname)s %(asctime)s - %(message)s"
logging.basicConfig(level=logging.DEBUG, filename="logfile.log", filemode="w", format=Log_Format)
SERVICE_URL = "http://localhost:7648/RRFITest4/OData/"
# Creating session and providing authentication credentials
session = requests.Session()
session.auth = HttpNtlmAuth('username', 'password')
client = pyodata.Client(SERVICE_URL, session)
# Get the entity specific to the company name
company_entity = client.entity_sets.Company.get_entity('Company Name')
sales_order = {
'Sell_to_Customer_No': '30001',
'Sales_OrderSalesLines': {
'Document_Type': 'Order',
'Document_No': 'SO-0147924',
'Line_No': 10000,
'Type': "Item",
'Family_Code': 'B116A',
'No': 'W211608',
'Quantity_Container': 0,
}
}
# Creating a navigation property of the company
create_request = company_entity.nav('Sales_Order').create_entity()
create_request.set(**sales_order)
new_sales_order = create_request.execute()
print(new_sales_order)

我面临的问题是,我可以查询所有的销售订单,但当我试图创建一个销售订单和相关的销售线时,我会收到以下错误:

Traceback (most recent call last):
File "C:/Users/hsajib/Dev/nav-webservices-integration/odata-sample.py", line 37, in <module>
new_sales_order = create_request.execute()
File "C:UsersUserNameAppDataLocalpypoetryCachevirtualenvsnav-webservices-integration-iyrYYhSb-py3.8libsite-packagespyodatav2service.py", line 305, in execute
return self._handler(response)
File "C:UsersUserNameAppDataLocalpypoetryCachevirtualenvsnav-webservices-integration-iyrYYhSb-py3.8libsite-packagespyodatav2service.py", line 1135, in create_entity_handler
raise HttpError('HTTP POST for Entity Set {0} failed with status code {1}'
pyodata.exceptions.HttpError: HTTP POST for Entity Set Sales_Order failed with status code 400
Process finished with exit code 1

以下是运行代码的详细日志:

INFO 2022-03-02 10:08:12,279 - Fetching metadata
DEBUG 2022-03-02 10:08:12,281 - Starting new HTTP connection (1): localhost:7648
DEBUG 2022-03-02 10:08:12,347 - http://localhost:7648 "GET /RRFITest4/OData/$metadata HTTP/1.1" 401 0
DEBUG 2022-03-02 10:08:12,367 - http://localhost:7648 "GET /RRFITest4/OData/$metadata HTTP/1.1" 401 0
DEBUG 2022-03-02 10:08:13,540 - http://localhost:7648 "GET /RRFITest4/OData/$metadata HTTP/1.1" 200 42231
DEBUG 2022-03-02 10:08:13,541 - Retrieved the response:
H: Cache-Control: no-cache
H: Content-Length: 42231
H: Content-Type: application/xml;charset=utf-8
H: Server: Microsoft-HTTPAPI/2.0
H: X-Content-Type-Options: nosniff
H: DataServiceVersion: 1.0;
H: Date: Wed, 02 Mar 2022 15:08:12 GMT
INFO 2022-03-02 10:08:13,542 - Creating OData Schema (version: 2)
INFO 2022-03-02 10:08:13,563 - Creating OData Service (version: 2)
DEBUG 2022-03-02 10:08:13,563 - New entity set proxy instance for Customers
DEBUG 2022-03-02 10:08:13,563 - New entity set proxy instance for CustomersDoc_Distribution_Line
DEBUG 2022-03-02 10:08:13,564 - New entity set proxy instance for Items
DEBUG 2022-03-02 10:08:13,564 - New entity set proxy instance for Job_Ledger_Entries
DEBUG 2022-03-02 10:08:13,564 - New entity set proxy instance for Sales_Lines
DEBUG 2022-03-02 10:08:13,564 - New entity set proxy instance for Sales_Order
DEBUG 2022-03-02 10:08:13,564 - New entity set proxy instance for Sales_OrderSalesLines
DEBUG 2022-03-02 10:08:13,564 - New entity set proxy instance for Company
DEBUG 2022-03-02 10:08:13,564 - Detected single property key, adding pair Name->Company Name to keyproperties
INFO 2022-03-02 10:08:13,564 - Getting entity Company for key Company Name and args {}
DEBUG 2022-03-02 10:08:13,564 - New instance of EntityGetRequest for last segment: Company
DEBUG 2022-03-02 10:08:13,564 - New entity set proxy instance for Sales_Order
DEBUG 2022-03-02 10:08:13,564 - New instance of EntityCreateRequest for entity type: Sales_Order on path Company('Company Name')/Sales_Order
INFO 2022-03-02 10:08:13,564 - {'Sell_to_Customer_No': '30001'}
DEBUG 2022-03-02 10:08:13,564 - Send (execute) POST request to http://localhost:7648/RRFITest4/OData/Company('Company Name')/Sales_Order
DEBUG 2022-03-02 10:08:13,564 -   query params: {}
DEBUG 2022-03-02 10:08:13,564 -   headers: {'Accept': 'application/json', 'Content-Type': 'application/json', 'X-Requested-With': 'X'}
DEBUG 2022-03-02 10:08:13,564 -   body: {"Sell_to_Customer_No": "30001"}
DEBUG 2022-03-02 10:08:13,646 - http://localhost:7648 "POST /RRFITest4/OData/Company('Company%20Name')/Sales_Order HTTP/1.1" 401 0
DEBUG 2022-03-02 10:08:13,705 - http://localhost:7648 "POST /RRFITest4/OData/Company('Company%20Name')/Sales_Order HTTP/1.1" 401 0
DEBUG 2022-03-02 10:08:13,755 - http://localhost:7648 "POST /RRFITest4/OData/Company('Company%20Name')/Sales_Order HTTP/1.1" 400 187
DEBUG 2022-03-02 10:08:13,755 - Received response
DEBUG 2022-03-02 10:08:13,755 -   url: http://localhost:7648/RRFITest4/OData/Company('Company%20Name')/Sales_Order
DEBUG 2022-03-02 10:08:13,756 -   headers: {'Content-Length': '187', 'Content-Type': 'application/json;odata=minimalmetadata;streaming=true;charset=utf-8', 'Server': 'Microsoft-HTTPAPI/2.0', 'X-Content-Type-Options': 'nosniff', 'DataServiceVersion': '3.0;', 'Date': 'Wed, 02 Mar 2022 15:08:13 GMT'}
DEBUG 2022-03-02 10:08:13,756 -   status code: 400
DEBUG 2022-03-02 10:08:13,756 -   body: {"odata.error":{"code":"","message":{"lang":"en-US","value":"The length of the string is 31, but it must be less than or equal to 30 characters. Value: ='Company Name'"}}}

我试着从导航端调试这个。为此,我使用了Dynamics NAV调试器,使用了"下一步调试"选项。我把这篇文章作为调试的指导原则,但没有任何运气。

我的问题是如何绕过这个错误并为销售订单创建销售行?在NAV端,我还能做其他事情来调试它吗?

日志的最后一行

DEBUG 2022-03-02 10:08:13,756 -   body: {"odata.error":{"code":"","message":{"lang":"en-US","value":"The length of the string is 31, but it must be less than or equal to 30 characters. Value: ='Company Name'"}}}

清楚地告诉您在"公司名称"参数中传递的值超过30个字符,这超过了Navision侧"公司名称(Company Name("字段的字符长度。

最新更新