【问题标题】:Converting sql query to X++ query将 sql 查询转换为 X++ 查询
【发布时间】:2020-09-02 05:17:39
【问题描述】:

我想在职位层次结构中获取特定经理下的员工,并使用以下 sql 代码来实现它。 我是 X++ 的新手,我想将以下 sql 查询转换为 X++ 查询,但是我编写的代码没有编译并显示连接非法的错误消息, 需要你的帮助。

这是我要转换成x++代码的sql代码。

select top 1 name from DIRPARTYTABLE
inner join HcmWorker ON HcmWorker.PERSON = DIRPARTYTABLE.RECID
AND HcmWorker.RECID = 
    (select top 1 worker from HCMPOSITIONWORKERASSIGNMENT  
    INNER JOIN HCMPOSITION ON HCMPOSITIONWORKERASSIGNMENT.POSITION =  HCMPOSITION.RECID
    AND HCMPOSITION.RECID = 
        (select TOP 1 ParentPosition from  hcmPositionHierarchy 
            INNER JOIN  hcmPositionHierarchyType on hcmPositionHierarchy.PositionHierarchyType = hcmPositionHierarchyType.RECID AND hcmPositionHierarchyType.HierarchyType = 0
            where hcmPositionHierarchy.Position = 
                (select top 1 POSITION from HCMPOSITIONWORKERASSIGNMENT  
                INNER JOIN HCMPOSITION ON HCMPOSITIONWORKERASSIGNMENT.POSITION =  HCMPOSITION.RECID
                where GETDATE() between HCMPOSITIONWORKERASSIGNMENT.VALIDFROM AND HCMPOSITIONWORKERASSIGNMENT.VALIDTO 
                AND HCMPOSITIONWORKERASSIGNMENT.WORKER = 
                    (select TOP 1 WORKER from hcmEmployment where hcmEmployment.RECID = 5637152077)))
    where GETDATE() between HCMPOSITIONWORKERASSIGNMENT.VALIDFROM AND HCMPOSITIONWORKERASSIGNMENT.VALIDTO);

以下是我编写的 x++ 代码。

HcmPositionWorkerAssignment     HCMPOSITIONWORKERASSIGNMENT;
    DirPartyTable                   DIRPARTYTABLE;
    HcmPosition                     HCMPOSITION;
    HcmWorker                       HcmWorker;
    HcmPositionHierarchy            hcmPositionHierarchy;
    HcmPositionHierarchyType        hcmPositionHierarchyType;
    HcmEmployment                   hcmEmployment;
    
  select firstonly name from DIRPARTYTABLE
join HcmWorker where HcmWorker.PERSON == DIRPARTYTABLE.RECID
&& HcmWorker.RECID == 
    (select firstOnly worker from HCMPOSITIONWORKERASSIGNMENT  
     JOIN HCMPOSITION where HCMPOSITIONWORKERASSIGNMENT.POSITION ==  HCMPOSITION.RECID
    && HCMPOSITION.RECID == 
        (select firstOnly ParentPosition from  hcmPositionHierarchy 
             JOIN  hcmPositionHierarchyType where hcmPositionHierarchy.PositionHierarchyType = hcmPositionHierarchyType.RECID && hcmPositionHierarchyType.HierarchyType == 0
            where hcmPositionHierarchy.Position == 
                (select firstOnly POSITION from HCMPOSITIONWORKERASSIGNMENT  
                JOIN HCMPOSITION where HCMPOSITIONWORKERASSIGNMENT.POSITION ==  HCMPOSITION.RECID
                where GETDATE() between HCMPOSITIONWORKERASSIGNMENT.VALIDFROM && HCMPOSITIONWORKERASSIGNMENT.VALIDTO 
                && HCMPOSITIONWORKERASSIGNMENT.WORKER == 
                    (select firstOnly WORKER from hcmEmployment where hcmEmployment.RECID == 12345678)))
    where GETDATE() between HCMPOSITIONWORKERASSIGNMENT.VALIDFROM && HCMPOSITIONWORKERASSIGNMENT.VALIDTO);

【问题讨论】:

  • 您可以通过edit提出问题来帮助我们回答问题,并且 1) 添加自然语言解释查询试图实现的内容,以及 2) 描述 x++ 的问题是什么(确实它无法编译,是否会产生错误的结果,您尝试了哪些变体,...)。
  • 我编辑了帖子,先生。

标签: sql x++ dynamics-ax-2012


【解决方案1】:

X++ 查询没有像 SQL 这样的圆括号之间的子查询的概念。您必须使用连接类型或有时拆分 X++ 查询以获得相同的结果。 X++ 查询语法的所有文档都可以在here 找到。

对您的尝试的一般说明:

  • 不要重复使用表变量。它们是单独的表缓冲区,而不仅仅是 SQL 中的表名(有点类似于 SQL 表别名)。
  • SQL 构造 .RecId = (select top 1 FieldName 通常转换为 X++,如 ... firstonly ... where exists ( ...
  • X++ 中的exist join 没有字段列表,您无法从此连接类型中获取值。
  • 您的版本中还有=比较运算符,它们都必须是==
  • HcmPositionWorkerAssignmentHcmEmployment 是“valid time state tables”。这些表在查询时需要特别注意。 SQL 中的between ValidFrom and ValidTo 自动应用在幕后(注释代码)。查询超出这个范围需要额外的关键字。 Examples 可在文档中找到。

将所有这些应用于 SQL 查询会得到以下版本。它可以编译,但可能需要进一步调整才能产生与 SQL 完全相同的结果。

HcmPositionWorkerAssignment     hcmPositionWorkerAssignment1,
                                hcmPositionWorkerAssignment2;
DirPartyTable                   dirPartyTable;
HcmPosition                     hcmPosition1,
                                hcmPosition2;
HcmWorker                       hcmWorker;
HcmPositionHierarchy            hcmPositionHierarchy;
HcmPositionHierarchyType        hcmPositionHierarchyType;
HcmEmployment                   hcmEmployment;

//utcdatetime refDateTime = DateTimeUtil::getSystemDateTime();

select firstOnly Name from dirPartyTable
    exists join hcmWorker
        where hcmWorker.Person == dirPartyTable.RecId
    exists join hcmPositionWorkerAssignment1
        where hcmPositionWorkerAssignment1.worker == hcmWorker.RecId
    exists join hcmPosition1
        where hcmPosition1.RecId == hcmPositionWorkerAssignment1.Position
    exists join hcmPositionHierarchy
        where hcmPositionHierarchy.ParentPosition == hcmPosition1.RecId
    exists join hcmPositionHierarchyType
        where hcmPositionHierarchyType.RecId == hcmPositionHierarchy.PositionHierarchyType
           && hcmPositionHierarchyType.HierarchyType == 0
    exists join hcmPositionWorkerAssignment2
        where hcmPositionWorkerAssignment2.Position == hcmPositionHierarchy.Position
         //&& hcmPositionWorkerAssignment2.ValidFrom <= refDateTime
         //&& hcmPositionWorkerAssignment2.ValidTo > refDateTime
    exists join hcmPosition2
        where hcmPosition2.RecId == hcmPositionWorkerAssignment2.Position
    exists join hcmEmployment
        where hcmEmployment.Worker == hcmPositionWorkerAssignment2.Worker
           && hcmEmployment.RecId == 12345678;

【讨论】:

    猜你喜欢
    • 2014-08-14
    • 2015-10-10
    • 2015-05-08
    • 1970-01-01
    • 1970-01-01
    • 2017-04-25
    • 2017-04-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多