[AX]AX2012 Number sequence framework :(二)实现自定义模块的Number sequence

有了“[AX]AX2012 Number sequence framework :(一)概览与原理浅析”一文中对Number sequence framework的初步分析,实现自己的模块的Number sequence就比较容易理解了。这里以实现一个我们自己的“MES”模块为例来看看具体如何操作,在这个MES模块中我们有一个WeighingJobsID的EDT扩展类型,用它来表示唯一一个称量任务,它的编号来自于一个Number sequence。

1.首先我们需要在NumberSeqModule base enum下添加模块“MES”的子项

2.定义扩展类型WeighingJobId,字符串类型的EDT

3.创建保存模块参数配置的表MESParameters,可以从其他模块照抄,这个表必须有一个ParametersKey EDT类型的字段“key”,创建一个非重复的索引“Key”,仅包含字段“key”。在表MESParameters上创建一些方法:

void delete()
{
    throw error("@SYS23721");
}
void update()
{
    super();
    flush MESParameters;
}
//AOSRunMode::CalledFrom
static MESParameters find(boolean _forupdate = false)
{
    MESParameters parameter;

    parameter.selectForUpdate(_forupdate);

    select firstonly parameter
        index Key
        where parameter.Key == 0;

    if (!parameter && !parameter.isTmp())
    {
        Company::createParameter(parameter);
    }

    return parameter;
}

//返回当前Number sequence模块的ENUM值
static client server NumberSeqModule numberSeqModule()
{
    return NumberSeqModule::MES;
}

client server static NumberSequenceReference numRefWeighingJobId()
{
    
    //使用当前公司创建一个scope
    NumberSeqScope scope = NumberSeqScopeFactory::createDataAreaScope(curext());
    //根据EDT类型和scope在NumberSequenceReference表中查找相应的引用记录
    return NumberSeqReference::findReference(extendedtypenum(WeighingJobId), scope);
}

4.从NumberSeqApplicationModule扩展自己的Module类NumberSeqModuleMES,重载numberSeqModule()和loadModule()两个方法:

class NumberSeqModuleMES extends NumberSeqApplicationModule
{
}
    NumberSeqDatatype datatype = NumberSeqDatatype::construct();

    /* Weighing job number */
    //指定data type的一些参数,用于在wizard生成number sequence时使用
    datatype.parmDatatypeId(extendedTypeNum(WeighingJobId));//EDT类型
    datatype.parmReferenceHelp("Unique identifier for weighingjobs");
    datatype.parmWizardIsContinuous(false);//是否连续
    datatype.parmWizardIsManual(NoYes::No);//是否手工输入编号
    datatype.parmWizardIsChangeDownAllowed(NoYes::No);//可往下修改编号
    datatype.parmWizardIsChangeUpAllowed(NoYes::No);//可往上修改编号
    datatype.parmSortField(1);
    datatype.parmWizardHighest(999999);//编号最大值

    datatype.addParameterType(NumberSeqParameterType::DataArea, true, true);//该函数可以多次调用,组合多个scope类型,注意最后一个参数,为true表示可配置 
    this.create(datatype);

  
}
public NumberSeqModule numberSeqModule()
{
   return NumberSeqModule::MES;
}

5.创建配置MES parameters的form MESParameters,其他模块照抄,删除不需要的内容,保留Data source下的表NumberSequenceReference及其下的表NumberSequenceTable,包含表MESParameters到data source,实现修改以下方法:

public class FormRun extends ObjectRun
{
    boolean                 runExecuteDirect;
    TmpIdRef                tmpIdRef;

    fieldId                 tmpFieldId;


    NumberSeqScope             scope;
    NumberSeqApplicationModule numberSeqApplicationModule;
    container                  numberSequenceModules;
}

public void init()
{
    this.numberSeqPreInit();

    super();

    MESParameters::find();

    this.numberSeqPostInit();

}
void numberSeqPreInit()
{
    runExecuteDirect   = false;

    numberSequenceModules = [NumberSeqModule::MES];
    numberSeqApplicationModule = new NumberSeqModuleMES();
    scope = NumberSeqScopeFactory::createDataAreaScope();//使用当前公司创建scope
    NumberSeqApplicationModule::createReferencesMulti(numberSequenceModules, scope);//在NumberSequenceReference表中创建当前模块的所有引用
    tmpIdRef.setTmpData(NumberSequenceReference::configurationKeyTableMulti(numberSequenceModules));
}

void numberSeqPostInit()
{
    numberSequenceReference_ds.object(fieldNum(NumberSequenceReference, AllowSameAs)).visible(numberSeqApplicationModule.sameAsActive());
    referenceSameAsLabel.visible(numberSeqApplicationModule.sameAsActive());
}

6.创建一个job调用一次NumberSeqModuleMES的loadModule()方法,注册模块的data type,当然可以放在其他一些地方来调用。loadModule()可以调用多次,它会自动更新已经创建的data type,或者添加新的data type:

