批量更新字段信息
在窗体记录信息窗体上有个重命名的功能,可以把用到某个表主键的从表信息统一进行更新,常用的可能是更新物料编码,会计科目代码等。
有时候需要统一按照某个规则批量更新物料编码和会计科目代码等,一个个通过窗体的重命名操作会有些麻烦,可以使用主表的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); }