Как я могу найти последний labelId в AX2009? - PullRequest
4 голосов
/ 25 января 2012

Я хотел бы вставить все метки из labelModuleId в таблицу AX2009.

У меня есть эта работа, которая выполняет почти все, что мне нужно.Но я должен ввести максимальный идентификатор (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 ]

1 голос
/ 25 января 2012

Вот еще один вариант, я полагаю. Вы можете вставить ярлык, чтобы получить следующий номер ярлыка, а затем сразу же удалить его:

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 (...) и затем проверить текстовый файл с помощью кода. Посмотрите на классы \ SysLabel *, чтобы увидеть, как система работает с метками. Это выглядит не очень просто.

1 голос
/ 25 января 2012

Вот еще один вариант, который может работать для вас. Это также определит отсутствующие ярлыки. Измените «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));
}
1 голос
/ 25 января 2012

Если это разовая работа, вы можете просто остановить 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 (...) очистит их, но я не уверен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...