4

我想将 labelModuleId 中的所有标签插入 AX2009 表中。

我有这份工作,几乎可以满足我的一切需求。但我必须输入最大 ID(toLabel = 1000):

static void OcShowAllLabel(Args _args)
{
    xInfo               xinfo;
    LanguageId          currentLanguageId;
    LabelModuleId       labelModuleId = 'OCM'; // hier evt eine Eingabe durch Benutzer zur Auswahl
    LabelIdNum          frLabel;
    LabelIdNum          toLabel = 1000;
    LabelId             labelId;
    OcShowAllLabels_RS  tab;
    Label               blub = new Label();
    str                 label;
    ;

    xInfo = new xInfo();
    currentLanguageId = xInfo.language();
    delete_from tab
        where tab.LanguageId == currentLanguageId
        && tab.LabelModuleId == labelModuleId;

    for (frLabel = 1; frLabel <= toLabel; frLabel++)
    {
        labelId = strfmt('@%1%2', labelModuleId, frLabel);
        label = SysLabel::labelId2String(labelId, currentLanguageId);
        if (labelId != label)
        {
            tab.initValue();
            tab.LabelId = labelId;
            tab.Label = label;
            tab.LanguageId =  currentLanguageId;
            tab.LabelModuleId = labelModuleId;
            tab.insert();
        }
    }

    Info('done');
}
4

3 回答 3

1

这是我想的另一种选择。您可以插入标签以获取下一个标签编号,然后立即将其删除:

static void Job32(Args _args)
{
    SysLabel sysLabel = new SysLabel(LanguageTable::defaultLanguage());
    SysLabelEdit sysLabelEdit = new SysLabeLEdit();
    LabelId labelid;
    ;

    labelId = syslabel.insert('alextest', '', 'OCM');

    info(strfmt("%1", labelId));

    sysLabelEdit.labelDelete(labelId, false);
}

不过,它似乎确实消耗了数字序列中的数字。你可以做一个 Label::Flush(...) 然后通过代码检查文本文件。查看 Classes\SysLabel* 以了解系统如何处理标签。无论如何,它看起来都不是很简单。

于 2012-01-25T18:47:07.493 回答
1

这是另一个可能对您有用的选项。这也将识别缺失的标签。将“en-us”更改为您的语言。我想这是一个“肮脏”的选择。您可能需要添加一些内容来说明“如果我们连续找到 5 个标签,它们就像 '@OCM'”。

for (i=1; i<999; i++)
{
    labelId = strfmt("@%1%2", 'OCM', i);
    s = SysLabel::labelId2String(labelId, 'en-us');

    if (s like '@OCM*')
    {
        info (strfmt("%1: Last is %2", i, s));
        break;
    }
    info(strfmt("%1: %2", i, s));
}
于 2012-01-25T18:56:36.403 回答
1

如果这是一次性作业,您可以停止 AOS 并在记事本中打开标签文件。它位于名为 axXXXen-us.ald 的应用程序文件夹中,其中 XXX 是您的标签文件名,而 en-us 是您的语言。

查看 classes\Tutorial_ThreadWork\doTheWork 以了解他们在哪里使用 while(sLabel) 而不是像您那样的 for 循环。

container doTheWork(Thread t,LabelType searchFor)
{
    container   retVal;
    SysLabel    sysLabel = new SysLabel(LanguageTable::defaultLanguage());
    str         slabel;
    ;

    slabel = sysLabel.searchFirst(searchFor);
    while (slabel)
    {
        retVal += sLabel;
        slabel = sysLabel.searchNext();
    }

   return retVal;
}

由于标签文件是文本文件,因此您不能只选择最后一个文件,而是必须遍历文件。然而,AX 缓存标签,但据我所知,我不相信您可以轻松访问标签缓存。

最后,希望您不会尝试此操作,但不要尝试仅读取标签文本文件,因为 AX 有时具有尚未从缓存刷新到该文件的标签。我认为 Label::Flush(...) 会刷新它们,但我不确定。

于 2012-01-25T15:54:12.337 回答