|
![]() |
#1 |
Участник
|
Ок, я понял. Так будет правильно?
X++: strToUpdate = strpoke(vendtable.AccountNum, "С", strfind(vendtable.AccountNum,"C", 1, strlen(vendtable.AccountNum))); findVendTable.renamePrimaryKey() VendTable.AccountNum = strToUpdate ; findVendTable.renamePrimaryKey(); findVendTable.update(); ![]() |
|
![]() |
#2 |
Участник
|
Цитата:
Сообщение от Masterofmind
![]() Ок, я понял. Так будет правильно?
X++: strToUpdate = strpoke(vendtable.AccountNum, "С", strfind(vendtable.AccountNum,"C", 1, strlen(vendtable.AccountNum))); findVendTable.renamePrimaryKey() VendTable.AccountNum = strToUpdate ; findVendTable.renamePrimaryKey(); findVendTable.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; } } |
|
|
За это сообщение автора поблагодарили: Masterofmind (1). |
![]() |
#3 |
Участник
|
Цитата:
![]() |
|