Axapta X++;查询以选择字符串类型字段的最大值

Axapta X++;查询以选择字符串类型字段的最大值,axapta,x++,dynamics-ax-2012,Axapta,X++,Dynamics Ax 2012,我在Dynamics AX 2012表格中有一个字段,填充了序列号PRE1 00162格式,我需要返回下一个序列号,在本例中是PRE1 00163 在遗留系统上,通过运行 SELECT MAX(RIGHT(SerialNumber,5))+1 FROM Table_Serials WHERE SerialNumber LIKE 'PRE1%' 针对SQL server上的表 如何在X++中获得相同的结果?到目前为止我的猜测是 select maxof(right(SerialNumber,

我在Dynamics AX 2012表格中有一个字段,填充了序列号PRE1 00162格式,我需要返回下一个序列号,在本例中是PRE1 00163

在遗留系统上,通过运行

SELECT MAX(RIGHT(SerialNumber,5))+1 FROM Table_Serials 
WHERE SerialNumber LIKE 'PRE1%' 
针对SQL server上的表

如何在X++中获得相同的结果?到目前为止我的猜测是

select maxof(right(SerialNumber,5))+1
    from tableSerials
    where tableSerials.SerialNumber 
like tableSerials;
但是它显示了在
maxof(right(
part)之后开始的语法错误

谢谢!

正确的方法应该是创建()


如果要保留原有功能,必须使用创建AOT视图。 字段
ViewMethod
的示例:

专用静态服务器str compSerial()
{
str srcCol=SysComputedColumn::returnField(tableStr(TableSerialsView)、identifierStr(TableSerials_1)、fieldStr(TableSerials,SerialNumber));
str result=strFmt('MAX(右(%1,5))+1',srcCol);
返回结果;
}

然后将计算字段添加到视图字段并选择。

我的一位睿智的同事也提出了这种方法,这种方法同样有效:

static void CompNextSerial(Args _args)
{
    str value;
    int num;
    str 10 prefix;
    SerialsTable serialsTable;

    prefix = "PRE1 *";

    select firstOnly serialsTable
        order by SerialNumber desc
        where serialsTable.SerialNumber like prefix;

    value = subStr (serialsTable.SerialNumber, strLen(serialsTable.SerialNumber) - 4 , 5);
    num = str2int(value) + 1;
    info (strFmt('%1', num));
}

谢谢你,Matej。我相信你让我走上了正确的道路。所以我让
str srcCol
部分正常工作,但当我试图返回
str结果时,我得到了SQL错误描述:[Microsoft][SQL Server Native Client 10.0][SQL Server]列“TABLESERIALS.SerialNumber”在选择列表中无效,因为它既不包含在聚合函数中,也不包含在GROUP BY子句中。u
srcCol
的视图返回u Partition、RecId、CompNextSerial、SerialNumber、dataAreaId和recVersion字段。添加GroupBy字段SerialNumber没有帮助。就像在常规SQ中一样五十、 group by段中的字段列表必须与select语句中的字段相同。请尝试将此字段包括到视图上的“字段”节点,以便与“group by”一致一个,就像你在构建一个常规SQL select语句时所做的那样。终于让它工作了。问题是我没有为SerialNumber字段选择Aggregation=Max。像'PRE1%'这样的
怎么样呢?
part?如何让它在这个视图中工作?谢谢你们,伙计们!比使用
Max(右(…)
(更好的性能、可用性和可读性,更少复杂的方法)。视图只是对遗留代码的重写。