4

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

これが 1 回限りのジョブである場合は、AOS を停止して、メモ帳でラベル ファイルを開くことができます。これは、axXXXen-us.ald という名前のアプリケーション フォルダーにあります。ここで、XXX はラベル ファイル名、en-us は言語です。

classes\Tutorial_ThreadWork\doTheWork を見て、 for ループの代わりに while(sLabel) を使用している場所を確認してください。

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 に答える
1

これがあなたのために働くかもしれない別のオプションです。これにより、欠落しているラベルも識別されます。「en-us」をあなたの言語に変更してください。これは、私が推測する「汚い」代替手段です。「'@OCM' のようなラベルが 5 つ続けて見つかった場合」と言う何かを追加する必要があるかもしれません。

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 に答える