当前位置: 首页 > 知识库问答 >
问题:

如何在Business Central 365中迭代枚举标题

柳杰
2023-03-14
value(0; Default) { Caption = ' '; }
value(1; OH) { Caption = 'Ohio'; }
value(2; TX) { Caption = 'Texas'; }

如果将表或页字段定义为枚举,则标题将显示在下拉列表中。要获得标题,您可以使用Format(EnumType::Name)但是我们需要迭代给定枚举的所有标题。

共有1个答案

吴高洁
2023-03-14

经过在一些博客和文档中的挖掘,这里是我发现的总结。

>

  • 首先,有一个主要的限制,因为标题只能在枚举类型的上下文中处理,而且至少到目前为止,Business Central 365 SaaS解决方案不支持通用枚举(例如,像RecordRef和FieldRef这样的枚举)。这意味着必须逐个枚举创建标题的文本列表。

    但是,一旦创建了标题列表,然后使用[Text]的名称、序号和标题列表的组合,就可以编写适用于任何枚举的通用代码。

    下面是一些具有几种不同枚举样式的示例代码,以及一个允许您为标题创建[Text]列表的方法。同样,必须为每个特定枚举编码。a.在VS代码中,使用AL Go创建一个新的HelloWorld应用程序B。更改app.json文件名和Publisher,我将我的EnumHelper命名为。注意:我们总是定义一个Publisher,因为您无法在SaaS C中筛选默认的Publisher。用下面的代码替换helloworld.al文件中的所有代码注意:为了简化,下面的所有代码都在同一个文件d中。该代码是帐户表页面的PageExtension并通过OnOpenPage触发器运行,这样就可以轻松地调用该代码,而不需要大量的设置代码。

    下面是允许您创建标题列表的代码。变量myOrdinal是一个整数,Flagged是一个已定义的枚举。注意Enum::EnumName,类似于Page::PageName或Database::TableName。

     foreach myOrdinal in Flagged.Ordinals do begin
         // Enum definition, NOT an enum instance.
         captions.Add(Format(Enum::Flagged.FromInteger(myOrdinal)));
     end;
    

    所有代码(抱歉,它的格式不完全正确)

    value(0; Default) { Caption = ' '; }
    value(1; OH) { Caption = 'Ohio'; }
    value(2; TX) { Caption = 'Texas'; }
    value(3; NC) { Caption = 'North Carolina'; }
    value(4; IA) { Caption = 'Iowa'; }
    value(5; MO) { Caption = 'Missouri'; }
    
    value(0; Default) { Caption = ' '; }
    value(1; Bold) { Caption = 'Bold'; }
    value(2; ITalic) { Caption = 'Italid '; }
    value(4; Underline) { Caption = 'Underline'; } 
    value(8; BoldItalic) { Caption = 'Bold & Italic'; }
    value(16; BoldUnderline) { Caption = 'Bold & Underline '; }
    value(32; ItalicUnderline) { Caption = 'Italic & Underline'; }
    value(64; All3Options) { Caption = 'All 3 Options'; }
    

    }

    枚举50202随机化{可扩展=真;

    value(0; Default) { Caption = ' '; }
    value(7; Good) { Caption = 'The Good'; }
    value(5; Bad) { Caption = 'The Bad'; }
    value(11; Ugly) { Caption = 'The Ugly'; }
    

    }

    value(0; Default) { Caption = ' '; }
    value(1; Flagged) { Caption = 'Flagged'; }
    value(2; Randomized) { Caption = 'Randomized'; }
    value(4; FourStates) { Caption = 'FourStates'; }
    
    trigger OnOpenPage();
    begin
        case UserID.ToLower() of
            'larry':
                Message('Hello Larry, this is an extension for October testing.');
            'vicki':
                Message('Good morning Vicki, this is an extension for October testing.');
            else
                if Confirm('Hello %1 from EnumHelper.\\Click Yes to process or no to cancel.', true, UserID) then begin
                    ProcessEnumerations();
                end;
        end;
    end;
    
    local procedure ProcessEnumerations()
    var
        allLines: TextBuilder;
        randomCaptions: List of [Text];
        flaggedCaptions: List of [Text];
        fourStatesCaptions: List of [Text];
    begin
        GetEnumCaptions(randomCaptions, flaggedCaptions, fourStatesCaptions);
        IterateEnumNamesOrdinalsAndCaptions(allLines, randomCaptions, flaggedCaptions, fourStatesCaptions);
        Message(allLines.ToText());
    end;
    
    local procedure GetEnumCaptions(randomCaptions: List of [Text]; flaggedCaptions: List of [Text]; fourStatesCaptions: List of [Text])
    begin
        GetCaptions(randomCaptions, ProcessFlowOptions::Randomized);
        GetCaptions(flaggedCaptions, ProcessFlowOptions::Flagged);
        GetCaptions(fourStatesCaptions, ProcessFlowOptions::FourStates);
    end;
    
    local procedure IterateEnumNamesOrdinalsAndCaptions(allLines: TextBuilder; randomCaptions: List of [Text]; flaggedCaptions: List of [Text]; fourStatesCaptions: List of [Text])
    begin
        IterateEnumNamesOrdinalsAndCaptions('Flagged Enum', allLines, myFlagged.Names, myFlagged.Ordinals, flaggedCaptions);
        IterateEnumNamesOrdinalsAndCaptions('Randomized Enum', allLines, myRandomized.Names, myRandomized.Ordinals, randomCaptions);
        IterateEnumNamesOrdinalsAndCaptions('FourStates Enum', allLines, myFourStates.Names, myFourStates.Ordinals, fourStatesCaptions);
    end;
    
    local procedure IterateEnumNamesOrdinalsAndCaptions(title: Text; allLines: TextBuilder; enumNames: List of [Text]; enumOrdinals: List of [Integer]; enumCaptions: List of [Text])
    var
        i: Integer;
        enumLine: TextBuilder;
        enumLines: TextBuilder;
    begin
        allLines.AppendLine(title);
        allLines.appendLine();
        for i := 1 to enumNames.Count do begin
            Clear(enumLine);
            enumLine.AppendLine('EnumName: ''' + enumNames.Get(i) + ''',');
            enumLine.AppendLine('EnumOrdinal: ' + Format(enumOrdinals.Get(i)) + ',');
            enumLine.AppendLine('EnumCaption: ''' + enumCaptions.Get(i) + '''.');
            //enumLine.AppendLine('EnumName: ''' + enumNames.Get(i) + ''', EnumOrdinal: ' + ordinal + ', EnumCaption: ''' + enumCaptions.Get(i) + '''');
            enumLines.AppendLine(enumLine.ToText());
        end;
        allLines.AppendLine(enumLines.ToText());
    end;
    
    local procedure GetCaptions(captions: List of [Text]; processFlowOption: Enum ProcessFlowOptions)
    var
        myOrdinal: Integer;
        myProcessFlowOptions: Enum ProcessFlowOptions;
    begin
        // Load captions by iterating specific Enums.
        case processFlowOption of
            myProcessFlowOptions::Flagged:
                begin
                    foreach myOrdinal in Flagged.Ordinals do begin
                        // Enum definition, NOT an enum instance.
                        captions.Add(Format(Enum::Flagged.FromInteger(myOrdinal)));
                    end;
                end;
            myProcessFlowOptions::Randomized:
                begin
                    foreach myOrdinal in Randomized.Ordinals do begin
                        // Enum definition, NOT an enum instance.
                        captions.Add(Format(Enum::Randomized.FromInteger(myOrdinal)));
                    end;
                end;
            myProcessFlowOptions::FourStates:
                begin
                    foreach myOrdinal in FourStates.Ordinals do begin
                        // Enum definition, NOT an enum instance.
                        captions.Add(Format(Enum::FourStates.FromInteger(myOrdinal)));
                    end;
                end;
        end;
    end;
    

  •  类似资料:
    • 问题内容: 是否可以使用Lambda表达式进行迭代?以下代码段的Lambda表示形式是什么: 我在其中找不到任何流。 问题答案: 如果您不喜欢在迭代开始之前将全部内容复制到(临时)列表中的事实,则可以使用简单的实用程序方法来帮助自己: 然后,您可以简单地进行操作(注意该功能)…

    • 我在一个扩展名为的单独文件中创建了以下张贴的颜色枚举。我想知道如何在发布的代码中使用或调用中的枚举,以便能够迭代抛出它。换句话说,如何循环遍历下面发布的枚举,以便设置for,以及当。 显然,双问题mart将被通过枚举的迭代所取代。

    • 问题内容: 我有一个实现该接口的类,但是Java的foreach循环需要该接口。是否有一个到适配器在Java的标准库? 问题答案: 您需要一个所谓的“适配器”,以适应不兼容的。Apache commons- collections具有。用法是:

    • 问题内容: 在Java 5及更高版本中,您具有foreach循环,该循环可以神奇地实现任何实现的对象: 但是,仍然没有实现,这意味着要迭代一个,您必须执行以下操作: 有谁知道为什么仍然不执行? 编辑: 为澄清起见,我不是在谈论枚举的语言概念,而是在Java API中称为“ 枚举 ” 的Java特定类。 问题答案: 枚举没有被修改为支持Iterable,因为它是一个接口,而不是一个具体的类(例如Ve

    • 问题内容: 我要做什么才能完成此任务?另外,可以说我将其更改为: 我该如何使它符合Decodable? EDit 这是我的完整代码(不起作用) 最终编辑 另外,它将如何处理这样的枚举? 问题答案: 这很简单,只需使用或隐式分配的原始值即可。 被编码到并到 要么 被编码到并到 这是一个简单的示例如何使用它: