查找库存维度

时间:2016-01-04 15:47:09

标签: axapta dynamics-ax-2012 dynamics-ax-2012-r2 dynamics-ax-2012-r3

我试图获取inventDim记录(如果存在)或者创建一个新记录。

InventDim inventDim;

inventDim.InventLocationId = "220";
inventDim = InventDim::findOrCreate(inventDim);
info(inventDim.inventDimId);

我确信InventLocationId的值为" 220"已经存在,但无论如何,增加了一个新的。

如果我再次运行上述行,我将获得最后创建的值,所以这一次,它都很好。

通过SQL检查:

SELECT *
FROM INVENTDIM
WHERE INVENTLOCATIONID = '220'

返回两行。

我可以使用以下行删除添加的行:

 select forUpdate inventDim 
    where inventDim.inventDimId == 'the new id';
 inventDim.delete(true);

我无法弄清楚我在这里做错了什么..

3 个答案:

答案 0 :(得分:1)

InventDim表包含库存维度的值。每条记录都是唯一的,因为没有记录具有完全相同的维度组合。

这意味着如果您正在寻找使用InventLocationId ==" 220"的记录,则可以有许多记录,其中一个记录包含InventColorId ==" Red"和一个使用InventColorId ==" Blue"。当您组合其他尺寸时,您将获得更多组合,例如,您可以有两个记录,其中颜色为蓝色,位置为220,InventSizeId为5厘米或3厘米。

因此,通过上面的示例,您只考虑了一个维度而忽略了其余维度。将InventLocationId设置为220可以拥有多条记录,因为一个或多个其他库存维度将不同。

如果您想要一个所有其他维度为空且InventLocationId为220的记录,则必须在尝试查找记录之前指定其他维度应为空白。

InventDim          inventDim;
InventDim          inventDimNew;
select inventDim
    where inventDim.InventLocationId == "220"
    && inventDim.ConfigId == ""
    && inventDim.InventSizeId == "";
    //Add more blank dimensions depending on the dimensions active in your system.

buf2Buf(inventDim, inventDimNew);
inventDimNew.inventDimId = '';

info(InventDim::findOrCreate(inventDimNew).inventDimId);

答案 1 :(得分:1)

听起来您并不完全理解InventDim的工作方式,或者 All Blank 维度可能存在缓存问题。

解决方法是调试方法\Data Dictionary\Tables\InventDim\Methods\findDim以查看它在决定创建之前如何查找维度。

  

inventDim.inventLocationId == '220'

与填充了两个字段的另一条记录不同:

  

inventDim.inventLocationId == '220'

     

inventDim.inventSiteId == '1'

我已经看到了AllBlank维度的缓存问题。在调试器中检查这两个方法,看看是否有任何异常。一个使用常量AllBlank,而另一个使用全局对象缓存。

InventDim::inventDimIdBlank();

InventDim::findOrCreateBlank();

答案 2 :(得分:1)

关于您正在使用的许可证代码,配置密钥,设置,模块和产品组,对于两种不同的产品,您可能没有相同的维度。

例如,您可以跟随尺寸和颜色的T恤以及颜色和款式的帽子。您对库存维度有类似的疑问。

根据产品的不同,您可能不会查找相同的尺寸。您将在PriceDisc.findPrice()

中找到一个如何使用它的好例子

因此,在您的情况下,发明地点220可能已经被使用过,因此您可能会有一个记录。但它似乎从未单独使用,但具有其他尺寸(尺寸,颜色,批次,序列等)。在运行InventDim :: findOrCreate()方法之前,请确保设置所有相关尺寸。