Farseer

导航

批量更新字段信息

在窗体记录信息窗体上有个重命名的功能,可以把用到某个表主键的从表信息统一进行更新,常用的可能是更新物料编码,会计科目代码等。

有时候需要统一按照某个规则批量更新物料编码和会计科目代码等,一个个通过窗体的重命名操作会有些麻烦,可以使用主表的renamePrimaryKey写一段代码来批量更新,不过如果遇到数据量很大,并且这个字段没建索引的话,就有的等了,可能N个小时都没反映。

renamePrimaryKey这个方法是内置的,并没有公开它的代码,不过推测的话,它应该是通过反射数据字典找到哪些表用到了表的主键,比如哪些表用到了LedgerAccount,哪些表用到了ItemId之类,通过AX提供的反射类可以很容易地找到这个关系,通过代码可以生成需要的update方法,生成代码之后执行一下,看哪个表更新的慢,创建索引再更新就可以了。

static void generateUpdateMethod(Args _args)
{
    #AOT
    #define.FileName(@"c:\DataDictionary.txt")
    TextBuffer  tb = new TextBuffer();
    Dictionary  dictionary = new Dictionary();

    DictTable   dictTable;
    DictField   dictField;
    SysDictType type;
    int         i;
    int         j;
    boolean     exist;
    str         statement;
    int         k;
    ;

    for( i=1;i<= dictionary.tableCnt();i++)
    {
        //print i;
        dictTable = new DictTable(dictionary.tableCnt2Id(i));

        if(dictTable.isView() || dictTable.isMap() || dictTable.isTmp())
            continue;

        //Define tables
        for(j=1;j<=dictTable.fieldCnt();j++)
        {
            exist = false;
            dictField = new DictField(dictTable.id(),dictTable.fieldCnt2Id(j));
            type = new SysDictType(dictField.typeId());


            while(type)
            {
                if(Global::extendedTypeId2name(type.id()) == "LedgerAccount" &&
                    (Global::isConfigurationkeyEnabled(dictField.configurationKeyId()) || dictField.configurationKeyId() == 0 ))
                {
                    print type.name();
                    tb.appendText(" "+dictTable.name()+"    "+dictTable.name()+@";
                    ");
                    exist = true;
                    break;
                }
                type = new SysDictType(type.extend());
            }
            if(exist)
                break;
        }
    }
    tb.appendText (@"

                    ");

    dictionary = new Dictionary();
    tb.appendText(@"    while select ChartAccountMapping
    {");
    for( i=1;i<= dictionary.tableCnt();i++)
    {
        print i;
        dictTable = new DictTable(dictionary.tableCnt2Id(i));

        if(dictTable.isView() || dictTable.isMap() || dictTable.isTmp() || dictTable.name()== "ChartAccountMapping")
            continue;

        for(j=1;j<=dictTable.fieldCnt();j++)
        {
            dictField = new DictField(dictTable.id(),dictTable.fieldCnt2Id(j));
            type = new SysDictType(dictField.typeId());

            while(type)
            {
                if(Global::extendedTypeId2name(type.id()) == "LedgerAccount"&&
                    (Global::isConfigurationkeyEnabled(dictField.configurationKeyId()) || dictField.configurationKeyId() == 0 ))
                {
                                        tb.appendText( strfmt(@"
        update_recordset %1
        setting %2= %3
        where %1.%2 == %4
        ",dictTable.name(),dictField.name(),"ChartAccountMapping.newAccount",
        "ChartAccountMapping.oldAccount;"));

                }
                type = new SysDictType(type.extend());
            }
        }
    }
    tb.appendText( "}" );
    tb.toFile(#FileName);

}

 

 

posted on 2013-09-16 13:21  佛西亚  阅读(1281)  评论(0编辑  收藏  举报