Acumatica-已经添加了一个具有相同密钥的项目



我在Acumatica 2021R1(v221.104.0018(中有一个自定义项目。我有一个具有ID的父DAC和多个使用此ID和PXParent属性的子DAC。每当我在定制项目编辑器中选择屏幕进行设计时,我都会收到一条错误消息,上面写着:;已添加具有相同键的项目"然后,我无法在屏幕编辑器中设计屏幕。奇怪的是,当我打开实际屏幕时,我没有收到这条消息。

我不确定这指的是什么,因为在我用于屏幕图形视图的表中,数据库中没有记录。

不确定是否有其他人遇到过这个问题,也不知道是什么原因造成的,但Acumatica确实可以使用一些更具体的错误消息。

这是我的父DAC(注意:出于篇幅考虑,我省略了系统字段(:

public class PSImport : IBqlTable
{
#region Import ID
[PXDBString(15, IsKey = true, IsUnicode = true, InputMask = ">CCCCCCCCCCCCCCC")]
[PXDefault(PersistingCheck = PXPersistingCheck.NullOrBlank)]
[PXUIField(DisplayName = "Import No.", Visibility = PXUIVisibility.SelectorVisible, Enabled = true)]
[AutoNumber(typeof(PSSetup.numberingID), typeof(AccessInfo.businessDate))]
[PXSelector(
typeof(PSImport.importID),
typeof(PSImport.description),
typeof(PSImport.fileFormat),
typeof(PSImport.status),
typeof(PSImport.description)
)]
public virtual string ImportID { get; set; }
public abstract class importID : PX.Data.BQL.BqlString.Field<importID> { }
#endregion
#region Description
[PXDBString(IsUnicode = true, IsFixed = false)]
[PXUIField(DisplayName = "Description")]
public virtual string Description { get; set; }
public abstract class description : PX.Data.BQL.BqlString.Field<description> { }
#endregion
#region File Format
[PXDBString(2, IsFixed = true, IsUnicode = true)]
[PXUIField(DisplayName = "File Format", Enabled = true)]
[PXDefault]
[PXStringList(
new string[]
{
FileFormatTypes.Flats,
FileFormatTypes.IDOA,
FileFormatTypes.MMS,
FileFormatTypes.OCR,
FileFormatTypes.Pressero
},
new string[]
{
FileFormatTypeDisplayNames.Flats,
FileFormatTypeDisplayNames.IDOA,
FileFormatTypeDisplayNames.MMS,
FileFormatTypeDisplayNames.OCR,
FileFormatTypeDisplayNames.Pressero
}
)]
public virtual string FileFormat { get; set; }
public abstract class fileFormat : PX.Data.BQL.BqlString.Field<fileFormat> { }
#endregion
#region Status
[PXDBString(2, IsFixed = true, IsUnicode = true)]
[PXUIField(DisplayName = "Status", Enabled = false)]
[PXDefault(ImportStatusTypes.Unvalidated)]
[PXStringList(
new string[]
{
ImportStatusTypes.Unvalidated,
ImportStatusTypes.Invalid,
ImportStatusTypes.Valid,
ImportStatusTypes.Released
},
new string[]
{
ImportStatusTypeDisplayNames.Unvalidated,
ImportStatusTypeDisplayNames.Invalid,
ImportStatusTypeDisplayNames.Valid,
ImportStatusTypeDisplayNames.Released
}
)]
public virtual string Status { get; set; }
public abstract class status : PX.Data.BQL.BqlString.Field<status> { }
#endregion
#region Date Imported
[PXDBDate]
[PXUIField(DisplayName = "Date Imported", Enabled = false)]
public virtual DateTime? DateImported { get; set; }
public abstract class dateImported : PX.Data.BQL.BqlDateTime.Field<dateImported> { }
#endregion
#region Date of Last Validation
[PXDBDate]
[PXUIField(DisplayName = "Date of Last Validation", Enabled = false)]
public virtual DateTime? DateOfLastValidation { get; set; }
public abstract class dateOfLastValidation : PX.Data.BQL.BqlDateTime.Field<dateOfLastValidation> { }
#endregion
#region Date Released
[PXDBDate]
[PXUIField(DisplayName = "Date Released", Enabled = false)]
public virtual DateTime? DateReleased { get; set; }
public abstract class dateReleased : PX.Data.BQL.BqlDateTime.Field<dateReleased> { }
#endregion
}

这是一个儿童DAC(现在我只有钥匙,因为我还不知道我需要的所有字段,我只是想开始设计屏幕(:

public class PSTranFlats : IBqlTable
{
#region Import ID
[PXDBString(15, IsKey = true, IsUnicode = true, InputMask = "")]
[PXDBDefault(typeof(PSImport.importID))]
[PXParent(typeof(SelectFrom<PSImport>.
Where<PSImport.importID.IsEqual<PSTranFlats.importID.FromCurrent>>)
)]
public virtual string ImportID { get; set; }
public abstract class importID : PX.Data.BQL.BqlString.Field<importID> { }
#endregion
}

这是我的设置DAC:

[PXPrimaryGraph(typeof(PSSetupMaint))]
public class PSSetup : IBqlTable
{
#region NumberingID
[PXDBString(10, IsUnicode = true)]
[PXDefault("PSIMPORT")]
[PXUIField(DisplayName = "Import Numbering Sequence")]
[PXSelector(typeof(Numbering.numberingID), DescriptionField = typeof(Numbering.descr))]
public virtual string NumberingID { get; set; }
public abstract class numberingID : PX.Data.BQL.BqlString.Field<numberingID> { }
#endregion
}

这是我的设置图:

public class PSSetupMaint : PXGraph<PSSetupMaint>
{
#region Selects / Views
public PXSave<PSSetup> Save;
public PXCancel<PSSetup> Cancel;
public SelectFrom<PSSetup>.View Setup;
#endregion
}

这是我的主要图表:

public class PSImportEntry : PXGraph<PSImportEntry>
{
#region Selects / Views
public PXCancelClose<PSImport> CancelClose;
public PXSaveClose<PSImport> SaveClose;
public PXSave<PSImport> Save;
public PXCancel<PSImport> Cancel;
public PXInsert<PSImport> Insert;
public PXDelete<PSImport> Delete;
public PXFirst<PSImport> First;
public PXPrevious<PSImport> Previous;
public PXNext<PSImport> Next;
public PXLast<PSImport> Last;
public PXSetup<PSSetup> PSSetup;
public SelectFrom<PSImport>.View Import;
[PXImport(typeof(PSTranFlats))]
public SelectFrom<PSTranFlats>.
Where<PSTranFlats.importID.IsEqual<PSImport.importID.FromCurrent>>.View
FlatsTransactions;
[PXImport(typeof(PSTranIDOA))]
public SelectFrom<PSTranIDOA>.
Where<PSTranIDOA.importID.IsEqual<PSImport.importID.FromCurrent>>.View
IDOATransactions;
[PXImport(typeof(PSTranMMS))]
public SelectFrom<PSTranMMS>.
Where<PSTranMMS.importID.IsEqual<PSImport.importID.FromCurrent>>.View
MMSTransactions;
[PXImport(typeof(PSTranOCR))]
public SelectFrom<PSTranOCR>.
Where<PSTranOCR.importID.IsEqual<PSImport.importID.FromCurrent>>.View
OCRTransactions;
[PXImport(typeof(PSTranPressero))]
public SelectFrom<PSTranPressero>.
Where<PSTranPressero.importID.IsEqual<PSImport.importID.FromCurrent>>.View
PresseroTransactions;
#endregion
}

我不能100%确定,但我认为这是关于ASPX中的ID,而不是数据库数据。例如:

<px:PXLayoutRule LabelsWidth=";S〃;ControlSize=";SM";ID=";PXLayoutRule1";runat=";服务器";StartRow=";真"gt<px:PXLayoutRule>

注意ID=";PXLayoutRule1">在该样本中。如果这个";ID";ASPX中任何条目的值作为另一个条目的ID在屏幕中的任何位置重复,您将得到一个错误。

我在早期版本中也遇到过类似的问题,尤其是当我试图自定义屏幕,并在屏幕中间使自定义屏幕界面崩溃时。我会尝试删除屏幕,但我会在CstDesigner和CstPublished文件夹中获得孤立文件,这会使我的问题更加复杂。

希望您知道如何查看ASPX文件和自定义项目XML来检查所有ID。如果你知道如何完成这一切,只需在你的所有ID值中添加一些东西,比如结尾的X。(即PXLayoutRule1X(如果没有,那么在继续进行时,获得这种熟悉感是一个有价值的副目标

如果您的问题与我过去遇到的问题相同,并且您无法简单地在ASPX文件或Project XML中查找和编辑重复的ID,则在备份项目和这些步骤中提到的受影响文件夹后,需要采取以下步骤。当然,这也假设您正在使用实例的开发副本。(如果我不确定的话,我经常把我的主要DEV实例克隆到我的笔记本电脑上测试这样的东西,这样我的DEV实例就不会受到影响。这只需要额外的时间,你可能有,也可能没有。(

  1. 从自定义项目中删除屏幕
  2. 在实例的根文件夹下找到文件夹CstDesigner和CstPublished(即AcumticaDEV、Sandbox等,您的站点所在的位置(
  3. 进入Pages_XX文件夹(其中XX是屏幕ID前两个字母的2个字符代码(
  4. 如果找到屏幕文件,请从中删除它们
  5. 如果这是一个自定义屏幕,请进入Pages文件夹,该文件夹与步骤2中的文件夹位于实例的同一根文件夹中,并在该文件夹中重复步骤3和4
  6. 在自定义项目屏幕的文件菜单中,检查项目XML中是否有任何对屏幕的引用,并删除这些部分(如果存在(。(这往往更多地与自定义现有屏幕有关。(
  7. 发布您的项目
  8. 从你的页面开始,看看你是否仍然收到错误

同样,在执行这些步骤之前,请确保获得备份,以便在无法解决问题的情况下轻松将其放回。

最新更新