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

如何通过JavaScript打开Acumatica Smart Panel并填充数据后保存至Acumatica?

如何通过JavaScript打开Acumatica Smart Panel并填充数据后保存至Acumatica?

看起来你卡在了用JS打开Acumatica Smart Panel这一步,还想把JS数组的数据填充进去再保存,我来一步步帮你解决这个问题:

一、先解决Smart Panel打不开的问题

你当前的代码用硬编码的ID去定位面板,这在Acumatica里很容易出问题——因为Acumatica的页面控件ID经常会动态生成(比如页面布局变化、多实例场景),硬写的ctl00_phG_PanelAttributesDetails大概率会失效。给你两个更可靠的方案:

方案1:给SmartPanel设置固定ClientID

在ASPX页面的SmartPanel控件里加上ClientIDMode="Static",这样它的ID就不会动态变化了:

<px:PXSmartPanel ID="PanelAttributesDetails" runat="server" ClientIDMode="Static" ...>
    <!-- 你的DAC字段控件 -->
</px:PXSmartPanel>

然后修改你的JS代码,直接用静态ID定位,同时注意Acumatica的SmartPanel是用自身控件实现的,不用调用jQuery的dialog('open'),应该用控件原生的show()方法:

function openSmartPanel() {
    var panelId = 'PanelAttributesDetails'; // 现在是静态ID
    var panel = window.top.$(`#${panelId}`)[0];
    if (panel) {
        panel.show(); // 调用Acumatica SmartPanel的原生显示方法
    } else {
        console.error(`SmartPanel with ID '${panelId}' not found.`);
    }
}

方案2:用Acumatica客户端API定位面板(更推荐)

如果不想改ASPX,你可以通过Acumatica的客户端API来找到对应的SmartPanel,比如关联到某个视图的上下文:

function openSmartPanel() {
    // 假设你的SmartPanel关联的视图是"AttributesDetails"
    var view = PXClient.getInstance().findView("AttributesDetails");
    if (view) {
        var panel = view.getPanel();
        if (panel) {
            panel.show();
        } else {
            console.error("对应的SmartPanel未找到");
        }
    } else {
        console.error("未找到指定的视图");
    }
}

二、打开面板后填充JS数组数据到DAC字段

面板打开后,你需要把JS数组的数据映射到SmartPanel里的各个DAC字段控件。比如你的JS数组是var dataArray = [{AttrID: "Size", AttrValue: "L"}, {AttrID: "Color", AttrValue: "Red"}];,可以这样处理:

function fillPanelData(dataArray) {
    // 这里以数组第一个元素为例,批量填充的话可以循环数组
    if (dataArray.length > 0) {
        // 用Acumatica的客户端API设置字段值,确保触发正确的事件
        var view = PXClient.getInstance().findView("AttributesDetails");
        PXClient.getInstance().setFieldValue(view.getField("AttrID"), dataArray[0].AttrID);
        PXClient.getInstance().setFieldValue(view.getField("AttrValue"), dataArray[0].AttrValue);
    }
}

注意:一定要用Acumatica的PXClient.getInstance().setFieldValue()方法来设置值,而不是直接修改input的value——因为这样能触发Acumatica客户端的字段验证、视图同步等逻辑,避免后续保存出问题。

三、填充数据后保存到Acumatica

数据填好后,你可以通过调用视图的保存方法来提交数据:

function savePanelData() {
    var view = PXClient.getInstance().findView("AttributesDetails");
    if (view) {
        // 调用视图的保存方法,成功/失败可以加回调
        view.save(function(success) {
            if (success) {
                console.log("数据保存成功!");
                // 保存成功后可以关闭面板
                var panel = view.getPanel();
                panel.hide();
            } else {
                console.error("数据保存失败,请检查字段是否合法");
            }
        });
    }
}

整合起来的完整流程

把打开、填充、保存的逻辑串起来,适合批量处理数组数据的场景:

function processAndSaveData(jsDataArray) {
    // 1. 定位视图与面板
    var view = PXClient.getInstance().findView("AttributesDetails");
    if (!view) {
        console.error("未找到目标视图");
        return;
    }
    var panel = view.getPanel();
    if (!panel) {
        console.error("未找到SmartPanel");
        return;
    }
    panel.show();

    // 2. 批量填充数据(支持多行场景)
    jsDataArray.forEach(function(item, index) {
        // 从第二行数据开始,先在视图里新增行
        if (index > 0) {
            view.insert();
        }
        PXClient.getInstance().setFieldValue(view.getField("AttrID"), item.AttrID);
        PXClient.getInstance().setFieldValue(view.getField("AttrValue"), item.AttrValue);
    });

    // 3. 提交保存并处理结果
    view.save(function(success) {
        if (success) {
            console.log("所有数据保存完成");
            panel.hide();
        } else {
            console.error("保存失败,请检查数据是否符合要求");
        }
    });
}

最后给你几个小提醒:

  • 确保你操作的视图和字段在Acumatica的权限配置里是允许编辑的,否则保存会被拦截
  • 如果SmartPanel是关联到主视图的子视图,要确保主视图的当前记录是选中状态
  • 测试时打开浏览器控制台(F12),看有没有报错信息,能帮你快速定位问题

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.08 07:14:32