2012-01-25 50 views
4

我想要從AX2009表中的labelModuleId插入所有標籤。如何查找AX2009中的最後一個labelId?

我有這份工作,那幾乎是我需要的一切。但我必須輸入的最高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'); 
} 

回答

1

如果這是一個一次性的工作,你可以停止AOS並在記事本中打開的標籤文件。它位於名爲axXXXen-us.ald的應用程序文件夾中,其中XXX是您的標籤文件名,en-us是您的語言。

看看classes \ 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(...)會沖洗它們,但我不確定。

+0

1.這不是一次性工作,我不喜歡直接使用labelfile。但你是對的,那是最簡單的解決方案。 2. sysLabel.searchFirst搜索標籤而不是labelId。所以這在這裏沒有幫助。 – supertobi

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 *以查看系統如何處理標籤。它看起來並不簡單。

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)); 
} 
相關問題