static void InstallModuleMES(Args _args)
{
    NumberSeqModuleMES n = new NumberSeqModuleMES();

    n.loadModule();
}

运行一次JOB InstallModuleMES,所有我们模块的Number sequence的准备工作都做好了,接下来就可以使用“set up number sequence” wizard为我们的模块创建Number sequence,上面的例子中scope设置为按公司(DataArea),wizard会为每个公司的WeighingJobId创建一个单独的Number sequence,打开MESParameters窗口就能看到已经分配好的Number sequence。

 

在X++代码中我们可以这样得到一个WeighingJobId的编号:

static void TestNumSeqWeighingJobId(Args _args)
{

    ;
    ttsBegin;//如果是连续的number seuqnce,必须放在ttsbegin...ttscommit中调用
    Info(NumberSeq::newGetNum(MesParameters::numRefWeighingJobId()).num());
    ttsCommit;

}

要在form上新建纪录时自动填充WeighingJobId需要一些更多的步骤,假设有个表WeighingJobs,字段WeighingJobId使用前面的EDT类型WeighingJobId,创建form WeigingJobs使用表WeigingJobs作为数据源,在WeighingJobs form上实现以下方法:

public class FormRun extends ObjectRun
{
    NumberSeqFormHandler numberSeqFormHandler;
}
public NumberSeqFormHandler numberSeqFormHandler()
{
    if (!numberSeqFormHandler)
    {
        numberSeqFormHandler = NumberSeqFormHandler::newForm(
            MESParameters::numRefWeighingJobId().NumberSequenceId,
             element,
             WeighingJobs_ds,
             fieldnum(WeighingJobs, WeighingJobId));
    }
    return numberSeqFormHandler;
}

还需要在表WeighingJobs的data source上实现以下方法:

public void create(boolean _append = false)
{
    element.numberSeqFormHandler().formMethodDataSourceCreatePre();
    super(_append);
    element.numberSeqFormHandler().formMethodDataSourceCreate();
}
public void write()
{
    super();
    element.numberSeqFormHandler().formMethodDataSourceWrite();
}
public void delete()
{
    element.numberSeqFormHandler().formMethodDataSourceDelete();
    super();
}

做完上述工作,在form上新建一个纪录时就能为WeighingJobId字段自动分配编号了。

这里下载上述测试的样例工程,主要步骤基本上都是参照http://msdn.microsoft.com/EN-US/library/aa608474,重要的是要理解Number sequence framework是如何工作的。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ava实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),可运行高分资源 Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现
C语言是一种广泛使用的编程语言,它具有高效、灵活、可移植性强等特点,被广泛应用于操作系统、嵌入式系统、数据库、编译器等领域的开发。C语言的基本语法包括变量、数据型、运算符、控制结构(如if语句、循环语句等)、函数、指针等。下面详细介绍C语言的基本概念和语法。 1. 变量和数据型 在C语言中,变量用于存储数据,数据型用于定义变量的型和范围。C语言支持多种数据型,包括基本数据型(如int、float、char等)和复合数据型(如结构体、联合等)。 2. 运算符 C语言中常用的运算符包括算术运算符(如+、、、/等)、关系运算符(如==、!=、、=、<、<=等)、逻辑运算符(如&&、||、!等)。此外,还有位运算符(如&、|、^等)和指针运算符(如、等)。 3. 控制结构 C语言中常用的控制结构包括if语句、循环语句(如for、while等)和switch语句。通过这些控制结构,可以实现程序的分支、循环和多路选择等功能。 4. 函数 函数是C语言中用于封装代码的单元,可以实现代码的复用和模块化。C语言中定义函数使用关键字“void”或返回值型(如int、float等),并通过“{”和“}”括起来的代码块来实现函数的功能。 5. 指针 指针是C语言中用于存储变量地址的变量。通过指针,可以实现对内存的间接访问和修改。C语言中定义指针使用星号()符号,指向数组、字符串和结构体等数据结构时,还需要注意数组名和字符串常量的特殊性质。 6. 数组和字符串 数组是C语言中用于存储同型数据的结构,可以通过索引访问和修改数组中的元素。字符串是C语言中用于存储文本数据的特殊型,通常以字符串常量的形式出现,用双引号("...")括起来,末尾自动添加'\0'字符。 7. 结构体和联合 结构体和联合是C语言中用于存储不同型数据的复合数据型。结构体由多个成员组成,每个成员可以是不同的数据型;联合由多个变量组成,它们共用同一块内存空间。通过结构体和联合,可以实现数据的封装和抽象。 8. 文件操作 C语言中通过文件操作函数(如fopen、fclose、fread、fwrite等)实现对文件的读写操作。文件操作函数通常返回文件指针,用于表示打开的文件。通过文件指针,可以进行文件的定位、读写等操作。 总之,C语言是一种功能强大、灵活高效的编程语言,广泛应用于各种领域。掌握C语言的基本语法和数据结构,可以为编程学习和实践打下坚实的基础。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值