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

View Code
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的是否包含日期,

View Code
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;
}

  处理包含日期后的逻辑

View Code
//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窗体中定义一个数组

View Code
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方法中获取得到的生成编号

View Code
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;
}

 

原文地址:https://www.cnblogs.com/dingkui/p/2657464.html