如何找到AX2009中的最后一个labelId?

时间:2012-01-25 15:48:14

标签: axapta dynamics-ax-2009 x++ ax

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

我有这份工作,几乎可以满足我所需要的一切。但我必须输入最大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');
}

3 个答案:

答案 0 :(得分:1)

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

查看类\ Tutorial_ThreadWork \ doTheWork以查看它们使用了一段时间(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(...)会刷新它们,但我不确定。

答案 1 :(得分: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 *以查看系统如何处理标签的一些内容。无论如何,它看起来并不简单。

答案 2 :(得分:1)

这是另一个可能适合您的选项。这也将识别缺失的标签。改变&#39; en-us&#39;用你的语言这是一个&#34;脏&#34;另外我想。您可能需要添加一些内容来说明&#34;如果我们在一行中找到5个标签,他们就会喜欢&#39; @ OCM&#39;&#34;。

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));
}