フィールド情報の一括更新

3954 ワード

フォームレコード情報フォームには名前変更機能があり、あるテーブルのプライマリ・キーに使用されるテーブル情報を統一的に更新することができ、品目コード、会計科目コードなどを更新するのが一般的である可能性があります.
あるルールに従って品目コードや会計科目コードなどを一括更新する必要がある場合がありますが、フォームの名前変更操作を1つずつ行うのは面倒で、メインテーブルの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);

}