Удаление местоположения с помощью Acumatica API

Я хочу удалить одну из записей о местонахождении клиента. Я никогда ничего не удалял раньше и не вижу примеров этого в StackOverflow или в примерах, предоставленных Acumatica. Кажется, что выполнение Submit с ключевыми полями и командой 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 ---

person Eric Barr    schedule 26.03.2015    source источник
comment
Похоже на ошибку в приложении, ваш код чистый. Есть ли у места, которое вы пытаетесь удалить, действительный адрес и контакт? Я проверил код Location_RowDeleted и вижу, что у нас могло быть исключение NullReferenceException ...   -  person Gabriel    schedule 26.03.2015
comment
@Gabriel Для адреса, который я пытаюсь удалить, Контакт установлен на такой же, как основной, а адрес установлен на действительный адрес со всеми заполненными полями, кроме строки адреса 2. Спасибо за проверку вашего Location_RowDeleted, сообщите мне, если вы обнаружите, что это проблема.   -  person Eric Barr    schedule 27.03.2015


Ответы (3)


Ваш код правильный, но он не работает при удалении местоположения, которое не использует адрес по умолчанию или контактную информацию. Это связано с ошибкой, затрагивающей все версии Acumatica. Обходной путь - еще раз проверить «Использовать по умолчанию» перед удалением местоположения. О проблеме было сообщено, и в настоящее время она исправляется. Благодарим Эрика за помощь в устранении этой проблемы и приносим извинения за неудобства.

person Gabriel    schedule 03.04.2015

Могу предложить вам некрасивый способ: PXDatabase.Delete. Он сгенерирует оператор удаления прямо в db. Например, в C #:

PXDatabase.Delete (новый PXDataFieldRestrict («RefNbr», row.APRefNbr), новый PXDataFieldRestrict («DocType», «INV»)); PXDatabase.Delete (новый PXDataFieldRestrict («RefNbr», row.APRefNbr), новый PXDataFieldRestrict («DocType», «INV»));

person Yuriy Zaletskyy    schedule 26.03.2015
comment
Используя API веб-служб, я не верю, что у меня есть доступ к объекту и командам PXDatabase. У меня есть доступ только к экранам / объектам, которые были в сгенерированном файле WSDL. Но, пожалуйста, дайте мне знать, если я ошибаюсь, я с удовольствием воспользуюсь PXDatabase.Delete, если смогу. - person Eric Barr; 27.03.2015
comment
Предлагаю попробовать сделать кнопку, выполняющую это действие, и вызвать эту кнопку - person Yuriy Zaletskyy; 27.03.2015
comment
Я считаю, что это очень плохая идея - вы обойдете всю бизнес-логику. - person Gabriel; 27.03.2015
comment
Вот почему я написал некрасиво - person Yuriy Zaletskyy; 27.03.2015

Код ниже работает нормально

            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
            }
        );
person srodionov    schedule 27.03.2015
comment
для вашего первого значения ваша LinkedCommand - CR303010.LocationSummary.BusinessAccount. В моем CR303010.LocationSummary нет свойства BusinessAccount, поэтому я использую CR303010.LocationSummary.Cusotmer. Это и свойства Commit = true - единственные различия, которые я вижу между вашим кодом и моим. Я попытался добавить Commit = true для каждого значения, но все равно получил ту же ошибку. - person Eric Barr; 27.03.2015
comment
я использовал версию 5.00.2718 - person srodionov; 28.03.2015
comment
Это интересно. Мы используем версию 4.20.2063. Я рассмотрю возможность обновления. Это может занять некоторое время, если мы даже сможем, но мы сообщим вам, решит ли это проблему. - person Eric Barr; 28.03.2015
comment
@EricBarr, вы решили проблему? при необходимости мы можем изучить это подробнее - person Gabriel; 01.04.2015
comment
@ Габриэль Нет, не знал. Может пройти некоторое время, прежде чем мы сможем опробовать его в новой версии. Если у вас есть время, чтобы разобраться в этом подробнее, было бы здорово, спасибо. - person Eric Barr; 02.04.2015
comment
@EricBarr, пожалуйста, напишите мне по электронной почте, это в моем профиле (я отвечу с моего адреса электронной почты Acumatica.com) - person Gabriel; 02.04.2015
comment
@EricBarr Я тестировал ваш код, и здесь он отлично сработал. Мне пришлось внести коррективы для его компиляции - это может быть связано с вашей проблемой. У меня нет полей с именами address.LocationSummary.Customer, вот это address.LocationSummary.BusinessAccount. Напишите мне по электронной почте, я постараюсь помочь. - person Gabriel; 02.04.2015