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表示不重置当前视图状态。 - 数据逻辑要正确:如果是从外部系统拉取数据,确保按钮事件里正确调用接口并将数据插入临时表。
排查小技巧
要是还是没数据,按这几步检查:
- 确认临时表的
TempTable属性确实设置为Yes。 - 调试按钮事件,加一句
Message('%1', ParcelTracking.Count())查看临时表是否成功插入数据。 - 检查ListPart的
SourceTable是否正确指向你的临时表。 - 核对页面扩展里部件的名称和代码中引用的名称完全一致(比如
"Parcel Tracking Part")。
内容的提问来源于stack exchange,提问作者kuhi
相关产品推荐
相关产品推荐

