AX2009 销售订单的不同情况生成不同的订单号

class FormRun extends ObjectRun { RGD_SalesorderSourse SalesorderSourse ; }
有很多客户习惯了EXCEL,在他们使用AX的时候,习惯的先在EXCEL将销售,采购订单创建好,然后直接导入到AX系统中,客户有时想区分系统中地销售,采购订单是在标准系统创建的还是通过导入生成的,这样也有利于当某些订单发生某些错误的时候,可以区分是否是导入的订单的时候出现问题。
这里我以销售订单为例,记录当时我们处理的方式和逻辑。
1,订单的编码规则是根据根据订单的来源分配,如果是导入生成,则编码规则是“SOR-SH+当前时间的年月+5位流水号,如果是在系统中创建,则编码规则是”STN-SH+当前时间的年月+5位流水号。
2,在创建销售订单时,给一个订单来源让用户选择,根据用户选择的来源生成不同的编码,如图:
3,日期的控制,这里我们采取的是用在NumberSequenceTable窗体中设置一个开关,让用户选择是否在生成的编码当中包含当前时间的年月,如图
4,实现步骤3的逻辑代码
在类NumberSeq的getNumInternal方法中判断步骤3的是否包含日期,

protected Num getNumInternal(NumberSequenceCode _numberSequenceCode) { Num _num = ''; NumberSequenceTable numberSequenceTable; UserConnection userConnection; boolean ok; ; this.setGlobalTransId(); userConnection = new UserConnection(); userConnection.ttsbegin(); sequenceUpdated = false; numberSequenceTable.setConnection(userConnection); select forupdate firstonly numberSequenceTable index hint SeriesIdx where numberSequenceTable.NumberSequence == _numberSequenceCode; this.setCleanupSequence(numberSequenceTable); ok = this.checkSetUpNum(numberSequenceTable); if (ok) { _num = this.getNumFromList(userConnection,numberSequenceTable); if (_num == '') { if (numberSequenceTable.NextRec == 0 || numberSequenceTable.NextRec > numberSequenceTable.Highest) ok = checkFailed(strfmt("@SYS17478",numberSequenceTable.NumberSequence)); else _num = this.getNumFromTable(userConnection,numberSequenceTable); } } if (!ok) { userConnection.ttsabort(); throw error("@SYS25038"); } userConnection.ttscommit(); if (sequenceUpdated) this.createTTSLink(); //ADD BY Kim if (numberSequenceTable.RGD_IfIncludeDate) { _num = this.RGD_FormatDate(_num); } //END By Kim return _num; }
处理包含日期后的逻辑

//this method is used add date to num Num RGD_FormatDate(Num _Num) { Num tmpNum = ''; int position; str strDate; str strLongYear; str strShortYear; str strMonth; str strDay; ; tmpNum = _Num; strDate = Date2Str(getServerDate(),321,2,2,2,2,4); strLongYear = subStr(strDate,1,4); strShortYear= subStr(strLongYear,3,2); strMonth = subStr(strDate,6,2); strDay = subStr(strDate,9,2); //Format day position = StrScan(tmpNum,"DD",1,strLen(tmpNum)); tmpNum = strPoke(tmpNum,strDay,position); //Format month position = StrScan(tmpNum,"MM",1,strLen(tmpNum)); tmpNum = strPoke(tmpNum,strMonth,position); //Format year position = StrScan(tmpNum,"YYYY",1,strLen(tmpNum)); if (position) { tmpNum = strPoke(tmpNum,strLongYear,position); } else { position = StrScan(tmpNum,"YY",1,strLen(tmpNum)); tmpNum = strPoke(tmpNum,strShortYear,position); } return tmpNum; }
5,在AX系统销售订单窗体上创建时的逻辑,在SalesCreateOrder窗体中定义一个数组

class FormRun extends ObjectRun { .... RGD_SalesorderSourse SalesorderSourse ; Array A ; .... } //init void init() { .... A = new Array(Types::String); A.value(1,'empty'); A.value(2,'empty'); SalesorderSourse = RGD_SalesorderSourse::Blank ; .... }
note:我只粘贴了针对处理该逻辑的代码,在SalesCreateOrder的数据源的RGD_SalesorderSourse字段的validate方法中获取得到的生成编号

public boolean validate() { boolean ret; ; ret = super(); // CUS-Modifed by sherr on 2011-08-22 Begin if(ret && #RGD_HDC) { if( SalesTable.RGD_SalesorderSourse != SalesorderSourse ) { if( SalesTable.RGD_SalesorderSourse == RGD_SalesorderSourse::NRR) { if(A.value(1) == 'empty') { SalesTable.SalesId = NumberSeq::newGetNum(SalesParameters::numRefSalesIdNRR(),true).num(); A.value(1,SalesTable.SalesId); } else { SalesTable.SalesId = A.value(1) ; } } else if( SalesTable.RGD_SalesorderSourse == RGD_SalesorderSourse::KRR) { if(A.value(2) == 'empty') { salesTableType.formMethodDataSourceCreate(element, salesTable_ds); A.value(2,SalesTable.SalesId); } else { SalesTable.SalesId = A.value(2) ; } } // CUS-Modifed by sherr on 2011-08-22 End } /* if( SalesTable.orig().RGD_OrderSource != SalesTable.RGD_OrderSource ) { if( SalesTable.RGD_OrderSource == "@RGD149") SalesTable.SalesId = NumberSeq::newGetNum(SalesParameters::numRefSalesIdNRR()).num(); else if( SalesTable.RGD_OrderSource == "@RGD150") salesTableType.formMethodDataSourceCreate(element, salesTable_ds); } */ } SalesorderSourse = SalesTable.RGD_SalesorderSourse ; return ret; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?