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 字段,因为对于这个字段没有必要的更改。为了将来我会更加注意异常消息,显然它们可能有点混乱并导致错误的方向。