Business Central中动态设置Sales Line“No.”列宽度的技术求助
解决方案:动态调整Sales Line中“No.”列的宽度
步骤1:获取最长“No.”字段的长度
方法一:直接遍历记录,实时更新最大值(推荐,更高效)
无需数组,遍历销售行时直接对比并记录当前最长长度:
var SalesHeader: Record "Sales Header"; SalesLine: Record "Sales Line"; MaxNoLength: Integer; CurrentLength: Integer; begin // 获取当前打开的销售订单头信息 SalesHeader.Get(Rec."Document Type", Rec."No."); MaxNoLength := 0; // 筛选当前订单下的所有销售行 SalesLine.SetRange("Document Type", SalesHeader."Document Type"); SalesLine.SetRange("Document No.", SalesHeader."No."); if SalesLine.FindSet() then begin repeat CurrentLength := StrLen(SalesLine."No."); if CurrentLength > MaxNoLength then MaxNoLength := CurrentLength; until SalesLine.Next() = 0; end; // MaxNoLength即为当前订单销售行中最长的No.字段长度 end;
方法二:用数组存储所有长度后求最大值
如果一定要用数组实现需求,AL中可以用List of Integer替代传统数组(更灵活):
var SalesHeader: Record "Sales Header"; SalesLine: Record "Sales Line"; LengthList: List of Integer; MaxNoLength: Integer; CurrentLength: Integer; begin SalesHeader.Get(Rec."Document Type", Rec."No."); LengthList.Clear(); SalesLine.SetRange("Document Type", SalesHeader."Document Type"); SalesLine.SetRange("Document No.", SalesHeader."No."); if SalesLine.FindSet() then begin repeat CurrentLength := StrLen(SalesLine."No."); LengthList.Add(CurrentLength); until SalesLine.Next() = 0; end; // 从列表中筛选最大值 MaxNoLength := 0; foreach CurrentLength in LengthList do begin if CurrentLength > MaxNoLength then MaxNoLength := CurrentLength; end; end;
步骤2:动态设置列宽
在Sales Line子页面(标准页面ID为9305 "Sales Order Subform")的扩展中,通过ColumnWidth属性动态赋值,可在页面打开时或数据变更后触发:
pageextension 50100 "Custom Sales Order Subform" extends "Sales Order Subform" { var MaxNoLength: Integer; SalesHeader: Record "Sales Header"; SalesLine: Record "Sales Line"; trigger OnOpenPage(); var CurrentLength: Integer; begin // 获取当前订单最长No.长度 SalesHeader.Get(Rec."Document Type", Rec."No."); MaxNoLength := 0; SalesLine.SetRange("Document Type", SalesHeader."Document Type"); SalesLine.SetRange("Document No.", SalesHeader."No."); if SalesLine.FindSet() then begin repeat CurrentLength := StrLen(SalesLine."No."); if CurrentLength > MaxNoLength then MaxNoLength := CurrentLength; until SalesLine.Next() = 0; end; // 动态设置列宽,可加1-2个字符留缓冲避免截断 CurrPage."No.".ColumnWidth := MaxNoLength + 2; end; // 可选:新增/修改销售行后重新计算列宽 trigger OnAfterInsertRecord(); begin RecalculateColumnWidth(); end; trigger OnAfterModifyRecord(); begin RecalculateColumnWidth(); end; local procedure RecalculateColumnWidth(); var CurrentLength: Integer; begin SalesHeader.Get(Rec."Document Type", Rec."No."); MaxNoLength := 0; SalesLine.SetRange("Document Type", SalesHeader."Document Type"); SalesLine.SetRange("Document No.", SalesHeader."No."); if SalesLine.FindSet() then begin repeat CurrentLength := StrLen(SalesLine."No."); if CurrentLength > MaxNoLength then MaxNoLength := CurrentLength; until SalesLine.Next() = 0; end; CurrPage."No.".ColumnWidth := MaxNoLength + 2; end; }
注意事项
ColumnWidth的单位是字符数,建议在最大值基础上加1-2,避免内容被截断- 如果销售行数据会在页面打开后变更,需在
OnAfterInsertRecord/OnAfterModifyRecord事件中重新计算并更新列宽 - 确保扩展对象正确继承了标准的Sales Order子页面
内容的提问来源于stack exchange,提问作者jbendy
相关产品推荐
相关产品推荐

