从视图上的连接表获取值

Eri*_*cP. 0 join view acumatica

我正在尝试从视图上的连接字段中获取值。示例代码:

  public PXSelectJoin<Table1, 
     LeftJoinSingleTable<Table2, On<Table2.FieldA, Equal<Table1.FieldB>>>> Document
Run Code Online (Sandbox Code Playgroud)

现在假设表 2 具有未包含在表 1 中的 FieldC。我如何获取该数据?

例子:

public SomeFunction()
{
   if (Table2.FieldC != null)
   {
      //do something
   }
}
Run Code Online (Sandbox Code Playgroud)

Rus*_*Dev 5

Eric,您检查过T200 培训课程中的 “访问检索的数据记录”部分吗?在此输入图像描述

通常,人们会在主数据视图中联接多个 DAC,以便在Where 子句中使用它们或在 UI 中显示(以只读模式)联接的 DAC 字段。

除了 T200 类中显示的内容之外,还有 2 个选项可用于访问主数据视图中加入的 DAC 的字段:

  1. 使用与您最初在主数据视图中加入的主 DAC 匹配的主 DAC 执行 BQL 查询:

    var joinedDAC = PXSelect<Table2, Where<Table2.FieldA, Equal<Current<Table1.FieldB>>>>>.Select(this);
    
    Run Code Online (Sandbox Code Playgroud)
  2. 如果您需要更新已加入 DAC 中的某些值并将它们保存回数据库,则有必要声明一个数据视图,其中主 DAC 与您最初在主数据视图中加入的 DAC 相匹配:

    PXSelect<Table2, Where<Table2.FieldA, Equal<Current<Table1.FieldB>>>>> JoinedDAC;
    
    Run Code Online (Sandbox Code Playgroud)

    要访问已加入 DAC 的字段,只需调用 JoinedDAC 天视图的 Select 方法即可:

    Table2 record = JoinedDAC.Select();
    
    Run Code Online (Sandbox Code Playgroud)

附带说明一下,ARDocType 只是 SOOrder DAC 中声明的字符串字段:

public partial class SOOrder : PX.Data.IBqlTable, PX.Data.EP.IAssign, IFreightBase, ICCAuthorizePayment, ICCCapturePayment, IInvoice
{
    ...

    #region ARDocType
    public abstract class aRDocType : PX.Data.IBqlField
    {
    }
    protected String _ARDocType;
    [PXString(ARRegister.docType.Length, IsFixed = true)]
    [PXFormula(typeof(Selector<SOOrder.orderType, SOOrderType.aRDocType>))]
    public virtual String ARDocType
    {
        get
        {
            return this._ARDocType;
        }
        set
        {
            this._ARDocType = value;
        }
    }
    #endregion

    ...
}
Run Code Online (Sandbox Code Playgroud)

并且Document.Current将始终返回 SOOrder DAC 的实例,因为它在内部调用时Document.Cache.Current也始终从缓存返回当前记录。PXCache 设计为仅处理单一类型的记录,不能包含任何连接的记录。包含所有连接的 DAC 的结果集存储在 PXView QueryCache 中...