AX带参数调用FORM

一、不同菜单带参数调用同一个FORM,实现不同内容的界面。

  1. 界面里创建两个菜单,EnumTypeParameter都选【InventTransType】,Object都指向同一个Form【InventQuarantineOrder】。
  2. 菜单A的EnumParameter选择【Purch】,菜单B的EnumParameter选择【Production】。
  3. 也可以两个菜单分别指定不同的【Parameters】参数来代替【EnumTypeParameter】+【EnumParameter】组合值,把这个参数传给Form来实现。
  4. 被调用的Form,可以在form.init()中取参数,也可以在DataSource.init()中取参数。下面的代码写在DataSource.init()中取得参数,根据不同的参数值过滤数据,同时并改变子表DataSource的LinkType值。
void init()
{
    QueryBuildRange _qbrType;
    ;

    super();
    this.query().dataSourceTable(tablenum(InventQuarantineOrder)).addSortField(fieldnum(InventQuarantineOrder,QuarantineId));
    _qbrType = this.query().dataSourceTable(TableNum(InventQuarantineOrder)).addRange(FieldNum(InventQuarantineOrder,TransType));

    if (element.args().parmEnumType())
    {
        if (element.args().parmEnum() == InventTransType::Purch)
        {
            _qbrType.value(ENum2Str(InventTransType::Purch));
            VendPackingSlipJour_ds.linkType(3);
        }
        else
        {
            _qbrType.value(Enum2Str(InventTransType::Production));
            VendPackingSlipJour_ds.linkType(1);
        }
    }
}

二、Button控件携带参数调用Form。

  1. 主界面创建一个Button控件,在其.Clicked()中写调用代码。
  2. 被调界面的.init()中取参数并根据参数值显示数据。
//主界面呼叫按钮的Clicked()代码
void clicked()
{
    args        _args;
    FormRun     _formRun;
    str         _sParam;
    ;
    super();
    _args   = new Args(formstr(SPL_WoItemAudit));
    _sParam = SPL_cmTable.ProdPoolId + ',SPL_cmTable';
    _args.parm(_sParam);
    _formRun= classFactory.formRunClass(_args);
    _formRun.init();
    _formRun.run();
    _formRun.detach();
}
//被调界面的init()代码
public void init()
{
    str         m_param,m_prodPoolId,m_SO;
    int         _postion,_length;
    ;
    super();
    if(element.args().parm())
    {
        m_param     = element.args().parm();
        _length     = strlen(m_param);
        _postion    = strFind(m_param,',',1,_length);
        m_prodPoolId= subStr(m_param,1,_postion-1);
        m_SO        = subStr(m_param,_postion+1,_length-_postion);
        if(m_SO == 'SPL_cmTable')
        {
            SPL_NotIntersected.value(NoYes::Yes);
            txt_prodPoolId.text(m_prodPoolId);
            txt_SalesId.text('');
        }
        else
        {
            SPL_NotIntersected.value(NoYes::No);
            txt_prodPoolId.text(m_prodPoolId);
            txt_SalesId.text(m_SO);
        }
    }
}

三、Button控件携带Record作参数调用Form。

//主表呼叫按钮的Clicked()代码
void clicked()
{
    args        _args;
    FormRun     _formRun;
    HelpTable   _helpTable;
    ;
    super();
    select firstonly _helpTable where _helpTable.FormName == element.name();
    if(_helpTable)
    {
        _args   = new Args(formstr(HelpView));
        _args.record(_helpTable);
        _formRun= classFactory.formRunClass(_args);
        _formRun.init();
        _formRun.run();
        _formRun.detach();
    }
}
//被调用Form.init()的代码
public void init()
{
    HelpTable   _helpTable;
    ;
    super();
    if(element.args().record())
    {
        _helpTable = element.args().record();
        seFormName.text(_helpTable.FormName);
        seFormDesc.text(_helpTable.FormDesc);
        seHelp.text(_helpTable.FormHelp);
    }
}

四、在被调界面中呼叫主界面中的某个方法执行。下面代码表示:被调界面完成工作后,让主界面中的 SPL_Dorefresh的方法执行一次,以刷新主界面的数据源,然后自我关闭被调界面。

    super();
    element.args().caller().SPL_Dorefresh();
    element.close();

五、在被调界中引用主界面里的函数。下面被调Form.init()中的代码表示:如果主叫界面是“SPL_QueryForProdBom”,则被调界面的 ItemId 变量用主界面中的函数getItemID() 取值。

    if( element.Args().caller().name() == formStr(SPL_QueryForProdBom)  )
        itemid = element.args().caller().getItemID();

发表评论