我想从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');
}
答案 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));
}