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

Business Central中如何基于临时表正确填充销售订单页面部件?

解决Sales Orders页面中临时表填充ListPart的问题

1. 先把临时表定义弄对

首先得确认你的Parcel Tracking临时表已经开启TempTable = Yes,字段(比如跟踪号、快递公司、状态这些核心字段)也配置完整。参考代码示例:

table 50100 "Parcel Tracking"
{
    DataClassification = CustomerContent;
    TempTable = Yes;

    fields
    {
        field(1; "Tracking No."; Code[50])
        {
            DataClassification = CustomerContent;
        }
        field(2; "Courier Name"; Text[50])
        {
            DataClassification = CustomerContent;
        }
        field(3; Status; Option)
        {
            DataClassification = CustomerContent;
            OptionMembers = Pending,InTransit,Delivered;
        }
    }

    keys
    {
        key(PK; "Tracking No.")
        {
            Clustered = true;
        }
    }
}

2. ListPart页面别瞎配置

ListPart页面直接绑定临时表即可,PageType设为ListPart,绝对不能加RunObject配置——这就是之前导致部件最大化的元凶。示例代码:

page 50100 "Parcel Tracking ListPart"
{
    PageType = ListPart;
    SourceTable = "Parcel Tracking";
    ApplicationArea = All;
    UsageCategory = Lists;

    layout
    {
        area(Content)
        {
            repeater(Group)
            {
                field("Tracking No."; "Tracking No.")
                {
                    ApplicationArea = All;
                }
                field("Courier Name"; "Courier Name")
                {
                    ApplicationArea = All;
                }
                field(Status; Status)
                {
                    ApplicationArea = All;
                }
            }
        }
    }
}

3. 页面扩展里正确传递临时表数据

核心是:在销售订单的页面扩展里定义临时表的Record变量,按钮触发时先填充数据,再把这个变量传给ListPart的数据源。

页面扩展代码示例:

pageextension 50100 "Sales Order Tracking Ext" extends "Sales Order"
{
    layout
    {
        addlast(Content)
        {
            part("Parcel Tracking Part"; "Parcel Tracking ListPart")
            {
                ApplicationArea = All;
            }
        }
    }

    actions
    {
        addlast(Processing)
        {
            action("Load Tracking Data")
            {
                ApplicationArea = All;
                Promoted = true;
                PromotedCategory = Process;

                trigger OnAction()
                var
                    ParcelTracking: Record "Parcel Tracking" temporary;
                begin
                    // 第一步:填充临时表数据(替换为你的实际业务逻辑,比如调用物流API、关联其他表)
                    ParcelTracking.Init();
                    ParcelTracking."Tracking No." := "Document No." + "-TRK001";
                    ParcelTracking."Courier Name" := "Contoso Logistics";
                    ParcelTracking.Status := ParcelTracking.Status::InTransit;
                    ParcelTracking.Insert();

                    ParcelTracking.Init();
                    ParcelTracking."Tracking No." := "Document No." + "-TRK002";
                    ParcelTracking."Courier Name" := "Adventure Works Shipping";
                    ParcelTracking.Status := ParcelTracking.Status::Pending;
                    ParcelTracking.Insert();

                    // 第二步:将填充好的临时表传递给ListPart并刷新
                    CurrPage."Parcel Tracking Part".Page.SetTableView(ParcelTracking);
                    CurrPage."Parcel Tracking Part".Page.Update(false);
                end;
            }
        }
    }
}

4. 几个容易踩坑的点

  • 临时表实例要统一:临时表是会话级的,必须保证填充数据的变量和ListPart使用的是同一个实例,通过SetTableView传递即可。
  • 禁用RunObject:之前的最大化问题就是因为ListPart里加了这个配置,ListPart作为页面部件完全不需要它。
  • 记得刷新部件:填充完数据一定要调用Update(false)刷新显示,false表示不重置当前视图状态。
  • 数据逻辑要正确:如果是从外部系统拉取数据,确保按钮事件里正确调用接口并将数据插入临时表。

排查小技巧

要是还是没数据,按这几步检查:

  1. 确认临时表的TempTable属性确实设置为Yes。
  2. 调试按钮事件,加一句Message('%1', ParcelTracking.Count())查看临时表是否成功插入数据。
  3. 检查ListPart的SourceTable是否正确指向你的临时表。
  4. 核对页面扩展里部件的名称和代码中引用的名称完全一致(比如"Parcel Tracking Part")。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 06:03:18