Цитата:
Сообщение от
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;
}
}