简短的回答:您无法通过 GP Web 服务进行查询。甚至您的仓库密钥也不是 GetSalesOrderList 的可接受标准。要做你想做的事,你需要使用 eConnect 或直接访问表。如果您使用 Microsoft.Dynamics.GP.eConnect 和 Microsoft.Dynamics.GP.eConnect.Serialization 库(我强烈推荐),eConnect 在 .Net 中已经取得了长足的进步。但是,即使在 eConnect 中,您也被困在基于文档标题而不是行项目值的查询中,因此直接表访问可能是您使其工作的唯一方法。
在 eConnect 中,您需要的关键部分是生成有效的 RQeConnectOutType。请注意“ForList = 1”部分。这很重要。因为我做了类似的事情,所以它可能开始是这样的(你需要试验 WhereClause 的功能,我从来没有做过比直接相等的更多的事情):
private RQeConnectOutType getRequest(string warehouseId)
{
eConnectOut outDoc = new eConnectOut()
{
DOCTYPE = "Sales_Transaction",
OUTPUTTYPE = 1,
FORLIST = 1,
INDEX1FROM = "A001",
INDEX1TO = "Z001",
WhereClause = string.Format("WarehouseId = '{0}'", warehouseId)
};
RQeConnectOutType outType = new RQeConnectOutType()
{
eConnectOut = outDoc
};
return outType;
}
如果您必须直接访问表,我建议您通过内置视图之一。在这种情况下,看起来 ReqSOLineView 具有您需要的字段(仓库 ID 为 LOCNCODE,延期交货数量为 QTYBAOR,请求发货日期为 ReqShipDate)。拉出 SOPNUMBE 并在对 GetSalesOrderByKey 的调用中使用它们。
是的,混合解决方案有点糟糕,但我发现如果你打算将 GP Web 服务用于任何复杂的事情,你真的必须适应。就个人而言,我通过访问类型隔离我的库,然后使用特定于我正在使用的任何进程的库来协调它们。所以我有我几乎在任何地方都使用的 Integration.GPWebServices、Integration.eConnect 和 Integration.Data 库,然后我的各个流程库在这些库之上进行协调。