zoukankan      html  css  js  c++  java
  • 批量更新字段信息

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

    有时候需要统一按照某个规则批量更新物料编码和会计科目代码等,一个个通过窗体的重命名操作会有些麻烦,可以使用主表的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);
    
    }
    
  • 相关阅读:
    JS BOM对象 History对象 Location对象
    JS 字符串对象 数组对象 函数对象 函数作用域
    JS 引入方式 基本数据类型 运算符 控制语句 循环 异常
    Pycharm Html CSS JS 快捷方式创建元素
    CSS 内外边距 float positio属性
    CSS 颜色 字体 背景 文本 边框 列表 display属性
    【Android】RxJava的使用(三)转换——map、flatMap
    【Android】RxJava的使用(二)Action
    【Android】RxJava的使用(一)基本用法
    【Android】Retrofit 2.0 的使用
  • 原文地址:https://www.cnblogs.com/Farseer1215/p/3324091.html
Copyright © 2011-2022 走看看