Acumatica 如何自动创建非库存工具包规范?

Acumatica 如何自动创建非库存工具包规范?,acumatica,Acumatica,我正在创建一个工具,允许“用户a”输入有关要设置的材料的已知信息,然后“用户B”在作为有效零件加载之前将该数据转换为批准的标准。在这个工具中,我必须调用多个图形来创建各种辅助数据点。所有这些工作,直到我达到套件规格 我对每个图形进行的各种调用的格式如下: INItemSiteMaint siteGraph = PXGraph.CreateInstance<INItemSiteMaint>(); INItemSite iNItemSite = new INItemSite(); iN

我正在创建一个工具,允许“用户a”输入有关要设置的材料的已知信息,然后“用户B”在作为有效零件加载之前将该数据转换为批准的标准。在这个工具中,我必须调用多个图形来创建各种辅助数据点。所有这些工作,直到我达到套件规格

我对每个图形进行的各种调用的格式如下:

INItemSiteMaint siteGraph = PXGraph.CreateInstance<INItemSiteMaint>();

INItemSite iNItemSite = new INItemSite();
iNItemSite.InventoryID = item.InventoryID;
iNItemSite.SiteID = newItem.SiteID;
...
siteGraph.itemsitesettings.Insert(iNItemSite);
siteGraph.Actions.PressSave();
我正在用foreach包装创建,以循环查看要添加“新项目”的工具包列表,因此高级视图是

INKitSpecMaint kitGraph = PXGraph.CreateInstance<INKitSpecMaint>();
foreach (MyAsset asset in assets)
{
    //Check if the Kit exists and create it if necessary
    ...

    //Add the new item to the Kit (item was just created, so cannot possibly exist in the kit)
}
kitGraph.Actions.PressSave();
INKitSpecMaint kitGraph=PXGraph.CreateInstance();
foreach(资产中的我的资产)
{
//检查套件是否存在,必要时创建它
...
//将新项目添加到工具包(项目刚刚创建,因此不可能存在于工具包中)
}
kitGraph.Actions.PressSave();
但是,当我使用Actions.PressSave()时,会出现一个错误,即非库存工具包可能只有一个版本。我只在工具包根本不存在时添加工具包/修订版。我尝试了各种不同的方法,包括初始化图形并将其全部保存在foreach循环中(性能不佳),以及在foreach顶部清除图形并进行多次保存,只是为了看看是否有任何方法可行


我很困惑,当使用可选参数定义时,搜索是如何在图形的主视图上不起作用的,我也很困惑,为什么Acumatica会认为在创建工具包时,我在工具包中添加了第二个修订版。

我查看了INKitSpecMaint.cs文件中的代码库以寻找线索。解决方案只会弹出一个错误代码Messages.SingleRevisionForNS,它位于INKitSpecHdr_Row持久化函数中:

protected virtual void INKitSpecHdr_RowPersisting(PXCache sender, PXRowPersistingEventArgs e)
{
    INKitSpecHdr row = e.Row as INKitSpecHdr;
    if (row != null && e.Operation == PXDBOperation.Insert)
    {
        InventoryItem item = InventoryItem.PK.Find(this, row.KitInventoryID);
        if (item.StkItem != true)
        {
            INKitSpecHdr existing = PXSelectReadonly<INKitSpecHdr, Where<INKitSpecHdr.kitInventoryID, Equal<Current<INKitSpecHdr.kitInventoryID>>>>.Select(this);
            if (existing != null)
            {
                if (sender.RaiseExceptionHandling<INKitSpecHdr.revisionID>(e.Row, row.RevisionID, new PXSetPropertyException(Messages.SingleRevisionForNS)))
                {
                    throw new PXRowPersistingException(typeof (INKitSpecHdr.revisionID).Name, null, Messages.SingleRevisionForNS);
                }
            }
        }
    }
}
受保护的虚拟无效INKitSpecHdr_行持久化(PXCache发送方,PXRowPersistingEventArgs e)
{
INKitSpecHdr行=e.行作为INKitSpecHdr;
if(行!=null&&e.Operation==PXDBOperation.Insert)
{
InventoryItem=InventoryItem.PK.Find(this,row.KitInventoryID);
如果(item.StkItem!=真)
{
INKitSpecHdr existing=PXSelectReadonly.Select(此);
if(现有!=null)
{
if(sender.RaiseExceptionHandling(e.Row,Row.RevisionID,new PXSetPropertyException(Messages.SingleRevisionForNS)))
{
抛出新的PXRowPersistingException(typeof(INKitSpecHdr.revisionID).Name,null,Messages.SingleRevisionForNS);
}
}
}
}
}
我将使用VisualStudio的扩展库调试您的解决方案,并逐步检查您的代码,看看您创建的数据为何会失败。当您发送的项目是非库存项目且存在现有修订时,会出现这种情况,因此我将验证正在设置的KitInventoryID是否为正确的项目

为了查看发送给persist方法的内容,我将创建一个快速图扩展,并在它调用基本委托之前放置一个断点。例如:

public class InKitSpecMaintExt : PXGraphExtension<INKitSpecMaint>
{
    protected void INKitSpecHdr_RowPersisting(PXCache sender, PXRowPersistingEventArgs e, PXRowPersisting del)
    {
        //perform code checks/breakpoints first...
        INKitSpecHdr Row = (INKitSpecHdr)e.Row;
        //execute the base method...
        del?.Invoke(sender, e); //set a breakpoint here
    }
}
公共类InKitSpecMaintExt:PXGrapherExtension
{
受保护的无效INKitSpecHdr_行持久化(PXCache发送方、PXRowPersistingEventArgs e、PXRowPersistingDel)
{
//首先执行代码检查/断点。。。
INKitSpecHdr Row=(INKitSpecHdr)e.Row;
//执行基本方法。。。
del?.Invoke(sender,e);//在此处设置断点
}
}

