DAC 中的 DateTime 字段导致异常
DateTime field in DAC causes exception
我尝试在 acumatica/lexbizz 中创建一个屏幕,它应该在一个简单的网格视图中显示我新创建的 DAC 的所有条目。该图如下所示:
using PX.Data;
using PX.Data.BQL.Fluent;
using PX.LotSertialNbrAttribute.Ext;
namespace Maut1
{
public class TestMaint : PXGraph<TestMaint>
{
public SelectFrom<M1InventoryLotSerialContainer>.View InventoryLotSerialContainers;
}
}
并且使用的 DAC M1InventoryLotSerialContainer 包含两个声明如下的日期字段:
#region ValidFrom
[PXDBDate()]
[PXUIField(DisplayName = "Valid from")]
public virtual DateTime? ValidFrom { get; set; }
public abstract class validFrom : PX.Data.BQL.BqlDateTime.Field<validFrom> { }
#endregion
#region ValidTo
[PXDBDate()]
[PXUIField(DisplayName = "Valid to")]
public virtual DateTime? ValidTo { get; set; }
public abstract class validTo : PX.Data.BQL.BqlDateTime.Field<validTo> { }
#endregion
并且我在 SQL table 中创建了两个字段都可以为 null,类型为 [datetime]。我可以设法通过使用现有屏幕在 table 中创建新条目,但是当我尝试访问我新创建的 GridView 时,出现以下异常并且没有显示任何条目:
5/12/2021 3:42:27 PM Error:
Error: An error occurred during processing of the field Valid to: Specified cast is not valid..
System.InvalidCastException: Specified cast is not valid.
at System.Data.SqlClient.SqlBuffer.get_DateTime()
at System.Data.SqlClient.SqlDataReader.GetDateTime(Int32 i)
at PX.Data.PXDataRecord.GetDateTime(Int32 i) in C:\Users\svc-builder\AppData\Local\Temp\~PX.Data.0\PX.Data.dll.il:line 769081
at PX.Data.PXDBDateAttribute.RowSelecting(PXCache sender, PXRowSelectingEventArgs e) in C:\Users\svc-builder\AppData\Local\Temp\~PX.Data.0\PX.Data.dll.il:line 856111
at PX.Data.PXCache.OnRowSelecting(Object item, PXDataRecord record, Int32& position, Boolean isReadOnly) in C:\Users\svc-builder\AppData\Local\Temp\~PX.Data.0\PX.Data.dll.il:line 666901
at PX.Data.PXCache.OnRowSelecting(Object item, PXDataRecord record, Int32& position, Boolean isReadOnly) in C:\Users\svc-builder\AppData\Local\Temp\~PX.Data.0\PX.Data.dll.il:line 666757
at PX.Data.PXCache`1.Select(PXDataRecord record, Int32& position, Boolean isReadOnly, Boolean& wasUpdated) in C:\Users\svc-builder\AppData\Local\Temp\~PX.Data.0\PX.Data.dll.il:line 644916
at PX.Data.PXView.CreateItem(PXCache cache, PXDataRecord record, Int32& position, Boolean isReadOnly, Boolean& wasUpdated) in C:\Users\svc-builder\AppData\Local\Temp\~PX.Data.0\PX.Data.dll.il:line 685666
at PX.Data.PXView.CreateResult(PXCache[] caches, PXDataRecord rec, Boolean hascount, Boolean& overrideSort, Boolean& extFilter) in C:\Users\svc-builder\AppData\Local\Temp\~PX.Data.0\PX.Data.dll.il:line 685586
at PX.Data.PXView.GetResult(Object[] parameters, PXFilterRow[] filters, Boolean reverseOrder, Int32 topCount, PXSearchColumn[] sorts, Boolean& overrideSort, Boolean& extFilter) in C:\Users\svc-builder\AppData\Local\Temp\~PX.Data.0\PX.Data.dll.il:line 685520
at PX.Data.PXView.Select(Object[] currents, Object[] parameters, Object[] searches, String[] sortcolumns, Boolean[] descendings, PXFilterRow[] filters, Int32& startRow, Int32 maximumRows, Int32& totalRows) in C:\Users\svc-builder\AppData\Local\Temp\~PX.Data.0\PX.Data.dll.il:line 690963
at PX.Data.PXGraph.ExecuteSelect(String viewName, Object[] currents, Object[] parameters, Object[] searches, String[] sortcolumns, Boolean[] descendings, PXFilterRow[] filters, Int32& startRow, Int32 maximumRows, Int32& totalRows) in C:\Users\svc-builder\AppData\Local\Temp\~PX.Data.0\PX.Data.dll.il:line 981069
据我所知,acumatica 无法将字段 Valid to
转换为 [datetime]。我已经尝试在 SQL table 中使用 [datetime2] 类型,但没有任何改变。所以我不太确定是否在 DAC 中错误地声明了该字段,或者我是否必须在 SQL table.
中使用不同的类型
顺便说一句,这是我在 Whosebug 上发布的第一个问题,因此非常感谢您提供有关如何改进未来问题的反馈
我会检查您的自定义页面定义,我的猜测是您创建了错误类型的控件来显示您的日期字段。进入 'Customization Project Editor',点击屏幕下方的 'Screens' header,点击你的网格,点击右侧的 'Add Data Fields' 列。检查您的 'Valid To' 字段并确保它没有与选择器控件或 DateTimeEdit 以外的其他内容一起列出。如果是,可以删除,改控件,还有re-add.
我通过在 SQL table 的自定义编辑器中生成 DAC 解决了这个问题。之后,我可以在 DAC 中应用我需要的所有更改,同时每隔几个字段检查视图是否仍然正确。相当乏味的过程。这样我就可以将问题缩小到另一个定义如下的字段:
#region CustomerID
[CustomerActive(DisplayName = "Customer ID", DescriptionField = typeof(Customer.acctName))]
[PXUIField(DisplayName = "Customer ", Enabled = false)]
[PXDBInt]
public virtual int? CustomerID { get; set; }
public abstract class customerID : PX.Data.BQL.BqlInt.Field<customerID> { }
#endregion
使用 [CustomerActive] 时已包含属性 [PXDBInt]。通过从 CustomerID 字段中删除 [PXDBInt],重复项被删除,DAC 可以在我的屏幕上正确使用。我仍然不完全确定为什么 acumatica 在异常中提到了 ValidTo 字段,因为对于这个字段没有必要的更改。为了将来我会更加注意异常消息,显然它们可能有点混乱并导致错误的方向。
我尝试在 acumatica/lexbizz 中创建一个屏幕,它应该在一个简单的网格视图中显示我新创建的 DAC 的所有条目。该图如下所示:
using PX.Data;
using PX.Data.BQL.Fluent;
using PX.LotSertialNbrAttribute.Ext;
namespace Maut1
{
public class TestMaint : PXGraph<TestMaint>
{
public SelectFrom<M1InventoryLotSerialContainer>.View InventoryLotSerialContainers;
}
}
并且使用的 DAC M1InventoryLotSerialContainer 包含两个声明如下的日期字段:
#region ValidFrom
[PXDBDate()]
[PXUIField(DisplayName = "Valid from")]
public virtual DateTime? ValidFrom { get; set; }
public abstract class validFrom : PX.Data.BQL.BqlDateTime.Field<validFrom> { }
#endregion
#region ValidTo
[PXDBDate()]
[PXUIField(DisplayName = "Valid to")]
public virtual DateTime? ValidTo { get; set; }
public abstract class validTo : PX.Data.BQL.BqlDateTime.Field<validTo> { }
#endregion
并且我在 SQL table 中创建了两个字段都可以为 null,类型为 [datetime]。我可以设法通过使用现有屏幕在 table 中创建新条目,但是当我尝试访问我新创建的 GridView 时,出现以下异常并且没有显示任何条目:
5/12/2021 3:42:27 PM Error:
Error: An error occurred during processing of the field Valid to: Specified cast is not valid..
System.InvalidCastException: Specified cast is not valid.
at System.Data.SqlClient.SqlBuffer.get_DateTime()
at System.Data.SqlClient.SqlDataReader.GetDateTime(Int32 i)
at PX.Data.PXDataRecord.GetDateTime(Int32 i) in C:\Users\svc-builder\AppData\Local\Temp\~PX.Data.0\PX.Data.dll.il:line 769081
at PX.Data.PXDBDateAttribute.RowSelecting(PXCache sender, PXRowSelectingEventArgs e) in C:\Users\svc-builder\AppData\Local\Temp\~PX.Data.0\PX.Data.dll.il:line 856111
at PX.Data.PXCache.OnRowSelecting(Object item, PXDataRecord record, Int32& position, Boolean isReadOnly) in C:\Users\svc-builder\AppData\Local\Temp\~PX.Data.0\PX.Data.dll.il:line 666901
at PX.Data.PXCache.OnRowSelecting(Object item, PXDataRecord record, Int32& position, Boolean isReadOnly) in C:\Users\svc-builder\AppData\Local\Temp\~PX.Data.0\PX.Data.dll.il:line 666757
at PX.Data.PXCache`1.Select(PXDataRecord record, Int32& position, Boolean isReadOnly, Boolean& wasUpdated) in C:\Users\svc-builder\AppData\Local\Temp\~PX.Data.0\PX.Data.dll.il:line 644916
at PX.Data.PXView.CreateItem(PXCache cache, PXDataRecord record, Int32& position, Boolean isReadOnly, Boolean& wasUpdated) in C:\Users\svc-builder\AppData\Local\Temp\~PX.Data.0\PX.Data.dll.il:line 685666
at PX.Data.PXView.CreateResult(PXCache[] caches, PXDataRecord rec, Boolean hascount, Boolean& overrideSort, Boolean& extFilter) in C:\Users\svc-builder\AppData\Local\Temp\~PX.Data.0\PX.Data.dll.il:line 685586
at PX.Data.PXView.GetResult(Object[] parameters, PXFilterRow[] filters, Boolean reverseOrder, Int32 topCount, PXSearchColumn[] sorts, Boolean& overrideSort, Boolean& extFilter) in C:\Users\svc-builder\AppData\Local\Temp\~PX.Data.0\PX.Data.dll.il:line 685520
at PX.Data.PXView.Select(Object[] currents, Object[] parameters, Object[] searches, String[] sortcolumns, Boolean[] descendings, PXFilterRow[] filters, Int32& startRow, Int32 maximumRows, Int32& totalRows) in C:\Users\svc-builder\AppData\Local\Temp\~PX.Data.0\PX.Data.dll.il:line 690963
at PX.Data.PXGraph.ExecuteSelect(String viewName, Object[] currents, Object[] parameters, Object[] searches, String[] sortcolumns, Boolean[] descendings, PXFilterRow[] filters, Int32& startRow, Int32 maximumRows, Int32& totalRows) in C:\Users\svc-builder\AppData\Local\Temp\~PX.Data.0\PX.Data.dll.il:line 981069
据我所知,acumatica 无法将字段 Valid to
转换为 [datetime]。我已经尝试在 SQL table 中使用 [datetime2] 类型,但没有任何改变。所以我不太确定是否在 DAC 中错误地声明了该字段,或者我是否必须在 SQL table.
顺便说一句,这是我在 Whosebug 上发布的第一个问题,因此非常感谢您提供有关如何改进未来问题的反馈
我会检查您的自定义页面定义,我的猜测是您创建了错误类型的控件来显示您的日期字段。进入 'Customization Project Editor',点击屏幕下方的 'Screens' header,点击你的网格,点击右侧的 'Add Data Fields' 列。检查您的 'Valid To' 字段并确保它没有与选择器控件或 DateTimeEdit 以外的其他内容一起列出。如果是,可以删除,改控件,还有re-add.
我通过在 SQL table 的自定义编辑器中生成 DAC 解决了这个问题。之后,我可以在 DAC 中应用我需要的所有更改,同时每隔几个字段检查视图是否仍然正确。相当乏味的过程。这样我就可以将问题缩小到另一个定义如下的字段:
#region CustomerID
[CustomerActive(DisplayName = "Customer ID", DescriptionField = typeof(Customer.acctName))]
[PXUIField(DisplayName = "Customer ", Enabled = false)]
[PXDBInt]
public virtual int? CustomerID { get; set; }
public abstract class customerID : PX.Data.BQL.BqlInt.Field<customerID> { }
#endregion
使用 [CustomerActive] 时已包含属性 [PXDBInt]。通过从 CustomerID 字段中删除 [PXDBInt],重复项被删除,DAC 可以在我的屏幕上正确使用。我仍然不完全确定为什么 acumatica 在异常中提到了 ValidTo 字段,因为对于这个字段没有必要的更改。为了将来我会更加注意异常消息,显然它们可能有点混乱并导致错误的方向。