|
09.02.2017, 14:37 | #1 |
Участник
|
Длина номера фактуры, накладной больше 20 символов.
Добрый день.
Коллеги, недавно столкнулись с проблемой, что поставщики чаще стали присылать номера документов длиной больше 20 символов. В аксапту не лезут. С учетом того что в 1С , Oracle Aplications длина номера инвойса 50 символов (интересно сколько в сапе ?) то такая ситуация будет повторяться все чаще. Как можно исправить ситуацию ? Есть несколько вариантов. 1. «В лоб». Увеличить EDT NUM, FactureExternalId_RU до 50 символов. + А. просто и быстро модифицировать. Б. Практически нулевая вероятность багов в кое после такого изменения. - А. Нереально долгая синхронизация базы. (у нас порядка 700 миллионов записей только в InventTrans, а работаем 24/7. Разрешенный простой- 2 часа в неделю). Вариант почти невозможный. Б. Увеличить размер поля NUM– выпустить джина из бутылки – будут чаще заполнять длинные значения (причем не только для номеров документов. Наследники EDT NUM много где используются)- уменьшится скорость работы базы. В. А если потребуется еще длиннее номер сделать ? (Интересно, кто встречал больше 50?) – Опять все переделывать и устраивать перепроверку и переколбас БД ? 2. «Компромиссный». Оторвать подветку EDT InvoiceId от NUM и увеличить до 50 символов. Также увеличить длину EDT FactureExternalId_RU до 50 символов. + А. Не такой большой рост базы и не такой долгий простой в работе как для варианта 1. (но все равно немало) - А. Все равно немаленькое время синхронизации БД. Б. Все равно потери производительности при увеличении длины поля (хотя и не такие сильные как в варианте 1) В. Дополнительные трудозатраты на перепроверку исходного кода – нет ли где то усечения номеров документов при работе (нередко EDT Num использовали как промежуточный тип для переменных в коде и.т.п.). Выше риск разных багов. 3. «Новое поле “Внешний номер”». Завести в табличках документов 2-й поле «Внешний номер». В который и писать значение от поставщика и использовать его при выгрузках во внешние системы при печати документов, при формировании книг покупок и продаж и.т.п. + А. Короткое время синхронизации базы. Б. Нет рисков усечения номеров документов при работе - А. Все равно приличные трудозатраты на доработку кода, чтобы в нужных местах использовалось новое поле. (изменений наверно даже побольше чем в вариантах 1-2) Б. Много неоднозначностей в каком случае какое поле использовать и как заполнить обычный InvoiceId (как усечь номер от поставщика, чтобы не получить кучу дублей) 4. «Я-шланг». Прикинуться шлангом. В аксапте ничего не менять, пусть пользователи сами что-нибудь придумают, усекут номер как хотят и потом разбираются с налоговой и с контрагентами. + … - … Какие еще есть варианты и что лучше выбрать ? Кто как делал у себя на проектах ? P.S. Все больше начинаю любить суррогатные ключи. P.P.S. DAX 2009 Приложение RU5 Последний раз редактировалось Logger; 09.02.2017 в 14:40. |
|
09.02.2017, 15:16 | #2 |
Участник
|
А разве время синхронизации базы разное если добавить поле / изменить текущее?
__________________
Ivanhoe as is.. |
|
09.02.2017, 15:21 | #3 |
Moderator
|
Цитата:
Вы бы там попробовали где-нить на полигоне в лоб задачу решить. Есть большие шансы что за пару часов управитесь. (Ну а если не управитесь - придется базу на полигоне из бэкапа поднимать. Не самое приятное задача, но за выходные явно поднимется...) P.S. Размер базы тоже не должен сильно увеличиться, поскольку конечные пробелы все равно в БД не хранятся. Там все-таки VARCHAR, и аксапта их перед записью урезает как не необходимые... Последний раз редактировалось fed; 09.02.2017 в 15:23. |
|
|
За это сообщение автора поблагодарили: Logger (3). |
09.02.2017, 15:29 | #4 |
Участник
|
Цитата:
Проблема с изменением поля в том что если табличка непустая, то аксапта создает новую табличку, такую же по структуре и новой длиной поля. Переливает данные из одной таблички в другую, старую грохает, а новую переименовывает. А затем с нуля индексирует ее. На перелив данных и индексацию уходит много времени (если табличка миллионник) Мы придумали обходной финт. Если строковый EDT меняет длину, то собираем перечень табличек и полей на которые это повлияет, генерим для них SQL запросы вида ALTER TABLE ... MODIFY FIELD изменяя длину поля и обновляем также инфу в системной табличке SQL Dictionary После этого аксапта при синхронизации ничего не трогает (мы ведь все сделали за нее). Отрабатывает такая полуручная "синхронизация" мгновенно. Но если поле для которого хотим поменять длину индексировано, то БД посылает на попытке изменения длины, приходится грохать индекс, менять длину и заново строить индекс. Т.е. выигрываем на переливке данных все равно, но можем потратить много времени на переиндексацию (о чем я и упомянул). А поскольку номер документа это ключевое поле которой входит в первичный ключ и почти во все foreignKey то ... Приходится кучу индексов пересоздавать и тратить на это много времени. 2 часов на всю базу не хватает. Ну и плюс опять же размер индексов вырастать будет если реально будут 50 символов заполнять. Последний раз редактировалось Logger; 09.02.2017 в 15:37. |
|
09.02.2017, 15:48 | #5 |
Moderator
|
Цитата:
И какая у вас версия SQL ? |
|
09.02.2017, 17:05 | #6 |
Участник
|
Цитата:
Цитата:
ORA-30556: functional index is defined on the column to be modified
Поговорил с DBA. Проблема в функциональных индексах. Без них все ок. Попробовал сам, действительно без функциональных индексов все ок. Запрос такой X++: ALTER TABLE TESTTABLE MODIFY TEXTFIELD NVARCHAR2(50) |
|
|
За это сообщение автора поблагодарили: fed (1). |
10.02.2017, 09:29 | #7 |
Участник
|
А сколько сейчас времени у вас тратится при варианте пересоздания индексов, хотя бы порядок, если конечно пробовали? Просто при временных затратах в десятки часов, вариантов вроде не так много остается. В стандарте вроде как FactureExternaId_RU имеет длину 30 символов, у вас также ?
Можно же попробовать в два этапа провести увеличение длины номеров отдельно номера фактуры, отдельно накладные(скажем если бы два этапа шли последовательно условно в неделю разницы, то вполне можно написать джоб, который бы обновил номера накладных из фактур(правда, может с внешними обменами будут проблемки небольшие), в случае если у вас текущие размеры их совпадают, если же фактура больше и сейчас, то проблем по идее и так быть не должно). Цитата:
Б. Много неоднозначностей в каком случае какое поле использовать и как заполнить обычный InvoiceId (как усечь номер от поставщика, чтобы не получить кучу дублей)
__________________
Sergey Nefedov |
|
|
За это сообщение автора поблагодарили: Logger (3). |
10.02.2017, 10:11 | #8 |
Участник
|
Цитата:
Цитата:
Цитата:
Поговорили еще с DBA. Мне все больше нравится вариант 1. Возможно что нить придумаем как сделать. Как вариант - пропатчить ядро чтобы аксапта научилась работать с БД в регистронезависимом режиме без всяких функциональных индексов. Тогда и проблемы не будет никакой. Длины полей увеличатся легко. |
|
09.02.2017, 15:35 | #9 |
Участник
|
По законодательству длина номера документа у нас вроде не определена, но как подсказали мне друзья, для электронного документооборота внесена некоторая ясность.
http://www.garant.ru/products/ipo/prime/doc/71285094/ Цитата:
Наименование элемента Сокращенное наименование (код) элемента Признак типа элемента Формат элемента Признак обязательности элемента Дополнительная информация
Наименование товара (описание выполненных работ, оказанных услуг), имущественных прав (графа 1 счета-фактуры) НаимТов А Т(1-1000) О Цитата:
Сведения о платежно-расчетном документе (строка 5 счета-фактуры) (СвПРД)
Наименование элемента Сокращенное наименование (код) элемента Признак типа элемента Формат элемента Признак обязательности элемента Дополнительная информация Номер платежно-расчетного документа НомерПРД А Т(1-30) О Правда на скорую руку так и не разобрался в каком случае речь идет о номере СФ и сколько же он может быть длиной в электронном документообороте. 30 или 1000 символов. И как с остальными документами дело обстоит. P.S. Жаль форматирование таблички съехало в цитатах. - Смотреть лучше в документе по ссылке. |
|
10.02.2017, 09:17 | #10 |
Злыдни
|
Цитата:
Сообщение от Logger
Правда на скорую руку так и не разобрался в каком случае речь идет о номере СФ и сколько же он может быть длиной в электронном документообороте. 30 или 1000 символов.
И как с остальными документами дело обстоит. P.S. Жаль форматирование таблички съехало в цитатах. - Смотреть лучше в документе по ссылке. Цитата:
Порядковый номер счета- фактуры (строка 1 счета- фактуры), документа об отгрузке товаров (выполнении работ), передаче имущественных прав (документа об оказании услуг) НомерСчФ А Т(1-1000)
__________________
люди...считают, что если техника не ломается, то ее не нужно ремонтировать. Инженеры считают, что если она не ломается, то нуждается в совершенствовании. |
|
09.02.2017, 15:38 | #11 |
Участник
|
Если у вас реально уже проблемы с синхронизацией, пора делать обходную процедуру - запрет синхронизации через Акс, изменение структуры БД в SQL. На больших базах без этого никуда.
__________________
Ivanhoe as is.. |
|
09.02.2017, 15:41 | #12 |
Участник
|
Цитата:
Но чую, что в данном случае даже упомянутая мной схема не уложится в 2 часа, потому что поля почти все индексированные. |
|
Теги |
factureexternalid, invoice, invoiceid, num, электронная отчетность, электронный сф |
|
|