Отменить заказ на продажу - PullRequest
0 голосов
/ 10 октября 2018

Как можно отменить определенный заказ на продажу с помощью кода?Возможно, я могу вызвать график ProcessOrders, просмотреть циклы выбора и выполнить метод Cancel Order.К сожалению, я не вижу такого метода.Действие выпадающего меню управляется меню автоматизации.Я не нахожу действия отмены заказа в стандартном графике ввода заказов на продажу.Итак, как лучше всего достичь цели?

С помощью кода я могу вручную установить отмененный флаг и статус.Кажется, это работает, но я не уверен, что рекомендуется.Похоже, я что-то пропускаю, и меню автоматизации должно быть кстати.

1 Ответ

0 голосов
/ 10 октября 2018

Я копирую ответ из этого поста в блоге Acumatica, так как он делает именно то, что вам нужно, называется этапом автоматизации «Отменить заказ» из кода: Запуск шага автоматизации из кода

Чтобы вызвать шаг автоматизации, вам необходимо:

  • Определить новый пользовательский PXView, который будет возвращать запись, которую мы хотим обработать
  • Создать адаптер, который будет предоставлять данные для обработчика кнопок.Адаптер будет получать данные из пользовательского PXview.
  • Создать отдельный экземпляр графика, который будет обрабатывать действие.

Код:

public class SOOrderEntry_Extension:PXGraphExtension<SOOrderEntry>
{
    //Lets define additional button than will call automation button.    
    public PXAction<SOOrder> ButtonExample;       
    [PXButton()]
    [PXUIField(DisplayName = "Button Example")]
    public virtual IEnumerable buttonExample(PXAdapter adapter)
    {
        SOOrder order = Base.Document.Current;

        //creating a graph that will process Internal command
        SOOrderEntry graph = PXGraph.CreateInstance<SOOrderEntry>();

        graph.Document.Current = graph.Document.Search<SOOrder.orderNbr>(order.OrderNbr, order.OrderType);

        //Searching for correct button from that is defined in Automatin steps.
        //All sub  menues are adden under action button, so we can get them and iterate.
        foreach (var action in (graph.action.GetState(null) as PXButtonState).Menus)
        {
            if (action.Command == "Cancel Order")
            {
                //Constructing dummy view that will always return only one record.
                adapter = new PXAdapter(new DummyView(graph, graph.Document.View.BqlSelect, new List<object> { order }));

                //defining a button command
                adapter.Menu = action.Command;

                //running button
                return graph.action.Press(adapter);
            }
        }

        return adapter.Get();
    }

    //Defining a dummy view that is inherited from PXView
    internal class DummyView : PXView
    {
        //Storing list of records
        List<object> _Records;

        internal DummyView(PXGraph graph, BqlCommand command, List<object> records)
            : base(graph, true, command)
        {
            _Records = records;
        }

        //Everytime when system calls select for the view, retun saved records.
        public override List<object> Select(object[] currents, object[] parameters, object[] searches, string[] sortcolumns, bool[] descendings, PXFilterRow[] filters, ref int startRow, int maximumRows, ref int totalRows)
        {
            return _Records;
        }
    }
}

Я думаю, что предпочтительнее вызывать Шаг автоматизации вместо ручной настройки поля Отменено , потому что, если пользователь изменяет Шаг автоматизации, вы можете получить изменения, вызвав его.

Примечаниечто, когда это возможно, вы всегда должны использовать существующий Graph, когда вам нужно обрабатывать данные вручную, потому что это вызовет проверки.

Если вы должны были вручную изменить поле Отменено , используя SOOrderEntry вместо вызова автоматизацииПо-прежнему будет применяться следующая проверка в SOOrderEntry:

protected virtual void SOOrder_Cancelled_FieldVerifying(PXCache sender, PXFieldVerifyingEventArgs e)
{
    SOOrder row = (SOOrder) e.Row;
    PXResultset<CCProcTran> trans = PXSelect<CCProcTran, Where<CCProcTran.origRefNbr, Equal<Current<SOOrder.orderNbr>>,
                    And<CCProcTran.origDocType, Equal<Current<SOOrder.orderType>>,
                    And<CCProcTran.refNbr, IsNull,
                    And<CCProcTran.docType, IsNull>>>>>
                    .Select(this);
    CCProcTranHelper.UpdateCCPaymentState(row, trans);
    if (row != null && (row.IsCCAuthorized == true || row.IsCCCaptured == true))
    {
        bool authIsValid = true;
        if (row.IsCCAuthorized == true)
        {
            if (row.CCAuthTranNbr != null)
            {
                CCProcTran authTran = PXSelect<CCProcTran, Where<CCProcTran.tranNbr, Equal<Required<CCProcTran.tranNbr>>>>.Select(this, row.CCAuthTranNbr);
                if (String.IsNullOrEmpty(authTran.DocType) == false && String.IsNullOrEmpty(authTran.RefNbr) == false)
                {
                    authIsValid = false;
                }
            }
            else
            {
                CCProcTran authTran = this.ccAuthTrans.Select(); //Double-checking for valid auth tran
                if (authTran == null)
                    authIsValid = false;
            }

            if (authIsValid && row.CCAuthExpirationDate.HasValue)
            {
                authIsValid = row.CCAuthExpirationDate.Value > PXTimeZoneInfo.Now;
            }
        }
        if (authIsValid)
        {
            sender.RaiseExceptionHandling<SOOrder.cCPaymentStateDescr>(row, row.CCPaymentStateDescr, new PXSetPropertyException(Messages.CannotCancelCCProcessed, PXErrorLevel.Error));
        }
    }
}
...