以下是创建套件规格记录的工作代码:

INKitSpecMaint kitSpecMaint = PXGraph.CreateInstance<INKitSpecMaint>();
INKitSpecHdr newSpecHdr = new INKitSpecHdr()
{
    KitInventoryID = 10045,
    RevisionID = "SOMEREV"
};
newSpecHdr = kitSpecMaint.Hdr.Insert(newSpecHdr);
newSpecHdr.Descr = "Some test non-stock kit item";
newSpecHdr = kitSpecMaint.Hdr.Update(newSpecHdr);
var newStockDet = kitSpecMaint.StockDet.Insert();
newStockDet.CompInventoryID = 691;
newStockDet.DfltCompQty = 2m;
newStockDet = kitSpecMaint.StockDet.Update(newStockDet);
kitSpecMaint.Save.Press();
这个问题的棘手之处在于
Hdr
数据视图包含
可选的
参数,您必须指定它才能使
搜索正常工作


我没有发现任何文档说明必须指定
可选
参数,但此示例显示
搜索
在没有该参数的情况下无法找到记录。

这与我在调试中使用的一致。当我创造时,它不会失败。。。在“保存”时失败。保存到数据库时,持久化的行_将触发,而不是将对象插入DAC。在调用插入缓存之前,我还将尝试设置值(RevisionID、KitInventoryID),类似于上面为INItemSite列出的调用。我使用可用于检查行的图形扩展名编辑了文章。我已经用UI测试过,它是在按下save之后调用的,但是在调用基本方法之前调用的,这是最后一行代码。好主意。我要去亚特兰大参加一个8月的会议,但等我能回来的时候我会试试的。你能试着删除
iNKitSpecHdr=kitGraph.Hdr.Insert(iNKitSpecHdr)行并替换
iNKitSpecHdr=kitGraph.Hdr.Update(iNKitSpecHdr)带有
iNKitSpecHdr=kitGraph.Hdr.Insert(iNKitSpecHdr)?这是我第一次尝试。。。创建一个填充了所有数据的hdr对象,然后直接插入。但是我可以在八月会议之后再试一次。在插入之前建立标题和详细记录似乎已经解决了这个问题。我仍然困惑于为什么我不能让搜索工作,但我只是使用PXSelect,然后设置Hdr.Current=我找到的记录。奇怪的是,这仍然返回空为我和所有帐户应该工作得很好。。。kitGraph.Hdr.Current=kitGraph.Hdr.Search(asset.AssetID,(iNKitSpecHdr!=null)?iNKitSpecHdr.RevisionID:setup.DefaultKitRevisionID,新对象[]{asset.AssetID})。FirstOrDefault()@Briansteven尝试将skme硬编码值传递给搜索,以检查其是否有效,然后如果有效,则开始检查您传递的参数。仍在解决问题,但我的设置表“DefaultKitRevisionID”字段上没有掩码。。“1”和“1”不是一回事!有趣的是,PXSelect可以在没有正确填充空格的情况下找到它。
protected virtual void INKitSpecHdr_RowPersisting(PXCache sender, PXRowPersistingEventArgs e)
{
    INKitSpecHdr row = e.Row as INKitSpecHdr;
    if (row != null && e.Operation == PXDBOperation.Insert)
    {
        InventoryItem item = InventoryItem.PK.Find(this, row.KitInventoryID);
        if (item.StkItem != true)
        {
            INKitSpecHdr existing = PXSelectReadonly<INKitSpecHdr, Where<INKitSpecHdr.kitInventoryID, Equal<Current<INKitSpecHdr.kitInventoryID>>>>.Select(this);
            if (existing != null)
            {
                if (sender.RaiseExceptionHandling<INKitSpecHdr.revisionID>(e.Row, row.RevisionID, new PXSetPropertyException(Messages.SingleRevisionForNS)))
                {
                    throw new PXRowPersistingException(typeof (INKitSpecHdr.revisionID).Name, null, Messages.SingleRevisionForNS);
                }
            }
        }
    }
}
public class InKitSpecMaintExt : PXGraphExtension<INKitSpecMaint>
{
    protected void INKitSpecHdr_RowPersisting(PXCache sender, PXRowPersistingEventArgs e, PXRowPersisting del)
    {
        //perform code checks/breakpoints first...
        INKitSpecHdr Row = (INKitSpecHdr)e.Row;
        //execute the base method...
        del?.Invoke(sender, e); //set a breakpoint here
    }
}
INKitSpecMaint kitSpecMaint = PXGraph.CreateInstance<INKitSpecMaint>();
INKitSpecHdr newSpecHdr = new INKitSpecHdr()
{
    KitInventoryID = 10045,
    RevisionID = "SOMEREV"
};
newSpecHdr = kitSpecMaint.Hdr.Insert(newSpecHdr);
newSpecHdr.Descr = "Some test non-stock kit item";
newSpecHdr = kitSpecMaint.Hdr.Update(newSpecHdr);
var newStockDet = kitSpecMaint.StockDet.Insert();
newStockDet.CompInventoryID = 691;
newStockDet.DfltCompQty = 2m;
newStockDet = kitSpecMaint.StockDet.Update(newStockDet);
kitSpecMaint.Save.Press();
INKitSpecMaint kitSpecMaint = PXGraph.CreateInstance<INKitSpecMaint>();
INKitSpecHdr record = INKitSpecHdr.PK.Find(graph, 10045, "SOMEREV");
INKitSpecHdr findRecordBySearch = kitSpecMaint.Hdr.Search<INKitSpecHdr.kitInventoryID, INKitSpecHdr.revisionID>(10045,"SOMEREV",new object[] { 10045}).FirstOrDefault();