2014-10-22 32 views
0

我有填充PRE1的编号00162格式动态AX 2012表中的字段,我需要回到下一个序列号,在这种情况下将PRE1 00163X ++查询来选择字符串类型字段的最大价值

在遗留系统是由SQL服务器上运行

SELECT MAX(RIGHT(SerialNumber,5))+1 FROM Table_Serials 
WHERE SerialNumber LIKE 'PRE1%' 

对阵表来实现的。

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

select maxof(right(SerialNumber,5))+1 
    from tableSerials 
    where tableSerials.SerialNumber 
like tableSerials; 

但它显示了语法错误开始之后maxof(right(一部分。

谢谢!

回答

2

我的一个明智的同事也建议这个方法,这也适用:

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)); 
} 
+1

比'MAX(RIGHT(...))'更好的方法(更好的性能,可用性和可读性,更简单的方法)。视图只是重写遗留代码。 – Matej 2014-10-23 10:51:03

3

正确的方法应该是创建Number SequenceWhitepaper)。


如果继电器要保留你必须创建一个computed column AOT查看旧功能。 实施例田间ViewMethod

private static server str compSerial() 
{ 
    str srcCol = SysComputedColumn::returnField(tableStr(TableSerialsView), identifierStr(TableSerials_1), fieldStr(TableSerials, SerialNumber)); 
    str result = strFmt('MAX(RIGHT(%1, 5)) + 1', srcCol); 

    return result; 
} 

然后计算字段添加到视图和选择的领域。

+0

谢谢你,马捷。我相信你让我走上了正确的道路。 所以我得到'str srcCol'部分工作,但是当我试图返回'str result'时,我得到_SQL错误描述:[Microsoft] [SQL Server Native Client 10.0] [SQL Server] Column'TABLESERIALS .SerialNumber'在选择列表中无效,因为它不包含在聚合函数或GROUP BY子句中。 _ 'srcCol'的视图返回_Partition_,_RecId_,_CompNextSerial_,_SerialNumber_,_dataAreaId_和_recVersion_字段。 添加GroupBy字段_SerialNumber_没有帮助。 – Donatas 2014-10-22 15:53:21

+0

正如您在常规SQL中所做的那样,按分组分组的字段列表必须与select语句中的字段相同。尝试将这些字段包含到视图上的“Fields”节点上,以便与“group by”一致,就像您在构建常规SQL select语句时一样。 – 2014-10-22 21:35:37

+0

终于搞定了。问题是我没有为_SerialNumber_字段选择** Aggregation ** = ** Max **。 – Donatas 2014-10-23 08:30:15

相关问题