代码之家  ›  专栏  ›  技术社区  ›  Brad

Axapta将recid存储为anytype

  •  2
  • Brad  · 技术社区  · 16 年前

    当我将recid存储在anytype对象中时,该数字已损坏。在我的实现中,我将recid存储在TreeView项的数据值字段中。每当我检索数据值时,我保存的数字总是发生很大的变化。有什么建议吗?

    下面是一个例子:

    void fillTree()
    {
        ABC_Menus _ABC_Menus;
        TreeItemIdx parentItemIdx;
        ;
        while select Prompt, RecId from _ABC_Menus
        {
            parentItemIdx = SysFormTreeControl::addTreeItem(formTreeControl, _ABC_Menus.Prompt, FormTreeAdd::Root, _ABC_Menus.RecId, 0, true);
        }
    }
    
    public void endLabelEdit(int _idx, str _text, anytype _data)
    {
        FormTreeItem formTreeItem = this.getItem(_idx);
        ;
        formTreeItem.text(_text);
        this.setItem(formTreeItem);
        info(_data);     //this number comes out all wrong
        super(_idx, _text, _data);
    }
    

    我正在树值字段中存储recid。但是,如果我稍后再取回它,会返回一个完全不同的数字。
    -表中的Recid:5637144588
    -endlabeledit显示的recid方法:202520592908288

    我还尝试在字段中存储recid时使用num2str(abc_table.recid,0,0,0)。以这种方式存储时,数字匹配,但会引发“赋值/比较丢失精度”警告。这样可以吗?还是有更好的方法?

    谢谢

    2 回复  |  直到 13 年前
        1
  •  3
  •   Velislav Marinov    16 年前

    在Axapta版本3之后,所有recid都是64位整数。strfmt()函数可以将recid从int64强制转换为string,但也可以使用int642str()函数将recid显式转换为string。

    RecId recId = 5637144577;
    anytype a;
    int64 b;
    ;
    
    a = recId;
    b = a;
    
    info(int642str(a));
    info(int642str(b));
    info(int642str(recId));
    
        2
  •  2
  •   ceth    16 年前

    请提供完整的示例:

    RefRecId   recid = 5637144577;
    anytype    tmp;
    ;
    info(strfmt('%1', recid));
    tmp = recid;
    info(strfmt('%1', tmp));
    recid = tmp;
    info(strfmt('%1', recid));
    

    结果是:

    五十六亿三千七百一十四万四千五百七十七

    五十六亿三千七百一十四万四千五百七十七

    五十六亿三千七百一十四万四千五百七十七