Parse SubAccount для получения отдельных сегментов - PullRequest
0 голосов
/ 09 октября 2018

Я хотел бы получить доступ к отдельным сегментам субсчета программно.Предполагая, что у меня есть определенная дополнительная учетная запись, установленная как ABC-123, я хотел бы иметь возможность доступа к ABC и 123 по отдельности в коде, чтобы я мог реализовать конкретное требование бизнеса.

Я знаю, что SubAccounts сохраняются в таблице Sub как один строковый пример ABC123.Поля субсчета, которые ссылаются на эту таблицу, затем связываются на основе идентификатора (целое число - PK в таблице Sub).Я, конечно, могу прочитать из этой таблицы и затем разделить соответственно (взяв первые 3 символа и вторые 3 символа).Однако я хотел бы, чтобы это было динамичным, чтобы настройка работала для разных клиентов, а клиенты могли иметь разную длину для сегмента.Поэтому я не могу жестко закодировать значение 3. Я могу использовать таблицу SegmentValues ​​для извлечения длин каждого сегмента соответственно.

Однако, поскольку Acumatica уже каким-то образом выполняет этот анализ (пример в пользовательском интерфейсе), есть ли API, где Acumatica обрабатывает эту логику и может предоставить субсчет в виде массива строк.Я попытался заглянуть в SubAccountAttribute, PXDimensionSelectorAttribute и SubAccountProvider, но не смог найти ничего, что обеспечивало бы эту функциональность.

Обеспечивает ли Acumatica способ разделения субсчета на массив строк, или мне следует сделать это вручнуюпутем определения длин из значений сегмента?

1 Ответ

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

Я полагаю, что некоторая логика, используемая для разделения сегмента, находится в защищенном классе Definition .Разделенные сегменты находятся в коллекциях Dimensions класса Definition .Вы можете обращаться к нему в атрибутах, которые являются производными от класса PXDimensionAttribute , но поскольку класс Definition защищен, вы не можете получить к нему доступ в графе, поскольку PXGraph / PXGraphExtension не происходит от него.

Из Dimension можно извлечь не так много, поскольку большинство свойств защищены: enter image description here Вы можете свернуть свое собственное, прочитав сегменты сегментированного ключа: enter image description here

Вот пример, который записывает значения сегмента субсчета транзакций в трассировку для экрана Счета-фактуры и напоминания:

using PX.Data;
using PX.Objects.AR;
using PX.Objects.CS;
using PX.Objects.GL;

namespace PX.Objects.SO
{
  public class ARInvoiceEntry_Extension : PXGraphExtension<ARInvoiceEntry>
  {
      public void ARTran_RowSelected(PXCache cache, PXRowSelectedEventArgs e)
      {
          ARTran tran = e.Row as ARTran;

          if (tran != null && tran.SubID.HasValue)
          {
                Sub sub = SubAccountAttribute.GetSubaccount(Base, tran.SubID.Value);

                if (sub != null && sub.SubCD != null)
                {
                    short segmentStartIndex = 0;

                    foreach (Segment segment in PXSelect<Segment,
                                                Where<Segment.dimensionID, Equal<Required<Segment.dimensionID>>>,
                                                OrderBy<Asc<Segment.segmentID>>>.Select(Base, "SUBACCOUNT"))
                    {
                        if (segment.SegmentID.HasValue && segment.Length.HasValue)
                        {
                            PXTrace.WriteInformation(string.Format("Segment {0}: {1}",
                                                                   segment.SegmentID,
                                                                   sub.SubCD.Substring(segmentStartIndex, segment.Length.Value)));

                            segmentStartIndex += segment.Length.Value;
                        }
                    }
                }
          }
      }
  }
}

Результаты трассировки: enter image description here

...