You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SysOperation UiBuilder双Lookup功能报错问题求助

解决SysOperation中重复注册方法重写的报错问题

报错原因

当前代码每次切换Sa_Type枚举值时,都会调用registerOverrideMethod给combo控件的lookup方法绑定新实现,但SysOperation框架不允许对同一个控件的同一个方法多次注册重写,这就触发了RegisterOverrideMethod was called twice for the same object for method 'lookup'错误。

解决方案

不需要每次切换类型都重新注册lookup方法,只需要注册一次通用的lookup方法,在该方法内部根据当前Sa_Type的取值动态判断加载客户还是供应商数据。既能避免重复注册的问题,逻辑也更简洁。

修改后的代码示例

public class AdjustmentUiBuilder extends SysOperationAutomaticUIBuilder
{
    DialogField type;
    DialogField combo;
    
    public void build()
    {
        super();

        type = this.bindInfo().getDialogField(this.dataContractObject(), methodStr(AdjustmentSysContract, parmType));
        combo = this.bindInfo().getDialogField(this.dataContractObject(), methodStr(AdjustmentSysContract, parmCombo));
    }

    public void postRun()
    {
        super();
        // 仅注册一次通用lookup方法
        combo.registerOverrideMethod(methodStr(FormStringControl, lookup), methodStr(AdjustmentUiBuilder, lookupCustOrVendAccount), this);
        type.registerOverrideMethod(methodStr(FormComboBoxControl, modified), methodStr(AdjustmentUiBuilder, moduleCustVend_modified), this);
    }

    private void lookupCustOrVendAccount(FormStringControl _formStringControl)
    {
        Query query = new Query();
        QueryBuildDataSource qbds;
        SysTableLookup sysTableLookup;
        TableId tableId;
        FieldId accountFieldId;

        // 根据当前类型动态选择数据源表和字段
        if(type.value() == Sa_Type::Customer)
        {
            tableId = tableNum(CustTable);
            accountFieldId = fieldNum(CustTable, AccountNum);
        }
        else
        {
            tableId = tableNum(VendTable);
            accountFieldId = fieldNum(VendTable, AccountNum);
        }

        sysTableLookup = SysTableLookup::newParameters(tableId, _formStringControl);
        qbds = query.addDataSource(tableId);
        sysTableLookup.addLookupfield(accountFieldId, true);
        sysTableLookup.parmQuery(query);
        sysTableLookup.performFormLookup();
    }

    private boolean moduleCustVend_modified(FormComboBoxControl _control)
    {
        // 切换类型后清空combo值,避免数据不匹配
        combo.value('');
        return _control.modified();
    }
}

补充说明

  • 移除了原modifyDialogFields方法,不再反复注册lookup方法
  • 在postRun中仅注册一次通用的lookupCustOrVendAccount方法,内部根据类型动态切换数据源
  • 切换类型时清空combo现有值,防止出现“选了供应商后切客户,combo仍保留供应商账号”的不一致情况

内容的提问来源于stack exchange,提问作者R Monkey

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 02:07:23