Axapta 2012-Ax视图和GETDATE()

Axapta 2012-Ax视图和GETDATE(),axapta,microsoft-dynamics,x++,Axapta,Microsoft Dynamics,X++,我正试图在视图中设置一个日期范围,使之与今天相关。但我找不到任何函数在查询范围内设置,使其动态 例如: 创建: SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE VIEW [dbo].[MYCUSTINVOICETABLEVIEW] AS SELECT T1.INVOICEID AS INVOICEID,T1.DATAAREAID AS DATAAREAID,T1.PARTITION AS PARTITION,T1.RECID

我正试图在视图中设置一个日期范围,使之与今天相关。但我找不到任何函数在查询范围内设置,使其动态

例如:

创建:

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE VIEW [dbo].[MYCUSTINVOICETABLEVIEW] AS 
SELECT T1.INVOICEID AS INVOICEID,T1.DATAAREAID AS DATAAREAID,T1.PARTITION AS PARTITION,T1.RECID AS RECID 
FROM CUSTINVOICETABLE T1
WHERE (INVOICEDATE<={ts '2017-07-18 00:00:00.000'})
GO
你知道我如何设置这个查询范围吗


迄今为止:

  • …GetDate()
  • …今天()
  • …当前日期()
  • lessThanDate(0)

根据,这是不可能的(对于UserID())。我想再检查一下日期是否也是这样。视图正被同一个框(不是Ax表单)上的其他应用程序使用。

这并不漂亮,我仍然认为可能有更好的方法,但我刚刚测试了一个解决方案。显然,在x++、表单和报表中有更好的方法来实现这一点,但是下面的结果可以从AX外部查询,并且仍然会返回动态结果

您有一个查询>视图>查询>视图结构,顶层视图是您的可消费视图

第一个视图包含您需要的数据和计算日期列,由以下代码填充以获取动态日期:

public server static str today()
{
    return 'CONVERT (date, GETDATE())';
}
然后对该视图进行查询,并在其上放置一个扩展查询范围,以检查字段与动态GETDATE()列。然后,在该查询的基础上构建了一个视图,外部应用程序可以使用该视图

在下面的示例中,所有字段列表都设置为“动态是”。显然,您将一直携带根查询中的相关数据

图片中的示例产生以下视图定义:

 CREATE VIEW "DBO".TESTVIEW AS SELECT T1.SALESID AS SALESID,
 T1.RECEIPTDATEREQUESTED AS RECEIPTDATEREQUESTED,
 T1.DATAAREAID AS DATAAREAID,T1.PARTITION AS PARTITION,T1.RECID AS RECID,
 (CAST ((CONVERT (date, GETDATE())) AS DATETIME)) AS CURRENTDATE 
 FROM SALESTABLE T1

 CREATE VIEW "DBO".TESTCONSUMABLEVIEW AS 
 SELECT T1.CURRENTDATE AS CURRENTDATE,T1.RECEIPTDATEREQUESTED AS RECEIPTDATEREQUESTED,
 T1.SALESID AS SALESID,T1.DATAAREAID AS DATAAREAID,T1.PARTITION AS PARTITION,
 T1.RECID AS RECID 
 FROM TESTVIEW T1 WHERE (RECEIPTDATEREQUESTED<CURRENTDATE)
创建视图“DBO”。TESTVIEW作为选择T1.SALESID作为SALESID,
T1.RECEIPTDATEREQUESTED作为RECEIPTDATEREQUESTED,
T1.DATAAREAID作为DATAAREAID,T1.PARTITION作为PARTITION,T1.RECID作为RECID,
(强制转换((转换(date,GETDATE())为DATETIME))为CURRENTDATE
来自销售表T1
创建视图“DBO”。TESTCONSUMABLEVIEW为
选择T1.CURRENTDATE作为CURRENTDATE,选择T1.RECEIPTDATEREQUESTED作为RECEIPTDATEREQUESTED,
T1.SALESID作为SALESID,T1.DATAAREAID作为DATAAREAID,T1.PARTITION作为分区,
T1.RECID作为RECID

从TESTVIEW T1,其中(RECEIPTDATEREQUESTED我的答案基于@Spencer Kershaw的答案。他的工作值得赞扬,但我想提供一个更简洁的答案,不需要查询,希望对其他试图完成任务的人更清楚

要完成你想要的,你需要做三件事

  • 创建用于计算列的静态方法
  • 将计算列添加到视图中
  • 通过使用一些随机场正确地放入范围
  • 1.将此方法添加到视图中:

    public server static str today()
    {
        return 'CONVERT (date, GETDATE())';
    }
    
    2.右键单击字段节点,然后单击属性集上的
    ViewMethod=today

    3.添加一个范围。为字段选择
    dataAreaId
    (这是任意的)。将
    属性设置为
    (“YourComparisonField”<“today”)
    。语法在此处可能很重要

    这将产生:

    CREATE VIEW [dbo].[AAATESTVIEW]
    AS
    SELECT T1.ADDRESS AS ADDRESS
        ,T1.MODIFIEDDATETIME AS MODIFIEDDATETIME1
        ,T1.RECID AS RECID1
        ,T1.PARTITION AS PARTITION
        ,T1.RECID AS RECID
        ,(CAST((CONVERT(DATE, GETDATE())) AS DATETIME)) AS TODAY
    FROM LOGISTICSPOSTALADDRESS T1
    WHERE (N'modifiedDateTime1' < N'today')
    GO
    
    创建视图[dbo]。[AAATESTVIEW]
    作为
    选择T1.ADDRESS作为地址
    ,T1.MODIFIEDDATETIME作为MODIFIEDDATETIME1
    ,T1.RECID为RECID1
    ,T1.作为分区的分区
    ,T1.RECID作为RECID
    ,(将((转换(DATE,GETDATE())为DATETIME))转换为今天
    来自物流邮递T1
    其中(N'modifiedDateTime1'
    据我所知,日期也是如此。您可能可以对计算列进行一些欺骗,因为它允许您向视图中注入一些SQL,但我不建议您这样做。最好在每次使用视图时设置过滤器。为什么要使用查询?只需在不使用查询的情况下进行操作。将查询用作视图是最佳实践的习惯在没有查询的情况下,不支持几乎同样多的选项。在这种情况下,我更喜欢您的解决方案,因为它极大地简化了它,如果需要使用外部连接,您可以使用您创建的视图作为根数据源。它正在按字母顺序进行比较,而不是在实际日期。请尝试删除
    值中的引号我认为您不应该需要它们,但出于某种原因,我在没有它们的情况下遇到了一个错误。您可以做的另一件事是创建一个返回
    1
    0
    的计算列,并让它使用
    getDate()
    与您希望在同一行中进行的任何字段比较相结合。这样可以获得更清晰的结果。
    CREATE VIEW [dbo].[AAATESTVIEW]
    AS
    SELECT T1.ADDRESS AS ADDRESS
        ,T1.MODIFIEDDATETIME AS MODIFIEDDATETIME1
        ,T1.RECID AS RECID1
        ,T1.PARTITION AS PARTITION
        ,T1.RECID AS RECID
        ,(CAST((CONVERT(DATE, GETDATE())) AS DATETIME)) AS TODAY
    FROM LOGISTICSPOSTALADDRESS T1
    WHERE (N'modifiedDateTime1' < N'today')
    GO