首页 > 解决方案 > DAC 中的 DateTime 字段导致异常

问题描述

我试图在 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 包含两个 Date 字段,声明如下:

        #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 表中将这两个字段都创建为可为空且类型为 [datetime]。我可以通过使用已经存在的屏幕在表中创建新条目,但是当我尝试访问我新创建的 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为 [日期时间]。我已经尝试在我的 SQL 表中使用类型 [datetime2],但没有任何改变。因此,我不太确定是否在 DAC 中错误地声明了该字段,或者我是否必须在 SQL 表中使用不同的类型。

顺便说一句,这是我在 stackoverflow 上发布的第一个问题,因此感谢您对未来如何改进问题的反馈

标签: acumatica

解决方案


我会检查您的自定义页面定义,我的猜测是您创建了错误类型的控件来显示您的日期字段。进入“自定义项目编辑器”,单击“屏幕”标题下的屏幕,单击网格,单击右侧的“添加数据字段”列。检查您的“有效到”字段,并确保它没有与选择器控件或 DateTimeEdit 以外的其他内容一起列出。如果是,您可以删除、更改控件并重新添加。


推荐阅读