1

在 Business Central 中,我想根据是否安装了第 3 方扩展来启用/禁用页面扩展中的字段。我不想依赖这个 3rd 方扩展,因为大多数时候它不会出现,我们的扩展也不依赖它。

有谁知道如果将扩展作为依赖项包含在 app.json 中但在运行时未安装会发生什么?它安装在开发环境中,但未安装在运行时。我的假设是它将无法安装我的扩展程序。

对于我正在尝试做的事情,不需要更新第 3 方扩展数据,但我想阅读它。

有没有办法确定是否安装了第 3 方扩展?

4

3 回答 3

3

您可以使用以下命令:

[Ok := ] NavApp.GetModuleInfo(AppId: Guid, var Info: ModuleInfo)

来源:微软文档

如果未安装提供的 AppId,它将返回 false,否则,您将在 Info 变量中获得有关已安装应用程序的所有信息。

于 2021-05-18T13:45:52.627 回答
2

一种选择是尝试打开一个已知属于其他扩展的表。

如果另一个表不存在,RecordRef.Open(TableNum) 将出错。

不幸的是,RecordRef.Open() 不会返回类似的布尔值,例如 Record.Get(),所以我们不能只If RecordRef.Open()测试它是否成功。

因此,您需要一个类似以下的函数,作为“Try Function”,它会在错误时返回“false”,而不是实际抛出错误并停止。

[TryFunction]
procedure CheckTableExists(reference: integer)
var
    TryRecord: RecordRef;
begin
    TryRecord.open(reference)
end;

然后你可以做,例如

trigger OnAction();
var
    CheckOtherExtensionMgt: Codeunit "CheckOtherExtensionMgt";
begin
    if CheckOtherExtensionMgt.CheckTableExists(66666) then
        Message('66666 Exists'); //Do something if the other extension does exist

    if CheckOtherExtensionMgt.CheckTableExists(27) then
        Message('27 Exists'); //Prove that processing continues even if the other extension doesn't exist
end;

在我的环境中处理此操作时,我会收到一条“27 Exists”消息,如果存在其他扩展名,请将第一条消息替换为您想要执行的任何操作

如果另一个扩展在客户的对象范围内,请小心,如果是这样,您可能需要检查该表是否确实是您所期望的!

于 2020-10-03T18:18:26.190 回答
2

您需要使用虚拟表AllObj来确定您要查找的表是否存在:

local procedure GetValueWithoutDependency()
var
    AllObj: Record AllObj;
    RecRef: RecordRef;
begin
    AllObj.SetRange("App Package ID", [GUID of the other extension]);
    AllObj.SetRange("Object ID", [ID of the table in the other extension]);

    if not AllObj.FindFirst() then
        exit; // The table does not exist

    RecRef.Open(AllObj."Object ID"); // Won't fail because we know the table is there

    // Find your record
    // Get the field value using FieldRef
end;

打开后,您RecordRef可以设置过滤器以查找想要的记录,然后使用它FieldRef来获取想要的字段的值。

于 2020-10-06T07:48:11.477 回答