使用Acumatica API删除位置

使用Acumatica API删除位置,acumatica,Acumatica,我想删除一个客户的位置记录。我以前从未删除过任何内容,在StackOverflow或Acumatica提供的示例中也没有看到任何这样的示例。似乎使用键字段和Delete命令进行提交是有意义的,但这给了我一个相当模糊的“对象引用未设置为对象的实例”。错误。有谁能告诉我我做错了什么,或者这是一个错误的方法吗?下面是代码和完整的错误消息 Public Function DeleteLocation(ByVal customerID As String, ByVal locID As String) A

我想删除一个客户的位置记录。我以前从未删除过任何内容,在StackOverflow或Acumatica提供的示例中也没有看到任何这样的示例。似乎使用键字段和Delete命令进行提交是有意义的,但这给了我一个相当模糊的“对象引用未设置为对象的实例”。错误。有谁能告诉我我做错了什么,或者这是一个错误的方法吗?下面是代码和完整的错误消息

Public Function DeleteLocation(ByVal customerID As String, ByVal locID As String) As Boolean
    Dim address As CR303010Content = m_context.CR303010GetSchema()
    m_context.CR303010Clear()

    Dim customerVal As New Value() With {.LinkedCommand = address.LocationSummary.Customer, .Value = customerID}
    Dim idVal As New Value() With {.LinkedCommand = address.LocationSummary.LocationID, .Value = locID}

    ' execute delete
    Dim deleteCommands As Command() = {customerVal, idVal, address.Actions.Delete}
    Dim deleteResult As CR303010Content() = m_context.CR303010Submit(deleteCommands)

    Return True

End Function
引发此异常:

System.Web.Services.Protocols.SoapException: Server was unable to process request. ---> 
System.NullReferenceException: Object reference not set to an instance of an object.
at PX.Objects.CR.LocationMaintBase`3.Location_RowDeleted(PXCache cache, PXRowDeletedEventArgs e)
at PX.Data.PXCache.OnRowDeleted(Object item, Boolean externalCall)
at PX.Data.PXCache`1.Delete(Object data, Boolean bypassinterceptor)
at PX.Data.PXCache`1.Delete(Object data, Boolean bypassinterceptor)
at PX.Data.PXCache`1.Delete(Object data)
at PX.Data.PXDelete`1.<Handler>d__0.MoveNext()
at PX.Data.PXAction`1.<Press>d__c.MoveNext()
at PX.Data.PXAction`1.<Press>d__c.MoveNext()
at PX.Api.SyImportProcessor.SyStep.CommitChanges(Object itemToBypass, PXFilterRow[] targetConditions)
at PX.Api.SyImportProcessor.ExportTableHelper.ExportTable()
at PX.Api.ScreenUtils.Submit(String screenId, Command[] commands, SchemaMode schemaMode, PXGraph graph)
at PX.Api.Services.ScreenService.Submit(String id, IEnumerable`1 commands, SchemaMode schemaMode)
at PX.Api.Soap.Screen.ScreenGate.Submit(Command[] commands)
--- End of inner exception stack trace ---
System.Web.Services.Protocols.SoapException:服务器无法处理请求。-->
System.NullReferenceException:对象引用未设置为对象的实例。
在PX.Objects.CR.LocationMaintBase`3.Location_行已删除(PXCache缓存,PXRowDeletedEventArgs e)
在PX.Data.PXCache.OnRowDeleted处(对象项,布尔外部调用)
在PX.Data.PXCache`1.Delete处(对象数据,布尔旁路拦截器)
在PX.Data.PXCache`1.Delete处(对象数据,布尔旁路拦截器)
在PX.Data.PXCache`1.Delete处(对象数据)
在PX.Data.PXDelete`1.d_uu0.MoveNext()
在PX.Data.PXAction`1.d_uc.MoveNext()中
在PX.Data.PXAction`1.d_uc.MoveNext()中
在PX.Api.SyImportProcessor.SyStep.CommitChanges(对象项ToByPass,PXFilterRow[]targetConditions)
在PX.Api.SyImportProcessor.ExportTableHelper.ExportTable()处
在PX.Api.ScreenUtils.Submit(stringscreenid,Command[]commands,SchemaMode-SchemaMode,PXGraph-graph)
在PX.Api.Services.ScreenService.Submit(字符串id,IEnumerable`1命令,SchemaMode SchemaMode)
在PX.Api.Soap.Screen.ScreenGate.Submit(Command[]commands)
---内部异常堆栈跟踪的结束---

我可以向你推荐一种丑陋的方式:PXDatabase.Delete。它将直接在db中生成delete语句。例如在C#中:

PXDatabase.Delete(新的PXDataFieldRestrict(“RefNbr”,row.APRefNbr),新的PXDataFieldRestrict(“DocType”,“INV”);
PXDatabase.Delete(新的PXDataFieldRestrict(“RefNbr”,row.APRefNbr),新的PXDataFieldRestrict(“DocType”,“INV”)

下面的代码工作正常

            Content CR303010 = context.GetSchema();
        context.Clear();

        context.Submit(
            new Command[]
            {
                new Value { Value = "ABARTENDE", LinkedCommand = CR303010.LocationSummary.BusinessAccount, Commit = true },
                new Value { Value = "TEST2", LinkedCommand = CR303010.LocationSummary.LocationID, Commit = true },
                CR303010.Actions.Delete
            }
        );

您的代码是正确的,但删除不使用默认地址或联系信息的位置时失败。这是由于影响Acumatica所有版本的错误造成的。解决方法是在删除位置之前重新选中“使用默认值”。该问题已报告,目前正在修复。感谢您帮助Eric解决此问题,并对由此带来的不便表示歉意。

这看起来像是应用程序中的一个错误,您的代码是干净的。您试图删除的位置是否具有有效的地址和联系人?我检查了删除位置的代码,在那里我看到我们可能有NullReferenceException…@Gabriel对于我试图删除的地址,联系人设置为“与主联系人相同”,地址设置为有效地址,除地址行2外,所有字段均已填写。感谢您检查您的位置,如果您发现问题所在,请告诉我。使用Web服务API,我认为我无法访问PXDatabase对象和命令。我只能访问生成的WSDL文件中的屏幕/对象。但如果我错了,请告诉我,我很乐意使用PXDatabase。如果可以,请删除。我建议尝试制作执行此操作的按钮,并调用该按钮。我认为这是一个非常糟糕的主意-您绕过了所有业务逻辑。这就是为什么我为您的第一个值编写了丑陋的方式,您的LinkedCommand是CR303010.LocationSummary.BusinessAccount。我的CR303010.LocationSummary没有BusinessAccount属性,这就是我使用CR303010.LocationSummary.Cusotmer的原因。这和Commit=true属性是我看到的您的代码和我的代码之间的唯一区别。我尝试为每个值添加Commit=true,但仍然收到相同的错误。我使用了5.00.2718版本,这很有趣。我们使用的是版本4.20.2063。我将研究升级的可能性。如果我们能做到,可能还需要一段时间,但如果这能解决问题,我们会让你知道issue@EricBarr你解决问题了吗?我们可以进一步调查,如果needed@Gabriel没有。我们可能需要很长时间才能在新版本上试用它。如果你有时间进一步研究,那就太好了,谢谢。