AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 16.03.2009, 19:45   #8  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от Masterofmind Посмотреть сообщение
Ок, я понял. Так будет правильно?
X++:
strToUpdate = strpoke(vendtable.AccountNum, "С", strfind(vendtable.AccountNum,"C", 1, strlen(vendtable.AccountNum)));
        
                findVendTable.renamePrimaryKey()
                VendTable.AccountNum = strToUpdate ;
                findVendTable.renamePrimaryKey();
               
                findVendTable.update();
Строго не судите, это мой первый джоб, да и программированием я не занимался уже лет 5
не renamePrimaryKey используется вместо update.

правильно так (в аксапте не проверял)

X++:
static void Base1000_RenameVendPrKey(Args _args)
{
    vendTable        vendTable,
                     findVendTable;

    str              strToUpdate;
    ;

    while select recid from vendTable
        where vendTable.AccountNum like "*C*" // тут будет TableScan, ну и черт с ним: все равно надо обработать все записи
    {
        ttsbegin;

        findVendTable = VendTable::findRecId(vendTable.RecId, true);
        if(!findVendTable) continue;

        strToUpdate = strReplace(findVendTable.AccountNum, "С", "C"); // это из класса Global
        if( strToUpdate == findVendTable.AccountNum ) continue;

        findVendTable.AccountNum = strToUpdate;
        findVendTable.renamePrimaryKey(); // переименование во всех связанных таблицах

        ttscommit;
    }
}
ну, и конечно, стоит двадцать раз подумать прежде чем комиттить каждую запись.
в принципе транзакции получаются маленькими и но зафиксироваться может промежуточное состояние, когда обновлены не все записи. Если устраивает, то все нормально.

кроме того, поскольку вы меняете первичный ключ, то теоретически может случится ошибка дублирования уникального индекса...

ну и наконец, чтобы работала комбинация Ctrl+Break стоит добавить ProgressBar

X++:
static void Base1000_RenameVendPrKey(Args _args)
{
    vendTable        vendTable,
                     findVendTable;

    str              strToUpdate;
    SysOperationProgress progress;
    ;

    select count(recid) from vendTable;
    progress = SysOperationProgress::newGeneral('','',vendTable.recid); // тут будет больше, чем будет обсчитано.
    // Ну и ладно. Запускать два раза tableScan не будем.

    while select recid from vendTable
        where vendTable.AccountNum like "*C*" // тут будет TableScan, ну и черт с ним: все равно надо обработать все записи
    {
        progress.inccount();
        ttsbegin;

        findVendTable = VendTable::findRecId(vendTable.RecId, true);
        if(!findVendTable) continue;

        strToUpdate = strReplace(findVendTable.AccountNum, "С", "C"); // это из класса Global
        if( strToUpdate == findVendTable.AccountNum ) continue;

        findVendTable.AccountNum = strToUpdate;
        findVendTable.renamePrimaryKey(); // переименование во всех связанных таблицах

        ttscommit;
    }
}
__________________
полезное на axForum, github, vk, coub.
За это сообщение автора поблагодарили: Masterofmind (1).
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Пересоздание таблицы при синхронизации Serg16 DAX: Администрирование 1 26.08.2009 13:55
Вставка строк в таблицы Аксапты сторонними средствами Андре DAX: База знаний и проекты 1 07.05.2009 16:49
Две таблицы в одном datasource Turetskiy DAX: Программирование 10 16.09.2008 16:35
Блокировка ключа индекса Sequel DAX: Программирование 4 06.07.2006 16:08
Получение из поля Map кода поля реальной таблицы, к ней привязанной (Mappings) vey DAX: Функционал 5 16.03.2005 11:16

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 20:02.