27.07.2011, 12:31 | #1 |
Участник
|
Уважаемые коллеги, в очередной раз обращаюсь к вам за помощью Подскажите, плиз, как оптимальнее сдалать следующее:
нужно просмотреть все таблицы, и проверить в этих таблицах содержимое полей с типом Code на предмет присутствия в них запрещенных символов (например ß или œ) и заменить их на "правильные" (ss и ü соответственно). Обработку я написала. Ее можно запускать в двух режимах: либо только проверка с заполнением протокола, либо проверка с исправлением (новое значение в поле заношу с помощью команд: Код: Fld_ref.VALIDATE(NewValue); Tbl_ref.MODIFY; а) Не во всякой таблице мне можно корректировать значения (например, при исправлении в Т112 пишет: "У вас нет прав на изменения в записях таблицы Sales Invoice Header") б) Некоторые Code-поля содержат TableRelation. И их исправление тоже вызывает ошибку: ругается что-то типа "в таблице такой-то (называется исходная таблица, на которую ссылается поле) нет такого NewValue значения) Проблема понятна и в принцепе все логично. Но дело в том, что и старое-то значение тоже отсутствует в исходной таблице (предполагаю, что оно туда затесалось еще со времен доисторических, когда базу конвертировали из одной версии Нава в другую). Вопрос понятен: 1) как быть и что делать? как обойти эти "углы" (править ручками ну ооочень не хочется, т.к. полей с ошибками довольно много .... если помножить это еще и на порядка 10 мандантов, у каждого из которых неск. сот (а то и млн) записей в основных таблицах) Попутно еще парочка вопросов: 2) Есть ли такая команда в Наве, к помощью которой можно было бы "сделать примерку", т.е. фактически не заносить новое значение в поле, а лишь примерить "придется ли оно по вкусу системе". При отрицательном ответе я бы выводила некое сообщение в протокол проверки: дескать такое-то поле в такой-то записи исправить автоматически низя. 3) Как выявить поля, имеющие TableRelation (чтобы сообщение о таковых тоже было напечатано в протоколе)? В своей обработке я пользуюсь таблицей 2000000041 Fields. В ней есть поля RelationTableNo и RelationFieldNo. Я наивно полагала, что если RelationTableNo > 0, то это указывает на то, что поле содержит ссылку на др. таблицу. Но оказалось, что это не всегда так (выражаясь языком математическим: это достаточное условие, но не необходимое) Пример: таблица 110 (Sales Shipment Header) - поле Sell-to Customer No содержит ссылку на таблицу 18 (Customer) (свойство TableRelation = Customer). RelationTableNo для него = 18 та же таблица - поле Ship-to Code: В свойстве TableRelation написано: "Ship-to Address".Code WHERE (Customer No.=FIELD(Sell-to Customer No.)). Но в то же время RelationTableNo = RelationFieldNo = 0. 4) И вообще правильно ли я использую Fld_ref.VALIDATE для присваивания нового значения полю? Может "лучше" было бы обычным присваиванием (без валидации) ? 5) Какие еще подводные камни могут тут встретиться? 6) Обработка последовательно выбирает все таблицы БД, проверяет, исправляет. Если таблица Х проверена и исправлена благополучно, а на таблице Х+1 обработка "спотыкнулась" и прервалась сообщением об ошибке, то и изменения в таблице Х сохранены не будут. Разумно ли использовать COMMIT, чтобы хотя бы изменения в первой таблице сохранить? И на сколько скажется такая принудительная запись на времени выполнения процедуры? |
|