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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 16:30:28