Acumatica:我加入的选择器写得不好吗?
Acumatica : Is my joined selector badly written?
我刚开始在 Acumatica 中编码,我正在尝试将部门添加到客户屏幕。我用 18 个不同扇区的名称和代码创建了一个 SQL 扇区 table (TRSector)。我还创建了另一个 SQL table (TRCustSectorActive),其中包含客户帐户和部门代码的所有组合以及附加信息(是否有效、日期等)。
这个想法是每个客户都会有关于每个部门的信息。
我正在尝试为客户页面 (AR303000) 上的扇区添加选择器。 我面临的问题是,即使我尝试更改扇区时我的选择器显示正确,我的选择也会自动返回到第一行。
我猜我在加入我的两个 table 时做错了什么?
或者我应该在我的图表中有一个 CurrentSector 视图吗?
以下是有关我的代码的更多详细信息。
我的 TRCustSectorActive DAC 中的选择器如下所示:
#region SectorCD
[PXDBString(20, IsKey = true, IsFixed = true, IsUnicode = true, InputMask = "")]
[PXUIField(DisplayName = "Filière")]
[PXSelector(
typeof(Search2<TRCustSectorActive.sectorCD, LeftJoin<TRSector, On<TRCustSectorActive.sectorCD, Equal<TRSector.sectorCD>>>, Where<TRCustSectorActive.bAccountID, Equal<Current<Customer.bAccountID>>>>),
typeof(TRCustSectorActive.sectorCD),
typeof(TRSector.name),
typeof(TRCustSectorActive.active)
)]
public virtual string SectorCD { get; set; }
public abstract class sectorCD : IBqlField { }
#endregion
我加入了TRSector DAC,这样我就可以在选择中显示扇区的名称。
CustomerMaint 扩展中的视图如下所示:
public PXSelect<TRCustSectorActive, Where<TRCustSectorActive.bAccountID, Equal<Current<Customer.bAccountID>>>> Sector;
并且在页面中,我添加了这一点:
<px:PXFormView ID="DefFiliere" runat="server" Caption="Activation Filières" DataMember="Sector" RenderStyle="Fieldset" DataSourceID="ds" TabIndex="2100">
<Template>
<px:PXLayoutRule runat="server" ControlSize="SM" LabelsWidth="SM" StartColumn="True" />
<px:PXSelector runat="server" ID="edSector" DataField="SectorCD"/>
<px:PXLayoutRule runat="server" StartColumn="True" LabelsWidth="SM" ControlSize="SM" />
<px:PXCheckBox runat="server" ID="edActive" DataField="Active"/>
</Template>
</px:PXFormView>
能否包含您的整个 属性 定义(不仅仅是选择器属性)?
确保您已正确定义字段,包括 BqlField class 定义。
此外,要开始解决您的问题,我会从一个更简单的选择器开始,例如下面的选择器,这样您就可以排除它是否与联接相关。
[PXSelector(
typeof(TRCustSectorActive.sectorCD),
typeof(TRCustSectorActive.sectorCD),
typeof(TRSector.name),
typeof(TRCustSectorActive.active)
)]
- 你的选择器没问题
- 问题出在你的视图声明中。
此视图 returns 当前客户的几条记录。结果,Search
方法将只采用第一行。
Customer1 Sector1
Customer1 Sector2
Customer1 Sector3
...
此外,根据您的需要,有几种可能的选择来解决问题:
使用网格显示当前客户的所有可用扇区(参见 "Locations" 或 "Payment Methods" 选项卡作为示例)
添加一个新过滤器(例如SectorFilter
)以仅显示所选部门的Sector
数据
查看下面的代码
public PXFilter<SectorFilter> sectorFilter;
[Serializable]
public partial class SectorFilter : IBqlTable
{
#region SectorCD
public abstract class sectorCD : IBqlField { }
[PXDBString(20, IsFixed = true, IsUnicode = true, InputMask = "")]
[PXUIField(DisplayName = "Filière")]
[PXSelector(
typeof(Search2<TRCustSectorActive.sectorCD, LeftJoin<TRSector, On<TRCustSectorActive.sectorCD, Equal<TRSector.sectorCD>>>, Where<TRCustSectorActive.bAccountID, Equal<Current<Customer.bAccountID>>>>),
typeof(TRCustSectorActive.sectorCD),
typeof(TRSector.name),
typeof(TRCustSectorActive.active)
)]
public virtual string SectorCD { get; set; }
#endregion
}
public PXSelect<TRCustSectorActive,
Where<TRCustSectorActive.bAccountID, Equal<Current<Customer.bAccountID>>,
And<TRCustSectorActive.sectorCD, Equal<Current<SectorFilter.sectorCD>>>>> Sector;
和aspx
<px:PXFormView ID="formSectorFilter" runat="server" DataSourceID="ds" Style="z-index: 100" Width="100%" CaptionVisible="False"
DataMember="sectorFilter" SkinID="Transparent">
<Template>
<px:PXLayoutRule runat="server" StartColumn="True" LabelsWidth="S" ControlSize="XM" />
<px:PXSelector CommitChanges="True" ID="edSectorCD" runat="server" DataField="SectorCD" AutoRefresh="True"/>
</Template>
</px:PXFormView>
<px:PXFormView ID="DefFiliere" runat="server" Caption="Activation Filières" DataMember="Sector" RenderStyle="Fieldset" DataSourceID="ds" TabIndex="2100">
<Template>
<px:PXLayoutRule runat="server" ControlSize="SM" LabelsWidth="SM" StartColumn="True" />
<px:PXLayoutRule runat="server" StartColumn="True" LabelsWidth="SM" ControlSize="SM" />
<px:PXCheckBox runat="server" ID="edActive" DataField="Active"/>
</Template>
我刚开始在 Acumatica 中编码,我正在尝试将部门添加到客户屏幕。我用 18 个不同扇区的名称和代码创建了一个 SQL 扇区 table (TRSector)。我还创建了另一个 SQL table (TRCustSectorActive),其中包含客户帐户和部门代码的所有组合以及附加信息(是否有效、日期等)。 这个想法是每个客户都会有关于每个部门的信息。
我正在尝试为客户页面 (AR303000) 上的扇区添加选择器。 我面临的问题是,即使我尝试更改扇区时我的选择器显示正确,我的选择也会自动返回到第一行。 我猜我在加入我的两个 table 时做错了什么? 或者我应该在我的图表中有一个 CurrentSector 视图吗?
以下是有关我的代码的更多详细信息。 我的 TRCustSectorActive DAC 中的选择器如下所示:
#region SectorCD
[PXDBString(20, IsKey = true, IsFixed = true, IsUnicode = true, InputMask = "")]
[PXUIField(DisplayName = "Filière")]
[PXSelector(
typeof(Search2<TRCustSectorActive.sectorCD, LeftJoin<TRSector, On<TRCustSectorActive.sectorCD, Equal<TRSector.sectorCD>>>, Where<TRCustSectorActive.bAccountID, Equal<Current<Customer.bAccountID>>>>),
typeof(TRCustSectorActive.sectorCD),
typeof(TRSector.name),
typeof(TRCustSectorActive.active)
)]
public virtual string SectorCD { get; set; }
public abstract class sectorCD : IBqlField { }
#endregion
我加入了TRSector DAC,这样我就可以在选择中显示扇区的名称。
CustomerMaint 扩展中的视图如下所示:
public PXSelect<TRCustSectorActive, Where<TRCustSectorActive.bAccountID, Equal<Current<Customer.bAccountID>>>> Sector;
并且在页面中,我添加了这一点:
<px:PXFormView ID="DefFiliere" runat="server" Caption="Activation Filières" DataMember="Sector" RenderStyle="Fieldset" DataSourceID="ds" TabIndex="2100">
<Template>
<px:PXLayoutRule runat="server" ControlSize="SM" LabelsWidth="SM" StartColumn="True" />
<px:PXSelector runat="server" ID="edSector" DataField="SectorCD"/>
<px:PXLayoutRule runat="server" StartColumn="True" LabelsWidth="SM" ControlSize="SM" />
<px:PXCheckBox runat="server" ID="edActive" DataField="Active"/>
</Template>
</px:PXFormView>
能否包含您的整个 属性 定义(不仅仅是选择器属性)? 确保您已正确定义字段,包括 BqlField class 定义。
此外,要开始解决您的问题,我会从一个更简单的选择器开始,例如下面的选择器,这样您就可以排除它是否与联接相关。
[PXSelector(
typeof(TRCustSectorActive.sectorCD),
typeof(TRCustSectorActive.sectorCD),
typeof(TRSector.name),
typeof(TRCustSectorActive.active)
)]
- 你的选择器没问题
- 问题出在你的视图声明中。
此视图 returns 当前客户的几条记录。结果,Search
方法将只采用第一行。
Customer1 Sector1
Customer1 Sector2
Customer1 Sector3
...
此外,根据您的需要,有几种可能的选择来解决问题:
使用网格显示当前客户的所有可用扇区(参见 "Locations" 或 "Payment Methods" 选项卡作为示例)
添加一个新过滤器(例如
SectorFilter
)以仅显示所选部门的Sector
数据
查看下面的代码
public PXFilter<SectorFilter> sectorFilter;
[Serializable]
public partial class SectorFilter : IBqlTable
{
#region SectorCD
public abstract class sectorCD : IBqlField { }
[PXDBString(20, IsFixed = true, IsUnicode = true, InputMask = "")]
[PXUIField(DisplayName = "Filière")]
[PXSelector(
typeof(Search2<TRCustSectorActive.sectorCD, LeftJoin<TRSector, On<TRCustSectorActive.sectorCD, Equal<TRSector.sectorCD>>>, Where<TRCustSectorActive.bAccountID, Equal<Current<Customer.bAccountID>>>>),
typeof(TRCustSectorActive.sectorCD),
typeof(TRSector.name),
typeof(TRCustSectorActive.active)
)]
public virtual string SectorCD { get; set; }
#endregion
}
public PXSelect<TRCustSectorActive,
Where<TRCustSectorActive.bAccountID, Equal<Current<Customer.bAccountID>>,
And<TRCustSectorActive.sectorCD, Equal<Current<SectorFilter.sectorCD>>>>> Sector;
和aspx
<px:PXFormView ID="formSectorFilter" runat="server" DataSourceID="ds" Style="z-index: 100" Width="100%" CaptionVisible="False"
DataMember="sectorFilter" SkinID="Transparent">
<Template>
<px:PXLayoutRule runat="server" StartColumn="True" LabelsWidth="S" ControlSize="XM" />
<px:PXSelector CommitChanges="True" ID="edSectorCD" runat="server" DataField="SectorCD" AutoRefresh="True"/>
</Template>
</px:PXFormView>
<px:PXFormView ID="DefFiliere" runat="server" Caption="Activation Filières" DataMember="Sector" RenderStyle="Fieldset" DataSourceID="ds" TabIndex="2100">
<Template>
<px:PXLayoutRule runat="server" ControlSize="SM" LabelsWidth="SM" StartColumn="True" />
<px:PXLayoutRule runat="server" StartColumn="True" LabelsWidth="SM" ControlSize="SM" />
<px:PXCheckBox runat="server" ID="edActive" DataField="Active"/>
</Template>