Как проверить, была ли нажата кнопка «Удалить», так как при удалении элемента возникает ошибка MoveNext

Есть ли способ проверить, было ли нажато действие удаления на экране Acumatica? Это связано с тем, что у меня есть код для перезагрузки экрана StockItems, и всякий раз, когда я удаляю элемент, он выдает ошибку movenext, но элемент успешно удаляется. Ниже мой код перезагрузки:

[PXOverride]
  public void Persist(Action persist)
  {
   persist();// this will call base Persist();
   InventoryItemMaint grp = PXGraph.CreateInstance<InventoryItemMaint>();
   InventoryItem inv = PXSelect<InventoryItem, Where<InventoryItem.inventoryCD, Equal<Required<InventoryItem.inventoryCD>>>>.Select(grp, this.Base.Item.Current.InventoryCD.Trim());
   if (inv != null && inv.InventoryID.HasValue)
   {
      grp.Item.Current = grp.Item.Search<InventoryItem.inventoryID>(inv.InventoryID);
      throw new PXRedirectRequiredException(grp, "Reloading Item");
   }
  }

person Angelo Veloria    schedule 18.06.2015    source источник


Ответы (2)


Вы можете следовать методу, предложенному Юрой, ИЛИ вы можете добиться этого другим способом, я думаю.

Вы можете проверить состояние кеша записи перед вызовом base persist, если состояние кеша говорит, что оно удалено, не выполняйте перенаправление.

Код может быть таким, как показано ниже [НЕ ПРОВЕРЕНО]

[PXOverride]
  public void Persist(Action persist)
  {
    bool isDeletion = false;
    InventoryItem  CurrentItem = this.Base.Item.Cache.Current as InventoryItem ;
    if(this.Base.Item.Cache.GetStatus(CurrentItem) == PXEntryStatus.Deleted) // Helps to check whether the operation is deletion
       isDeletion = true;
   persist();// this will call base Persist();
    if(!isDeletion)
    {
      InventoryItemMaint grp = PXGraph.CreateInstance<InventoryItemMaint>();
      InventoryItem inv = PXSelect<InventoryItem, Where<InventoryItem.inventoryCD, Equal<Required<InventoryItem.inventoryCD>>>>.Select(grp, this.Base.Item.Current.InventoryCD.Trim());
      if (inv != null && inv.InventoryID.HasValue)
      {
      grp.Item.Current = grp.Item.Search<InventoryItem.inventoryID>(inv.InventoryID);
      throw new PXRedirectRequiredException(grp, "Reloading Item");
      }
    }
  }

ИЗМЕНИТЬ:

Я обнаружил, что приведенный выше код не будет работать как InventoryItem.

this.Base.Item.Current // is returning null

и это ваша основная проблема с ошибкой movenext, поэтому я предлагаю вам обновить код следующим образом.

[PXOverride]
        public void Persist(Action persist)
        {            
            persist();// this will call base Persist();
            InventoryItem CurrentItem = this.Base.Item.Current as InventoryItem;
            if (CurrentItem != null)
            {
                InventoryItemMaint grp = PXGraph.CreateInstance<InventoryItemMaint>();
                InventoryItem inv = PXSelect<InventoryItem, Where<InventoryItem.inventoryCD, Equal<Required<InventoryItem.inventoryCD>>>>.Select(grp, CurrentItem.InventoryCD.Trim());
                if (inv != null && inv.InventoryID.HasValue)
                {
                    grp.Item.Current = grp.Item.Search<InventoryItem.inventoryID>(inv.InventoryID);
                    throw new PXRedirectRequiredException(grp, "Reloading Item");
                }
            }
        }
person Sin    schedule 19.06.2015
comment
привет еще раз Hybridzz, это не решило мою проблему. Могу ли я просто изменить свой вопрос на то, как я могу просто очистить экран Stock Items после нажатия на действие удаления? - person Angelo Veloria; 19.06.2015
comment
Привет, Анджело, isDeletion, когда вы делаете удаление, это не так верно? Если установлено значение true, приведенный ниже блок if не будет выполнен, и вы не должны получить ошибку movenext. - person Sin; 19.06.2015
comment
я думаю, что это не так, потому что ошибка movenext все еще появляется после удаления. - person Angelo Veloria; 19.06.2015
comment
Можем ли мы отладить и убедиться, что для параметра isDeletion не установлено значение true; Вы получаете какую-либо ошибку в коде, который я вам дал? Он должен работать. - person Sin; 19.06.2015
comment
нет, при публикации нет ошибки ... извините, я здесь новичок, как я могу запустить отладчик здесь, в настройке acumatica, или как я могу просто отправить сообщение, чтобы я знал, каково значение IsDeleted? - person Angelo Veloria; 19.06.2015
comment
Вы можете добавить это как новый вопрос, и я отвечу на него, кстати, я проверил здесь, что ток становится равным нулю при вызове сохранения, что делает проблему - person Sin; 19.06.2015
comment
ах, хорошо... теперь это работает, я добавил || CurrentItem == null в мое условие IF - person Angelo Veloria; 19.06.2015
comment
Это не обряд, Анджело, дай мне минутку, позволь мне дать другое решение - person Sin; 19.06.2015
comment
Пожалуйста, проверьте отредактированный ответ, я обнаружил, что нуль - это ваша основная проблема с ошибкой moveNext. пожалуйста, проверьте обновленный код, поможет вам или нет. Если поможет, не забудьте отметить как ответ. - person Sin; 19.06.2015
comment
еще раз спасибо Hybridzz, это решило мою проблему. - person Angelo Veloria; 19.06.2015

В качестве одного из способов я предлагаю вам добавить в ваш DAC поле IsDeleted, например:

[PXBool]
[PXDefault(false)]
public bool? IsDeleted { get; set; }

затем присоединитесь к RowDeleting(). Например вот так:

protected virtual void ShipmentLine_RowDeleting(PXCache sender, PXRowDeletingEventArgs e)
{
    ShipmentLine line = (ShipmentLine)e.Row;
    line.IsDeleted = true;
}

И, наконец, измените свой код на следующий сценарий:

[PXOverride]
public void Persist(Action persist)
{
  ShipmentLine  line = ViewShipmentLine.Current;
  if(line.IsDeleted)
  {
      //do some logic which you consider as nesessary
  }
  persist();// this will call base Persist();
  InventoryItemMaint grp = PXGraph.CreateInstance<InventoryItemMaint>();
  InventoryItem inv = PXSelect<InventoryItem, Where<InventoryItem.inventoryCD,Equal<Required<InventoryItem.inventoryCD>>>>.Select(grp, this.Base.Item.Current.InventoryCD.Trim());
  if (inv != null && inv.InventoryID.HasValue)
        {
              grp.Item.Current = grp.Item.Search<InventoryItem.inventoryID>(inv.InventoryID);
  throw new PXRedirectRequiredException(grp, "Reloading Item");
        }
  }

Надеюсь, поможет.

person Yuriy Zaletskyy    schedule 18.06.2015