Axapta ax 2012中自定义表的编号顺序

Axapta ax 2012中自定义表的编号顺序,axapta,dynamics-ax-2012,number-sequence,Axapta,Dynamics Ax 2012,Number Sequence,我有一个自定义实用程序,它在AX 2012 AOT中使用一个自定义表,我想为我的表设置一个标识字段,有人告诉我可以使用数字序列,并可以将数字序列映射到我的表,以便它可以在插入行时获得一个新的唯一id,当我尝试生成数字序列时,它会询问我区域和模块信息,由于我希望自定义表和实用程序使用.net business connector在dynamics ax 2012外部工作,因此我无法确定该向导的输入内容。您可能已经看到了使用NumberSeqModule enum并向其中添加自定义模块enum值的方

我有一个自定义实用程序,它在AX 2012 AOT中使用一个自定义表,我想为我的表设置一个标识字段,有人告诉我可以使用数字序列,并可以将数字序列映射到我的表,以便它可以在插入行时获得一个新的唯一id,当我尝试生成数字序列时,它会询问我区域和模块信息,由于我希望自定义表和实用程序使用.net business connector在dynamics ax 2012外部工作,因此我无法确定该向导的输入内容。

您可能已经看到了使用NumberSeqModule enum并向其中添加自定义模块enum值的方法。然后,您通常会创建一个扩展NumberSeqApplicationModule类的类,然后使用数字序列引用加载链接到数据类型的NumberSequence

虽然这是“最佳实践方式”,但对于您现在想要做的事情来说,这有点过头了。下面是你能做的:

您可以只覆盖正在使用的表的insert方法。另外,您可以在NumberSeq类上使用newGetNumFromCode构造函数

public static NumberSeq newGetNumFromCode(
    NumberSequenceCode  _numberSequenceCode,
    NumberSeqScope      _scope = NumberSeqScopeFactory::createDefaultScope(),
    boolean             _makeDecisionLater           = false,
    boolean             _dontThrowOnMissingRefSetUp  = false,
    SysLastValue        _nextNumSeq = null,
    boolean             _fillNextNumSeq = false)
{
    return NumberSeq::newGetNumFromId(
            NumberSequenceTable::findByNaturalKey(_numberSequenceCode, _scope.getId()).RecId,
            _makeDecisionLater,
            _dontThrowOnMissingRefSetUp,
            _nextNumSeq,
            _fillNextNumSeq);
}
现在要使用它,您只需在Dynamics Ax(组织管理|数字序列|数字序列)中创建一个新的数字序列,并记住数字序列代码

然后在表的insert方法上可以执行以下操作:(示例取自联系人表)


这应该确保在插入记录时,您还将填充ID。

您可能已经看到了使用NumberSeqModule枚举并向其添加自定义模块枚举值的方法。然后,您通常会创建一个扩展NumberSeqApplicationModule类的类,然后使用数字序列引用加载链接到数据类型的NumberSequence

虽然这是“最佳实践方式”,但对于您现在想要做的事情来说,这有点过头了。下面是你能做的:

您可以只覆盖正在使用的表的insert方法。另外,您可以在NumberSeq类上使用newGetNumFromCode构造函数

public static NumberSeq newGetNumFromCode(
    NumberSequenceCode  _numberSequenceCode,
    NumberSeqScope      _scope = NumberSeqScopeFactory::createDefaultScope(),
    boolean             _makeDecisionLater           = false,
    boolean             _dontThrowOnMissingRefSetUp  = false,
    SysLastValue        _nextNumSeq = null,
    boolean             _fillNextNumSeq = false)
{
    return NumberSeq::newGetNumFromId(
            NumberSequenceTable::findByNaturalKey(_numberSequenceCode, _scope.getId()).RecId,
            _makeDecisionLater,
            _dontThrowOnMissingRefSetUp,
            _nextNumSeq,
            _fillNextNumSeq);
}
现在要使用它,您只需在Dynamics Ax(组织管理|数字序列|数字序列)中创建一个新的数字序列,并记住数字序列代码

然后在表的insert方法上可以执行以下操作:(示例取自联系人表)


这应该确保在插入记录时,您也会填写ID。

这是您以正常方式对序列进行编号的方式

custTable.xyz = NumberSeq::newGetNum(CompanyInfo::numrefContactId()).num();

这就是你如何用正常的方式给序列编号

custTable.xyz = NumberSeq::newGetNum(CompanyInfo::numrefContactId()).num();

感谢Kenny,我创建了一个数字序列,覆盖了我的insert方法,并使用了newGetNumFromCode方法,我得到了重复的数字,然后有人告诉我必须使用连续的数字序列,并将代码包装到事务TTSBegin和TTSEnd中。它起作用了。@Kenny Saelen:您在本例中使用了NumberSeq::newGetNum()。我正在创建NumberSeq::newGetNumFromCode(),但它(有时,并非总是)抛出一个异常“数字序列不存在”。你知道为什么会这样吗?我在组织管理中使用“新数字序列”生成了数字序列,而不是通过代码(使用EDT stuff、loadModule()方法和所有方法)或生成序列向导生成的。感谢Kenny,我创建了一个数字序列并覆盖了我的插入方法,使用了newGetNumFromCode方法,我得到了重复的数字,然后有人告诉我,我必须使用连续的数字序列,并将代码包装在一个事务TTSBegin和TTSEnd中。它起作用了。@Kenny Saelen:您在本例中使用了NumberSeq::newGetNum()。我正在创建NumberSeq::newGetNumFromCode(),但它(有时,并非总是)抛出一个异常“数字序列不存在”。你知道为什么会这样吗?我在组织管理中使用“新数字序列”生成数字序列,而不是通过代码(使用EDT stuff、loadModule()方法和所有方法)或生成序列向导。这确实是上面的答案:)这确实是上面的答案:)