解析子帐户以获取各个细分

时间:2018-10-09 20:35:44

标签: acumatica

我想以编程方式访问子帐户的各个细分。假设我有一个特定的子帐户设置为ABC-123,我希望能够用代码分别访问ABC和123,这样我就可以实现特定的业务需求。

我知道SubAccounts作为一个字符串示例ABC123保存在Sub表中。然后,链接到该表的子帐户字段将基于ID(子表的整数-PK)进行链接。我当然可以从该表中读取内容,然后进行相应的拆分(采用前3个字符和后3个字符)。但是,我希望这是动态的,以便自定义将适用于不同的客户端,并且客户端的段长度可能不同。因此,我无法对值3进行硬编码。我可以利用SegmentValues表来相应地检索每个Segment的长度。

但是,由于Acumatica已经以某种方式执行了该解析(UI中的示例),因此存在一个API,Acumatica可以在该API中处理此逻辑并可以将子帐户提供为字符串数组。我试图研究SubAccountAttribute,PXDimensionSelectorAttribute和SubAccountProvider,但找不到能提供此功能的任何东西。

Acumatica是否提供一种将子帐户拆分为字符串数组的方法,还是应该通过从细分值中识别长度来手动完成此操作?

1 个答案:

答案 0 :(得分:2)

我认为,用于分隔细分受众群的某些逻辑位于受保护的 Definition 类中。分开的细分位于 Definition 类的 Dimensions 集合中。您可以在从 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